diff options
author | Georges Basile Stavracas Neto <georges.stavracas@gmail.com> | 2015-12-11 02:03:07 -0200 |
---|---|---|
committer | Georges Basile Stavracas Neto <georges.stavracas@gmail.com> | 2015-12-11 02:03:07 -0200 |
commit | e14c76bea5cce1cf82b1b71dccadabd0ca859cde (patch) | |
tree | 97c2b0206751c08d753ad2b52a5a64b34b3e6d0e | |
parent | 0cea0c8dacf009e2304ab7af62a85716292e352d (diff) | |
download | nautilus-e14c76bea5cce1cf82b1b71dccadabd0ca859cde.tar.gz |
placesview: update to upstream code
This commit updates the GtkPlacesView code
to match upstream's one. The gains:
- Better alignment of labels
- Measurement of available disk space
-rw-r--r-- | src/gtk/gtkplacesview.c | 10 | ||||
-rw-r--r-- | src/gtk/gtkplacesviewrow.c | 143 | ||||
-rw-r--r-- | src/gtk/gtkplacesviewrow.ui | 24 | ||||
-rw-r--r-- | src/gtk/gtkplacesviewrowprivate.h | 6 |
4 files changed, 176 insertions, 7 deletions
diff --git a/src/gtk/gtkplacesview.c b/src/gtk/gtkplacesview.c index f0d0cde88..484b4fcab 100644 --- a/src/gtk/gtkplacesview.c +++ b/src/gtk/gtkplacesview.c @@ -70,6 +70,9 @@ struct _GtkPlacesViewPrivate GtkWidget *network_placeholder; GtkWidget *network_placeholder_label; + GtkSizeGroup *path_size_group; + GtkSizeGroup *space_size_group; + GtkEntryCompletion *address_entry_completion; GtkListStore *completion_store; @@ -404,6 +407,8 @@ gtk_places_view_finalize (GObject *object) g_clear_object (&priv->volume_monitor); g_clear_object (&priv->cancellable); g_clear_object (&priv->networks_fetching_cancellable); + g_clear_object (&priv->path_size_group); + g_clear_object (&priv->space_size_group); G_OBJECT_CLASS (gtk_places_view_parent_class)->finalize (object); } @@ -672,6 +677,9 @@ insert_row (GtkPlacesView *view, G_CALLBACK (on_eject_button_clicked), row); + gtk_places_view_row_set_path_size_group (GTK_PLACES_VIEW_ROW (row), priv->path_size_group); + gtk_places_view_row_set_space_size_group (GTK_PLACES_VIEW_ROW (row), priv->space_size_group); + gtk_container_add (GTK_CONTAINER (priv->listbox), row); } @@ -2252,6 +2260,8 @@ gtk_places_view_init (GtkPlacesView *self) priv->volume_monitor = g_volume_monitor_get (); priv->open_flags = GTK_PLACES_OPEN_NORMAL; + priv->path_size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + priv->space_size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); gtk_widget_init_template (GTK_WIDGET (self)); } diff --git a/src/gtk/gtkplacesviewrow.c b/src/gtk/gtkplacesviewrow.c index 4b67b1879..33a9fa852 100644 --- a/src/gtk/gtkplacesviewrow.c +++ b/src/gtk/gtkplacesviewrow.c @@ -28,6 +28,7 @@ struct _GtkPlacesViewRow { GtkListBoxRow parent_instance; + GtkLabel *available_space_label; GtkSpinner *busy_spinner; GtkButton *eject_button; GtkImage *eject_icon; @@ -40,6 +41,8 @@ struct _GtkPlacesViewRow GMount *mount; GFile *file; + GCancellable *cancellable; + gint is_network : 1; }; @@ -60,13 +63,123 @@ enum { static GParamSpec *properties [LAST_PROP]; static void +measure_available_space_finished (GObject *object, + GAsyncResult *res, + gpointer user_data) +{ + GtkPlacesViewRow *row = user_data; + GFileInfo *info; + GError *error; + guint64 free_space; + guint64 total_space; + gchar *formatted_free_size; + gchar *formatted_total_size; + gchar *label; + + error = NULL; + + info = g_file_query_filesystem_info_finish (G_FILE (object), + res, + &error); + + if (error) + { + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED) && + !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_MOUNTED)) + { + g_warning ("Failed to measure available space: %s", error->message); + } + + g_clear_error (&error); + goto out; + } + + if (!g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_FILESYSTEM_FREE) || + !g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_FILESYSTEM_SIZE)) + { + g_object_unref (info); + goto out; + } + + free_space = g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_FILESYSTEM_FREE); + total_space = g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_FILESYSTEM_SIZE); + + formatted_free_size = g_format_size (free_space); + formatted_total_size = g_format_size (total_space); + /* Translators: respectively, free and total space of the drive */ + label = g_strdup_printf (_("%s / %s available"), formatted_free_size, formatted_total_size); + + gtk_label_set_label (row->available_space_label, label); + + g_object_unref (info); + g_free (formatted_total_size); + g_free (formatted_free_size); + g_free (label); +out: + g_object_unref (object); +} + +static void +measure_available_space (GtkPlacesViewRow *row) +{ + gboolean should_measure; + + should_measure = (!row->is_network && (row->volume || row->mount || row->file)); + + gtk_label_set_label (row->available_space_label, ""); + gtk_widget_set_visible (GTK_WIDGET (row->available_space_label), should_measure); + + if (should_measure) + { + GFile *file = NULL; + + if (row->file) + { + file = g_object_ref (row->file); + } + else if (row->mount) + { + file = g_mount_get_root (row->mount); + } + else if (row->volume) + { + GMount *mount; + + mount = g_volume_get_mount (row->volume); + + if (mount) + file = g_mount_get_root (row->mount); + + g_clear_object (&mount); + } + + if (file) + { + g_cancellable_cancel (row->cancellable); + g_clear_object (&row->cancellable); + row->cancellable = g_cancellable_new (); + + g_file_query_filesystem_info_async (file, + G_FILE_ATTRIBUTE_FILESYSTEM_FREE "," G_FILE_ATTRIBUTE_FILESYSTEM_SIZE, + G_PRIORITY_DEFAULT, + row->cancellable, + measure_available_space_finished, + row); + } + } +} + +static void gtk_places_view_row_finalize (GObject *object) { GtkPlacesViewRow *self = GTK_PLACES_VIEW_ROW (object); + g_cancellable_cancel (self->cancellable); + g_clear_object (&self->volume); g_clear_object (&self->mount); g_clear_object (&self->file); + g_clear_object (&self->cancellable); G_OBJECT_CLASS (gtk_places_view_row_parent_class)->finalize (object); } @@ -149,15 +262,26 @@ gtk_places_view_row_set_property (GObject *object, case PROP_MOUNT: g_set_object (&self->mount, g_value_get_object (value)); - gtk_widget_set_visible (GTK_WIDGET (self->eject_button), self->mount != NULL); + + /* + * When we hide the eject button, no size is allocated for it. Since + * we want to have alignment between rows, it needs an empty space + * when the eject button is not available. So, call then + * gtk_widget_set_child_visible(), which makes the button allocate the + * size but it stays hidden when needed. + */ + gtk_widget_set_child_visible (GTK_WIDGET (self->eject_button), self->mount != NULL); + measure_available_space (self); break; case PROP_FILE: g_set_object (&self->file, g_value_get_object (value)); + measure_available_space (self); break; case PROP_IS_NETWORK: gtk_places_view_row_set_is_network (self, g_value_get_boolean (value)); + measure_available_space (self); break; default: @@ -228,6 +352,7 @@ gtk_places_view_row_class_init (GtkPlacesViewRowClass *klass) gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/nautilus/gtk/gtkplacesviewrow.ui"); + gtk_widget_class_bind_template_child (widget_class, GtkPlacesViewRow, available_space_label); 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_icon); @@ -324,3 +449,19 @@ gtk_places_view_row_set_is_network (GtkPlacesViewRow *row, gtk_widget_set_tooltip_text (GTK_WIDGET (row->eject_button), is_network ? _("Disconnect") : _("Unmount")); } } + +void +gtk_places_view_row_set_path_size_group (GtkPlacesViewRow *row, + GtkSizeGroup *group) +{ + if (group) + gtk_size_group_add_widget (group, GTK_WIDGET (row->path_label)); +} + +void +gtk_places_view_row_set_space_size_group (GtkPlacesViewRow *row, + GtkSizeGroup *group) +{ + if (group) + gtk_size_group_add_widget (group, GTK_WIDGET (row->available_space_label)); +} diff --git a/src/gtk/gtkplacesviewrow.ui b/src/gtk/gtkplacesviewrow.ui index d1e923b19..e68502c1b 100644 --- a/src/gtk/gtkplacesviewrow.ui +++ b/src/gtk/gtkplacesviewrow.ui @@ -39,6 +39,7 @@ <property name="can_focus">False</property> <property name="hexpand">True</property> <property name="xalign">0</property> + <property name="ellipsize">end</property> </object> <packing> <property name="expand">False</property> @@ -47,13 +48,24 @@ </packing> </child> <child> + <object class="GtkLabel" id="available_space_label"> + <property name="visible">False</property> + <property name="xalign">1</property> + <style> + <class name="dim-label" /> + </style> + </object> + <packing> + <property name="position">2</property> + </packing> + </child> + <child> <object class="GtkLabel" id="path_label"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="justify">right</property> <property name="ellipsize">middle</property> - <property name="xalign">1</property> - <property name="width_chars">15</property> + <property name="xalign">0</property> <property name="max_width_chars">15</property> <style> <class name="dim-label"/> @@ -62,12 +74,12 @@ <packing> <property name="expand">False</property> <property name="fill">True</property> - <property name="position">2</property> + <property name="position">3</property> </packing> </child> <child> <object class="GtkButton" id="eject_button"> - <property name="visible">False</property> + <property name="visible">True</property> <property name="halign">end</property> <property name="valign">center</property> <property name="tooltip-text" translatable="yes">Unmount</property> @@ -86,7 +98,7 @@ <packing> <property name="expand">False</property> <property name="fill">True</property> - <property name="position">3</property> + <property name="position">4</property> </packing> </child> <child> @@ -98,7 +110,7 @@ <packing> <property name="expand">False</property> <property name="fill">True</property> - <property name="position">4</property> + <property name="position">5</property> </packing> </child> </object> diff --git a/src/gtk/gtkplacesviewrowprivate.h b/src/gtk/gtkplacesviewrowprivate.h index 59294dec6..a0de3fcf3 100644 --- a/src/gtk/gtkplacesviewrowprivate.h +++ b/src/gtk/gtkplacesviewrowprivate.h @@ -48,6 +48,12 @@ gboolean gtk_places_view_row_get_is_network (GtkPlacesViewR void gtk_places_view_row_set_is_network (GtkPlacesViewRow *row, gboolean is_network); +void gtk_places_view_row_set_path_size_group (GtkPlacesViewRow *row, + GtkSizeGroup *group); + +void gtk_places_view_row_set_space_size_group (GtkPlacesViewRow *row, + GtkSizeGroup *group); + G_END_DECLS #endif /* GTK_PLACES_VIEW_ROW_H */ |