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



commit 61df0725e79fcfce9e9a8a8a8a7f6987493f5c00
Author: Alexander Mikhaylenko <alexm gnome org>
Date:   Fri Oct 14 03:33:02 2022 +0400

    browsing view

 src/adw-browsing-view.c | 149 ++++++++++++++++++++++++++++++++++++++++++------
 src/adw-browsing-view.h |  10 ++++
 2 files changed, 143 insertions(+), 16 deletions(-)
---
diff --git a/src/adw-browsing-view.c b/src/adw-browsing-view.c
index c7dd4203..c949a37a 100644
--- a/src/adw-browsing-view.c
+++ b/src/adw-browsing-view.c
@@ -84,7 +84,6 @@ struct _AdwBrowsingView
 
   AdwBrowsingView *previous_view;
   AdwBrowsingView *next_view;
-  gboolean inside_set_previous_next_child;
 };
 
 static void adw_browsing_view_buildable_init (GtkBuildableIface *iface);
@@ -443,21 +442,30 @@ push_to_stack (AdwBrowsingView      *self,
 }
 
 static void
-pop_from_stack (AdwBrowsingView *self,
-                gboolean         animate)
+pop_from_stack (AdwBrowsingView      *self,
+                AdwBrowsingViewChild *child_to,
+                gboolean              animate)
 {
-  AdwBrowsingViewChild *visible_child;
+  AdwBrowsingViewChild *old_child;
   AdwBrowsingViewChild *new_child;
+  GSList *popped = NULL, *l;
 
   g_assert (self->navigation_stack);
 
-  visible_child = adw_browsing_view_get_visible_child (self);
+  old_child = adw_browsing_view_get_visible_child (self);
+
+  while (self->navigation_stack &&
+         self->navigation_stack->data &&
+         self->navigation_stack->data != child_to) {
+    AdwBrowsingViewChild *c = self->navigation_stack->data;
 
-  self->navigation_stack = g_slist_remove (self->navigation_stack, visible_child);
+    popped = g_slist_prepend (popped, c);
+    self->navigation_stack = g_slist_remove (self->navigation_stack, c);
+  }
 
   new_child = adw_browsing_view_get_visible_child (self);
 
-  switch_child (self, visible_child, new_child, TRUE, animate);
+  switch_child (self, old_child, new_child, TRUE, animate);
 
   if (!new_child && self->previous_view) {
     AdwBrowsingViewChild *prev_visible_child = adw_browsing_view_get_visible_child (self->previous_view);
@@ -474,7 +482,10 @@ pop_from_stack (AdwBrowsingView *self,
       adw_animation_skip (self->previous_view->transition);
   }
 
-  g_signal_emit (self, signals[SIGNAL_POPPED], 0, visible_child);
+  for (l = 0; l; l = l->next)
+    g_signal_emit (self, signals[SIGNAL_POPPED], 0, l->data);
+
+  g_slist_free (popped);
 }
 
 static void
@@ -902,7 +913,7 @@ adw_browsing_view_class_init (AdwBrowsingViewClass *klass)
   widget_class->compute_expand = adw_widget_compute_expand;
 
   /**
-   * AdwBrowsingView:visible-child: (attributes 
org.gtk.Property.get=adw_browsing_view_child_get_visible_child 
org.gtk.Property.set=adw_browsing_view_child_set_visible_child)
+   * AdwBrowsingView:visible-child: (attributes 
org.gtk.Property.get=adw_browsing_view_child_get_visible_child)
    *
    * TODO
    *
@@ -914,7 +925,7 @@ adw_browsing_view_class_init (AdwBrowsingViewClass *klass)
                          G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
 
   /**
-   * AdwBrowsingView:previous-view: (attributes 
org.gtk.Property.get=adw_browsing_view_child_get_previous_view 
org.gtk.Property.set=adw_browsing_view_child_set_previous_view)
+   * AdwBrowsingView:previous-view: (attributes 
org.gtk.Property.get=adw_browsing_view_child_get_previous_view)
    *
    * TODO
    *
@@ -926,7 +937,7 @@ adw_browsing_view_class_init (AdwBrowsingViewClass *klass)
                          G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
 
   /**
-   * AdwBrowsingView:next-view: (attributes org.gtk.Property.get=adw_browsing_view_child_get_next_view 
org.gtk.Property.set=adw_browsing_view_child_set_next_view)
+   * AdwBrowsingView:next-view: (attributes org.gtk.Property.get=adw_browsing_view_child_get_next_view)
    *
    * TODO
    *
@@ -1210,7 +1221,7 @@ adw_browsing_view_child_get_child_name (AdwBrowsingViewChild *self)
 }
 
 /**
- * adw_browsing_view_child_set_child_name (attributes org.gtk.Method.set_property=child-name)
+ * adw_browsing_view_child_set_child_name: (attributes org.gtk.Method.set_property=child-name)
  * @self: a browsing view child
  * @name: (nullable): the name
  *
@@ -1346,8 +1357,11 @@ adw_browsing_view_remove (AdwBrowsingView *self,
     return;
   }
 
+  if (self->hiding_child && child == GTK_WIDGET (self->hiding_child))
+    adw_animation_skip (self->transition);
+
   if (adw_browsing_view_get_visible_child (self) == ADW_BROWSING_VIEW_CHILD (wrapper))
-    pop_from_stack (self, FALSE);
+    adw_browsing_view_pop (self, FALSE);
   else if (g_slist_find (self->navigation_stack, wrapper))
     self->navigation_stack = g_slist_remove (self->navigation_stack, wrapper);
 
@@ -1472,6 +1486,7 @@ adw_browsing_view_pop (AdwBrowsingView *self,
                        gboolean         animate)
 {
   AdwBrowsingViewChild *child;
+  AdwBrowsingViewChild *prev_child;
 
   g_return_val_if_fail (ADW_IS_BROWSING_VIEW (self), FALSE);
 
@@ -1479,16 +1494,98 @@ adw_browsing_view_pop (AdwBrowsingView *self,
 
   child = adw_browsing_view_get_visible_child (self);
 
-  if (!adw_browsing_view_get_previous_child (self, child))
+  prev_child = adw_browsing_view_get_previous_child (self, child);
+
+  if (!prev_child)
     return FALSE;
 
-  pop_from_stack (self, animate);
+  pop_from_stack (self, prev_child, animate);
 
   return TRUE;
 }
 
 /**
- * adw_browsing_view_get_visible_child:
+ * adw_browsing_view_pop_to_child:
+ * @self: a browsing view
+ * @child: TODO
+ * @animate: TODO
+ *
+ * TODO
+ *
+ * Returns: TODO
+ *
+ * Since: 1.3
+ */
+gboolean
+adw_browsing_view_pop_to_child (AdwBrowsingView *self,
+                                GtkWidget       *child,
+                                gboolean         animate)
+{
+  AdwBrowsingViewChild *visible_child;
+  AdwBrowsingViewChild *wrapper;
+
+  g_return_val_if_fail (ADW_IS_BROWSING_VIEW (self), FALSE);
+  g_return_val_if_fail (ADW_IS_BROWSING_VIEW_CHILD (child), FALSE);
+
+  animate = !!animate;
+
+  visible_child = adw_browsing_view_get_visible_child (self);
+
+  if (ADW_IS_BROWSING_VIEW_CHILD (child) &&
+      gtk_widget_get_parent (child) == GTK_WIDGET (self))
+    wrapper = ADW_BROWSING_VIEW_CHILD (child);
+  else
+    wrapper = g_hash_table_lookup (self->child_mapping, child);
+
+  if (wrapper == visible_child)
+    return FALSE;
+
+  if (!g_slist_find (self->navigation_stack, wrapper)) {
+    g_critical ("Child '%s' is not in the navigation stack\n",
+                adw_browsing_view_child_get_title (wrapper));
+    return FALSE;
+  }
+
+  pop_from_stack (self, wrapper, animate);
+
+  return TRUE;
+}
+
+/**
+ * adw_browsing_view_pop_to_name:
+ * @self: a browsing view
+ * @name: TODO
+ * @animate: TODO
+ *
+ * TODO
+ *
+ * Returns: TODO
+ *
+ * Since: 1.3
+ */
+gboolean
+adw_browsing_view_pop_to_name (AdwBrowsingView *self,
+                               const char      *name,
+                               gboolean         animate)
+{
+  AdwBrowsingViewChild *child;
+
+  g_return_val_if_fail (ADW_IS_BROWSING_VIEW (self), FALSE);
+  g_return_val_if_fail (name != NULL, FALSE);
+
+  child = adw_browsing_view_find_child (self, name);
+
+  if (child == NULL) {
+    g_critical ("No child found with the name '%s' in AdwBrowsingView %p",
+                name, self);
+    return FALSE;
+  }
+
+  return adw_browsing_view_pop_to_child (self, GTK_WIDGET (child), animate);
+}
+
+/**
+ * adw_browsing_view_get_visible_child: (attributes org.gtk.Method.set_property=visible-child)
  * @self: a browsing view
  *
  * TODO
@@ -1541,6 +1638,16 @@ adw_browsing_view_get_previous_child (AdwBrowsingView      *self,
   return NULL;
 }
 
+/**
+ * adw_browsing_view_get_previous_view: (attributes org.gtk.Method.set_property=previous-view)
+ * @self: a browsing view
+ *
+ * TODO
+ *
+ * Returns: TODO
+ *
+ * Since: 1.3
+ */
 AdwBrowsingView *
 adw_browsing_view_get_previous_view (AdwBrowsingView *self)
 {
@@ -1549,6 +1656,16 @@ adw_browsing_view_get_previous_view (AdwBrowsingView *self)
   return self->previous_view;
 }
 
+/**
+ * adw_browsing_view_get_next_view: (attributes org.gtk.Method.set_property=next-view)
+ * @self: a browsing view
+ *
+ * TODO
+ *
+ * Returns: TODO
+ *
+ * Since: 1.3
+ */
 AdwBrowsingView *
 adw_browsing_view_get_next_view (AdwBrowsingView *self)
 {
diff --git a/src/adw-browsing-view.h b/src/adw-browsing-view.h
index 5df3b8d3..5e35af13 100644
--- a/src/adw-browsing-view.h
+++ b/src/adw-browsing-view.h
@@ -97,6 +97,16 @@ ADW_AVAILABLE_IN_1_3
 gboolean adw_browsing_view_pop (AdwBrowsingView *self,
                                 gboolean         animate);
 
+ADW_AVAILABLE_IN_1_3
+gboolean adw_browsing_view_pop_to_child (AdwBrowsingView *self,
+                                         GtkWidget       *child,
+                                         gboolean         animate);
+
+ADW_AVAILABLE_IN_1_3
+gboolean adw_browsing_view_pop_to_name (AdwBrowsingView *self,
+                                        const char      *name,
+                                        gboolean         animate);
+
 ADW_AVAILABLE_IN_1_3
 AdwBrowsingViewChild *adw_browsing_view_get_visible_child (AdwBrowsingView *self);
 


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