[libadwaita/wip/exalm/browsing-view] browsing view
- From: Alexander Mikhaylenko <alexm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libadwaita/wip/exalm/browsing-view] browsing view
- Date: Thu, 13 Oct 2022 23:33:18 +0000 (UTC)
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]