[gnome-builder/wip/gtk4-port: 1356/1774] libide/webkit: switch between reload/stop buttons while loading




commit f66245eb66e09ad4599b85aa2804056b7dad858e
Author: Christian Hergert <chergert redhat com>
Date:   Fri Jun 3 16:16:05 2022 -0700

    libide/webkit: switch between reload/stop buttons while loading
    
    When loading we need to show the stop button so the user can stop the
    loading if desired.

 .../scalable/actions/stop-sign-symbolic.svg        |  2 ++
 src/libide/webkit/ide-webkit-page.c                | 41 ++++++++++++++++++++++
 src/libide/webkit/ide-webkit-page.ui               | 26 ++++++++++++--
 3 files changed, 66 insertions(+), 3 deletions(-)
---
diff --git a/data/icons/hicolor/scalable/actions/stop-sign-symbolic.svg 
b/data/icons/hicolor/scalable/actions/stop-sign-symbolic.svg
new file mode 100644
index 000000000..b5a56aaa3
--- /dev/null
+++ b/data/icons/hicolor/scalable/actions/stop-sign-symbolic.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg"; height="16px" viewBox="0 0 16 16" width="16px"><g 
fill="#222222"><path d="m 5.679688 1.988281 l -0.289063 0.289063 l -3.390625 3.359375 v 4.644531 l 3.675781 
3.707031 h 4.648438 l 3.675781 -3.707031 v -4.644531 l -3.679688 -3.648438 z m 0.828124 2 h 2.992188 l 2.5 
2.480469 v 2.988281 l -2.507812 2.53125 h -2.980469 l -2.511719 -2.53125 v -2.988281 z m 0 0"/><path d="m 
6.855469 4.988281 l -1.855469 1.835938 v 2.289062 l 1.855469 1.875 h 2.289062 l 1.855469 -1.875 v -2.289062 l 
-1.855469 -1.835938 z m 0 0"/></g></svg>
diff --git a/src/libide/webkit/ide-webkit-page.c b/src/libide/webkit/ide-webkit-page.c
index 0179e9e68..2e2fd2f40 100644
--- a/src/libide/webkit/ide-webkit-page.c
+++ b/src/libide/webkit/ide-webkit-page.c
@@ -29,9 +29,11 @@
 
 typedef struct
 {
+  GtkStack           *reload_stack;
   GtkCenterBox       *toolbar;
   IdeUrlBar          *url_bar;
   WebKitWebView      *web_view;
+
   GSimpleActionGroup *actions;
 } IdeWebkitPagePrivate;
 
@@ -195,10 +197,29 @@ reload_action (GSimpleAction *action,
   IDE_EXIT;
 }
 
+static void
+stop_action (GSimpleAction *action,
+             GVariant      *param,
+             gpointer       user_data)
+{
+  IdeWebkitPage *self = user_data;
+  IdeWebkitPagePrivate *priv = ide_webkit_page_get_instance_private (self);
+
+  IDE_ENTRY;
+
+  g_assert (G_IS_SIMPLE_ACTION (action));
+  g_assert (IDE_IS_WEBKIT_PAGE (self));
+
+  webkit_web_view_stop_loading (priv->web_view);
+
+  IDE_EXIT;
+}
+
 static const GActionEntry actions[] = {
   { "go-forward", go_forward_action },
   { "go-back", go_back_action },
   { "reload", reload_action },
+  { "stop", stop_action },
 };
 
 static void
@@ -264,6 +285,12 @@ ide_webkit_page_update_reload (IdeWebkitPage *self)
   uri = webkit_web_view_get_uri (priv->web_view);
 
   set_action_enabled (self, "reload", !loading && !ide_str_empty0 (uri));
+  set_action_enabled (self, "stop", loading);
+
+  if (loading)
+    gtk_stack_set_visible_child_name (priv->reload_stack, "stop");
+  else
+    gtk_stack_set_visible_child_name (priv->reload_stack, "reload");
 
   IDE_EXIT;
 }
@@ -283,6 +310,17 @@ ide_webkit_page_constructed (GObject *object)
     webkit_web_view_set_background_color (WEBKIT_WEB_VIEW (priv->web_view), &color);
 }
 
+static void
+ide_webkit_page_dispose (GObject *object)
+{
+  IdeWebkitPage *self = (IdeWebkitPage *)object;
+  IdeWebkitPagePrivate *priv = ide_webkit_page_get_instance_private (self);
+
+  g_clear_object (&priv->actions);
+
+  G_OBJECT_CLASS (ide_webkit_page_parent_class)->dispose (object);
+}
+
 static void
 ide_webkit_page_get_property (GObject    *object,
                               guint       prop_id,
@@ -328,6 +366,7 @@ ide_webkit_page_class_init (IdeWebkitPageClass *klass)
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
   object_class->constructed = ide_webkit_page_constructed;
+  object_class->dispose = ide_webkit_page_dispose;
   object_class->get_property = ide_webkit_page_get_property;
   object_class->set_property = ide_webkit_page_set_property;
 
@@ -344,6 +383,7 @@ ide_webkit_page_class_init (IdeWebkitPageClass *klass)
 
   gtk_widget_class_set_template_from_resource (widget_class, "/plugins/webkit/ide-webkit-page.ui");
 
+  gtk_widget_class_bind_template_child_private (widget_class, IdeWebkitPage, reload_stack);
   gtk_widget_class_bind_template_child_private (widget_class, IdeWebkitPage, toolbar);
   gtk_widget_class_bind_template_child_private (widget_class, IdeWebkitPage, url_bar);
   gtk_widget_class_bind_template_child_private (widget_class, IdeWebkitPage, web_view);
@@ -388,6 +428,7 @@ ide_webkit_page_init (IdeWebkitPage *self)
   set_action_enabled (self, "go-forward", FALSE);
   set_action_enabled (self, "go-back", FALSE);
   set_action_enabled (self, "reload", FALSE);
+  set_action_enabled (self, "stop", FALSE);
 }
 
 IdeWebkitPage *
diff --git a/src/libide/webkit/ide-webkit-page.ui b/src/libide/webkit/ide-webkit-page.ui
index d534f2503..84d88e880 100644
--- a/src/libide/webkit/ide-webkit-page.ui
+++ b/src/libide/webkit/ide-webkit-page.ui
@@ -42,9 +42,29 @@
                   </object>
                 </child>
                 <child>
-                  <object class="GtkButton">
-                    <property name="icon-name">view-refresh-symbolic</property>
-                    <property name="action-name">web.reload</property>
+                  <object class="GtkStack" id="reload_stack">
+                    <child>
+                      <object class="GtkStackPage">
+                        <property name="name">reload</property>
+                        <property name="child">
+                          <object class="GtkButton">
+                            <property name="icon-name">view-refresh-symbolic</property>
+                            <property name="action-name">web.reload</property>
+                          </object>
+                        </property>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkStackPage">
+                        <property name="name">stop</property>
+                        <property name="child">
+                          <object class="GtkButton">
+                            <property name="icon-name">stop-sign-symbolic</property>
+                            <property name="action-name">web.stop</property>
+                          </object>
+                        </property>
+                      </object>
+                    </child>
                   </object>
                 </child>
               </object>


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