[tepl] WindowActionsEdit: update undo/redo actions sensitivity



commit 0bf9d314fd735c99239f9ede8a294c36facc95a0
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Mon May 4 02:32:08 2020 +0200

    WindowActionsEdit: update undo/redo actions sensitivity

 tepl/tepl-application-window.c  |  65 ----------------
 tepl/tepl-window-actions-edit.c | 161 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 161 insertions(+), 65 deletions(-)
---
diff --git a/tepl/tepl-application-window.c b/tepl/tepl-application-window.c
index 22e4435..4e04d0d 100644
--- a/tepl/tepl-application-window.c
+++ b/tepl/tepl-application-window.c
@@ -194,38 +194,6 @@ goto_line_change_state_cb (GSimpleAction *action,
        update_goto_line (tepl_window);
 }
 
-static void
-update_undo_redo_actions_sensitivity (TeplApplicationWindow *tepl_window)
-{
-       TeplView *view;
-       gboolean view_is_editable = FALSE;
-       GtkSourceBuffer *buffer;
-       GActionMap *action_map;
-       GAction *action;
-
-       view = tepl_tab_group_get_active_view (TEPL_TAB_GROUP (tepl_window));
-       if (view != NULL)
-       {
-               view_is_editable = gtk_text_view_get_editable (GTK_TEXT_VIEW (view));
-       }
-
-       buffer = GTK_SOURCE_BUFFER (tepl_tab_group_get_active_buffer (TEPL_TAB_GROUP (tepl_window)));
-
-       action_map = G_ACTION_MAP (tepl_window->priv->gtk_window);
-
-       action = g_action_map_lookup_action (action_map, "tepl-undo");
-       g_simple_action_set_enabled (G_SIMPLE_ACTION (action),
-                                    view_is_editable &&
-                                    buffer != NULL &&
-                                    gtk_source_buffer_can_undo (buffer));
-
-       action = g_action_map_lookup_action (action_map, "tepl-redo");
-       g_simple_action_set_enabled (G_SIMPLE_ACTION (action),
-                                    view_is_editable &&
-                                    buffer != NULL &&
-                                    gtk_source_buffer_can_redo (buffer));
-}
-
 /* @can_paste_according_to_clipboard: TRUE if calling
  * tepl_view_paste_clipboard() will paste something.
  */
@@ -387,7 +355,6 @@ update_basic_edit_actions_sensitivity (TeplApplicationWindow *tepl_window)
 static void
 update_actions_sensitivity (TeplApplicationWindow *tepl_window)
 {
-       update_undo_redo_actions_sensitivity (tepl_window);
        update_basic_edit_actions_sensitivity (tepl_window);
        update_paste_action_sensitivity (tepl_window);
        update_goto_line_action_sensitivity (tepl_window);
@@ -775,7 +742,6 @@ tepl_application_window_get_application_window (TeplApplicationWindow *tepl_wind
 static void
 active_tab_changed (TeplApplicationWindow *tepl_window)
 {
-       update_undo_redo_actions_sensitivity (tepl_window);
        update_basic_edit_actions_sensitivity (tepl_window);
        update_paste_action_sensitivity (tepl_window);
 
@@ -788,7 +754,6 @@ active_view_editable_notify_cb (GtkTextView           *active_view,
                                GParamSpec            *pspec,
                                TeplApplicationWindow *tepl_window)
 {
-       update_undo_redo_actions_sensitivity (tepl_window);
        update_basic_edit_actions_sensitivity (tepl_window);
        update_paste_action_sensitivity (tepl_window);
 
@@ -825,22 +790,6 @@ active_buffer_has_selection_notify_cb (GtkTextBuffer         *buffer,
        update_basic_edit_actions_sensitivity (tepl_window);
 }
 
-static void
-active_buffer_can_undo_notify_cb (GtkSourceBuffer       *buffer,
-                                 GParamSpec            *pspec,
-                                 TeplApplicationWindow *tepl_window)
-{
-       update_undo_redo_actions_sensitivity (tepl_window);
-}
-
-static void
-active_buffer_can_redo_notify_cb (GtkSourceBuffer       *buffer,
-                                 GParamSpec            *pspec,
-                                 TeplApplicationWindow *tepl_window)
-{
-       update_undo_redo_actions_sensitivity (tepl_window);
-}
-
 static void
 active_buffer_full_title_notify_cb (TeplBuffer            *buffer,
                                    GParamSpec            *pspec,
@@ -870,18 +819,6 @@ active_buffer_changed (TeplApplicationWindow *tepl_window)
                                                  G_CALLBACK (active_buffer_has_selection_notify_cb),
                                                  tepl_window));
 
-       _tepl_signal_group_add (tepl_window->priv->buffer_signal_group,
-                               g_signal_connect (active_buffer,
-                                                 "notify::can-undo",
-                                                 G_CALLBACK (active_buffer_can_undo_notify_cb),
-                                                 tepl_window));
-
-       _tepl_signal_group_add (tepl_window->priv->buffer_signal_group,
-                               g_signal_connect (active_buffer,
-                                                 "notify::can-redo",
-                                                 G_CALLBACK (active_buffer_can_redo_notify_cb),
-                                                 tepl_window));
-
        _tepl_signal_group_add (tepl_window->priv->buffer_signal_group,
                                g_signal_connect (active_buffer,
                                                  "notify::tepl-full-title",
@@ -889,9 +826,7 @@ active_buffer_changed (TeplApplicationWindow *tepl_window)
                                                  tepl_window));
 
 end:
-       update_undo_redo_actions_sensitivity (tepl_window);
        update_basic_edit_actions_sensitivity (tepl_window);
-
        update_title (tepl_window);
 }
 
diff --git a/tepl/tepl-window-actions-edit.c b/tepl/tepl-window-actions-edit.c
index 25202fa..245d192 100644
--- a/tepl/tepl-window-actions-edit.c
+++ b/tepl/tepl-window-actions-edit.c
@@ -4,6 +4,7 @@
 
 #include "tepl-window-actions-edit.h"
 #include <amtk/amtk.h>
+#include "tepl-signal-group.h"
 #include "tepl-tab-group.h"
 #include "tepl-view.h"
 
@@ -12,8 +13,15 @@
 struct _TeplWindowActionsEdit
 {
        TeplApplicationWindow *tepl_window; /* unowned */
+
+       TeplSignalGroup *tepl_window_signal_group;
+       TeplSignalGroup *view_signal_group;
+       TeplSignalGroup *buffer_signal_group;
 };
 
+/******************************************************************************/
+/* Activate callbacks */
+
 static void
 undo_activate_cb (GSimpleAction *action,
                  GVariant      *parameter,
@@ -182,6 +190,140 @@ unindent_activate_cb (GSimpleAction *action,
        }
 }
 
+/******************************************************************************/
+/* Update sensitivity */
+
+static void
+update_undo_redo_actions_sensitivity (TeplApplicationWindow *tepl_window)
+{
+       TeplView *view;
+       gboolean view_is_editable = FALSE;
+       GtkSourceBuffer *buffer;
+       GActionMap *action_map;
+       GAction *action;
+
+       view = tepl_tab_group_get_active_view (TEPL_TAB_GROUP (tepl_window));
+       if (view != NULL)
+       {
+               view_is_editable = gtk_text_view_get_editable (GTK_TEXT_VIEW (view));
+       }
+
+       buffer = GTK_SOURCE_BUFFER (tepl_tab_group_get_active_buffer (TEPL_TAB_GROUP (tepl_window)));
+
+       action_map = G_ACTION_MAP (tepl_application_window_get_application_window (tepl_window));
+
+       action = g_action_map_lookup_action (action_map, "tepl-undo");
+       g_simple_action_set_enabled (G_SIMPLE_ACTION (action),
+                                    view_is_editable &&
+                                    buffer != NULL &&
+                                    gtk_source_buffer_can_undo (buffer));
+
+       action = g_action_map_lookup_action (action_map, "tepl-redo");
+       g_simple_action_set_enabled (G_SIMPLE_ACTION (action),
+                                    view_is_editable &&
+                                    buffer != NULL &&
+                                    gtk_source_buffer_can_redo (buffer));
+}
+
+static void
+active_view_editable_notify_cb (GtkTextView           *active_view,
+                               GParamSpec            *pspec,
+                               TeplWindowActionsEdit *window_actions_edit)
+{
+       update_undo_redo_actions_sensitivity (window_actions_edit->tepl_window);
+}
+
+static void
+active_view_changed (TeplWindowActionsEdit *window_actions_edit)
+{
+       TeplView *active_view;
+
+       _tepl_signal_group_clear (&window_actions_edit->view_signal_group);
+
+       active_view = tepl_tab_group_get_active_view (TEPL_TAB_GROUP (window_actions_edit->tepl_window));
+       if (active_view == NULL)
+       {
+               goto end;
+       }
+
+       window_actions_edit->view_signal_group = _tepl_signal_group_new (G_OBJECT (active_view));
+
+       _tepl_signal_group_add (window_actions_edit->view_signal_group,
+                               g_signal_connect (active_view,
+                                                 "notify::editable",
+                                                 G_CALLBACK (active_view_editable_notify_cb),
+                                                 window_actions_edit));
+
+end:
+       update_undo_redo_actions_sensitivity (window_actions_edit->tepl_window);
+}
+
+static void
+active_view_notify_cb (TeplApplicationWindow *tepl_window,
+                      GParamSpec            *pspec,
+                      TeplWindowActionsEdit *window_actions_edit)
+{
+       active_view_changed (window_actions_edit);
+}
+
+static void
+active_buffer_can_undo_notify_cb (GtkSourceBuffer       *buffer,
+                                 GParamSpec            *pspec,
+                                 TeplWindowActionsEdit *window_actions_edit)
+{
+       update_undo_redo_actions_sensitivity (window_actions_edit->tepl_window);
+}
+
+static void
+active_buffer_can_redo_notify_cb (GtkSourceBuffer       *buffer,
+                                 GParamSpec            *pspec,
+                                 TeplWindowActionsEdit *window_actions_edit)
+{
+       update_undo_redo_actions_sensitivity (window_actions_edit->tepl_window);
+}
+
+static void
+active_buffer_changed (TeplWindowActionsEdit *window_actions_edit)
+{
+       TeplBuffer *active_buffer;
+
+       _tepl_signal_group_clear (&window_actions_edit->buffer_signal_group);
+
+       active_buffer = tepl_tab_group_get_active_buffer (TEPL_TAB_GROUP (window_actions_edit->tepl_window));
+       if (active_buffer == NULL)
+       {
+               goto end;
+       }
+
+       window_actions_edit->buffer_signal_group = _tepl_signal_group_new (G_OBJECT (active_buffer));
+
+       _tepl_signal_group_add (window_actions_edit->buffer_signal_group,
+                               g_signal_connect (active_buffer,
+                                                 "notify::can-undo",
+                                                 G_CALLBACK (active_buffer_can_undo_notify_cb),
+                                                 window_actions_edit));
+
+       _tepl_signal_group_add (window_actions_edit->buffer_signal_group,
+                               g_signal_connect (active_buffer,
+                                                 "notify::can-redo",
+                                                 G_CALLBACK (active_buffer_can_redo_notify_cb),
+                                                 window_actions_edit));
+
+end:
+       update_undo_redo_actions_sensitivity (window_actions_edit->tepl_window);
+}
+
+static void
+active_buffer_notify_cb (TeplApplicationWindow *tepl_window,
+                        GParamSpec            *pspec,
+                        TeplWindowActionsEdit *window_actions_edit)
+{
+       active_buffer_changed (window_actions_edit);
+}
+
+/******************************************************************************/
+/* Public functions */
+
 TeplWindowActionsEdit *
 _tepl_window_actions_edit_new (TeplApplicationWindow *tepl_window)
 {
@@ -210,6 +352,22 @@ _tepl_window_actions_edit_new (TeplApplicationWindow *tepl_window)
 
        window_actions_edit = g_new0 (TeplWindowActionsEdit, 1);
        window_actions_edit->tepl_window = tepl_window;
+       window_actions_edit->tepl_window_signal_group = _tepl_signal_group_new (G_OBJECT (tepl_window));
+
+       _tepl_signal_group_add (window_actions_edit->tepl_window_signal_group,
+                               g_signal_connect (tepl_window,
+                                                 "notify::active-view",
+                                                 G_CALLBACK (active_view_notify_cb),
+                                                 window_actions_edit));
+
+       _tepl_signal_group_add (window_actions_edit->tepl_window_signal_group,
+                               g_signal_connect (tepl_window,
+                                                 "notify::active-buffer",
+                                                 G_CALLBACK (active_buffer_notify_cb),
+                                                 window_actions_edit));
+
+       active_view_changed (window_actions_edit);
+       active_buffer_changed (window_actions_edit);
 
        return window_actions_edit;
 }
@@ -222,6 +380,9 @@ window_actions_edit_free (TeplWindowActionsEdit *window_actions_edit)
                return;
        }
 
+       _tepl_signal_group_clear (&window_actions_edit->tepl_window_signal_group);
+       _tepl_signal_group_clear (&window_actions_edit->view_signal_group);
+       _tepl_signal_group_clear (&window_actions_edit->buffer_signal_group);
        g_free (window_actions_edit);
 }
 


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