summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2015-12-11 02:03:07 -0200
committerGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2015-12-11 02:03:07 -0200
commite14c76bea5cce1cf82b1b71dccadabd0ca859cde (patch)
tree97c2b0206751c08d753ad2b52a5a64b34b3e6d0e
parent0cea0c8dacf009e2304ab7af62a85716292e352d (diff)
downloadnautilus-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.c10
-rw-r--r--src/gtk/gtkplacesviewrow.c143
-rw-r--r--src/gtk/gtkplacesviewrow.ui24
-rw-r--r--src/gtk/gtkplacesviewrowprivate.h6
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 */