[gtksourceview] view: do not show undo/redo in context menu if undo/redo is disabled
- From: Sébastien Wilmet <swilmet src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtksourceview] view: do not show undo/redo in context menu if undo/redo is disabled
- Date: Fri, 16 Oct 2015 14:17:22 +0000 (UTC)
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]