diff --git a/gtk/gtkplacesview.c b/gtk/gtkplacesview.c index ca02fe04b5..3721be71bf 100644 --- a/gtk/gtkplacesview.c +++ b/gtk/gtkplacesview.c @@ -701,6 +701,7 @@ add_volume (GtkPlacesView *view, "volume", volume, "mount", mount, "file", NULL, + "is-network", is_network, NULL); insert_row (view, row, is_network); @@ -748,6 +749,7 @@ add_mount (GtkPlacesView *view, "volume", NULL, "mount", mount, "file", NULL, + "is-network", is_network, NULL); insert_row (view, row, is_network); @@ -1314,10 +1316,12 @@ build_popup_menu (GtkPlacesView *view, GtkWidget *item; GMount *mount; GFile *file; + gboolean is_network; priv = gtk_places_view_get_instance_private (view); mount = gtk_places_view_row_get_mount (row); file = gtk_places_view_row_get_file (row); + is_network = gtk_places_view_row_get_is_network (row); priv->popup_menu = gtk_menu_new (); gtk_style_context_add_class (gtk_widget_get_style_context (priv->popup_menu), @@ -1373,7 +1377,7 @@ build_popup_menu (GtkPlacesView *view, /* Mount/Unmount items */ if (mount) { - item = gtk_menu_item_new_with_mnemonic (_("_Unmount")); + item = gtk_menu_item_new_with_mnemonic (is_network ? P_("_Disconnect") : P_("_Unmount")); g_signal_connect (item, "activate", G_CALLBACK (unmount_cb), @@ -1383,7 +1387,7 @@ build_popup_menu (GtkPlacesView *view, } else { - item = gtk_menu_item_new_with_mnemonic (_("_Mount")); + item = gtk_menu_item_new_with_mnemonic (is_network ? P_("_Connect") : P_("_Mount")); g_signal_connect (item, "activate", G_CALLBACK (mount_cb), diff --git a/gtk/gtkplacesviewrow.c b/gtk/gtkplacesviewrow.c index 641399f709..3e66398e29 100644 --- a/gtk/gtkplacesviewrow.c +++ b/gtk/gtkplacesviewrow.c @@ -31,6 +31,7 @@ struct _GtkPlacesViewRow GtkSpinner *busy_spinner; GtkButton *eject_button; + GtkImage *eject_icon; GtkEventBox *event_box; GtkImage *icon_image; GtkLabel *name_label; @@ -39,6 +40,8 @@ struct _GtkPlacesViewRow GVolume *volume; GMount *mount; GFile *file; + + gint is_network : 1; }; G_DEFINE_TYPE (GtkPlacesViewRow, gtk_places_view_row, GTK_TYPE_LIST_BOX_ROW) @@ -51,6 +54,7 @@ enum { PROP_VOLUME, PROP_MOUNT, PROP_FILE, + PROP_IS_NETWORK, LAST_PROP }; @@ -107,6 +111,10 @@ gtk_places_view_row_get_property (GObject *object, g_value_set_object (value, self->file); break; + case PROP_IS_NETWORK: + g_value_set_boolean (value, self->is_network); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } @@ -149,6 +157,10 @@ gtk_places_view_row_set_property (GObject *object, g_set_object (&self->file, g_value_get_object (value)); break; + case PROP_IS_NETWORK: + gtk_places_view_row_set_is_network (self, g_value_get_boolean (value)); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } @@ -206,12 +218,20 @@ gtk_places_view_row_class_init (GtkPlacesViewRowClass *klass) G_TYPE_FILE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); + properties[PROP_IS_NETWORK] = + g_param_spec_boolean ("is-network", + P_("Whether the row represents a network location"), + P_("Whether the row represents a network location"), + FALSE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); + g_object_class_install_properties (object_class, LAST_PROP, properties); gtk_widget_class_set_template_from_resource (widget_class, "/org/gtk/libgtk/ui/gtkplacesviewrow.ui"); 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); gtk_widget_class_bind_template_child (widget_class, GtkPlacesViewRow, event_box); gtk_widget_class_bind_template_child (widget_class, GtkPlacesViewRow, icon_image); gtk_widget_class_bind_template_child (widget_class, GtkPlacesViewRow, name_label); @@ -282,3 +302,26 @@ gtk_places_view_row_set_busy (GtkPlacesViewRow *row, gtk_widget_set_visible (GTK_WIDGET (row->busy_spinner), is_busy); } + +gboolean +gtk_places_view_row_get_is_network (GtkPlacesViewRow *row) +{ + g_return_val_if_fail (GTK_IS_PLACES_VIEW_ROW (row), FALSE); + + return row->is_network; +} + +void +gtk_places_view_row_set_is_network (GtkPlacesViewRow *row, + gboolean is_network) +{ + if (row->is_network != is_network) + { + row->is_network = is_network; + + gtk_image_set_from_icon_name (row->eject_icon, + is_network ? "network-offline-symbolic" : "media-eject-symbolic", + GTK_ICON_SIZE_BUTTON); + gtk_widget_set_tooltip_text (GTK_WIDGET (row->eject_button), is_network ? P_("Disconnect") : P_("Unmount")); + } +} diff --git a/gtk/gtkplacesviewrowprivate.h b/gtk/gtkplacesviewrowprivate.h index 20add04241..3c46d5d9a5 100644 --- a/gtk/gtkplacesviewrowprivate.h +++ b/gtk/gtkplacesviewrowprivate.h @@ -48,6 +48,11 @@ GFile* gtk_places_view_row_get_file (GtkPlacesViewR void gtk_places_view_row_set_busy (GtkPlacesViewRow *row, gboolean is_busy); +gboolean gtk_places_view_row_get_is_network (GtkPlacesViewRow *row); + +void gtk_places_view_row_set_is_network (GtkPlacesViewRow *row, + gboolean is_network); + G_END_DECLS #endif /* GTK_PLACES_VIEW_ROW_H */ diff --git a/gtk/ui/gtkplacesviewrow.ui b/gtk/ui/gtkplacesviewrow.ui index c46079bbcf..d1e923b191 100644 --- a/gtk/ui/gtkplacesviewrow.ui +++ b/gtk/ui/gtkplacesviewrow.ui @@ -72,7 +72,7 @@ center Unmount - + True media-eject-symbolic 1