LevelBar: Really fix underallocation of blocks
authorDaniel Boles <dboles@src.gnome.org>
Sat, 12 Aug 2017 14:51:45 +0000 (15:51 +0100)
committerDaniel Boles <dboles@src.gnome.org>
Mon, 28 Aug 2017 23:03:47 +0000 (00:03 +0100)
Themes should not enforce min sizes on blocks in continuous mode; in
this case, the filled block should be as large as it needs to be to
reflect the current value, and no larger or smaller than that. So, the
fact that the minimal size was selected on just levelbar block is wrong:
we should also require the levelbar.discrete class to apply min sizes.

The widget should enforce whatever correct minimum size results from the
above fix, by reapplying commit 78b4885fe8850e132d8bb06df8ab90ac6c2033e0

Except: we should not allocate/draw the filled block if the value is 0,
as in this case, the LevelBar should be empty, not have a min-size fill.

https://bugzilla.gnome.org/show_bug.cgi?id=783649

gtk/gtklevelbar.c
gtk/theme/Adwaita/_common.scss
gtk/theme/Adwaita/gtk-contained-dark.css
gtk/theme/Adwaita/gtk-contained.css
gtk/theme/HighContrast/_common.scss
gtk/theme/HighContrast/gtk-contained-inverse.css
gtk/theme/HighContrast/gtk-contained.css

index 8cb46ce059f7c8a6378964cfbfe155e5ef42108a..7924b7095be85211d5184477fbf7fcb4bba54a99 100644 (file)
@@ -342,7 +342,8 @@ gtk_level_bar_draw_fill_continuous (GtkLevelBar *self,
   gtk_css_gadget_draw (self->priv->block_gadget[inverted ? 0 : 1], cr);
 
   /* now render the filled part on top of it */
-  gtk_css_gadget_draw (self->priv->block_gadget[inverted ? 1 : 0], cr);
+  if (self->priv->cur_value != 0)
+    gtk_css_gadget_draw (self->priv->block_gadget[inverted ? 1 : 0], cr);
 }
 
 static void
@@ -458,6 +459,7 @@ gtk_level_bar_allocate_trough_continuous (GtkLevelBar *self,
   GtkAllocation block_area, clip;
   gdouble fill_percentage;
   gboolean inverted;
+  int block_min;
 
   inverted = gtk_level_bar_get_real_inverted (self);
 
@@ -467,14 +469,23 @@ gtk_level_bar_allocate_trough_continuous (GtkLevelBar *self,
                            baseline,
                            out_clip);
 
+  if (self->priv->cur_value == 0)
+    return;
+
   /* now allocate the filled part */
   block_area = *allocation;
   fill_percentage = (self->priv->cur_value - self->priv->min_value) /
     (self->priv->max_value - self->priv->min_value);
 
+  gtk_css_gadget_get_preferred_size (self->priv->block_gadget[inverted ? 1 : 0],
+                                     self->priv->orientation, -1,
+                                     &block_min, NULL,
+                                     NULL, NULL);
+
   if (self->priv->orientation == GTK_ORIENTATION_HORIZONTAL)
     {
       block_area.width = (gint) floor (block_area.width * fill_percentage);
+      block_area.width = MAX (block_area.width, block_min);
 
       if (inverted)
         block_area.x += allocation->width - block_area.width;
@@ -482,6 +493,7 @@ gtk_level_bar_allocate_trough_continuous (GtkLevelBar *self,
   else
     {
       block_area.height = (gint) floor (block_area.height * fill_percentage);
+      block_area.height = MAX (block_area.height, block_min);
 
       if (inverted)
         block_area.y += allocation->height - block_area.height;
index f1e0cea00f42a0e84222e97cae521a12075992a0..7a76663b0287b7d66f3db98efcae0850301aadbd 100644 (file)
@@ -3368,14 +3368,26 @@ progressbar {
  * Level Bar *
  *************/
 levelbar {
-  block {
-    min-width: 32px;
-    min-height: 1px;
+  &.horizontal {
+    block {
+      min-height: 1px;
+    }
+
+    &.discrete block {
+      margin: 0 1px;
+      min-width: 32px;
+    }
   }
 
-  &.vertical block {
-    min-width: 1px;
-    min-height: 32px;
+  &.vertical {
+    block {
+      min-width: 1px;
+    }
+
+    &.discrete block {
+      margin: 1px 0;
+      min-height: 32px;
+    }
   }
 
   &:backdrop { transition: $backdrop_transition; }
@@ -3389,10 +3401,6 @@ levelbar {
     &:backdrop { @include entry(backdrop); }
   }
 
-  &.horizontal.discrete block { margin: 0 1px; }
-
-  &.vertical.discrete block { margin: 1px 0; }
-
   block {
     border: 1px solid;
     border-radius: 1px;
index 92418933db455c5151c6ece2285d4d04b416baaf..7ad9b23505b6410987bd9488bd112a44777fad78 100644 (file)
@@ -1445,9 +1445,13 @@ progressbar.osd progress { border-style: none; border-radius: 0; }
 progressbar trough.empty progress { all: unset; }
 
 /************* Level Bar * */
-levelbar block { min-width: 32px; min-height: 1px; }
+levelbar.horizontal block { min-height: 1px; }
 
-levelbar.vertical block { min-width: 1px; min-height: 32px; }
+levelbar.horizontal.discrete block { margin: 0 1px; min-width: 32px; }
+
+levelbar.vertical block { min-width: 1px; }
+
+levelbar.vertical.discrete block { margin: 1px 0; min-height: 32px; }
 
 levelbar:backdrop { transition: 200ms ease-out; }
 
@@ -1455,10 +1459,6 @@ levelbar trough { border: 1px solid; padding: 2px; border-radius: 3px; color: wh
 
 levelbar trough:backdrop { color: #d3d4d5; border-color: #202425; background-color: #252a2c; box-shadow: none; }
 
-levelbar.horizontal.discrete block { margin: 0 1px; }
-
-levelbar.vertical.discrete block { margin: 1px 0; }
-
 levelbar block { border: 1px solid; border-radius: 1px; }
 
 levelbar block.low { border-color: #f57900; background-color: #f57900; }
index 9fa66b7c472956f6416a44b7049ebc6dea7331f7..7367fc22aedd4056705350e5664c5eac63ee929f 100644 (file)
@@ -1465,9 +1465,13 @@ progressbar.osd progress { border-style: none; border-radius: 0; }
 progressbar trough.empty progress { all: unset; }
 
 /************* Level Bar * */
-levelbar block { min-width: 32px; min-height: 1px; }
+levelbar.horizontal block { min-height: 1px; }
 
-levelbar.vertical block { min-width: 1px; min-height: 32px; }
+levelbar.horizontal.discrete block { margin: 0 1px; min-width: 32px; }
+
+levelbar.vertical block { min-width: 1px; }
+
+levelbar.vertical.discrete block { margin: 1px 0; min-height: 32px; }
 
 levelbar:backdrop { transition: 200ms ease-out; }
 
@@ -1475,10 +1479,6 @@ levelbar trough { border: 1px solid; padding: 2px; border-radius: 3px; color: bl
 
 levelbar trough:backdrop { color: #323232; border-color: #c0c0bd; background-color: #fcfcfc; box-shadow: none; }
 
-levelbar.horizontal.discrete block { margin: 0 1px; }
-
-levelbar.vertical.discrete block { margin: 1px 0; }
-
 levelbar block { border: 1px solid; border-radius: 1px; }
 
 levelbar block.low { border-color: #8f4700; background-color: #f57900; }
index 715ac769ca34e2c44cf4564061c2b41dbe9026c7..d53f38bc71af8e885a185f32d189794039c9d73a 100644 (file)
@@ -2525,17 +2525,29 @@ levelbar {
       @include entry(backdrop);
     }
   }
-  & block {
-    min-width: 32px;
-    min-height: 1px;
+
+  &.horizontal {
+    block {
+      min-height: 1px;
+    }
+
+    &.discrete block {
+      margin: 0 1px;
+      min-width: 32px;
+    }
   }
-  &.vertical block {
-    min-width: 1px;
-    min-height: 32px;
+
+  &.vertical {
+    block {
+      min-width: 1px;
+    }
+
+    &.discrete block {
+      margin: 1px 0;
+      min-height: 32px;
+    }
   }
 
-  &.horizontal.discrete block { margin: 0 1px; }
-  &.vertical.discrete block { margin: 1px 0; }
   & block.filled.low {
     border-color: darken($warning_color,10%);
     background-color: $warning_color;
index d79fa1a850bb02dc28a8a576b2e750e54d3d29d0..7ed1c6457cda18ee7a1af480f90bf6e57574c0fc 100644 (file)
@@ -1114,13 +1114,13 @@ levelbar trough { padding: 2px; border-radius: 3px; background-color: transparen
 
 levelbar trough:backdrop { background-color: transparent; border-style: solid; background-image: linear-gradient(to bottom, #090909, #111 90%); color: #fff; background-image: linear-gradient(to bottom, #111, #111); box-shadow: 0 1px rgba(255, 255, 255, 0); }
 
-levelbar block { min-width: 32px; min-height: 1px; }
+levelbar.horizontal block { min-height: 1px; }
 
-levelbar.vertical block { min-width: 1px; min-height: 32px; }
+levelbar.horizontal.discrete block { margin: 0 1px; min-width: 32px; }
 
-levelbar.horizontal.discrete block { margin: 0 1px; }
+levelbar.vertical block { min-width: 1px; }
 
-levelbar.vertical.discrete block { margin: 1px 0; }
+levelbar.vertical.discrete block { margin: 1px 0; min-height: 32px; }
 
 levelbar block.filled.low { border-color: #c26000; background-color: #f57900; }
 
index bcdf77d14e4b287a6826b4c72c6c77ff0b5f20eb..e67ce4824321518f02c8163c86af3274b2ce69d2 100644 (file)
@@ -1120,13 +1120,13 @@ levelbar trough { padding: 2px; border-radius: 3px; background-color: transparen
 
 levelbar trough:backdrop { background-color: transparent; border-style: solid; background-image: linear-gradient(to bottom, #f7f7f7, #fff 90%); color: #000; background-image: linear-gradient(to bottom, #fff, #fff); box-shadow: 0 1px rgba(255, 255, 255, 0); }
 
-levelbar block { min-width: 32px; min-height: 1px; }
+levelbar.horizontal block { min-height: 1px; }
 
-levelbar.vertical block { min-width: 1px; min-height: 32px; }
+levelbar.horizontal.discrete block { margin: 0 1px; min-width: 32px; }
 
-levelbar.horizontal.discrete block { margin: 0 1px; }
+levelbar.vertical block { min-width: 1px; }
 
-levelbar.vertical.discrete block { margin: 1px 0; }
+levelbar.vertical.discrete block { margin: 1px 0; min-height: 32px; }
 
 levelbar block.filled.low { border-color: #c26000; background-color: #f57900; }