From 396bfe04660e17d02c147488edd0c752682afecf Mon Sep 17 00:00:00 2001 From: Matt Watson Date: Mon, 12 May 2014 16:35:18 -0700 Subject: EosPageManager uses GtkStack properties directly Use the visible-child and visible-child-name properties of GtkStack in lieu of visible-page and visible-page-name. Use the transition-duration, transition-type and name properties of GtkStack instead of proxying in page manager with properties of that same name. The page manger becomes nothing more than a stack with custom child properties for use in EosWindow, and becomes a lot simpler. This breaks the page manager api and will require changes in the apps as well [endlessm/eos-sdk#985] --- docs/reference/endless/endless-sections.txt | 13 - endless/Makefile.am | 2 +- endless/eospagemanager-private.h | 18 - endless/eospagemanager.c | 566 +--------------------------- endless/eospagemanager.h | 63 ---- endless/eossplashpagemanager.c | 6 +- endless/eoswindow.c | 24 +- test/endless/test-page-manager.c | 338 ----------------- test/endless/test-splash-page-manager.c | 35 +- test/smoke-tests/app-window.js | 72 +--- test/smoke-tests/webhelper/webview.js | 8 +- wikipedia/views/domain_wiki_view.js | 22 +- 12 files changed, 77 insertions(+), 1090 deletions(-) delete mode 100644 endless/eospagemanager-private.h diff --git a/docs/reference/endless/endless-sections.txt b/docs/reference/endless/endless-sections.txt index 0799fba..0dc0428 100644 --- a/docs/reference/endless/endless-sections.txt +++ b/docs/reference/endless/endless-sections.txt @@ -58,12 +58,6 @@ EosWindowPrivate page-manager EosPageManager eos_page_manager_new -eos_page_manager_get_visible_page -eos_page_manager_set_visible_page -eos_page_manager_get_visible_page_name -eos_page_manager_set_visible_page_name -eos_page_manager_get_page_name -eos_page_manager_set_page_name eos_page_manager_get_page_left_topbar_widget eos_page_manager_set_page_left_topbar_widget eos_page_manager_get_page_center_topbar_widget @@ -76,12 +70,7 @@ eos_page_manager_get_page_background_position eos_page_manager_set_page_background_position eos_page_manager_get_page_background_repeats eos_page_manager_set_page_background_repeats -eos_page_manager_get_transition_duration -eos_page_manager_set_transition_duration -eos_page_manager_get_transition_type -eos_page_manager_set_transition_type eos_page_manager_remove_page_by_name -EosPageManagerTransitionType EOS_IS_PAGE_MANAGER EOS_IS_PAGE_MANAGER_CLASS @@ -89,10 +78,8 @@ EOS_PAGE_MANAGER EOS_PAGE_MANAGER_CLASS EOS_PAGE_MANAGER_GET_CLASS EOS_TYPE_PAGE_MANAGER -EOS_TYPE_PAGE_MANAGER_TRANSITION_TYPE EosPageManagerClass eos_page_manager_get_type -eos_page_manager_transition_type_get_type EosPageManagerPrivate diff --git a/endless/Makefile.am b/endless/Makefile.am index a1d4e15..f0a6a6a 100644 --- a/endless/Makefile.am +++ b/endless/Makefile.am @@ -43,7 +43,7 @@ endless_library_sources = \ endless/eoscustomcontainer.c \ endless/eoshello.c \ endless/eosinit.c endless/eosinit-private.h \ - endless/eospagemanager.c endless/eospagemanager-private.h \ + endless/eospagemanager.c \ endless/eosresource.c endless/eosresource-private.h \ endless/eossplashpagemanager.c \ endless/eostopbar.c endless/eostopbar-private.h \ diff --git a/endless/eospagemanager-private.h b/endless/eospagemanager-private.h deleted file mode 100644 index c39a118..0000000 --- a/endless/eospagemanager-private.h +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright 2013 Endless Mobile, Inc. */ - -#ifndef EOS_PAGE_MANAGER_PRIVATE_H -#define EOS_PAGE_MANAGER_PRIVATE_H - -#include "eostypes.h" - -#include "eospagemanager.h" - -#include - -G_BEGIN_DECLS - -GtkStackTransitionType eos_page_manager_get_gtk_stack_transition_type (EosPageManager *self); - -G_END_DECLS - -#endif /* EOS_PAGE_MANAGER_PRIVATE_H */ diff --git a/endless/eospagemanager.c b/endless/eospagemanager.c index 3100d74..78d5b56 100644 --- a/endless/eospagemanager.c +++ b/endless/eospagemanager.c @@ -2,7 +2,6 @@ #include "config.h" #include "eospagemanager.h" -#include "eospagemanager-private.h" #include @@ -73,16 +72,10 @@ * If the removed page was the only page, then the page manager will display * nothing. * If there are multiple pages still in the page manager, you should never - * remove the visible-page. Always set a new visible page before removing the + * remove the visible-child. Always set a new visible child before removing the * current one. A critical warning will be emitted if you remove the visible- * page when there are still other pages in the page manager. * - * - * Removing pages with gtk_container_remove() is currently broken due to - * a bug in GTK. Use eos_page_manager_remove_page_by_name() for the time - * being. - * - * * In general, it is convenient to refer to a page by its name when dealing with * the page manager, so you should make a point of giving all your pages names. */ @@ -92,7 +85,6 @@ typedef struct { GtkWidget *page; - gchar *name; GtkWidget *left_topbar_widget; GtkWidget *center_topbar_widget; gchar *background_uri; @@ -103,47 +95,14 @@ typedef struct { typedef struct { GList *page_info; /* GList */ - GHashTable *pages_by_name; /* GHashTable */ GHashTable *pages_by_widget; /* GHashTable */ - EosPageManagerPageInfo *visible_page_info; - EosPageManagerTransitionType transition_type; } EosPageManagerPrivate; G_DEFINE_TYPE_WITH_PRIVATE (EosPageManager, eos_page_manager, GTK_TYPE_STACK) -GType -eos_page_manager_transition_type_get_type (void) -{ - static GType etype = 0; - if (G_UNLIKELY(etype == 0)) { - static const GEnumValue values[] = { - { EOS_PAGE_MANAGER_TRANSITION_TYPE_NONE, "EOS_PAGE_MANAGER_TRANSITION_TYPE_NONE", "none" }, - { EOS_PAGE_MANAGER_TRANSITION_TYPE_CROSSFADE, "EOS_PAGE_MANAGER_TRANSITION_TYPE_CROSSFADE", "crossfade" }, - { EOS_PAGE_MANAGER_TRANSITION_TYPE_SLIDE_RIGHT, "EOS_PAGE_MANAGER_TRANSITION_TYPE_SLIDE_RIGHT", "slide_right" }, - { EOS_PAGE_MANAGER_TRANSITION_TYPE_SLIDE_LEFT, "EOS_PAGE_MANAGER_TRANSITION_TYPE_SLIDE_LEFT", "slide_left" }, - { EOS_PAGE_MANAGER_TRANSITION_TYPE_SLIDE_UP, "EOS_PAGE_MANAGER_TRANSITION_TYPE_SLIDE_UP", "slide_up" }, - { EOS_PAGE_MANAGER_TRANSITION_TYPE_SLIDE_DOWN, "EOS_PAGE_MANAGER_TRANSITION_TYPE_SLIDE_DOWN", "slide_down" }, - { 0, NULL, NULL } - }; - etype = g_enum_register_static (g_intern_static_string ("EosPageManagerTransitionType"), values); - } - return etype; -} - -enum -{ - PROP_0, - PROP_VISIBLE_PAGE, - PROP_VISIBLE_PAGE_NAME, - PROP_TRANSITION_DURATION, - PROP_TRANSITION_TYPE, - NPROPS -}; - enum { CHILD_PROP_0, - CHILD_PROP_NAME, CHILD_PROP_LEFT_TOPBAR_WIDGET, CHILD_PROP_CENTER_TOPBAR_WIDGET, CHILD_PROP_BACKGROUND_URI, @@ -153,13 +112,11 @@ enum NCHILDPROPS }; -static GParamSpec *eos_page_manager_props[NPROPS] = { NULL, }; static GParamSpec *eos_page_manager_child_props[NCHILDPROPS] = { NULL, }; static void page_info_free (EosPageManagerPageInfo *info) { - g_free (info->name); g_free (info->background_uri); g_free (info->background_size); g_free (info->background_position); @@ -191,24 +148,6 @@ find_page_info_by_widget (EosPageManager *self, return g_hash_table_lookup (priv->pages_by_widget, page); } -/* - * find_page_info_by_name: - * @self: the page manager - * @name: the name to look for - * - * Searches for the page info corresponding to the child with name @name. - * - * Returns: the #EosPageManagerPageInfo for @name, or %NULL if @name is not the - * name of a child of @self. - */ -static EosPageManagerPageInfo * -find_page_info_by_name (EosPageManager *self, - const gchar *name) -{ - EosPageManagerPrivate *priv = eos_page_manager_get_instance_private (self); - return g_hash_table_lookup (priv->pages_by_name, name); -} - /* Convenience function, since this warning occurs at several places */ static void warn_page_widget_not_found (EosPageManager *self, @@ -220,16 +159,6 @@ warn_page_widget_not_found (EosPageManager *self, self); } -/* Convenience function, since this warning occurs at several places */ -static void -warn_page_name_not_found (EosPageManager *self, - const gchar *name) -{ - g_critical ("EosPageManager %p has no page named %s", - self, - name); -} - /* Invariants: number of pages in list and number of pages in pages_by_widget hash table must be equal; and number of pages in pages_by_name hash table must be equal or less. This check is expensive, should only be enabled for debugging. @@ -243,88 +172,9 @@ assert_internal_state (EosPageManager *self) g_assert_cmpuint (list_length, ==, g_hash_table_size (priv->pages_by_widget)); - g_assert_cmpuint (list_length, - >=, - g_hash_table_size (priv->pages_by_name)); #endif } -static void -set_visible_page_from_info (EosPageManager *self, - EosPageManagerPageInfo *info) -{ - EosPageManagerPrivate *priv = eos_page_manager_get_instance_private (self); - gtk_stack_set_visible_child (GTK_STACK (self), info->page); - - priv->visible_page_info = info; - - GObject *self_object = G_OBJECT (self); - g_object_notify(self_object, "visible-page"); - g_object_notify(self_object, "visible-page-name"); -} - -static void -eos_page_manager_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec) -{ - EosPageManager *self = EOS_PAGE_MANAGER (object); - - switch (property_id) - { - case PROP_VISIBLE_PAGE: - g_value_set_object (value, eos_page_manager_get_visible_page (self)); - break; - - case PROP_VISIBLE_PAGE_NAME: - g_value_set_string (value, eos_page_manager_get_visible_page_name (self)); - break; - - case PROP_TRANSITION_DURATION: - g_value_set_uint (value, eos_page_manager_get_transition_duration (self)); - break; - - case PROP_TRANSITION_TYPE: - g_value_set_enum (value, eos_page_manager_get_transition_type (self)); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - } -} - -static void -eos_page_manager_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec) -{ - EosPageManager *self = EOS_PAGE_MANAGER (object); - - switch (property_id) - { - case PROP_VISIBLE_PAGE: - eos_page_manager_set_visible_page (self, g_value_get_object (value)); - break; - - case PROP_VISIBLE_PAGE_NAME: - eos_page_manager_set_visible_page_name (self, g_value_get_string (value)); - break; - - case PROP_TRANSITION_DURATION: - eos_page_manager_set_transition_duration (self, g_value_get_uint (value)); - break; - - case PROP_TRANSITION_TYPE: - eos_page_manager_set_transition_type (self, g_value_get_enum (value)); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - } -} - static void eos_page_manager_dispose (GObject *object) { @@ -332,8 +182,6 @@ eos_page_manager_dispose (GObject *object) EosPageManagerPrivate *priv = eos_page_manager_get_instance_private (self); g_list_foreach (priv->page_info, (GFunc)top_bars_unref, NULL); - // Unset visible page so it doesn't keep updating as widgets are removed - priv->visible_page_info = NULL; G_OBJECT_CLASS (eos_page_manager_parent_class)->dispose (object); } @@ -343,11 +191,10 @@ eos_page_manager_finalize (GObject *object) EosPageManager *self = EOS_PAGE_MANAGER (object); EosPageManagerPrivate *priv = eos_page_manager_get_instance_private (self); + G_OBJECT_CLASS (eos_page_manager_parent_class)->finalize (object); + g_list_foreach (priv->page_info, (GFunc)page_info_free, NULL); g_hash_table_destroy(priv->pages_by_widget); - g_hash_table_destroy(priv->pages_by_name); - - G_OBJECT_CLASS (eos_page_manager_parent_class)->finalize (object); } static void @@ -357,7 +204,6 @@ eos_page_manager_add (GtkContainer *container, EosPageManager *self = EOS_PAGE_MANAGER (container); EosPageManagerPrivate *priv = eos_page_manager_get_instance_private (self); - GTK_CONTAINER_CLASS (eos_page_manager_parent_class)->add (container, new_page); EosPageManagerPageInfo *info = g_slice_new0 (EosPageManagerPageInfo); info->background_size = g_strdup (DEFAULT_BACKGROUND_SIZE); info->background_position = g_strdup (DEFAULT_BACKGROUND_POSITION); @@ -366,10 +212,7 @@ eos_page_manager_add (GtkContainer *container, priv->page_info = g_list_prepend (priv->page_info, info); g_hash_table_insert (priv->pages_by_widget, new_page, info); - /* If there were no pages yet, then this one must become the visible one */ - if (priv->visible_page_info == NULL) - eos_page_manager_set_visible_page (self, new_page); - + GTK_CONTAINER_CLASS (eos_page_manager_parent_class)->add (container, new_page); assert_internal_state (self); } @@ -389,26 +232,6 @@ eos_page_manager_remove (GtkContainer *container, } priv->page_info = g_list_remove (priv->page_info, info); g_hash_table_remove (priv->pages_by_widget, page); - if (info->name != NULL) - g_hash_table_remove (priv->pages_by_name, info->name); - - if (priv->visible_page_info == info) - { - /* If this was the only page */ - if (priv->page_info == NULL) - { - priv->visible_page_info = NULL; - } - /* Otherwise set visible page as the first in our list. */ - else - { - g_critical ("Removing the currently visible page %p from the page manager.", - page); - EosPageManagerPageInfo *visible_info = g_list_first (priv->page_info)->data; - set_visible_page_from_info (self, visible_info); - } - - } page_info_free (info); @@ -426,10 +249,6 @@ eos_page_manager_get_child_property (GtkContainer *container, switch (property_id) { - case CHILD_PROP_NAME: - g_value_set_string (value, eos_page_manager_get_page_name (self, child)); - break; - case CHILD_PROP_BACKGROUND_URI: g_value_set_string (value, eos_page_manager_get_page_background_uri (self, @@ -483,10 +302,6 @@ eos_page_manager_set_child_property (GtkContainer *container, switch (property_id) { - case CHILD_PROP_NAME: - eos_page_manager_set_page_name (self, child, g_value_get_string (value)); - break; - case CHILD_PROP_BACKGROUND_URI: eos_page_manager_set_page_background_uri (self, child, g_value_get_string (value)); @@ -529,8 +344,6 @@ eos_page_manager_class_init (EosPageManagerClass *klass) GObjectClass *object_class = G_OBJECT_CLASS (klass); GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass); - object_class->get_property = eos_page_manager_get_property; - object_class->set_property = eos_page_manager_set_property; object_class->dispose = eos_page_manager_dispose; object_class->finalize = eos_page_manager_finalize; @@ -539,73 +352,6 @@ eos_page_manager_class_init (EosPageManagerClass *klass) container_class->get_child_property = eos_page_manager_get_child_property; container_class->set_child_property = eos_page_manager_set_child_property; - /** - * EosPageManager:visible-page: - * - * A reference to the page widget that is currently being displayed by the - * page manager. - * If the page manager has no pages, then this is %NULL. - */ - eos_page_manager_props[PROP_VISIBLE_PAGE] = - g_param_spec_object ("visible-page", "Visible page", - "Page widget currently displaying in the page manager", - GTK_TYPE_WIDGET, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); - /** - * EosPageManager:visible-page-name: - * - * The name of the page that is currently being displayed by the page manager. - * If the page manager has no pages, or if there is a page currently being - * displayed but it has no name, then this is %NULL. - */ - eos_page_manager_props[PROP_VISIBLE_PAGE_NAME] = - g_param_spec_string ("visible-page-name", "Visible page name", - "Name of page currently displaying in the page " - "manager", - "", - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); - - /** - * EosPageManager:transition-duration: - * - * The time it will take to animate between pages in the page managers, in - * milliseconds. - */ - eos_page_manager_props[PROP_TRANSITION_DURATION] = - g_param_spec_uint ("transition-duration", "Transition duration", - "The animation duration, in milliseconds", - 0, G_MAXUINT, - 200, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT); - - - /** - * EosPageManager:transition-type: - * - * The type of animation to use when switching between pages in the page - * manager. The pages can crossfade from one to the next, or slide in from - * any direction. - */ - eos_page_manager_props[PROP_TRANSITION_TYPE] = - g_param_spec_enum ("transition-type", "Transition type", - "The type of animation used to transition", - EOS_TYPE_PAGE_MANAGER_TRANSITION_TYPE, - EOS_PAGE_MANAGER_TRANSITION_TYPE_NONE, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT); - - g_object_class_install_properties (object_class, NPROPS, - eos_page_manager_props); - - /** - * EosPageManager:name: - * - * The name of this page. Make sure to choose a unique name. - */ - eos_page_manager_child_props[CHILD_PROP_NAME] = - g_param_spec_string ("name", "Name", "Unique ID for the page", - NULL, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); - /** * EosPageManager:left-topbar-widget: * @@ -685,7 +431,7 @@ eos_page_manager_class_init (EosPageManagerClass *klass) /* Install child properties all at once, because there is no gtk_container_class_install_child_properties() function */ int count; - for (count = PROP_0 + 1; count < NCHILDPROPS; count++) + for (count = CHILD_PROP_0 + 1; count < NCHILDPROPS; count++) gtk_container_class_install_child_property (container_class, count, eos_page_manager_child_props[count]); } @@ -696,10 +442,6 @@ eos_page_manager_init (EosPageManager *self) EosPageManagerPrivate *priv = eos_page_manager_get_instance_private (self); priv->pages_by_widget = g_hash_table_new (g_direct_hash, g_direct_equal); - priv->pages_by_name = g_hash_table_new_full (g_str_hash, - g_str_equal, - g_free, - NULL); } /* Public API */ @@ -717,187 +459,6 @@ eos_page_manager_new (void) return g_object_new (EOS_TYPE_PAGE_MANAGER, NULL); } -/** - * eos_page_manager_get_visible_page: - * @self: the page manager - * - * Gets the page widget that @self is currently displaying. - * See #EosPageManager:visible-page for more information. - * - * Returns: (transfer none): the page #GtkWidget, or %NULL if @self does not - * have any pages. - */ -GtkWidget * -eos_page_manager_get_visible_page (EosPageManager *self) -{ - g_return_val_if_fail (EOS_IS_PAGE_MANAGER (self), NULL); - - EosPageManagerPrivate *priv = eos_page_manager_get_instance_private (self); - if (priv->visible_page_info == NULL) - return NULL; - - return priv->visible_page_info->page; -} - -/** - * eos_page_manager_set_visible_page: - * @self: the page manager - * @page: the page to switch to - * - * Switches the page manager @self to display @page. - * The @page widget must previously have been added to the page manager. - * See #EosPageManager:visible-page for more information. - */ -void -eos_page_manager_set_visible_page (EosPageManager *self, - GtkWidget *page) -{ - g_return_if_fail (EOS_IS_PAGE_MANAGER (self)); - - EosPageManagerPageInfo *info = find_page_info_by_widget (self, page); - if (info == NULL) - { - warn_page_widget_not_found (self, page); - return; - } - - set_visible_page_from_info (self, info); -} - -/** - * eos_page_manager_get_visible_page_name: - * @self: the page manager - * - * Gets the name of the page widget that @self is currently displaying. - * See #EosPageManager:visible-page for more information. - * - * Returns: (allow-none): the name of the page, or %NULL if @self does not have - * any pages or if the visible page does not have a name. - */ -const gchar * -eos_page_manager_get_visible_page_name (EosPageManager *self) -{ - g_return_val_if_fail (EOS_IS_PAGE_MANAGER (self), NULL); - - EosPageManagerPrivate *priv = eos_page_manager_get_instance_private (self); - if (priv->visible_page_info == NULL) - return NULL; - - return priv->visible_page_info->name; -} - -/** - * eos_page_manager_set_visible_page_name: - * @self: the page manager - * @page_name: the name of the page to switch to - * - * Switches the page manager @self to display the page called @page_name. - * This page must previously have been added to the page manager. - * See #EosPageManager:visible-page for more information. - */ -void -eos_page_manager_set_visible_page_name (EosPageManager *self, - const gchar *page_name) -{ - g_return_if_fail (EOS_IS_PAGE_MANAGER (self)); - g_return_if_fail (page_name != NULL); - - EosPageManagerPageInfo *info = find_page_info_by_name (self, page_name); - if (info == NULL) - { - warn_page_name_not_found (self, page_name); - return; - } - - set_visible_page_from_info (self, info); -} - -/** - * eos_page_manager_get_page_name: - * @self: the page manager - * @page: the page to be queried - * - * Gets the name of @page, which must previously have been added to the - * page manager. - * See #EosPageManager:name for more information. - * - * Returns: (allow-none): the name of @page, or %NULL if @page does not have a - * name. - */ -const gchar * -eos_page_manager_get_page_name (EosPageManager *self, - GtkWidget *page) -{ - g_return_val_if_fail (EOS_IS_PAGE_MANAGER (self), NULL); - g_return_val_if_fail (GTK_IS_WIDGET (page), NULL); - - EosPageManagerPageInfo *info = find_page_info_by_widget (self, page); - if (info == NULL) - { - warn_page_widget_not_found (self, page); - return NULL; - } - - return info->name; -} - -/** - * eos_page_manager_set_page_name: - * @self: the page manager - * @page: the page to be renamed - * @name: (allow-none): the new name for @page - * - * Changes the name of @page, which must previously have been added to the - * page manager. - * To remove @page's name, pass %NULL for @name. - * See #EosPageManager:name for more information. - */ -void -eos_page_manager_set_page_name (EosPageManager *self, - GtkWidget *page, - const gchar *name) -{ - g_return_if_fail (EOS_IS_PAGE_MANAGER (self)); - g_return_if_fail (GTK_IS_WIDGET (page)); - - EosPageManagerPrivate *priv = eos_page_manager_get_instance_private (self); - EosPageManagerPageInfo *info; - - /* Two pages with the same name are not allowed */ - if (name != NULL) - { - info = find_page_info_by_name (self, name); - if (info != NULL && info->page != page) - { - g_critical ("Not setting page name to \"%s\", because page manager " - "already contains a page by that name", - name); - return; - } - } - - info = find_page_info_by_widget (self, page); - if (info == NULL) - { - warn_page_widget_not_found (self, page); - return; - } - - if (g_strcmp0(info->name, name) == 0) - return; - - if (info->name != NULL) - g_hash_table_remove (priv->pages_by_name, info->name); - g_free (info->name); - info->name = g_strdup (name); - if (name != NULL) - g_hash_table_insert (priv->pages_by_name, g_strdup (name), info); - - gtk_container_child_notify (GTK_CONTAINER (self), page, "name"); - - assert_internal_state (self); -} - /** * eos_page_manager_get_page_left_topbar_widget: * @self: the page manager @@ -1241,115 +802,16 @@ eos_page_manager_remove_page_by_name (EosPageManager *self, { g_return_if_fail (EOS_IS_PAGE_MANAGER (self)); g_return_if_fail (name != NULL); + GtkContainer *container = GTK_CONTAINER (self); - EosPageManagerPageInfo *info = find_page_info_by_name (self, name); - if (info == NULL) - { - warn_page_name_not_found (self, name); - return; - } - - gtk_container_remove (GTK_CONTAINER (self), info->page); - - assert_internal_state (self); -} - -/** - * eos_page_manager_get_transition_duration: - * @self: the page manager - * - * Gets the animation duration of page transitions, in milliseconds. See - * #EosPageManager:transition-duration for more information. - * - * Returns: the current transition time of the page manager. - */ -guint -eos_page_manager_get_transition_duration (EosPageManager *self) -{ - g_return_val_if_fail (EOS_IS_PAGE_MANAGER (self), 0); - return gtk_stack_get_transition_duration (GTK_STACK (self)); -} - -/** - * eos_page_manager_set_transition_duration: - * @self: the page manager - * @duration: the duration of page transitions, in milliseconds - * - * Sets the animation duration of page transitions, in milliseconds. See - * #EosPageManager:transition-duration for more information. - */ -void -eos_page_manager_set_transition_duration (EosPageManager *self, - guint duration) -{ - g_return_if_fail (EOS_IS_PAGE_MANAGER (self)); - gtk_stack_set_transition_duration (GTK_STACK (self), duration); - g_object_notify (G_OBJECT (self), "transition-duration"); -} - -/** - * eos_page_manager_get_transition_type: - * @self: the page manager - * - * Gets the animation type of page transitions. See - * #EosPageManager:transition-type for more information. - * - * Returns: the current transition type of the page manager. - */ -EosPageManagerTransitionType -eos_page_manager_get_transition_type (EosPageManager *self) -{ - g_return_val_if_fail (EOS_IS_PAGE_MANAGER (self), EOS_PAGE_MANAGER_TRANSITION_TYPE_NONE); - - EosPageManagerPrivate *priv = eos_page_manager_get_instance_private (self); - return priv->transition_type; -} - - -/** - * eos_page_manager_set_transition_type: - * @self: the page manager - * @transition_type: the type of page transitions - * - * Sets the animation type of page transitions. See - * #EosPageManager:transition-type for more information. - */ -void -eos_page_manager_set_transition_type (EosPageManager *self, - EosPageManagerTransitionType transition_type) -{ - g_return_if_fail (EOS_IS_PAGE_MANAGER (self)); - - EosPageManagerPrivate *priv = eos_page_manager_get_instance_private (self); - priv->transition_type = transition_type; - GtkStackTransitionType gtk_stack_transition; - switch (transition_type) + GList *l; + for (l = gtk_container_get_children (container); l != NULL; l = l->next) { - case EOS_PAGE_MANAGER_TRANSITION_TYPE_NONE: - case EOS_PAGE_MANAGER_TRANSITION_TYPE_CROSSFADE: - case EOS_PAGE_MANAGER_TRANSITION_TYPE_SLIDE_RIGHT: - case EOS_PAGE_MANAGER_TRANSITION_TYPE_SLIDE_LEFT: - case EOS_PAGE_MANAGER_TRANSITION_TYPE_SLIDE_UP: - case EOS_PAGE_MANAGER_TRANSITION_TYPE_SLIDE_DOWN: - gtk_stack_transition = (GtkStackTransitionType)priv->transition_type; - break; - default: - gtk_stack_transition = GTK_STACK_TRANSITION_TYPE_NONE; - break; + GtkWidget *child = l->data; + gchar *child_name = NULL; + gtk_container_child_get (container, child, "name", &child_name, NULL); + if (child_name != NULL && g_strcmp0 (child_name, name) == 0) + gtk_container_remove (container, child); + g_free (child_name); } - gtk_stack_set_transition_type (GTK_STACK (self), - gtk_stack_transition); - g_object_notify (G_OBJECT (self), "transition-type"); -} - -/* - * eos_page_manager_get_gtk_stack_transition_type: - * @self: the page manager - * - * Gets the internal gtk_stack transition type used to animate the page manager. - */ -GtkStackTransitionType -eos_page_manager_get_gtk_stack_transition_type (EosPageManager *self) -{ - return gtk_stack_get_transition_type (GTK_STACK (self)); } diff --git a/endless/eospagemanager.h b/endless/eospagemanager.h index e2d4a2b..38e0ac0 100644 --- a/endless/eospagemanager.h +++ b/endless/eospagemanager.h @@ -38,29 +38,6 @@ G_BEGIN_DECLS typedef struct _EosPageManager EosPageManager; typedef struct _EosPageManagerClass EosPageManagerClass; -#define EOS_TYPE_PAGE_MANAGER_TRANSITION_TYPE (eos_page_manager_transition_type_get_type ()) - -/** - * EosPageManagerTransitionType: - * @EOS_PAGE_MANAGER_TRANSITION_TYPE_NONE: No animation, regardless of duration. - * @EOS_PAGE_MANAGER_TRANSITION_TYPE_CROSSFADE: Pages will not move, but fade into one another. - * @EOS_PAGE_MANAGER_TRANSITION_TYPE_SLIDE_RIGHT: The old page will slide off to the right. - * @EOS_PAGE_MANAGER_TRANSITION_TYPE_SLIDE_LEFT: The old page will slide off to the left. - * @EOS_PAGE_MANAGER_TRANSITION_TYPE_SLIDE_UP: The old page will slide up the screen. - * @EOS_PAGE_MANAGER_TRANSITION_TYPE_SLIDE_DOWN: The old page will slide down the screen. - * - * Enum values to specify the type of animation to use when transitioning - * between pages. - **/ -typedef enum { - EOS_PAGE_MANAGER_TRANSITION_TYPE_NONE, - EOS_PAGE_MANAGER_TRANSITION_TYPE_CROSSFADE, - EOS_PAGE_MANAGER_TRANSITION_TYPE_SLIDE_RIGHT, - EOS_PAGE_MANAGER_TRANSITION_TYPE_SLIDE_LEFT, - EOS_PAGE_MANAGER_TRANSITION_TYPE_SLIDE_UP, - EOS_PAGE_MANAGER_TRANSITION_TYPE_SLIDE_DOWN -} EosPageManagerTransitionType; - /** * EosPageManager: * @@ -82,35 +59,9 @@ struct _EosPageManagerClass EOS_SDK_ALL_API_VERSIONS GType eos_page_manager_get_type (void) G_GNUC_CONST; -EOS_SDK_ALL_API_VERSIONS -GType eos_page_manager_transition_type_get_type (void) G_GNUC_CONST; - EOS_SDK_ALL_API_VERSIONS GtkWidget *eos_page_manager_new (void); -EOS_SDK_ALL_API_VERSIONS -GtkWidget *eos_page_manager_get_visible_page (EosPageManager *self); - -EOS_SDK_ALL_API_VERSIONS -void eos_page_manager_set_visible_page (EosPageManager *self, - GtkWidget *page); - -EOS_SDK_ALL_API_VERSIONS -const gchar *eos_page_manager_get_visible_page_name (EosPageManager *self); - -EOS_SDK_ALL_API_VERSIONS -void eos_page_manager_set_visible_page_name (EosPageManager *self, - const gchar *page_name); - -EOS_SDK_ALL_API_VERSIONS -const gchar *eos_page_manager_get_page_name (EosPageManager *self, - GtkWidget *page); - -EOS_SDK_ALL_API_VERSIONS -void eos_page_manager_set_page_name (EosPageManager *self, - GtkWidget *page, - const gchar *name); - EOS_SDK_ALL_API_VERSIONS GtkWidget *eos_page_manager_get_page_left_topbar_widget (EosPageManager *self, GtkWidget *page); @@ -129,20 +80,6 @@ void eos_page_manager_set_page_center_topbar_widget (EosPageManage GtkWidget *page, GtkWidget *center_topbar_widget); -EOS_SDK_ALL_API_VERSIONS -void eos_page_manager_set_transition_duration (EosPageManager *self, - guint duration); - -EOS_SDK_ALL_API_VERSIONS -guint eos_page_manager_get_transition_duration (EosPageManager *self); - -EOS_SDK_ALL_API_VERSIONS -void eos_page_manager_set_transition_type (EosPageManager *self, - EosPageManagerTransitionType transition_type); - -EOS_SDK_ALL_API_VERSIONS -EosPageManagerTransitionType eos_page_manager_get_transition_type (EosPageManager *self); - EOS_SDK_ALL_API_VERSIONS const gchar *eos_page_manager_get_page_background_uri (EosPageManager *self, GtkWidget *page); diff --git a/endless/eossplashpagemanager.c b/endless/eossplashpagemanager.c index a22ff26..781c9e5 100644 --- a/endless/eossplashpagemanager.c +++ b/endless/eossplashpagemanager.c @@ -246,7 +246,7 @@ eos_splash_page_manager_set_splash_page (EosSplashPageManager *self, { GTK_CONTAINER_CLASS (eos_splash_page_manager_parent_class)->add (GTK_CONTAINER (self), page); if (!priv->main_page_shown) - eos_page_manager_set_visible_page (EOS_PAGE_MANAGER (self), page); + gtk_stack_set_visible_child (GTK_STACK (self), page); } priv->splash_page = page; g_object_notify( G_OBJECT (self), "splash-page"); @@ -322,7 +322,7 @@ eos_splash_page_manager_show_main_page (EosSplashPageManager *self) return; } priv->main_page_shown = TRUE; - eos_page_manager_set_visible_page (EOS_PAGE_MANAGER (self), priv->main_page); + gtk_stack_set_visible_child (GTK_STACK (self), priv->main_page); } /** @@ -345,5 +345,5 @@ eos_splash_page_manager_show_splash_page (EosSplashPageManager *self) return; } priv->main_page_shown = FALSE; - eos_page_manager_set_visible_page (EOS_PAGE_MANAGER (self), priv->splash_page); + gtk_stack_set_visible_child (GTK_STACK (self), priv->splash_page); } diff --git a/endless/eoswindow.c b/endless/eoswindow.c index 1ac5678..b6bd192 100644 --- a/endless/eoswindow.c +++ b/endless/eoswindow.c @@ -6,7 +6,6 @@ #include "eosapplication.h" #include "eospagemanager.h" -#include "eospagemanager-private.h" #include "eostopbar-private.h" #include @@ -109,7 +108,7 @@ typedef struct { /* For keeping track of what to display alongside the current page */ GtkWidget *current_page; - gulong visible_page_property_handler; + gulong visible_child_property_handler; GtkCssProvider *background_provider; gchar *current_background_css_props; } EosWindowPrivate; @@ -207,9 +206,9 @@ sync_stack_animation (EosWindow *self) EosWindowPrivate *priv = eos_window_get_instance_private (self); EosPageManager *pm = EOS_PAGE_MANAGER (priv->page_manager); gtk_stack_set_transition_type (GTK_STACK (priv->background_stack), - eos_page_manager_get_gtk_stack_transition_type (pm)); + gtk_stack_get_transition_type (GTK_STACK (pm))); gtk_stack_set_transition_duration (GTK_STACK (priv->background_stack), - eos_page_manager_get_transition_duration (pm)); + gtk_stack_get_transition_duration (GTK_STACK (pm))); } // Helper to generate frame css override @@ -276,7 +275,7 @@ update_page_background (EosWindow *self) } /* - * update_visible_page_properties: + * update_visible_child_properties: * @widget: the page * @child_property: the property that changed * @user_data: pointer to the window @@ -285,7 +284,7 @@ update_page_background (EosWindow *self) * changes. */ static void -update_visible_page_properties (GtkWidget *widget, +update_visible_child_properties (GtkWidget *widget, GParamSpec *child_property, gpointer data) { @@ -312,15 +311,18 @@ update_visible_page_properties (GtkWidget *widget, static void update_page (EosWindow *self) { + if (gtk_widget_in_destruction (GTK_WIDGET (self))) + return; + EosWindowPrivate *priv = eos_window_get_instance_private (self); EosPageManager *pm = EOS_PAGE_MANAGER (priv->page_manager); if (priv->current_page) { g_signal_handler_disconnect (priv->current_page, - priv->visible_page_property_handler); + priv->visible_child_property_handler); } - priv->current_page = eos_page_manager_get_visible_page (pm); + priv->current_page = gtk_stack_get_visible_child (GTK_STACK (pm)); sync_stack_animation (self); update_page_left_topbar (self); @@ -331,10 +333,10 @@ update_page (EosWindow *self) if (priv->current_page) { - priv->visible_page_property_handler = + priv->visible_child_property_handler = g_signal_connect (priv->current_page, "child-notify", - G_CALLBACK (update_visible_page_properties), + G_CALLBACK (update_visible_child_properties), self); } } @@ -898,7 +900,7 @@ eos_window_set_page_manager (EosWindow *self, update_page (self); - g_signal_connect_swapped (priv->page_manager, "notify::visible-page", + g_signal_connect_swapped (priv->page_manager, "notify::visible-child", G_CALLBACK (update_page), self); } diff --git a/test/endless/test-page-manager.c b/test/endless/test-page-manager.c index 3eadd67..98cdadc 100644 --- a/test/endless/test-page-manager.c +++ b/test/endless/test-page-manager.c @@ -9,12 +9,6 @@ #define PAGE1_PROP_STRING "prop1" #define PAGE2_PROP_STRING "prop2" #define PAGE3_PROP_STRING "prop3" -#define EXPECTED_PAGE_NAME PAGE2_NAME -#define EXPECTED_CHANGED_PAGE_NAME "changed-name" -#define DUPLICATE_PAGE_NAME "duplicate-name" -#define EXPECTED_DUPLICATE_PAGE_NAME_ERRMSG "*Not setting page name to \"" \ - DUPLICATE_PAGE_NAME "\", because page manager already contains a page by " \ - "that name*" #define EXPECTED_PAGE_PROP_STRING PAGE2_PROP_STRING #define EXPECTED_CHANGED_NAME "changed-name" #define ADD_PAGE_MANAGER_TEST(path, test_func) \ @@ -23,12 +17,6 @@ #define ADD_PAGE_MANAGER_TEST_WITH_ARGS(path, test_func, args) \ g_test_add ((path), PageManagerFixture, args, \ pm_fixture_setup, (test_func), pm_fixture_teardown) -#define ADD_EMPTY_PAGE_MANAGER_TEST(path, test_func) \ - g_test_add ((path), PageManagerFixture, NULL, \ - empty_pm_fixture_setup, (test_func), pm_fixture_teardown); -#define DURATION_DEFAULT 200 -#define DURATION_1 1 -#define DURATION_2 9999 #define BACKGROUND_SIZE_DEFAULT "100% 100%" #define BACKGROUND_POSITION_DEFAULT "0% 0%" @@ -72,13 +60,6 @@ pm_fixture_setup (PageManagerFixture *fixture, NULL); } -static void -empty_pm_fixture_setup (PageManagerFixture *fixture, - gconstpointer unused) -{ - fixture->pm = eos_page_manager_new (); -} - static void pm_fixture_teardown (PageManagerFixture *fixture, gconstpointer unused) @@ -86,110 +67,6 @@ pm_fixture_teardown (PageManagerFixture *fixture, gtk_widget_destroy (fixture->pm); } -static void -test_pm_get_set_visible_page (PageManagerFixture *fixture, - gconstpointer unused) -{ - GtkWidget *visible_page; - visible_page = eos_page_manager_get_visible_page (EOS_PAGE_MANAGER (fixture->pm)); - g_assert (visible_page != fixture->page2); - eos_page_manager_set_visible_page (EOS_PAGE_MANAGER (fixture->pm), - fixture->page2); - visible_page = eos_page_manager_get_visible_page (EOS_PAGE_MANAGER (fixture->pm)); - g_assert (visible_page == fixture->page2); -} - -static void -test_pm_prop_visible_page (PageManagerFixture *fixture, - gconstpointer unused) -{ - GtkWidget *visible_page; - g_object_get (fixture->pm, "visible-page", &visible_page, NULL); - g_assert (visible_page != fixture->page2); - g_object_set (fixture->pm, "visible-page", fixture->page2, NULL); - g_object_get (fixture->pm, "visible-page", &visible_page, NULL); - g_assert (visible_page == fixture->page2); -} - -static void -test_pm_get_set_visible_page_name (PageManagerFixture *fixture, - gconstpointer unused) -{ - const gchar *name; - name = eos_page_manager_get_visible_page_name (EOS_PAGE_MANAGER (fixture->pm)); - g_assert_cmpstr (name, !=, EXPECTED_PAGE_NAME); - eos_page_manager_set_visible_page_name (EOS_PAGE_MANAGER (fixture->pm), - EXPECTED_PAGE_NAME); - name = eos_page_manager_get_visible_page_name (EOS_PAGE_MANAGER (fixture->pm)); - g_assert_cmpstr (name, ==, EXPECTED_PAGE_NAME); -} - -static void -test_pm_prop_visible_page_name (PageManagerFixture *fixture, - gconstpointer unused) -{ - gchar *name; - g_object_get (fixture->pm, "visible-page-name", &name, NULL); - g_assert_cmpstr (name, !=, EXPECTED_PAGE_NAME); - g_free (name); - g_object_set (fixture->pm, "visible-page-name", EXPECTED_PAGE_NAME, NULL); - g_object_get (fixture->pm, "visible-page-name", &name, NULL); - g_assert_cmpstr (name, ==, EXPECTED_PAGE_NAME); - g_free (name); -} - -static void -test_pm_get_set_page_name (PageManagerFixture *fixture, - gconstpointer unused) -{ - const gchar *name; - name = eos_page_manager_get_page_name (EOS_PAGE_MANAGER (fixture->pm), - fixture->page1); - g_assert_cmpstr (name, ==, PAGE1_NAME); - name = eos_page_manager_get_page_name (EOS_PAGE_MANAGER (fixture->pm), - fixture->page2); - g_assert_cmpstr (name, ==, PAGE2_NAME); - name = eos_page_manager_get_page_name (EOS_PAGE_MANAGER (fixture->pm), - fixture->page3); - g_assert_cmpstr (name, ==, PAGE3_NAME); - eos_page_manager_set_page_name (EOS_PAGE_MANAGER (fixture->pm), - fixture->page2, - EXPECTED_CHANGED_NAME); - name = eos_page_manager_get_page_name (EOS_PAGE_MANAGER (fixture->pm), - fixture->page2); - g_assert_cmpstr (name, ==, EXPECTED_CHANGED_NAME); -} - -static void -test_pm_child_prop_name (PageManagerFixture *fixture, - gconstpointer unused) -{ - gchar *name; - gtk_container_child_get (GTK_CONTAINER (fixture->pm), fixture->page1, - "name", &name, - NULL); - g_assert_cmpstr (name, ==, PAGE1_NAME); - g_free (name); - gtk_container_child_get (GTK_CONTAINER (fixture->pm), fixture->page2, - "name", &name, - NULL); - g_assert_cmpstr (name, ==, PAGE2_NAME); - g_free (name); - gtk_container_child_get (GTK_CONTAINER (fixture->pm), fixture->page3, - "name", &name, - NULL); - g_assert_cmpstr (name, ==, PAGE3_NAME); - g_free (name); - gtk_container_child_set (GTK_CONTAINER (fixture->pm), fixture->page2, - "name", EXPECTED_CHANGED_NAME, - NULL); - gtk_container_child_get (GTK_CONTAINER (fixture->pm), fixture->page2, - "name", &name, - NULL); - g_assert_cmpstr (name, ==, EXPECTED_CHANGED_NAME); - g_free (name); -} - static void test_pm_get_set_background_repeats (PageManagerFixture *fixture, gconstpointer unused) @@ -262,37 +139,6 @@ test_pm_child_prop_string (PageManagerFixture *fixture, g_free (prop_string); } -static void -test_pm_page_no_name (PageManagerFixture *fixture, - gconstpointer unused) -{ - const gchar *name_get; - gchar *name_prop; - GtkWidget *new_page = gtk_label_new("new"); - gtk_container_add (GTK_CONTAINER (fixture->pm), new_page); - name_get = eos_page_manager_get_page_name (EOS_PAGE_MANAGER (fixture->pm), new_page); - g_assert (name_get == NULL); - gtk_container_child_get (GTK_CONTAINER (fixture->pm), new_page, - "name", &name_prop, - NULL); - g_assert (name_prop == NULL); -} - -static void -test_pm_set_page_no_name (PageManagerFixture *fixture, - gconstpointer unused) -{ - const gchar *name; - eos_page_manager_set_page_name (EOS_PAGE_MANAGER (fixture->pm), - fixture->page1, - NULL); - name = eos_page_manager_get_page_name (EOS_PAGE_MANAGER (fixture->pm), - fixture->page1); - g_assert (name == NULL); - name = eos_page_manager_get_visible_page_name (EOS_PAGE_MANAGER (fixture->pm)); - g_assert (name == NULL); -} - static void test_pm_no_background_uri (PageManagerFixture *fixture, gconstpointer unused) @@ -419,43 +265,6 @@ test_pm_get_set_background_position (PageManagerFixture *fixture, g_assert_cmpstr (background_position_get, ==, background_position_name_2); } -static void -test_pm_remove_page_behavior (PageManagerFixture *fixture, - gconstpointer unused) -{ - GtkWidget *visible_page; - visible_page = eos_page_manager_get_visible_page (EOS_PAGE_MANAGER (fixture->pm)); - g_assert (visible_page == fixture->page1); - gtk_container_remove (GTK_CONTAINER (fixture->pm), fixture->page3); - visible_page = eos_page_manager_get_visible_page (EOS_PAGE_MANAGER (fixture->pm)); - g_assert (visible_page == fixture->page1); - gtk_container_remove (GTK_CONTAINER (fixture->pm), fixture->page2); - visible_page = eos_page_manager_get_visible_page (EOS_PAGE_MANAGER (fixture->pm)); - g_assert (visible_page == fixture->page1); - gtk_container_remove (GTK_CONTAINER (fixture->pm), fixture->page1); - visible_page = eos_page_manager_get_visible_page (EOS_PAGE_MANAGER (fixture->pm)); - g_assert (visible_page == NULL); -} - -static void -test_pm_remove_page_undefined_behavior (PageManagerFixture *fixture, - gconstpointer unused) -{ - GtkWidget *visible_page; - GtkWidget *page1 = gtk_label_new ("page1"); - GtkWidget *page2 = gtk_label_new ("page2"); - gtk_container_add (GTK_CONTAINER (fixture->pm), page1); - gtk_container_add (GTK_CONTAINER (fixture->pm), page2); - eos_page_manager_set_visible_page (EOS_PAGE_MANAGER (fixture->pm), - page1); - visible_page = eos_page_manager_get_visible_page (EOS_PAGE_MANAGER (fixture->pm)); - g_assert (visible_page == page1); - gtk_container_remove (GTK_CONTAINER (fixture->pm), page1); - // Only one page left, so it should be the visible page. - visible_page = eos_page_manager_get_visible_page (EOS_PAGE_MANAGER (fixture->pm)); - g_assert (visible_page == page2); -} - static void test_pm_remove_page_by_name (PageManagerFixture *fixture, gconstpointer unused) @@ -474,130 +283,9 @@ test_pm_remove_page_by_name (PageManagerFixture *fixture, g_list_free (pages); } -static void -test_pm_duplicate_page_name (PageManagerFixture *fixture, - gconstpointer unused) -{ - eos_page_manager_set_page_name (EOS_PAGE_MANAGER (fixture->pm), - fixture->page1, - DUPLICATE_PAGE_NAME); - /* Should not complain */ - eos_page_manager_set_page_name (EOS_PAGE_MANAGER (fixture->pm), - fixture->page1, - DUPLICATE_PAGE_NAME); - - g_test_expect_message (TEST_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, - EXPECTED_DUPLICATE_PAGE_NAME_ERRMSG); - eos_page_manager_set_page_name (EOS_PAGE_MANAGER (fixture->pm), - fixture->page2, - DUPLICATE_PAGE_NAME); - g_test_assert_expected_messages (); - - const gchar *name = eos_page_manager_get_page_name (EOS_PAGE_MANAGER (fixture->pm), - fixture->page2); - g_assert_cmpstr (name, !=, DUPLICATE_PAGE_NAME); -} - -static void -test_pm_prop_transition_duration (PageManagerFixture *fixture, - gconstpointer unused) -{ - guint duration; - g_object_get (fixture->pm, "transition-duration", &duration, NULL); - g_assert (duration == DURATION_DEFAULT); - g_object_set (fixture->pm, "transition-duration", DURATION_2, NULL); - g_object_get (fixture->pm, "transition-duration", &duration, NULL); - g_assert (duration == DURATION_2); -} - -static void -test_pm_get_set_transition_duration (PageManagerFixture *fixture, - gconstpointer unused) -{ - g_assert (DURATION_DEFAULT == eos_page_manager_get_transition_duration (EOS_PAGE_MANAGER (fixture->pm))); - eos_page_manager_set_transition_duration (EOS_PAGE_MANAGER (fixture->pm), DURATION_1); - g_assert (DURATION_1 == eos_page_manager_get_transition_duration (EOS_PAGE_MANAGER (fixture->pm))); - eos_page_manager_set_transition_duration (EOS_PAGE_MANAGER (fixture->pm), DURATION_2); - g_assert (DURATION_2 == eos_page_manager_get_transition_duration (EOS_PAGE_MANAGER (fixture->pm))); -} - -static void -test_pm_prop_transition_type (PageManagerFixture *fixture, - gconstpointer unused) -{ - EosPageManagerTransitionType type; - g_object_get (fixture->pm, "transition-type", &type, NULL); - g_assert (type == EOS_PAGE_MANAGER_TRANSITION_TYPE_NONE); - g_object_set (fixture->pm, "transition-type", EOS_PAGE_MANAGER_TRANSITION_TYPE_CROSSFADE, NULL); - g_object_get (fixture->pm, "transition-type", &type, NULL); - g_assert (type == EOS_PAGE_MANAGER_TRANSITION_TYPE_CROSSFADE); -} - -static void -test_pm_get_set_transition_type (PageManagerFixture *fixture, - gconstpointer unused) -{ - g_assert (EOS_PAGE_MANAGER_TRANSITION_TYPE_NONE == eos_page_manager_get_transition_type (EOS_PAGE_MANAGER (fixture->pm))); - eos_page_manager_set_transition_type (EOS_PAGE_MANAGER (fixture->pm), EOS_PAGE_MANAGER_TRANSITION_TYPE_CROSSFADE); - g_assert (EOS_PAGE_MANAGER_TRANSITION_TYPE_CROSSFADE == eos_page_manager_get_transition_type (EOS_PAGE_MANAGER (fixture->pm))); -} - -static void -test_empty_pm_visible_page (PageManagerFixture *fixture, - gconstpointer unused) -{ - GtkWidget *visible_page_get, *visible_page_prop; - visible_page_get = eos_page_manager_get_visible_page (EOS_PAGE_MANAGER (fixture->pm)); - g_assert (visible_page_get == NULL); - g_object_get (fixture->pm, "visible-page", &visible_page_prop, NULL); - g_assert (visible_page_prop == NULL); -} - -static void -test_empty_pm_visible_page_name (PageManagerFixture *fixture, - gconstpointer unused) -{ - const gchar *name_get; - gchar *name_prop; - name_get = eos_page_manager_get_visible_page_name (EOS_PAGE_MANAGER (fixture->pm)); - g_assert (name_get == NULL); - g_object_get (fixture->pm, "visible-page-name", &name_prop, NULL); - g_assert (name_prop == NULL); -} - -static void -test_empty_pm_add_page_behavior (PageManagerFixture *fixture, - gconstpointer unused) -{ - GtkWidget *visible_page; - GtkWidget *page1 = gtk_label_new ("page1"); - GtkWidget *page2 = gtk_label_new ("page2"); - gtk_container_add (GTK_CONTAINER (fixture->pm), page1); - visible_page = eos_page_manager_get_visible_page (EOS_PAGE_MANAGER (fixture->pm)); - g_assert (visible_page == page1); - gtk_container_add (GTK_CONTAINER (fixture->pm), page2); - visible_page = eos_page_manager_get_visible_page (EOS_PAGE_MANAGER (fixture->pm)); - g_assert (visible_page == page1); /* Not page2! */ -} - void add_page_manager_tests (void) { - ADD_PAGE_MANAGER_TEST ("/page-manager/get-set-visible-page", - test_pm_get_set_visible_page); - ADD_PAGE_MANAGER_TEST ("/page-manager/prop-visible-page", - test_pm_prop_visible_page); - ADD_PAGE_MANAGER_TEST ("/page-manager/get-set-visible-page-name", - test_pm_get_set_visible_page_name); - ADD_PAGE_MANAGER_TEST ("/page-manager/prop-visible-page-name", - test_pm_prop_visible_page_name); - ADD_PAGE_MANAGER_TEST ("/page-manager/get-set-page-name", - test_pm_get_set_page_name); - ADD_PAGE_MANAGER_TEST ("/page-manager/child-prop-name", - test_pm_child_prop_name); - ADD_PAGE_MANAGER_TEST ("/page-manager/page-no-name", test_pm_page_no_name); - ADD_PAGE_MANAGER_TEST ("/page-manager/set-page-no-name", - test_pm_set_page_no_name); ADD_PAGE_MANAGER_TEST_WITH_ARGS ("/page-manager/child-prop-background-uri", test_pm_child_prop_string, "background-uri"); @@ -625,30 +313,4 @@ add_page_manager_tests (void) test_pm_child_prop_background_repeats); ADD_PAGE_MANAGER_TEST ("/page-manager/remove-page-by-name", test_pm_remove_page_by_name); - ADD_PAGE_MANAGER_TEST ("/page-manager/duplicate-page-name", - test_pm_duplicate_page_name); - ADD_PAGE_MANAGER_TEST ("/page-manager/prop-transition-duration", - test_pm_prop_transition_duration); - ADD_PAGE_MANAGER_TEST ("/page-manager/get-set-transition-duration", - test_pm_get_set_transition_duration); - ADD_PAGE_MANAGER_TEST ("/page-manager/prop-transition-type", - test_pm_prop_transition_type); - ADD_PAGE_MANAGER_TEST ("/page-manager/get-set-transition-type", - test_pm_get_set_transition_type); - ADD_EMPTY_PAGE_MANAGER_TEST ("/page-manager/empty-visible-page", - test_empty_pm_visible_page); - ADD_EMPTY_PAGE_MANAGER_TEST ("/page-manager/empty-visible-page-name", - test_empty_pm_visible_page_name); - ADD_EMPTY_PAGE_MANAGER_TEST ("/page-manager/add-page-behavior", - test_empty_pm_add_page_behavior); - - /* Disabled until https://bugzilla.gnome.org/show_bug.cgi?id=699756 is fixed - [endlessm/eos-sdk#67] */ - if (FALSE) - { - ADD_PAGE_MANAGER_TEST ("/page-manager/remove-page-behavior", - test_pm_remove_page_behavior); - ADD_EMPTY_PAGE_MANAGER_TEST ("/page-manager/remove-page-undefined-behavior", - test_pm_remove_page_undefined_behavior); - } } diff --git a/test/endless/test-splash-page-manager.c b/test/endless/test-splash-page-manager.c index 06105aa..735f872 100644 --- a/test/endless/test-splash-page-manager.c +++ b/test/endless/test-splash-page-manager.c @@ -24,10 +24,15 @@ empty_spm_fixture_setup (SplashPageManagerFixture *fixture, gconstpointer unused) { fixture->first_splash_page = gtk_label_new ("splash"); + gtk_widget_show (fixture->first_splash_page); fixture->second_splash_page = gtk_label_new ("ham sandwich"); + gtk_widget_show (fixture->second_splash_page); fixture->first_main_page = gtk_label_new ("main"); + gtk_widget_show (fixture->first_main_page); fixture->second_main_page = gtk_label_new ("pikachu"); + gtk_widget_show (fixture->second_main_page); fixture->spm = eos_splash_page_manager_new (); + gtk_widget_show (fixture->spm); } static void @@ -102,12 +107,12 @@ static void test_spm_show_main_page (SplashPageManagerFixture *fixture, gconstpointer unused) { - GtkWidget *visible_page; - visible_page = eos_page_manager_get_visible_page (EOS_PAGE_MANAGER (fixture->spm)); - g_assert (visible_page != fixture->first_main_page); + GtkWidget *visible_child; + visible_child = gtk_stack_get_visible_child (GTK_STACK (fixture->spm)); + g_assert (visible_child != fixture->first_main_page); eos_splash_page_manager_show_main_page (EOS_SPLASH_PAGE_MANAGER (fixture->spm)); - visible_page = eos_page_manager_get_visible_page (EOS_PAGE_MANAGER (fixture->spm)); - g_assert (visible_page == fixture->first_main_page); + visible_child = gtk_stack_get_visible_child (GTK_STACK (fixture->spm)); + g_assert (visible_child == fixture->first_main_page); } @@ -115,15 +120,15 @@ static void test_spm_show_splash_page (SplashPageManagerFixture *fixture, gconstpointer unused) { - GtkWidget *visible_page; - visible_page = eos_page_manager_get_visible_page (EOS_PAGE_MANAGER (fixture->spm)); - g_assert (visible_page == fixture->first_splash_page); + GtkWidget *visible_child; + visible_child = gtk_stack_get_visible_child (GTK_STACK (fixture->spm)); + g_assert (visible_child == fixture->first_splash_page); eos_splash_page_manager_show_main_page (EOS_SPLASH_PAGE_MANAGER (fixture->spm)); - visible_page = eos_page_manager_get_visible_page (EOS_PAGE_MANAGER (fixture->spm)); - g_assert (visible_page != fixture->first_splash_page); + visible_child = gtk_stack_get_visible_child (GTK_STACK (fixture->spm)); + g_assert (visible_child != fixture->first_splash_page); eos_splash_page_manager_show_splash_page (EOS_SPLASH_PAGE_MANAGER (fixture->spm)); - visible_page = eos_page_manager_get_visible_page (EOS_PAGE_MANAGER (fixture->spm)); - g_assert (visible_page == fixture->first_splash_page); + visible_child = gtk_stack_get_visible_child (GTK_STACK (fixture->spm)); + g_assert (visible_child == fixture->first_splash_page); } static void @@ -131,13 +136,13 @@ test_spm_default_visible_splash (SplashPageManagerFixture *fixture, gconstpointer unused) { // Even though main page is added first splash page should be visible after it is added. - GtkWidget *visible_page; + GtkWidget *visible_child; eos_splash_page_manager_set_main_page (EOS_SPLASH_PAGE_MANAGER (fixture->spm), fixture->first_main_page); eos_splash_page_manager_set_splash_page (EOS_SPLASH_PAGE_MANAGER (fixture->spm), fixture->first_splash_page); - visible_page = eos_page_manager_get_visible_page (EOS_PAGE_MANAGER (fixture->spm)); - g_assert (visible_page == fixture->first_splash_page); + visible_child = gtk_stack_get_visible_child (GTK_STACK (fixture->spm)); + g_assert (visible_child == fixture->first_splash_page); } static void diff --git a/test/smoke-tests/app-window.js b/test/smoke-tests/app-window.js index d7554b9..bbfd461 100644 --- a/test/smoke-tests/app-window.js +++ b/test/smoke-tests/app-window.js @@ -32,12 +32,12 @@ const Page0 = new Lang.Class ({ // Combo box for transition type... let typeMenu = new Gtk.ComboBoxText(); let type_options = { - "Transition type: None": Endless.PageManagerTransitionType.NONE, - "Transition type: Fade": Endless.PageManagerTransitionType.CROSSFADE, - "Transition type: Slide Right": Endless.PageManagerTransitionType.SLIDE_RIGHT, - "Transition type: Slide Left": Endless.PageManagerTransitionType.SLIDE_LEFT, - "Transition type: Slide Down": Endless.PageManagerTransitionType.SLIDE_DOWN, - "Transition type: Slide Up": Endless.PageManagerTransitionType.SLIDE_UP + "Transition type: None": Gtk.StackTransitionType.NONE, + "Transition type: Fade": Gtk.StackTransitionType.CROSSFADE, + "Transition type: Slide Right": Gtk.StackTransitionType.SLIDE_RIGHT, + "Transition type: Slide Left": Gtk.StackTransitionType.SLIDE_LEFT, + "Transition type: Slide Down": Gtk.StackTransitionType.SLIDE_DOWN, + "Transition type: Slide Up": Gtk.StackTransitionType.SLIDE_UP } for (let key in type_options) { typeMenu.append_text(key); @@ -90,33 +90,6 @@ const Page1 = new Lang.Class ({ } }); -const Toolbox = new Lang.Class ({ - Name: 'Toolbox', - Extends: Gtk.Grid, - - _init: function(props) { - props = props || {}; - props.orientation = Gtk.Orientation.VERTICAL; - this.parent(props); - - this._label = new Gtk.Label({ label: 'The Toolbox' }); - this._label1 = new Gtk.Label({ label: 'Actions on page 0' }); - this._label2 = new Gtk.Label({ label: 'Actions on page 1' }); - this.switch1 = new Gtk.Switch({ active: false }); - this.switch2 = new Gtk.Switch({ active: true }); - this.button1 = new Gtk.Button({ label: 'Scale font down' }); - this.button2 = new Gtk.Button({ label: 'Scale font up' }); - - this.add(this._label); - this.add(this._label1); - this.add(this.switch1); - this.add(this._label2); - this.add(this.switch2); - this.add(this.button1); - this.add(this.button2); - } -}); - const LeftTopbar = new Lang.Class ({ Name: 'LeftTopBar', Extends: Gtk.Grid, @@ -159,19 +132,19 @@ const TestApplication = new Lang.Class ({ // First page this._page0 = new Page0(this._pm); this._page0.button1.connect('clicked', Lang.bind(this, function () { - this._pm.visible_page = this._page1; + this._pm.visible_child = this._page1; })); this._page0.button2.connect('clicked', Lang.bind(this, function () { - this._pm.visible_page_name = "page1"; + this._pm.visible_child_name = "page1"; })); // Second page this._page1 = new Page1(); this._page1.button1.connect('clicked', Lang.bind(this, function () { - this._pm.visible_page = this._page0; + this._pm.visible_child = this._page0; })); this._page1.button2.connect('clicked', Lang.bind(this, function () { - this._pm.visible_page_name = "page0"; + this._pm.visible_child_name = "page0"; })); this._page1.button3.connect('clicked', Lang.bind(this, function () { this._setupDogBackground(this._page1); @@ -183,17 +156,6 @@ const TestApplication = new Lang.Class ({ this._setupCatBackground(this._page1); })); - - this._toolbox = new Toolbox(); - this._toolbox.switch1.connect('notify::active', Lang.bind(this, function () { - this._pm.set_page_actions(this._page0, - this._toolbox.switch1.active); - })); - this._toolbox.switch2.connect('notify::active', Lang.bind(this, function () { - this._pm.set_page_actions(this._page1, - this._toolbox.switch2.active); - })); - this._left_topbar = new LeftTopbar(); this._center_topbar = new CenterTopbar(); @@ -201,17 +163,14 @@ const TestApplication = new Lang.Class ({ this._pm.add(this._page0, { name: "page0", background_uri: CAT_BACKGROUND_PATH, - custom_toolbox_widget: this._toolbox, left_topbar_widget: this._left_topbar, center_topbar_widget: this._center_topbar }); this._pm.add(this._page1, { name: "page1", - custom_toolbox_widget: this._toolbox, left_topbar_widget: this._left_topbar, - center_topbar_widget: this._center_topbar, - page_actions: true + center_topbar_widget: this._center_topbar }); this._setupDogBackground(this._page0); @@ -224,15 +183,6 @@ const TestApplication = new Lang.Class ({ 'font-scaling-default-size': 16 }); - this._toolbox.button1.connect('clicked', Lang.bind(this, function () { - let current_font_size = this._window.get_font_scaling_default_size(); - this._window.set_font_scaling_default_size(current_font_size - 1); - })); - this._toolbox.button2.connect('clicked', Lang.bind(this, function () { - let current_font_size = this._window.get_font_scaling_default_size(); - this._window.set_font_scaling_default_size(current_font_size + 1); - })); - let provider = new Gtk.CssProvider(); provider.load_from_data("EosWindow { font-size: 1em; }"); Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(), provider, diff --git a/test/smoke-tests/webhelper/webview.js b/test/smoke-tests/webhelper/webview.js index a3b91e5..a1dba65 100644 --- a/test/smoke-tests/webhelper/webview.js +++ b/test/smoke-tests/webhelper/webview.js @@ -64,7 +64,7 @@ const TestApplication = new Lang.Class({ /* dict['name'] is the name of the page to move to */ moveToPage: function(dict) { - this._pm.visible_page_name = dict['name']; + this._pm.visible_child_name = dict['name']; }, /* dict['msg'] is the message to display */ @@ -134,7 +134,7 @@ const TestApplication = new Lang.Class({ this._page2 = new Gtk.Grid(); let back_button = new Gtk.Button({ label:"Go back to page 1" }); back_button.connect('clicked', Lang.bind(this, function() { - this._pm.visible_page_name = 'page1'; + this._pm.visible_child_name = 'page1'; })); this._page2.add(back_button); @@ -144,10 +144,10 @@ const TestApplication = new Lang.Class({ }); this._pm = this._window.page_manager; - this._pm.set_transition_type(Endless.PageManagerTransitionType.CROSSFADE); + this._pm.set_transition_type(Gtk.StackTransitionType.CROSSFADE); this._pm.add(this._page1, { name: 'page1' }); this._pm.add(this._page2, { name: 'page2' }); - this._pm.visible_page = this._page1; + this._pm.visible_child = this._page1; this._window.show_all(); } diff --git a/wikipedia/views/domain_wiki_view.js b/wikipedia/views/domain_wiki_view.js index a2f7419..06a936d 100644 --- a/wikipedia/views/domain_wiki_view.js +++ b/wikipedia/views/domain_wiki_view.js @@ -196,10 +196,10 @@ const DomainWikiView = new Lang.Class({ * Transition to the front page of the view */ show_front_page: function () { - if (this._window.page_manager.visible_page_name === "front") + if (this._window.page_manager.visible_child_name === "front") return; - this._window.page_manager.transition_type = Endless.PageManagerTransitionType.SLIDE_RIGHT; - this._window.page_manager.visible_page_name = "front"; + this._window.page_manager.transition_type = Gtk.StackTransitionType.SLIDE_RIGHT; + this._window.page_manager.visible_child_name = "front"; }, /** @@ -207,14 +207,14 @@ const DomainWikiView = new Lang.Class({ * Transition to the category page of the view */ show_category_page: function () { - if (this._window.page_manager.visible_page_name === "category") + if (this._window.page_manager.visible_child_name === "category") return; this._category_article_list.scrollToTop(); - if (this._window.page_manager.visible_page_name === "front") - this._window.page_manager.transition_type = Endless.PageManagerTransitionType.SLIDE_LEFT; + if (this._window.page_manager.visible_child_name === "front") + this._window.page_manager.transition_type = Gtk.StackTransitionType.SLIDE_LEFT; else - this._window.page_manager.transition_type = Endless.PageManagerTransitionType.SLIDE_RIGHT; - this._window.page_manager.visible_page_name = "category"; + this._window.page_manager.transition_type = Gtk.StackTransitionType.SLIDE_RIGHT; + this._window.page_manager.visible_child_name = "category"; }, /** @@ -222,11 +222,11 @@ const DomainWikiView = new Lang.Class({ * Transition to the article page of the view */ show_article_page: function () { - if (this._window.page_manager.visible_page_name === "article") + if (this._window.page_manager.visible_child_name === "article") return; this._article_list.scrollToTop(); - this._window.page_manager.transition_type = Endless.PageManagerTransitionType.SLIDE_LEFT; - this._window.page_manager.visible_page_name = "article"; + this._window.page_manager.transition_type = Gtk.StackTransitionType.SLIDE_LEFT; + this._window.page_manager.visible_child_name = "article"; }, set_categories: function(categories){ -- cgit v1.2.3