[libpanel] widget: implement page.save action from PanelWidget



commit f19358f2397d18795bef7888dfd82b5def9e8326
Author: Christian Hergert <chergert redhat com>
Date:   Wed Jul 27 23:01:09 2022 -0700

    widget: implement page.save action from PanelWidget
    
    This allows it to be more local to the save delegate and wrapped in the
    action muxer re-routed to the frame.

 src/panel-frame.c  | 41 --------------------------------
 src/panel-widget.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++----
 2 files changed, 63 insertions(+), 46 deletions(-)
---
diff --git a/src/panel-frame.c b/src/panel-frame.c
index 6cec0b3..5898f63 100644
--- a/src/panel-frame.c
+++ b/src/panel-frame.c
@@ -80,25 +80,6 @@ panel_frame_new (void)
   return g_object_new (PANEL_TYPE_FRAME, NULL);
 }
 
-static void
-page_save_action (GtkWidget  *widget,
-                  const char *action_name,
-                  GVariant   *param)
-{
-  PanelFrame *self = (PanelFrame *)widget;
-  PanelWidget *visible_child;
-  PanelSaveDelegate *save_delegate;
-
-  g_assert (PANEL_IS_FRAME (self));
-
-  if (!(visible_child = panel_frame_get_visible_child (self)) ||
-      !_panel_widget_can_save (visible_child) ||
-      !(save_delegate = panel_widget_get_save_delegate (visible_child)))
-    g_return_if_reached ();
-
-  panel_save_delegate_save_async (save_delegate, NULL, NULL, NULL);
-}
-
 static void
 close_page_or_frame_action (GtkWidget  *widget,
                             const char *action_name,
@@ -250,10 +231,6 @@ panel_frame_update_actions (PanelFrame *self)
   gtk_widget_action_set_enabled (GTK_WIDGET (self), "page.move-left", grid && visible_child);
   gtk_widget_action_set_enabled (GTK_WIDGET (self), "page.move-down", grid && visible_child);
   gtk_widget_action_set_enabled (GTK_WIDGET (self), "page.move-up", grid && visible_child);
-  gtk_widget_action_set_enabled (GTK_WIDGET (self), "page.maximize",
-                                 grid && visible_child && panel_widget_get_can_maximize (visible_child));
-  gtk_widget_action_set_enabled (GTK_WIDGET (self), "page.save",
-                                 visible_child && _panel_widget_can_save (visible_child));
   gtk_widget_action_set_enabled (GTK_WIDGET (self),
                                  "frame.close-page-or-frame",
                                  grid && (visible_child || priv->closeable));
@@ -291,21 +268,6 @@ panel_frame_notify_selected_page_cb (PanelFrame *self,
   g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_VISIBLE_CHILD]);
 }
 
-static void
-page_maximize_action (GtkWidget  *widget,
-                      const char *action_name,
-                      GVariant   *param)
-{
-  PanelWidget *visible_child;
-
-  g_assert (PANEL_IS_FRAME (widget));
-
-  if (!(visible_child = panel_frame_get_visible_child (PANEL_FRAME (widget))))
-    g_return_if_reached ();
-
-  panel_widget_maximize (visible_child);
-}
-
 static void
 page_move_right_action (GtkWidget  *widget,
                         const char *action_name,
@@ -741,15 +703,12 @@ panel_frame_class_init (PanelFrameClass *klass)
   gtk_widget_class_install_action (widget_class, "page.move-left", NULL, page_move_left_action);
   gtk_widget_class_install_action (widget_class, "page.move-down", NULL, page_move_down_action);
   gtk_widget_class_install_action (widget_class, "page.move-up", NULL, page_move_up_action);
-  gtk_widget_class_install_action (widget_class, "page.maximize", NULL, page_maximize_action);
-  gtk_widget_class_install_action (widget_class, "page.save", NULL, page_save_action);
   gtk_widget_class_install_action (widget_class, "frame.close-page-or-frame", NULL, 
close_page_or_frame_action);
   gtk_widget_class_install_action (widget_class, "frame.close", NULL, close_frame_action);
   gtk_widget_class_install_action (widget_class, "frame.page", "i", frame_page_action);
 
   gtk_widget_class_add_binding_action (widget_class, GDK_KEY_braceright, GDK_CONTROL_MASK | GDK_SHIFT_MASK, 
"page.move-right", NULL);
   gtk_widget_class_add_binding_action (widget_class, GDK_KEY_braceleft, GDK_CONTROL_MASK | GDK_SHIFT_MASK, 
"page.move-left", NULL);
-  gtk_widget_class_add_binding_action (widget_class, GDK_KEY_F11, GDK_SHIFT_MASK, "page.maximize", NULL);
 
   g_type_ensure (ADW_TYPE_TAB_VIEW);
   g_type_ensure (PANEL_TYPE_DROP_CONTROLS);
diff --git a/src/panel-widget.c b/src/panel-widget.c
index 613175d..a6f1e8a 100644
--- a/src/panel-widget.c
+++ b/src/panel-widget.c
@@ -71,6 +71,7 @@ typedef struct
   guint             maximized : 1;
   guint             modified : 1;
   guint             needs_attention : 1;
+  guint             saving : 1;
 } PanelWidgetPrivate;
 
 typedef struct
@@ -172,12 +173,17 @@ static void
 panel_widget_update_actions (PanelWidget *self)
 {
   PanelWidgetPrivate *priv = panel_widget_get_instance_private (self);
+  gboolean can_maximize;
+  gboolean can_save;
 
   g_assert (PANEL_IS_WIDGET (self));
 
-  panel_widget_action_set_enabled (self,
-                                   "page.maximize",
-                                   !priv->maximized && panel_widget_get_can_maximize (self));
+  can_maximize = !priv->maximized &&
+                 panel_widget_get_can_maximize (self);
+  can_save = _panel_widget_can_save (self);
+
+  panel_widget_action_set_enabled (self, "maximize", can_maximize);
+  panel_widget_action_set_enabled (self, "save", can_save);
 }
 
 static void
@@ -188,6 +194,55 @@ panel_widget_maximize_action (GtkWidget  *widget,
   panel_widget_maximize (PANEL_WIDGET (widget));
 }
 
+static void
+panel_widget_save_cb (GObject      *object,
+                      GAsyncResult *result,
+                      gpointer      user_data)
+{
+  PanelSaveDelegate *save_delegate = (PanelSaveDelegate *)object;
+  g_autoptr(PanelWidget) self = user_data;
+  PanelWidgetPrivate *priv = panel_widget_get_instance_private (self);
+  g_autoptr(GError) error = NULL;
+
+  g_assert (PANEL_IS_SAVE_DELEGATE (save_delegate));
+  g_assert (G_IS_ASYNC_RESULT (result));
+  g_assert (PANEL_IS_WIDGET (self));
+
+  priv->saving = FALSE;
+
+  if (!panel_save_delegate_save_finish (save_delegate, result, &error))
+    {
+      /* TODO: Request save delegate to format an error message to
+       *       display to the user via adwaita infobar replacement.
+       */
+      g_warning ("Failed to save: %s", error->message);
+    }
+
+  panel_widget_update_actions (self);
+}
+
+static void
+panel_widget_save_action (GtkWidget  *widget,
+                          const char *action_name,
+                          GVariant   *param)
+{
+  PanelWidget *self = (PanelWidget *)widget;
+  PanelWidgetPrivate *priv = panel_widget_get_instance_private (self);
+
+  g_return_if_fail (PANEL_IS_WIDGET (self));
+  g_return_if_fail (priv->save_delegate != NULL);
+  g_return_if_fail (priv->saving == FALSE);
+
+  priv->saving = TRUE;
+
+  panel_save_delegate_save_async (priv->save_delegate,
+                                  NULL,
+                                  panel_widget_save_cb,
+                                  g_object_ref (self));
+
+  panel_widget_update_actions (self);
+}
+
 /**
  * panel_widget_new:
  *
@@ -567,6 +622,7 @@ panel_widget_class_init (PanelWidgetClass *klass)
   gtk_widget_class_set_css_name (widget_class, "panelwidget");
 
   panel_widget_class_install_action (klass, "maximize", NULL, panel_widget_maximize_action);
+  panel_widget_class_install_action (klass, "save", NULL, panel_widget_save_action);
 
   /* Ensure we have quarks for known types */
   g_quark_from_static_string (PANEL_WIDGET_KIND_ANY);
@@ -582,7 +638,8 @@ panel_widget_init (GTypeInstance *instance,
   PanelWidget *self = PANEL_WIDGET (instance);
   PanelWidgetPrivate *priv = panel_widget_get_instance_private (self);
 
-  panel_widget_update_actions (self);
+  panel_widget_action_set_enabled (self, "maximize", FALSE);
+  panel_widget_action_set_enabled (self, "save", FALSE);
 
   priv->kind = g_quark_from_static_string (PANEL_WIDGET_KIND_UNKNOWN);
   priv->reorderable = TRUE;
@@ -712,6 +769,7 @@ panel_widget_set_modified (PanelWidget *self,
     {
       priv->modified = modified;
       g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_MODIFIED]);
+      panel_widget_update_actions (self);
     }
 }
 
@@ -1231,7 +1289,7 @@ _panel_widget_can_save (PanelWidget *self)
 
   g_return_val_if_fail (PANEL_IS_WIDGET (self), FALSE);
 
-  return priv->modified && priv->save_delegate != NULL;
+  return !priv->saving && priv->modified && priv->save_delegate != NULL;
 }
 
 void


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