[gtk/wip/chergert/textundo: 4/8] entry: allow disabling undo for GtkEntry



commit 9ba2921be11cb947dc3620e6874f307b885cc9bf
Author: Christian Hergert <chergert redhat com>
Date:   Fri Nov 1 11:17:00 2019 -0700

    entry: allow disabling undo for GtkEntry
    
    This plumbs support for enabling/disabling undo support on a GtkEntry to
    the underlying GtkText widget. By default it is enabled. You may also
    change the number of actions that may be undone.

 docs/reference/gtk/gtk4-sections.txt |  4 ++
 gtk/gtkentry.c                       | 95 ++++++++++++++++++++++++++++++++++++
 gtk/gtkentry.h                       | 10 ++++
 3 files changed, 109 insertions(+)
---
diff --git a/docs/reference/gtk/gtk4-sections.txt b/docs/reference/gtk/gtk4-sections.txt
index 97954788d3..297775c50f 100644
--- a/docs/reference/gtk/gtk4-sections.txt
+++ b/docs/reference/gtk/gtk4-sections.txt
@@ -1007,6 +1007,10 @@ gtk_entry_get_input_hints
 gtk_entry_grab_focus_without_selecting
 gtk_entry_set_extra_menu
 gtk_entry_get_extra_menu
+gtk_entry_get_enable_undo
+gtk_entry_set_enable_undo
+gtk_entry_get_max_undo_levels
+gtk_entry_set_max_undo_levels
 
 <SUBSECTION Standard>
 GTK_ENTRY
diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c
index ff6074a7df..48cf83ce98 100644
--- a/gtk/gtkentry.c
+++ b/gtk/gtkentry.c
@@ -224,6 +224,7 @@ enum {
   PROP_EXTRA_MENU,
   PROP_SHOW_EMOJI_ICON,
   PROP_ENABLE_EMOJI_COMPLETION,
+  PROP_ENABLE_UNDO,
   PROP_EDITING_CANCELED,
   NUM_PROPERTIES = PROP_EDITING_CANCELED,
 };
@@ -841,6 +842,19 @@ gtk_entry_class_init (GtkEntryClass *class)
                             FALSE,
                             GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
 
+  /**
+   * GtkEntry:enable-undo:
+   *
+   * Setting this to %TRUE allows the user to use keyboard shortcuts to
+   * undo or redo actions on the #GtkEntry.
+   */
+  entry_props[PROP_ENABLE_UNDO] =
+      g_param_spec_boolean ("enable-undo",
+                            P_("Enable Undo"),
+                            P_("Whether to enable undo support"),
+                            TRUE,
+                            GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
+
   g_object_class_install_properties (gobject_class, NUM_PROPERTIES, entry_props);
   g_object_class_override_property (gobject_class, PROP_EDITING_CANCELED, "editing-canceled");
   gtk_editable_install_properties (gobject_class, PROP_EDITING_CANCELED + 1);
@@ -947,6 +961,10 @@ gtk_entry_set_property (GObject         *object,
       g_object_set_property (G_OBJECT (priv->text), pspec->name, value);
       break;
 
+    case PROP_ENABLE_UNDO:
+      g_object_set_property (G_OBJECT (priv->text), pspec->name, value);
+      break;
+
     case PROP_HAS_FRAME:
       gtk_entry_set_has_frame (entry, g_value_get_boolean (value));
       break;
@@ -1102,6 +1120,10 @@ gtk_entry_get_property (GObject         *object,
       g_object_get_property (G_OBJECT (priv->text), pspec->name, value);
       break;
 
+    case PROP_ENABLE_UNDO:
+      g_object_get_property (G_OBJECT (priv->text), pspec->name, value);
+      break;
+
     case PROP_HAS_FRAME:
       g_value_set_boolean (value, gtk_entry_get_has_frame (entry));
       break;
@@ -3591,3 +3613,76 @@ gtk_entry_get_extra_menu (GtkEntry *entry)
 
   return gtk_text_get_extra_menu (GTK_TEXT (priv->text));
 }
+
+/**
+ * gtk_entry_get_enable_undo:
+ * @entry: a #GtkEntry
+ *
+ * Gets if undo is enabled for the entry.
+ *
+ * Returns: %TRUE if undo is enabled
+ */
+gboolean
+gtk_entry_get_enable_undo (GtkEntry *entry)
+{
+  GtkEntryPrivate *priv = gtk_entry_get_instance_private (entry);
+
+  g_return_val_if_fail (GTK_IS_ENTRY (entry), FALSE);
+
+  return gtk_text_get_enable_undo (GTK_TEXT (priv->text));
+}
+
+/**
+ * gtk_entry_set_enable_undo:
+ * @entry: a #GtkEntry
+ * @enable_undo: if undo should be enabled
+ *
+ * Enables or disables undo for the entry.
+ */
+void
+gtk_entry_set_enable_undo (GtkEntry *entry,
+                           gboolean  enable_undo)
+{
+  GtkEntryPrivate *priv = gtk_entry_get_instance_private (entry);
+
+  g_return_if_fail (GTK_IS_ENTRY (entry));
+
+  if (enable_undo != gtk_entry_get_enable_undo (entry))
+    gtk_text_set_enable_undo (GTK_TEXT (priv->text), enable_undo);
+}
+
+/**
+ * gtk_entry_get_max_undo_levels:
+ * @entry: a #GtkEntry
+ *
+ * Gets the maximum number of undo actions to store while editing
+ * within the #GtkEntry.
+ */
+guint
+gtk_entry_get_max_undo_levels (GtkEntry *entry)
+{
+  GtkEntryPrivate *priv = gtk_entry_get_instance_private (entry);
+
+  g_return_val_if_fail (GTK_IS_ENTRY (entry), 0);
+
+  return gtk_text_get_max_undo_levels (GTK_TEXT (priv->text));
+}
+
+/**
+ * gtk_entry_set_max_undo_levels:
+ * @entry: a #GtkEntry
+ * @max_undo_levels: maximum number of undo actions
+ *
+ * Sets the maximum number of undo actions that can be performed on the
+ * entry. Setting this to 0 results in unlimited undo operations.
+ */
+void
+gtk_entry_set_max_undo_levels (GtkEntry *entry,
+                               guint     max_undo_levels)
+{
+  GtkEntryPrivate *priv = gtk_entry_get_instance_private (entry);
+
+  g_return_if_fail (GTK_IS_ENTRY (entry));
+
+  gtk_text_set_max_undo_levels (GTK_TEXT (priv->text), max_undo_levels);
+}
diff --git a/gtk/gtkentry.h b/gtk/gtkentry.h
index fca03bc2b8..3048202e97 100644
--- a/gtk/gtkentry.h
+++ b/gtk/gtkentry.h
@@ -311,6 +311,16 @@ void           gtk_entry_set_extra_menu                      (GtkEntry
                                                               GMenuModel           *model);
 GDK_AVAILABLE_IN_ALL
 GMenuModel *   gtk_entry_get_extra_menu                      (GtkEntry             *entry);
+GDK_AVAILABLE_IN_ALL
+gboolean       gtk_entry_get_enable_undo                     (GtkEntry             *entry);
+GDK_AVAILABLE_IN_ALL
+void           gtk_entry_set_enable_undo                     (GtkEntry             *entry,
+                                                              gboolean              enable_undo);
+GDK_AVAILABLE_IN_ALL
+guint          gtk_entry_get_max_undo_levels                 (GtkEntry             *entry);
+GDK_AVAILABLE_IN_ALL
+void           gtk_entry_set_max_undo_levels                 (GtkEntry             *entry,
+                                                              guint                 max_undo_levels);
 
 G_END_DECLS
 


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