]> source.dussan.org Git - jquery-ui.git/commitdiff
Progressbar: Add ability to set value: false for an indeterminate progressbar. Fixes...
authorkborchers <kris.borchers@gmail.com>
Tue, 27 Mar 2012 02:51:16 +0000 (21:51 -0500)
committerKris Borchers <kris.borchers@gmail.com>
Thu, 22 Nov 2012 03:48:17 +0000 (21:48 -0600)
demos/progressbar/animated.html
demos/progressbar/indeterminate.html [new file with mode: 0644]
demos/progressbar/index.html
tests/unit/progressbar/progressbar_events.js
themes/base/images/animated-overlay.gif [new file with mode: 0644]
themes/base/jquery.ui.progressbar.css
ui/jquery.ui.progressbar.js

index f03070571e45fb7c79062677cc0217174e59991e..5cb1872edbf135106e302de536db1ea73ef88a44 100644 (file)
@@ -9,14 +9,11 @@
        <script src="../../ui/jquery.ui.widget.js"></script>
        <script src="../../ui/jquery.ui.progressbar.js"></script>
        <link rel="stylesheet" href="../demos.css">
-       <style>
-       .ui-progressbar .ui-progressbar-value { background-image: url(images/pbar-ani.gif); }
-       </style>
        <script>
        $(function() {
                $( "#progressbar" ).progressbar({
                        value: 59
-               });
+               }).find( ".ui-progressbar-value div" ).addClass( "ui-progressbar-overlay" );
        });
        </script>
 </head>
 <div class="demo-description">
 <p>
 This progressbar has an animated fill by setting the
-<code>background-image</code>
+<code>ui-progressbar-overlay</code> class
 on the
 <code>.ui-progressbar-value</code>
-element, using css.
+element's overlay div.
 </p>
 </div>
 </body>
diff --git a/demos/progressbar/indeterminate.html b/demos/progressbar/indeterminate.html
new file mode 100644 (file)
index 0000000..34ce6da
--- /dev/null
@@ -0,0 +1,53 @@
+<!doctype html>
+<html lang="en">
+<head>
+       <meta charset="utf-8">
+       <title>jQuery UI Progressbar - Indeterminate Value</title>
+       <link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+       <script src="../../jquery-1.8.3.js"></script>
+       <script src="../../ui/jquery.ui.core.js"></script>
+       <script src="../../ui/jquery.ui.widget.js"></script>
+       <script src="../../ui/jquery.ui.progressbar.js"></script>
+       <link rel="stylesheet" href="../demos.css">
+       <script>
+       $(function() {
+               $( "#progressbar" ).progressbar({
+                       value: false
+               });
+               $( "button" ).on( "click", function( event ) {
+                       var target = $( event.target ),
+                               pbar = $( "#progressbar" ),
+                               pbarValue = pbar.find( ".ui-progressbar-value" );
+
+                       if ( target.is( "#numButton" ) ) {
+                               pbar.progressbar( "option", {
+                                       value: Math.floor( Math.random() * 100 )
+                               });
+                       } else if ( target.is( "#colorButton" ) ) {
+                               pbarValue.css({
+                                       "background": '#' + Math.floor( Math.random() * 16777215 ).toString( 16 )
+                               });
+                       } else if ( target.is( "#falseButton" ) ) {
+                               pbar.progressbar( "option", "value", false );
+                       }
+               });
+       });
+       </script>
+       <style>
+               #progressbar .ui-progressbar-value {
+                       background-color: #CCCCCC;
+               }
+       </style>
+</head>
+<body>
+
+<div id="progressbar"></div>
+<button id="numButton">Random Value - Determinate</button>
+<button id="falseButton">Indeterminate</button>
+<button id="colorButton">Random Color</button>
+
+<div class="demo-description">
+<p>Indeterminate progress bar and switching between determinate and indeterminate styles.</p>
+</div>
+</body>
+</html>
index 5080520c26a98fb608a18285d330d22c8ae823af..df34838165d15f7971a16702498b4cd026499108 100644 (file)
@@ -10,6 +10,7 @@
        <li><a href="default.html">Default functionality</a></li>
        <li><a href="animated.html">Animated</a></li>
        <li><a href="resize.html">Resizable progressbar</a></li>
+       <li><a href="indeterminate.html">Indeterminate</a></li>
 </ul>
 
 </body>
index bb0d3ca5cf530ff27b113f5d82e49d5770bb2d79..fe05182a1383cb6c072369e47ac8a2a5f9c73698 100644 (file)
@@ -23,7 +23,7 @@ test( "change", function() {
 });
 
 test( "complete", function() {
-       expect( 3 );
+       expect( 4 );
        var value,
                changes = 0,
                element = $( "#progressbar" ).progressbar({
@@ -32,12 +32,14 @@ test( "complete", function() {
                                deepEqual( element.progressbar( "value" ), value, "change at " + value );
                        },
                        complete: function() {
-                               equal( changes, 2, "complete triggered after change" );
+                               equal( changes, 3, "complete triggered after change and not on indeterminate" );
                        }
                });
 
        value = 5;
        element.progressbar( "value", value );
+       value = false;
+       element.progressbar( "value", value );
        value = 100;
        element.progressbar( "value", value );
 });
diff --git a/themes/base/images/animated-overlay.gif b/themes/base/images/animated-overlay.gif
new file mode 100644 (file)
index 0000000..d441f75
Binary files /dev/null and b/themes/base/images/animated-overlay.gif differ
index f042a120f02331e3743e332ad76e24006d77d135..5aba50cdf648cee089153eff1438574263650dad 100644 (file)
@@ -9,11 +9,20 @@
  * http://docs.jquery.com/UI/Progressbar#theming
  */
 .ui-progressbar {
-       height:2em;
+       height: 2em;
        text-align: left;
        overflow: hidden;
 }
 .ui-progressbar .ui-progressbar-value {
        margin: -1px;
+       height:100%;
+}
+.ui-progressbar .ui-progressbar-value .ui-progressbar-overlay {
+       background: url("images/animated-overlay.gif");
        height: 100%;
+       filter: alpha(opacity=25);
+       opacity: 0.25;
+}
+.ui-progressbar .ui-progressbar-indeterminate {
+       background-image: none;
 }
index 6c3d7dadd2517cc0b0843d8b2f2ad19a9e7fccd5..0b1ee8aba136b29b0110bcd81855e5872108916f 100644 (file)
@@ -36,7 +36,7 @@ $.widget( "ui.progressbar", {
                                "aria-valuenow": this.options.value
                        });
 
-               this.valueDiv = $( "<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>" )
+               this.valueDiv = $( "<div class='ui-progressbar-value ui-widget-header ui-corner-left'><div></div></div>" )
                        .appendTo( this.element );
 
                this.oldValue = this.options.value;
@@ -71,16 +71,19 @@ $.widget( "ui.progressbar", {
                        val = newValue;
                }
 
+               this.indeterminate = val === false;
+
                // sanitize value
                if ( typeof val !== "number" ) {
                        val = 0;
                }
-               return Math.min( this.options.max, Math.max( this.min, val ) );
+               return this.indeterminate ? false : Math.min( this.options.max, Math.max( this.min, val ) );
        },
 
        _setOptions: function( options ) {
                var val = options.value;
 
+               // Ensure "value" option is set after other values (like max)
                delete options.value;
                this._super( options );
 
@@ -106,26 +109,36 @@ $.widget( "ui.progressbar", {
        },
 
        _percentage: function() {
-               return 100 * this.options.value / this.options.max;
+               return this.indeterminate ? 100 : 100 * this.options.value / this.options.max;
        },
 
        _refreshValue: function() {
-               var percentage = this._percentage();
+               var value = this.options.value,
+                       percentage = this._percentage(),
+                       overlay = this.valueDiv.children().eq( 0 );
+
+               overlay.toggleClass( "ui-progressbar-overlay", this.indeterminate );
+               this.valueDiv.toggleClass( "ui-progressbar-indeterminate", this.indeterminate );
 
-               if ( this.oldValue !== this.options.value ) {
-                       this.oldValue = this.options.value;
+               if ( this.oldValue !== value ) {
+                       this.oldValue = value;
                        this._trigger( "change" );
                }
-               if ( this.options.value === this.options.max ) {
+               if ( value === this.options.max ) {
                        this._trigger( "complete" );
                }
 
                this.valueDiv
-                       .toggle( this.options.value > this.min )
-                       .toggleClass( "ui-corner-right", this.options.value === this.options.max )
+                       .toggle( this.indeterminate || value > this.min )
+                       .toggleClass( "ui-corner-right", value === this.options.max )
                        .width( percentage.toFixed(0) + "%" );
-               this.element.attr( "aria-valuemax", this.options.max );
-               this.element.attr( "aria-valuenow", this.options.value );
+               if ( this.indeterminate ) {
+                       this.element.removeAttr( "aria-valuemax" );
+                       this.element.removeAttr( "aria-valuenow" );
+               } else {
+                       this.element.attr( "aria-valuemax", this.options.max );
+                       this.element.attr( "aria-valuenow", value );
+               }
        }
 });