summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nautilus-files-view.c92
-rw-r--r--src/nautilus-places-view.c22
-rw-r--r--src/nautilus-toolbar-menu-sections.h1
-rw-r--r--src/nautilus-toolbar.c90
-rw-r--r--src/nautilus-toolbar.h2
-rw-r--r--src/nautilus-view.h3
-rw-r--r--src/nautilus-window.c2
-rw-r--r--src/resources/ui/nautilus-toolbar-menu.ui31
-rw-r--r--src/resources/ui/nautilus-toolbar-view-menu.ui24
9 files changed, 144 insertions, 123 deletions
diff --git a/src/nautilus-files-view.c b/src/nautilus-files-view.c
index 1655f0530..469443714 100644
--- a/src/nautilus-files-view.c
+++ b/src/nautilus-files-view.c
@@ -269,9 +269,6 @@ struct NautilusFilesViewDetails
GtkWidget *zoom_controls_box;
GtkWidget *zoom_level_label;
- GtkWidget *undo_button;
- GtkWidget *redo_button;
-
gulong stop_signal_handler;
gulong reload_signal_handler;
};
@@ -8001,90 +7998,6 @@ nautilus_files_view_is_loading (NautilusView *view)
}
static void
-update_menu_item (GtkWidget *menu_item,
- NautilusWindow *window,
- const char *action_name,
- gboolean enabled,
- char *label)
-{
- GAction *action;
- GValue val = G_VALUE_INIT;
-
- /* Activate/deactivate */
- action = g_action_map_lookup_action (G_ACTION_MAP (window), action_name);
- g_simple_action_set_enabled (G_SIMPLE_ACTION (action), enabled);
-
- /* Set the text of the menu item. Can't use gtk_button_set_label here
- * as we need to set the text property, not the label. There's no equivalent
- * gtk_model_button_set_text function
- */
- g_value_init (&val, G_TYPE_STRING);
- g_value_set_string (&val, label);
- g_object_set_property (G_OBJECT (menu_item), "text", &val);
- g_value_unset (&val);
-}
-
-static void
-undo_manager_changed (NautilusFilesView *view)
-{
- NautilusWindow *window;
- NautilusFileUndoInfo *info;
- NautilusFileUndoManagerState undo_state;
- gboolean undo_active;
- gboolean redo_active;
- gchar *undo_label;
- gchar *redo_label;
- gchar *undo_description;
- gchar *redo_description;
- gboolean is_undo;
-
- window = nautilus_files_view_get_window (view);
- undo_label = undo_description = redo_label = redo_description = NULL;
-
- /* Look up the last action from the undo manager, and get the text that
- * describes it, e.g. "Undo Create Folder"/"Redo Create Folder"
- */
- info = nautilus_file_undo_manager_get_action ();
- undo_state = nautilus_file_undo_manager_get_state ();
- undo_active = redo_active = FALSE;
- if (info != NULL && undo_state > NAUTILUS_FILE_UNDO_MANAGER_STATE_NONE) {
- is_undo = undo_state == NAUTILUS_FILE_UNDO_MANAGER_STATE_UNDO;
-
- /* The last action can either be undone/redone. Activate the corresponding
- * menu item and deactivate the other
- */
- undo_active = is_undo;
- redo_active = !is_undo;
- nautilus_file_undo_info_get_strings (info, &undo_label, &undo_description,
- &redo_label, &redo_description);
- g_free (undo_description);
- g_free (redo_description);
- }
-
- /* Set the label of the undo and redo menu items, and activate them appropriately
- */
- undo_label = undo_active && undo_label != NULL ? undo_label : g_strdup (_("_Undo"));
- update_menu_item (view->details->undo_button, window, "undo", undo_active, undo_label);
-
- redo_label = redo_active && redo_label != NULL ? redo_label : g_strdup (_("_Redo"));
- update_menu_item (view->details->redo_button, window, "redo", redo_active, redo_label);
-
- g_free (undo_label);
- g_free (redo_label);
-}
-
-static void
-nautilus_files_view_constructed (GObject *object)
-{
- NautilusFilesView *view;
-
- view = NAUTILUS_FILES_VIEW (object);
- g_signal_connect_object (nautilus_file_undo_manager_get (), "undo-changed",
- G_CALLBACK (undo_manager_changed), view, G_CONNECT_SWAPPED);
- undo_manager_changed (view);
-}
-
-static void
nautilus_files_view_iface_init (NautilusViewInterface *iface)
{
iface->get_icon = nautilus_files_view_get_icon;
@@ -8109,7 +8022,6 @@ nautilus_files_view_class_init (NautilusFilesViewClass *klass)
oclass = G_OBJECT_CLASS (klass);
oclass->finalize = nautilus_files_view_finalize;
- oclass->constructed = nautilus_files_view_constructed;
oclass->get_property = nautilus_files_view_get_property;
oclass->set_property = nautilus_files_view_set_property;
@@ -8257,6 +8169,7 @@ nautilus_files_view_init (NautilusFilesView *view)
/* Toolbar menu */
builder = gtk_builder_new_from_resource ("/org/gnome/nautilus/ui/nautilus-toolbar-view-menu.ui");
view->details->toolbar_menu_sections = g_new0 (NautilusToolbarMenuSections, 1);
+ view->details->toolbar_menu_sections->supports_undo_redo = TRUE;
view->details->toolbar_menu_sections->zoom_section = g_object_ref_sink (gtk_builder_get_object (builder, "zoom_section"));
view->details->toolbar_menu_sections->extended_section = g_object_ref_sink (gtk_builder_get_object (builder, "extended_section"));
view->details->zoom_controls_box = GTK_WIDGET (gtk_builder_get_object (builder, "zoom_controls_box"));
@@ -8268,9 +8181,6 @@ nautilus_files_view_init (NautilusFilesView *view)
view->details->reload = GTK_WIDGET (gtk_builder_get_object (builder, "reload"));
view->details->stop = GTK_WIDGET (gtk_builder_get_object (builder, "stop"));
- view->details->undo_button = GTK_WIDGET (gtk_builder_get_object (builder, "undo"));
- view->details->redo_button = GTK_WIDGET (gtk_builder_get_object (builder, "redo"));
-
g_signal_connect (view,
"end-file-changes",
G_CALLBACK (on_end_file_changes),
diff --git a/src/nautilus-places-view.c b/src/nautilus-places-view.c
index dfe5a7fb9..4b79da886 100644
--- a/src/nautilus-places-view.c
+++ b/src/nautilus-places-view.c
@@ -20,15 +20,17 @@
#include "nautilus-places-view.h"
#include "nautilus-window-slot.h"
#include "nautilus-application.h"
+#include "nautilus-toolbar-menu-sections.h"
#include "gtk/nautilusgtkplacesviewprivate.h"
typedef struct
{
- GFile *location;
- GIcon *icon;
- NautilusQuery *search_query;
+ GFile *location;
+ GIcon *icon;
+ NautilusQuery *search_query;
+ NautilusToolbarMenuSections *toolbar_menu_sections;
- GtkWidget *places_view;
+ GtkWidget *places_view;
} NautilusPlacesViewPrivate;
struct _NautilusPlacesView
@@ -135,6 +137,8 @@ nautilus_places_view_finalize (GObject *object)
g_clear_object (&priv->location);
g_clear_object (&priv->search_query);
+ g_free (priv->toolbar_menu_sections);
+
G_OBJECT_CLASS (nautilus_places_view_parent_class)->finalize (object);
}
@@ -278,8 +282,11 @@ nautilus_places_view_set_search_query (NautilusView *view,
static NautilusToolbarMenuSections *
nautilus_places_view_get_toolbar_menu_sections (NautilusView *view)
{
- /* By returning NULL, no sections will be added to the toolbar menu when this view is active */
- return NULL;
+ NautilusPlacesViewPrivate *priv;
+
+ priv = nautilus_places_view_get_instance_private (NAUTILUS_PLACES_VIEW (view));
+
+ return priv->toolbar_menu_sections;
}
static gboolean
@@ -370,6 +377,9 @@ nautilus_places_view_init (NautilusPlacesView *self)
G_CALLBACK (show_error_message_cb),
self);
+ /* Toolbar menu */
+ priv->toolbar_menu_sections = g_new0 (NautilusToolbarMenuSections, 1);
+ priv->toolbar_menu_sections->supports_undo_redo = FALSE;
}
NautilusPlacesView *
diff --git a/src/nautilus-toolbar-menu-sections.h b/src/nautilus-toolbar-menu-sections.h
index 4bac24ce0..26b405139 100644
--- a/src/nautilus-toolbar-menu-sections.h
+++ b/src/nautilus-toolbar-menu-sections.h
@@ -26,6 +26,7 @@ typedef struct _NautilusToolbarMenuSections NautilusToolbarMenuSections;
struct _NautilusToolbarMenuSections {
GtkWidget *zoom_section;
GtkWidget *extended_section;
+ gboolean supports_undo_redo;
};
G_END_DECLS
diff --git a/src/nautilus-toolbar.c b/src/nautilus-toolbar.c
index 0a09dd9cc..fb14346e9 100644
--- a/src/nautilus-toolbar.c
+++ b/src/nautilus-toolbar.c
@@ -35,6 +35,7 @@
#include "nautilus-ui-utilities.h"
#include "nautilus-progress-info-manager.h"
#include "nautilus-file-operations.h"
+#include "nautilus-file-undo-manager.h"
#include "nautilus-toolbar-menu-sections.h"
#include <glib/gi18n.h>
@@ -68,7 +69,10 @@ struct _NautilusToolbarPrivate {
GtkWidget *operations_button;
GtkWidget *view_button;
GtkWidget *view_menu_zoom_section;
+ GtkWidget *view_menu_undo_redo_section;
GtkWidget *view_menu_extended_section;
+ GtkWidget *undo_button;
+ GtkWidget *redo_button;
GtkWidget *view_toggle_button;
GtkWidget *view_toggle_icon;
@@ -755,6 +759,71 @@ on_progress_has_viewers_changed (NautilusProgressInfoManager *manager,
}
static void
+update_menu_item (GtkWidget *menu_item,
+ NautilusToolbar *self,
+ const char *action_name,
+ gboolean enabled,
+ char *label)
+{
+ GAction *action;
+ GValue val = G_VALUE_INIT;
+
+ /* Activate/deactivate */
+ action = g_action_map_lookup_action (G_ACTION_MAP (self->priv->window), action_name);
+ g_simple_action_set_enabled (G_SIMPLE_ACTION (action), enabled);
+
+ /* Set the text of the menu item. Can't use gtk_button_set_label here as
+ * we need to set the text property, not the label. There's no equivalent
+ * gtk_model_button_set_text function (refer to #766083 for discussion
+ * on adding a set_text function)
+ */
+ g_value_init (&val, G_TYPE_STRING);
+ g_value_set_string (&val, label);
+ g_object_set_property (G_OBJECT (menu_item), "text", &val);
+ g_value_unset (&val);
+}
+
+static void
+undo_manager_changed (NautilusToolbar *self)
+{
+ NautilusFileUndoInfo *info;
+ NautilusFileUndoManagerState undo_state;
+ gboolean undo_active;
+ gboolean redo_active;
+ g_autofree gchar *undo_label = NULL;
+ g_autofree gchar *redo_label = NULL;
+ g_autofree gchar *undo_description = NULL;
+ g_autofree gchar *redo_description = NULL;
+ gboolean is_undo;
+
+ /* Look up the last action from the undo manager, and get the text that
+ * describes it, e.g. "Undo Create Folder"/"Redo Create Folder"
+ */
+ info = nautilus_file_undo_manager_get_action ();
+ undo_state = nautilus_file_undo_manager_get_state ();
+ undo_active = redo_active = FALSE;
+ if (info != NULL && undo_state > NAUTILUS_FILE_UNDO_MANAGER_STATE_NONE) {
+ is_undo = undo_state == NAUTILUS_FILE_UNDO_MANAGER_STATE_UNDO;
+
+ /* The last action can either be undone/redone. Activate the corresponding
+ * menu item and deactivate the other
+ */
+ undo_active = is_undo;
+ redo_active = !is_undo;
+ nautilus_file_undo_info_get_strings (info, &undo_label, &undo_description,
+ &redo_label, &redo_description);
+ }
+
+ /* Set the label of the undo and redo menu items, and activate them appropriately
+ */
+ undo_label = undo_active && undo_label != NULL ? undo_label : g_strdup (_("_Undo"));
+ update_menu_item (self->priv->undo_button, self, "undo", undo_active, undo_label);
+
+ redo_label = redo_active && redo_label != NULL ? redo_label : g_strdup (_("_Redo"));
+ update_menu_item (self->priv->redo_button, self, "redo", redo_active, redo_label);
+}
+
+static void
nautilus_toolbar_init (NautilusToolbar *self)
{
GtkBuilder *builder;
@@ -766,7 +835,10 @@ nautilus_toolbar_init (NautilusToolbar *self)
builder = gtk_builder_new_from_resource ("/org/gnome/nautilus/ui/nautilus-toolbar-menu.ui");
menu_popover = GTK_WIDGET (gtk_builder_get_object (builder, "menu_popover"));
self->priv->view_menu_zoom_section = GTK_WIDGET (gtk_builder_get_object (builder, "view_menu_zoom_section"));
+ self->priv->view_menu_undo_redo_section = GTK_WIDGET (gtk_builder_get_object (builder, "view_menu_undo_redo_section"));
self->priv->view_menu_extended_section = GTK_WIDGET (gtk_builder_get_object (builder, "view_menu_extended_section"));
+ self->priv->undo_button = GTK_WIDGET (gtk_builder_get_object (builder, "undo"));
+ self->priv->redo_button = GTK_WIDGET (gtk_builder_get_object (builder, "redo"));
gtk_menu_button_set_popover (GTK_MENU_BUTTON (self->priv->view_button), menu_popover);
g_object_unref (builder);
@@ -807,6 +879,21 @@ nautilus_toolbar_init (NautilusToolbar *self)
toolbar_update_appearance (self);
}
+void
+nautilus_toolbar_on_window_constructed (NautilusToolbar *self)
+{
+ /* undo_manager_changed manipulates the window actions, so set it up
+ * after the window and it's actions have been constructed
+ */
+ g_signal_connect_object (nautilus_file_undo_manager_get (),
+ "undo-changed",
+ G_CALLBACK (undo_manager_changed),
+ self,
+ G_CONNECT_SWAPPED);
+
+ undo_manager_changed (self);
+}
+
static void
nautilus_toolbar_get_property (GObject *object,
guint property_id,
@@ -992,6 +1079,9 @@ on_slot_toolbar_menu_sections_changed (NautilusToolbar *toolbar,
if (new_sections == NULL)
return;
+ gtk_widget_set_visible (toolbar->priv->view_menu_undo_redo_section,
+ new_sections->supports_undo_redo);
+
if (new_sections->zoom_section != NULL)
gtk_box_pack_start (GTK_BOX (toolbar->priv->view_menu_zoom_section), new_sections->zoom_section, FALSE, FALSE, 0);
diff --git a/src/nautilus-toolbar.h b/src/nautilus-toolbar.h
index 41ec2aee0..f4450796f 100644
--- a/src/nautilus-toolbar.h
+++ b/src/nautilus-toolbar.h
@@ -75,4 +75,6 @@ void nautilus_toolbar_set_active_slot (NautilusToolbar *toolbar,
gboolean nautilus_toolbar_is_operations_button_active (NautilusToolbar *toolbar);
+void nautilus_toolbar_on_window_constructed (NautilusToolbar *toolbar);
+
#endif /* __NAUTILUS_TOOLBAR_H__ */
diff --git a/src/nautilus-view.h b/src/nautilus-view.h
index ad019d6cf..4c76cd0cc 100644
--- a/src/nautilus-view.h
+++ b/src/nautilus-view.h
@@ -41,8 +41,7 @@ struct _NautilusViewInterface
/*
* Returns the menu sections that should be shown in the toolbar menu
- * when this view is active. Implementations can return %NULL to
- * indicate that no extra sections should be added to the menu
+ * when this view is active. Implementations must not return %NULL
*/
NautilusToolbarMenuSections * (*get_toolbar_menu_sections) (NautilusView *view);
diff --git a/src/nautilus-window.c b/src/nautilus-window.c
index 4e4a5bc11..6d5c41976 100644
--- a/src/nautilus-window.c
+++ b/src/nautilus-window.c
@@ -2151,6 +2151,8 @@ nautilus_window_constructed (GObject *self)
g_signal_connect_swapped (nautilus_application_get_bookmarks (application), "changed",
G_CALLBACK (nautilus_window_sync_bookmarks), window);
+ nautilus_toolbar_on_window_constructed (NAUTILUS_TOOLBAR (window->priv->toolbar));
+
nautilus_profile_end (NULL);
}
diff --git a/src/resources/ui/nautilus-toolbar-menu.ui b/src/resources/ui/nautilus-toolbar-menu.ui
index 05ab33fb8..b4bceaa28 100644
--- a/src/resources/ui/nautilus-toolbar-menu.ui
+++ b/src/resources/ui/nautilus-toolbar-menu.ui
@@ -96,6 +96,37 @@
</object>
</child>
<child>
+ <object class="GtkBox" id="view_menu_undo_redo_section">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkSeparator">
+ <property name="visible">True</property>
+ <property name="orientation">horizontal</property>
+ <property name="margin-top">6</property>
+ <property name="margin-bottom">6</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkModelButton" id="undo">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="text" translatable="yes">_Undo</property>
+ <property name="action-name">win.undo</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkModelButton" id="redo">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="text" translatable="yes">_Redo</property>
+ <property name="action-name">win.redo</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
<!-- Other controls custom to the view are added to this -->
<object class="GtkBox" id="view_menu_extended_section">
<property name="visible">True</property>
diff --git a/src/resources/ui/nautilus-toolbar-view-menu.ui b/src/resources/ui/nautilus-toolbar-view-menu.ui
index 38968dbda..06ad3e9bf 100644
--- a/src/resources/ui/nautilus-toolbar-view-menu.ui
+++ b/src/resources/ui/nautilus-toolbar-view-menu.ui
@@ -91,30 +91,6 @@
<property name="orientation">vertical</property>
<property name="width_request">160</property>
<child>
- <object class="GtkSeparator">
- <property name="visible">True</property>
- <property name="orientation">horizontal</property>
- <property name="margin-top">6</property>
- <property name="margin-bottom">6</property>
- </object>
- </child>
- <child>
- <object class="GtkModelButton" id="undo">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="text" translatable="yes">_Undo</property>
- <property name="action-name">win.undo</property>
- </object>
- </child>
- <child>
- <object class="GtkModelButton" id="redo">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="text" translatable="yes">_Redo</property>
- <property name="action-name">win.redo</property>
- </object>
- </child>
- <child>
<object class="GtkBox" id="sort_menu">
<property name="visible">True</property>
<property name="can_focus">False</property>