[gtksourceview] view: do not show undo/redo in context menu if undo/redo is disabled



commit b9a8d8b966f769dd81fe4fe5fb99f0b256dbbb40
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Fri Oct 16 10:38:13 2015 +0200

    view: do not show undo/redo in context menu if undo/redo is disabled
    
    If the default UndoManager is used and if the max_undo_levels is at 0,
    the undo/redo items in the context menu were always insensitive. So it's
    better to not show them altogether, instead of taunting the user with
    "look there is an undo/redo feature, but you can't use it, haha".

 gtksourceview/gtksourcebuffer-private.h |    3 ++
 gtksourceview/gtksourcebuffer.c         |   23 ++++++++++++-
 gtksourceview/gtksourceview.c           |   55 ++++++++++++++++--------------
 3 files changed, 54 insertions(+), 27 deletions(-)
---
diff --git a/gtksourceview/gtksourcebuffer-private.h b/gtksourceview/gtksourcebuffer-private.h
index 14eb968..c6d89b9 100644
--- a/gtksourceview/gtksourcebuffer-private.h
+++ b/gtksourceview/gtksourcebuffer-private.h
@@ -69,6 +69,9 @@ void                   _gtk_source_buffer_save_and_clear_selection    (GtkSourceBuffer      
   *bu
 G_GNUC_INTERNAL
 void                    _gtk_source_buffer_restore_selection           (GtkSourceBuffer         *buffer);
 
+G_GNUC_INTERNAL
+gboolean                _gtk_source_buffer_is_undo_redo_enabled        (GtkSourceBuffer         *buffer);
+
 G_END_DECLS
 
 #endif /* __GTK_SOURCE_BUFFER_PRIVATE_H__ */
diff --git a/gtksourceview/gtksourcebuffer.c b/gtksourceview/gtksourcebuffer.c
index 693ab40..6fe2761 100644
--- a/gtksourceview/gtksourcebuffer.c
+++ b/gtksourceview/gtksourcebuffer.c
@@ -1386,7 +1386,9 @@ gtk_source_buffer_get_max_undo_levels (GtkSourceBuffer *buffer)
  * track.  If the number of user actions exceeds the limit set by this
  * function, older actions will be discarded.
  *
- * If @max_undo_levels is -1, no limit is set.
+ * If @max_undo_levels is -1, the undo/redo is unlimited.
+ *
+ * If @max_undo_levels is 0, the undo/redo is disabled.
  */
 void
 gtk_source_buffer_set_max_undo_levels (GtkSourceBuffer *buffer,
@@ -1410,6 +1412,25 @@ gtk_source_buffer_set_max_undo_levels (GtkSourceBuffer *buffer,
        g_object_notify (G_OBJECT (buffer), "max-undo-levels");
 }
 
+gboolean
+_gtk_source_buffer_is_undo_redo_enabled (GtkSourceBuffer *buffer)
+{
+       g_return_val_if_fail (GTK_SOURCE_IS_BUFFER (buffer), FALSE);
+
+       if (buffer->priv->undo_manager == NULL)
+       {
+               return FALSE;
+       }
+
+       /* A custom UndoManager is not forced to follow max_undo_levels. */
+       if (!GTK_SOURCE_IS_UNDO_MANAGER_DEFAULT (buffer->priv->undo_manager))
+       {
+               return TRUE;
+       }
+
+       return buffer->priv->max_undo_levels != 0;
+}
+
 /**
  * gtk_source_buffer_begin_not_undoable_action:
  * @buffer: a #GtkSourceBuffer.
diff --git a/gtksourceview/gtksourceview.c b/gtksourceview/gtksourceview.c
index d1ffdaa..c5c67d8 100644
--- a/gtksourceview/gtksourceview.c
+++ b/gtksourceview/gtksourceview.c
@@ -1543,32 +1543,35 @@ gtk_source_view_populate_popup (GtkTextView *text_view,
 
        menu = GTK_MENU_SHELL (popup);
 
-       /* separator */
-       menu_item = gtk_separator_menu_item_new ();
-       gtk_menu_shell_prepend (menu, menu_item);
-       gtk_widget_show (menu_item);
-
-       /* create redo menu_item. */
-       menu_item = gtk_menu_item_new_with_mnemonic (_("_Redo"));
-       g_object_set_data (G_OBJECT (menu_item), "gtk-signal", (gpointer)"redo");
-       g_signal_connect (G_OBJECT (menu_item), "activate",
-                         G_CALLBACK (menu_item_activate_cb), text_view);
-       gtk_menu_shell_prepend (menu, menu_item);
-       gtk_widget_set_sensitive (menu_item,
-                                 (gtk_text_view_get_editable (text_view) &&
-                                  gtk_source_buffer_can_redo (GTK_SOURCE_BUFFER (buffer))));
-       gtk_widget_show (menu_item);
-
-       /* create undo menu_item. */
-       menu_item = gtk_menu_item_new_with_mnemonic (_("_Undo"));
-       g_object_set_data (G_OBJECT (menu_item), "gtk-signal", (gpointer)"undo");
-       g_signal_connect (G_OBJECT (menu_item), "activate",
-                         G_CALLBACK (menu_item_activate_cb), text_view);
-       gtk_menu_shell_prepend (menu, menu_item);
-       gtk_widget_set_sensitive (menu_item,
-                                 (gtk_text_view_get_editable (text_view) &&
-                                  gtk_source_buffer_can_undo (GTK_SOURCE_BUFFER (buffer))));
-       gtk_widget_show (menu_item);
+       if (_gtk_source_buffer_is_undo_redo_enabled (GTK_SOURCE_BUFFER (buffer)))
+       {
+               /* separator */
+               menu_item = gtk_separator_menu_item_new ();
+               gtk_menu_shell_prepend (menu, menu_item);
+               gtk_widget_show (menu_item);
+
+               /* create redo menu_item. */
+               menu_item = gtk_menu_item_new_with_mnemonic (_("_Redo"));
+               g_object_set_data (G_OBJECT (menu_item), "gtk-signal", (gpointer)"redo");
+               g_signal_connect (G_OBJECT (menu_item), "activate",
+                                 G_CALLBACK (menu_item_activate_cb), text_view);
+               gtk_menu_shell_prepend (menu, menu_item);
+               gtk_widget_set_sensitive (menu_item,
+                                         (gtk_text_view_get_editable (text_view) &&
+                                          gtk_source_buffer_can_redo (GTK_SOURCE_BUFFER (buffer))));
+               gtk_widget_show (menu_item);
+
+               /* create undo menu_item. */
+               menu_item = gtk_menu_item_new_with_mnemonic (_("_Undo"));
+               g_object_set_data (G_OBJECT (menu_item), "gtk-signal", (gpointer)"undo");
+               g_signal_connect (G_OBJECT (menu_item), "activate",
+                                 G_CALLBACK (menu_item_activate_cb), text_view);
+               gtk_menu_shell_prepend (menu, menu_item);
+               gtk_widget_set_sensitive (menu_item,
+                                         (gtk_text_view_get_editable (text_view) &&
+                                          gtk_source_buffer_can_undo (GTK_SOURCE_BUFFER (buffer))));
+               gtk_widget_show (menu_item);
+       }
 
        /* separator */
        menu_item = gtk_separator_menu_item_new ();


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]