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



commit 890c373e6e6a0b38d1af6be872575c31cef07000
Author: Alexander Mikhaylenko <alexm gnome org>
Date:   Fri Oct 14 00:22:38 2022 +0400

    headerbar

 src/adw-header-bar.c | 123 ++++++++++++++++++++++++++++++++++++++++++++++++---
 src/adw-header-bar.h |   6 +++
 2 files changed, 123 insertions(+), 6 deletions(-)
---
diff --git a/src/adw-header-bar.c b/src/adw-header-bar.c
index b579916c..f2aeadae 100644
--- a/src/adw-header-bar.c
+++ b/src/adw-header-bar.c
@@ -157,6 +157,7 @@ struct _AdwHeaderBar {
 
   guint show_start_title_buttons : 1;
   guint show_end_title_buttons : 1;
+  guint show_back_button : 1;
   guint track_default_decoration : 1;
 
   AdwCenteringPolicy centering_policy;
@@ -176,6 +177,7 @@ enum {
   PROP_TITLE_WIDGET,
   PROP_SHOW_START_TITLE_BUTTONS,
   PROP_SHOW_END_TITLE_BUTTONS,
+  PROP_SHOW_BACK_BUTTON,
   PROP_DECORATION_LAYOUT,
   PROP_CENTERING_POLICY,
   LAST_PROP
@@ -223,7 +225,7 @@ update_back_button (AdwHeaderBar *self)
 {
   AdwBrowsingViewChild *prev_child = NULL;
 
-  if (self->browsing_view && self->browsing_view_child)
+  if (self->show_back_button && 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));
 
@@ -320,6 +322,45 @@ browsing_view_pushed_cb (AdwHeaderBar *self)
     update_back_button (self);
 }
 
+static void
+browsing_view_notify_previous_view_cb (AdwHeaderBar *self)
+{
+  AdwBrowsingViewChild *prev_child;
+
+  g_assert (self->browsing_view);
+  g_assert (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 || gtk_widget_get_parent (GTK_WIDGET (prev_child)) != GTK_WIDGET (self->browsing_view))
+    update_back_button (self);
+}
+
+static void
+track_back_button (AdwHeaderBar *self)
+{
+  if (!self->browsing_view)
+    return;
+
+  g_signal_connect_swapped (self->browsing_view, "pushed",
+                            G_CALLBACK (browsing_view_pushed_cb), self);
+  g_signal_connect_swapped (self->browsing_view, "notify::previous-view",
+                            G_CALLBACK (browsing_view_notify_previous_view_cb), self);
+}
+
+static void
+untrack_back_button (AdwHeaderBar *self)
+{
+  if (!self->browsing_view)
+    return;
+
+  g_signal_handlers_disconnect_by_func (self->browsing_view,
+                                        browsing_view_pushed_cb, self);
+  g_signal_handlers_disconnect_by_func (self->browsing_view,
+                                        browsing_view_notify_previous_view_cb, self);
+}
+
 static void
 adw_header_bar_root (GtkWidget *widget)
 {
@@ -338,17 +379,17 @@ adw_header_bar_root (GtkWidget *widget)
 
   // 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, "pushed",
-                              G_CALLBACK (browsing_view_pushed_cb), widget);
     g_signal_connect_swapped (browsing_view_child, "notify::title",
                               G_CALLBACK (update_title), widget);
+
+    if (self->show_back_button)
+      track_back_button (self);
   } else {
     GtkRoot *root = gtk_widget_get_root (widget);
 
@@ -367,11 +408,11 @@ adw_header_bar_unroot (GtkWidget *widget)
   AdwHeaderBar *self = ADW_HEADER_BAR (widget);
 
   if (self->browsing_view && self->browsing_view_child) {
-    g_signal_handlers_disconnect_by_func (self->browsing_view,
-                                          browsing_view_pushed_cb, widget);
     g_signal_handlers_disconnect_by_func (self->browsing_view_child,
                                           update_title, widget);
 
+    untrack_back_button (self);
+
     self->browsing_view = NULL;
     self->browsing_view_child = NULL;
 
@@ -430,6 +471,9 @@ adw_header_bar_get_property (GObject    *object,
   case PROP_SHOW_END_TITLE_BUTTONS:
     g_value_set_boolean (value, adw_header_bar_get_show_end_title_buttons (self));
     break;
+  case PROP_SHOW_BACK_BUTTON:
+    g_value_set_boolean (value, adw_header_bar_get_show_back_button (self));
+    break;
   case PROP_DECORATION_LAYOUT:
     g_value_set_string (value, adw_header_bar_get_decoration_layout (self));
     break;
@@ -460,6 +504,9 @@ adw_header_bar_set_property (GObject      *object,
   case PROP_SHOW_END_TITLE_BUTTONS:
     adw_header_bar_set_show_end_title_buttons (self, g_value_get_boolean (value));
     break;
+  case PROP_SHOW_BACK_BUTTON:
+    adw_header_bar_set_show_back_button (self, g_value_get_boolean (value));
+    break;
   case PROP_DECORATION_LAYOUT:
     adw_header_bar_set_decoration_layout (self, g_value_get_string (value));
     break;
@@ -552,6 +599,18 @@ adw_header_bar_class_init (AdwHeaderBarClass *class)
                           TRUE,
                           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY);
 
+  /**
+   * AdwHeaderBar:show-back-button: (attributes org.gtk.Property.get=adw_header_bar_get_show_back_button 
org.gtk.Property.set=adw_header_bar_set_show_back_button)
+   *
+   * TODO
+   *
+   * Since: 1.3
+   */
+  props[PROP_SHOW_BACK_BUTTON] =
+    g_param_spec_boolean ("show-back-button", NULL, NULL,
+                          TRUE,
+                          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY);
+
   /**
    * AdwHeaderBar:decoration-layout: (attributes org.gtk.Property.get=adw_header_bar_get_decoration_layout 
org.gtk.Property.set=adw_header_bar_set_decoration_layout)
    *
@@ -602,6 +661,7 @@ adw_header_bar_init (AdwHeaderBar *self)
   self->decoration_layout = NULL;
   self->show_start_title_buttons = TRUE;
   self->show_end_title_buttons = TRUE;
+  self->show_back_button = TRUE;
 
   self->handle = gtk_window_handle_new ();
   gtk_widget_set_parent (self->handle, GTK_WIDGET (self));
@@ -930,6 +990,57 @@ adw_header_bar_set_show_end_title_buttons (AdwHeaderBar *self,
   g_object_notify_by_pspec (G_OBJECT (self), props[PROP_SHOW_END_TITLE_BUTTONS]);
 }
 
+/**
+ * adw_header_bar_get_show_back_button: (attributes org.gtk.Method.get_property=show-back-button)
+ * @self: a header bar
+ *
+ * TODO
+ *
+ * Returns: TODO
+ *
+ * Since: 1.3
+ */
+gboolean
+adw_header_bar_get_show_back_button (AdwHeaderBar *self)
+{
+  g_return_val_if_fail (ADW_IS_HEADER_BAR (self), FALSE);
+
+  return self->show_back_button;
+}
+
+/**
+ * adw_header_bar_set_show_back_button: (attributes org.gtk.Method.set_property=show-back-button)
+ * @self: a header bar
+ * @show_back_button: TODO
+ *
+ * TODO
+ *
+ * Since: 1.3
+ */
+void
+adw_header_bar_set_show_back_button (AdwHeaderBar *self,
+                                     gboolean      show_back_button)
+{
+  g_return_if_fail (ADW_IS_HEADER_BAR (self));
+
+  show_back_button = !!show_back_button;
+
+  if (self->show_back_button == show_back_button)
+    return;
+
+  self->show_back_button = show_back_button;
+
+  if (self->show_back_button)
+    track_back_button (self);
+  else
+    untrack_back_button (self);
+
+  if (self->start_box)
+    update_back_button (self);
+
+  g_object_notify_by_pspec (G_OBJECT (self), props[PROP_SHOW_BACK_BUTTON]);
+}
+
 /**
  * adw_header_bar_get_decoration_layout: (attributes org.gtk.Method.get_property=decoration-layout)
  * @self: a header bar
diff --git a/src/adw-header-bar.h b/src/adw-header-bar.h
index cd18885e..acfa29c2 100644
--- a/src/adw-header-bar.h
+++ b/src/adw-header-bar.h
@@ -72,6 +72,12 @@ ADW_AVAILABLE_IN_ALL
 void     adw_header_bar_set_show_end_title_buttons (AdwHeaderBar *self,
                                                     gboolean      setting);
 
+ADW_AVAILABLE_IN_ALL
+gboolean adw_header_bar_get_show_back_button (AdwHeaderBar *self);
+ADW_AVAILABLE_IN_ALL
+void     adw_header_bar_set_show_back_button (AdwHeaderBar *self,
+                                              gboolean      show_back_button);
+
 ADW_AVAILABLE_IN_ALL
 const char *adw_header_bar_get_decoration_layout (AdwHeaderBar *self);
 ADW_AVAILABLE_IN_ALL


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