gtkplacesviewrow: stop busy_spinner from offsetting the other widgets when visible
...by putting it in a stack. The busy_spinner and eject_button are mutually exclusive, but only the latter was coded to ensure that its visibility did not cause the rest of the row to reflow. By putting both widgets in a stack and setting child_visible on that, the row allocates enough space to show one - or none - at once, avoiding any misalignment. https://bugzilla.gnome.org/show_bug.cgi?id=772345 https://bugzilla.gnome.org/show_bug.cgi?id=772348
This commit is contained in:
		@ -33,6 +33,7 @@
 | 
				
			|||||||
#include "gtkintl.h"
 | 
					#include "gtkintl.h"
 | 
				
			||||||
#include "gtklabel.h"
 | 
					#include "gtklabel.h"
 | 
				
			||||||
#include "gtkspinner.h"
 | 
					#include "gtkspinner.h"
 | 
				
			||||||
 | 
					#include "gtkstack.h"
 | 
				
			||||||
#include "gtktypebuiltins.h"
 | 
					#include "gtktypebuiltins.h"
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
#include <gtk/gtk.h>
 | 
					#include <gtk/gtk.h>
 | 
				
			||||||
@ -43,6 +44,7 @@ struct _GtkPlacesViewRow
 | 
				
			|||||||
  GtkListBoxRow  parent_instance;
 | 
					  GtkListBoxRow  parent_instance;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  GtkLabel      *available_space_label;
 | 
					  GtkLabel      *available_space_label;
 | 
				
			||||||
 | 
					  GtkStack      *mount_stack;
 | 
				
			||||||
  GtkSpinner    *busy_spinner;
 | 
					  GtkSpinner    *busy_spinner;
 | 
				
			||||||
  GtkButton     *eject_button;
 | 
					  GtkButton     *eject_button;
 | 
				
			||||||
  GtkImage      *eject_icon;
 | 
					  GtkImage      *eject_icon;
 | 
				
			||||||
@ -285,15 +287,15 @@ gtk_places_view_row_set_property (GObject      *object,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    case PROP_MOUNT:
 | 
					    case PROP_MOUNT:
 | 
				
			||||||
      g_set_object (&self->mount, g_value_get_object (value));
 | 
					      g_set_object (&self->mount, g_value_get_object (value));
 | 
				
			||||||
 | 
					      if (self->mount != NULL)
 | 
				
			||||||
      /*
 | 
					        {
 | 
				
			||||||
       * When we hide the eject button, no size is allocated for it. Since
 | 
					          gtk_stack_set_visible_child (self->mount_stack, GTK_WIDGET (self->eject_button));
 | 
				
			||||||
       * we want to have alignment between rows, it needs an empty space
 | 
					          gtk_widget_set_child_visible (GTK_WIDGET (self->mount_stack), TRUE);
 | 
				
			||||||
       * when the eject button is not available. So, call then
 | 
					        }
 | 
				
			||||||
       * gtk_widget_set_child_visible(), which makes the button allocate the
 | 
					      else
 | 
				
			||||||
       * size but it stays hidden when needed.
 | 
					        {
 | 
				
			||||||
       */
 | 
					          gtk_widget_set_child_visible (GTK_WIDGET (self->mount_stack), FALSE);
 | 
				
			||||||
      gtk_widget_set_child_visible (GTK_WIDGET (self->eject_button), self->mount != NULL);
 | 
					        }
 | 
				
			||||||
      measure_available_space (self);
 | 
					      measure_available_space (self);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -376,6 +378,7 @@ gtk_places_view_row_class_init (GtkPlacesViewRowClass *klass)
 | 
				
			|||||||
  gtk_widget_class_set_template_from_resource (widget_class, "/org/gtk/libgtk/ui/gtkplacesviewrow.ui");
 | 
					  gtk_widget_class_set_template_from_resource (widget_class, "/org/gtk/libgtk/ui/gtkplacesviewrow.ui");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  gtk_widget_class_bind_template_child (widget_class, GtkPlacesViewRow, available_space_label);
 | 
					  gtk_widget_class_bind_template_child (widget_class, GtkPlacesViewRow, available_space_label);
 | 
				
			||||||
 | 
					  gtk_widget_class_bind_template_child (widget_class, GtkPlacesViewRow, mount_stack);
 | 
				
			||||||
  gtk_widget_class_bind_template_child (widget_class, GtkPlacesViewRow, busy_spinner);
 | 
					  gtk_widget_class_bind_template_child (widget_class, GtkPlacesViewRow, busy_spinner);
 | 
				
			||||||
  gtk_widget_class_bind_template_child (widget_class, GtkPlacesViewRow, eject_button);
 | 
					  gtk_widget_class_bind_template_child (widget_class, GtkPlacesViewRow, eject_button);
 | 
				
			||||||
  gtk_widget_class_bind_template_child (widget_class, GtkPlacesViewRow, eject_icon);
 | 
					  gtk_widget_class_bind_template_child (widget_class, GtkPlacesViewRow, eject_icon);
 | 
				
			||||||
@ -447,7 +450,15 @@ gtk_places_view_row_set_busy (GtkPlacesViewRow *row,
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  g_return_if_fail (GTK_IS_PLACES_VIEW_ROW (row));
 | 
					  g_return_if_fail (GTK_IS_PLACES_VIEW_ROW (row));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  gtk_widget_set_visible (GTK_WIDGET (row->busy_spinner), is_busy);
 | 
					  if (is_busy)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      gtk_stack_set_visible_child (row->mount_stack, GTK_WIDGET (row->busy_spinner));
 | 
				
			||||||
 | 
					      gtk_widget_set_child_visible (GTK_WIDGET (row->mount_stack), TRUE);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      gtk_widget_set_child_visible (GTK_WIDGET (row->mount_stack), FALSE);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
gboolean
 | 
					gboolean
 | 
				
			||||||
 | 
				
			|||||||
@ -59,10 +59,15 @@
 | 
				
			|||||||
                <property name="position">3</property>
 | 
					                <property name="position">3</property>
 | 
				
			||||||
              </packing>
 | 
					              </packing>
 | 
				
			||||||
            </child>
 | 
					            </child>
 | 
				
			||||||
 | 
					            <child>
 | 
				
			||||||
 | 
					              <object class="GtkStack" id="mount_stack">
 | 
				
			||||||
 | 
					                <property name="visible">1</property>
 | 
				
			||||||
 | 
					                <property name="hhomogeneous">1</property>
 | 
				
			||||||
 | 
					                <property name="vhomogeneous">1</property>
 | 
				
			||||||
                <child>
 | 
					                <child>
 | 
				
			||||||
                  <object class="GtkButton" id="eject_button">
 | 
					                  <object class="GtkButton" id="eject_button">
 | 
				
			||||||
                    <property name="visible">1</property>
 | 
					                    <property name="visible">1</property>
 | 
				
			||||||
                <property name="halign">end</property>
 | 
					                    <property name="halign">center</property>
 | 
				
			||||||
                    <property name="valign">center</property>
 | 
					                    <property name="valign">center</property>
 | 
				
			||||||
                    <property name="tooltip-text" translatable="yes">Unmount</property>
 | 
					                    <property name="tooltip-text" translatable="yes">Unmount</property>
 | 
				
			||||||
                    <child>
 | 
					                    <child>
 | 
				
			||||||
@ -77,16 +82,18 @@
 | 
				
			|||||||
                      <class name="sidebar-button"/>
 | 
					                      <class name="sidebar-button"/>
 | 
				
			||||||
                    </style>
 | 
					                    </style>
 | 
				
			||||||
                  </object>
 | 
					                  </object>
 | 
				
			||||||
              <packing>
 | 
					 | 
				
			||||||
                <property name="position">4</property>
 | 
					 | 
				
			||||||
              </packing>
 | 
					 | 
				
			||||||
                </child>
 | 
					                </child>
 | 
				
			||||||
                <child>
 | 
					                <child>
 | 
				
			||||||
                  <object class="GtkSpinner" id="busy_spinner">
 | 
					                  <object class="GtkSpinner" id="busy_spinner">
 | 
				
			||||||
 | 
					                    <property name="visible">1</property>
 | 
				
			||||||
                    <property name="active">1</property>
 | 
					                    <property name="active">1</property>
 | 
				
			||||||
 | 
					                    <property name="halign">center</property>
 | 
				
			||||||
 | 
					                    <property name="valign">center</property>
 | 
				
			||||||
 | 
					                  </object>
 | 
				
			||||||
 | 
					                </child>
 | 
				
			||||||
              </object>
 | 
					              </object>
 | 
				
			||||||
              <packing>
 | 
					              <packing>
 | 
				
			||||||
                <property name="position">5</property>
 | 
					                <property name="position">4</property>
 | 
				
			||||||
              </packing>
 | 
					              </packing>
 | 
				
			||||||
            </child>
 | 
					            </child>
 | 
				
			||||||
          </object>
 | 
					          </object>
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user