forked from AuroraMiddleware/gtk
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:
parent
0d00e0c3d3
commit
fe6030a41b
@ -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
|
||||||
|
@ -60,35 +60,42 @@
|
|||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkButton" id="eject_button">
|
<object class="GtkStack" id="mount_stack">
|
||||||
<property name="visible">1</property>
|
<property name="visible">1</property>
|
||||||
<property name="halign">end</property>
|
<property name="hhomogeneous">1</property>
|
||||||
<property name="valign">center</property>
|
<property name="vhomogeneous">1</property>
|
||||||
<property name="tooltip-text" translatable="yes">Unmount</property>
|
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkImage" id="eject_icon">
|
<object class="GtkButton" id="eject_button">
|
||||||
<property name="visible">1</property>
|
<property name="visible">1</property>
|
||||||
<property name="icon-name">media-eject-symbolic</property>
|
<property name="halign">center</property>
|
||||||
<property name="icon-size">1</property>
|
<property name="valign">center</property>
|
||||||
|
<property name="tooltip-text" translatable="yes">Unmount</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkImage" id="eject_icon">
|
||||||
|
<property name="visible">1</property>
|
||||||
|
<property name="icon-name">media-eject-symbolic</property>
|
||||||
|
<property name="icon-size">1</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<style>
|
||||||
|
<class name="image-button"/>
|
||||||
|
<class name="sidebar-button"/>
|
||||||
|
</style>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkSpinner" id="busy_spinner">
|
||||||
|
<property name="visible">1</property>
|
||||||
|
<property name="active">1</property>
|
||||||
|
<property name="halign">center</property>
|
||||||
|
<property name="valign">center</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<style>
|
|
||||||
<class name="image-button"/>
|
|
||||||
<class name="sidebar-button"/>
|
|
||||||
</style>
|
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="position">4</property>
|
<property name="position">4</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
|
||||||
<object class="GtkSpinner" id="busy_spinner">
|
|
||||||
<property name="active">1</property>
|
|
||||||
</object>
|
|
||||||
<packing>
|
|
||||||
<property name="position">5</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
|
Loading…
Reference in New Issue
Block a user