editable: add enable-undo property
authorChristian Hergert <chergert@redhat.com>
Tue, 5 Nov 2019 00:40:02 +0000 (16:40 -0800)
committerChristian Hergert <chergert@redhat.com>
Tue, 5 Nov 2019 18:27:27 +0000 (10:27 -0800)
This property is intended to be mapped to a GtkText so that undo/redo
support can be used from a number of editable widgets.

docs/reference/gtk/gtk4-sections.txt
gtk/gtkeditable.c
gtk/gtkeditable.h

index 1781176a9ec2f386dc6692ffaaed9ebe3eaa1e7f..82a10b250e9569182f8a1ebcc2acd7358b5644f2 100644 (file)
@@ -882,6 +882,8 @@ gtk_editable_get_width_chars
 gtk_editable_set_width_chars
 gtk_editable_get_max_width_chars
 gtk_editable_set_max_width_chars
+gtk_editable_get_enable_undo
+gtk_editable_set_enable_undo
 <SUBSECTION>
 gtk_editable_install_properties
 gtk_editable_init_delegate
index c61b3650123bd002047ccbc11574ad5e3620ce6e..1ee33acdbf3e5e63140509e4888b15667ffd342a 100644 (file)
@@ -379,6 +379,13 @@ gtk_editable_default_init (GtkEditableInterface *iface)
                         0,
                         GTK_PARAM_READABLE));
 
+  g_object_interface_install_property (iface,
+      g_param_spec_boolean ("enable-undo",
+                            P_("Enable Undo"),
+                            P_("If undo/redo should be enabled for the editable"),
+                            TRUE,
+                            GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY));
+
   g_object_interface_install_property (iface,
       g_param_spec_int ("selection-bound",
                         P_("Selection Bound"),
@@ -835,6 +842,46 @@ gtk_editable_set_max_width_chars (GtkEditable *editable,
   g_object_set (editable, "max-width-chars", n_chars, NULL);
 }
 
+/**
+ * gtk_editable_get_enable_undo:
+ * @editable: a #GtkEditable
+ *
+ * Gets if undo/redo actions are enabled for @editable
+ *
+ * Returns: %TRUE if undo is enabled
+ */
+gboolean
+gtk_editable_get_enable_undo (GtkEditable *editable)
+{
+  gboolean enable_undo;
+
+  g_return_val_if_fail (GTK_IS_EDITABLE (editable), 0);
+
+  g_object_get (editable, "enable-undo", &enable_undo, NULL);
+
+  return enable_undo;
+}
+
+/**
+ * gtk_editable_set_enable_undo:
+ * @editable: a #GtkEditable
+ * @enable_undo: if undo/redo should be enabled
+ *
+ * If enabled, changes to @editable will be saved for undo/redo actions.
+ *
+ * This results in an additional copy of text changes and are not stored in
+ * secure memory. As such, undo is forcefully disabled when #GtkText:visibility
+ * is set to %FALSE.
+ */
+void
+gtk_editable_set_enable_undo (GtkEditable *editable,
+                              gboolean     enable_undo)
+{
+  g_return_if_fail (GTK_IS_EDITABLE (editable));
+
+  g_object_set (editable, "enable-undo", enable_undo, NULL);
+}
+
 /**
  * gtk_editable_install_properties:
  * @object_class: a #GObjectClass
@@ -869,6 +916,7 @@ gtk_editable_install_properties (GObjectClass *object_class,
   g_object_class_override_property (object_class, first_prop + GTK_EDITABLE_PROP_WIDTH_CHARS, "width-chars");
   g_object_class_override_property (object_class, first_prop + GTK_EDITABLE_PROP_MAX_WIDTH_CHARS, "max-width-chars");
   g_object_class_override_property (object_class, first_prop + GTK_EDITABLE_PROP_XALIGN, "xalign");
+  g_object_class_override_property (object_class, first_prop + GTK_EDITABLE_PROP_ENABLE_UNDO, "enable-undo");
 
   return GTK_EDITABLE_NUM_PROPERTIES;
 }
@@ -982,6 +1030,10 @@ gtk_editable_delegate_set_property (GObject      *object,
       gtk_editable_set_alignment (delegate, g_value_get_float (value));
       break;
 
+    case GTK_EDITABLE_PROP_ENABLE_UNDO:
+      gtk_editable_set_enable_undo (delegate, g_value_get_boolean (value));
+      break;
+
     default:
       return FALSE;
     }
@@ -1054,6 +1106,10 @@ gtk_editable_delegate_get_property (GObject    *object,
       g_value_set_float (value, gtk_editable_get_alignment (delegate));
       break;
 
+    case GTK_EDITABLE_PROP_ENABLE_UNDO:
+      g_value_set_boolean (value, gtk_editable_get_enable_undo (delegate));
+      break;
+
     default:
       return FALSE;
     }
index 2de901fa1510e2d488e00be4b990e3d81c44a3cb..c5539fe84eed6e7cc97c12b5a1fff7b618b33ae3 100644 (file)
@@ -138,6 +138,11 @@ int      gtk_editable_get_max_width_chars  (GtkEditable *editable);
 GDK_AVAILABLE_IN_ALL
 void     gtk_editable_set_max_width_chars  (GtkEditable *editable,
                                             int          n_chars);
+GDK_AVAILABLE_IN_ALL
+gboolean gtk_editable_get_enable_undo      (GtkEditable *editable);
+GDK_AVAILABLE_IN_ALL
+void     gtk_editable_set_enable_undo      (GtkEditable *editable,
+                                            gboolean     enable_undo);
 
 /* api for implementations */
 
@@ -149,6 +154,7 @@ typedef enum {
   GTK_EDITABLE_PROP_WIDTH_CHARS,
   GTK_EDITABLE_PROP_MAX_WIDTH_CHARS,
   GTK_EDITABLE_PROP_XALIGN,
+  GTK_EDITABLE_PROP_ENABLE_UNDO,
   GTK_EDITABLE_NUM_PROPERTIES
 } GtkEditableProperties;