[libpanel] widget: implement page.save action from PanelWidget
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libpanel] widget: implement page.save action from PanelWidget
- Date: Thu, 28 Jul 2022 06:01:18 +0000 (UTC)
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]