[libadwaita/wip/exalm/browsing-view] hb



commit 5e7b79a0a3ac874c66ae015beefb56dd341173d3
Author: Alexander Mikhaylenko <alexm gnome org>
Date:   Mon Oct 10 20:21:17 2022 +0400

    hb

 src/adw-header-bar.c | 57 ++++++++++++++++++++++++++++------------------------
 1 file changed, 31 insertions(+), 26 deletions(-)
---
diff --git a/src/adw-header-bar.c b/src/adw-header-bar.c
index 1547596f..b579916c 100644
--- a/src/adw-header-bar.c
+++ b/src/adw-header-bar.c
@@ -23,6 +23,7 @@
 
 #include "adw-header-bar.h"
 
+#include "adw-button-content.h"
 #include "adw-browsing-view.h"
 #include "adw-enums.h"
 #include "adw-gizmo-private.h"
@@ -151,7 +152,6 @@ struct _AdwHeaderBar {
 
   GtkWidget *start_window_controls;
   GtkWidget *end_window_controls;
-  GtkWidget *back_button;
 
   char *decoration_layout;
 
@@ -164,8 +164,11 @@ struct _AdwHeaderBar {
 
   GtkSizeGroup *size_group;
 
+  GtkWidget *back_button;
   GtkWidget *browsing_view;
   GtkWidget *browsing_view_child;
+  AdwBrowsingViewChild *browsing_view_previous_child;
+  GBinding *back_button_binding;
 };
 
 enum {
@@ -218,31 +221,22 @@ create_end_window_controls (AdwHeaderBar *self)
 static void
 update_back_button (AdwHeaderBar *self)
 {
-  gboolean has_back_button = FALSE;
-  const char *tooltip = NULL;
-
-  if (self->browsing_view && self->browsing_view_child) {
-    AdwBrowsingViewChild *prev_child;
+  AdwBrowsingViewChild *prev_child = NULL;
 
-    // TODO: if there's a way to edit hsitory at some point, this will need to
-    // be updated too
-    // TODO: ditto for merging views
-    // TODO: need to check can-go-back once it's implemented
-    // TODO: track title changes
+  if (self->browsing_view && self->browsing_view_child)
     prev_child = adw_browsing_view_get_previous_child (ADW_BROWSING_VIEW (self->browsing_view),
                                                        ADW_BROWSING_VIEW_CHILD (self->browsing_view_child));
 
+  if (prev_child == self->browsing_view_previous_child)
+    return;
 
-    has_back_button = !!prev_child;
-
-    if (prev_child)
-      tooltip = adw_browsing_view_child_get_title (prev_child);
-  }
+  self->browsing_view_previous_child = prev_child;
 
-  if (has_back_button) {
+  if (prev_child) {
     if (!self->back_button) {
       self->back_button = gtk_button_new_from_icon_name ("go-previous-symbolic");
 
+      gtk_widget_add_css_class (self->back_button, "back-button");
       gtk_actionable_set_action_name (GTK_ACTIONABLE (self->back_button), "browsing.pop");
 
       gtk_box_insert_child_after (GTK_BOX (self->start_box),
@@ -250,12 +244,16 @@ update_back_button (AdwHeaderBar *self)
                                   self->start_window_controls);
     }
 
-    gtk_widget_set_tooltip_text (self->back_button, tooltip);
-  } else {
-    if (self->back_button)
-      gtk_box_remove (GTK_BOX (self->start_box), self->back_button);
-
+    g_clear_pointer (&self->back_button_binding, g_binding_unbind);
+    self->back_button_binding =
+      g_object_bind_property (prev_child, "title",
+                              self->back_button, "tooltip-text",
+                              G_BINDING_SYNC_CREATE);
+  } else if (self->back_button) {
+    gtk_box_remove (GTK_BOX (self->start_box), self->back_button);
     self->back_button = NULL;
+    self->browsing_view_previous_child = NULL;
+    self->back_button_binding = NULL;
   }
 }
 
@@ -309,7 +307,7 @@ construct_title_label (AdwHeaderBar *self)
 }
 
 static void
-browsing_view_visible_child_cb (AdwHeaderBar *self)
+browsing_view_pushed_cb (AdwHeaderBar *self)
 {
   AdwBrowsingViewChild *visible_child;
 
@@ -338,12 +336,17 @@ adw_header_bar_root (GtkWidget *widget)
   if (!ADW_IS_BROWSING_VIEW (browsing_view))
     browsing_view = NULL;
 
+  // TODO: if there's a way to edit hsitory at some point, this will need to
+  // be updated too
+  // TODO: ditto for merging views
+  // TODO: need to check can-go-back once it's implemented
+
   if (browsing_view && browsing_view_child) {
     self->browsing_view = browsing_view;
     self->browsing_view_child = browsing_view_child;
 
-    g_signal_connect_swapped (browsing_view, "notify::visible-child",
-                              G_CALLBACK (browsing_view_visible_child_cb), widget);
+    g_signal_connect_swapped (browsing_view, "pushed",
+                              G_CALLBACK (browsing_view_pushed_cb), widget);
     g_signal_connect_swapped (browsing_view_child, "notify::title",
                               G_CALLBACK (update_title), widget);
   } else {
@@ -365,12 +368,14 @@ adw_header_bar_unroot (GtkWidget *widget)
 
   if (self->browsing_view && self->browsing_view_child) {
     g_signal_handlers_disconnect_by_func (self->browsing_view,
-                                          browsing_view_visible_child_cb, widget);
+                                          browsing_view_pushed_cb, widget);
     g_signal_handlers_disconnect_by_func (self->browsing_view_child,
                                           update_title, widget);
 
     self->browsing_view = NULL;
     self->browsing_view_child = NULL;
+
+    update_back_button (self);
   } else {
     g_signal_handlers_disconnect_by_func (gtk_widget_get_root (widget),
                                           update_title, widget);


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