summaryrefslogtreecommitdiff
path: root/src/nautilus-files-view.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nautilus-files-view.c')
-rw-r--r--src/nautilus-files-view.c94
1 files changed, 92 insertions, 2 deletions
diff --git a/src/nautilus-files-view.c b/src/nautilus-files-view.c
index a386e19c0..078a27c3b 100644
--- a/src/nautilus-files-view.c
+++ b/src/nautilus-files-view.c
@@ -29,6 +29,7 @@
#include "nautilus-application.h"
#include "nautilus-error-reporting.h"
+#include "nautilus-file-undo-manager.h"
#include "nautilus-floating-bar.h"
#include "nautilus-list-view.h"
#include "nautilus-canvas-view.h"
@@ -261,7 +262,6 @@ struct NautilusFilesViewDetails
/* View menu */
GtkWidget *view_menu_widget;
- GtkWidget *view_icon;
GtkWidget *sort_menu;
GtkWidget *sort_trash_time;
GtkWidget *sort_search_relevance;
@@ -271,6 +271,9 @@ struct NautilusFilesViewDetails
GtkAdjustment *zoom_adjustment;
GtkWidget *zoom_level_scale;
+ GtkWidget *undo_button;
+ GtkWidget *redo_button;
+
gulong stop_signal_handler;
gulong reload_signal_handler;
};
@@ -7974,6 +7977,90 @@ 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;
@@ -7988,7 +8075,6 @@ nautilus_files_view_iface_init (NautilusViewInterface *iface)
iface->is_loading = nautilus_files_view_is_loading;
}
-
static void
nautilus_files_view_class_init (NautilusFilesViewClass *klass)
{
@@ -7999,6 +8085,7 @@ 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;
@@ -8157,6 +8244,9 @@ 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->details->zoom_level_scale, "value-changed",
G_CALLBACK (zoom_level_changed), view);