From: Jose Dapena Paz Date: Thu, 29 Oct 2009 18:47:50 +0000 (+0100) Subject: Replace hildon pannable area with modest scrollable in msg view window X-Git-Tag: jdapena-ppa-3.90.4-modest0~342 X-Git-Url: http://git.maemo.org/git/?p=modest;a=commitdiff_plain;h=c62c3e27d371549d19265e01bd78194a2926dc21 Replace hildon pannable area with modest scrollable in msg view window --- diff --git a/src/hildon2/modest-hildon-pannable-area-scrollable.c b/src/hildon2/modest-hildon-pannable-area-scrollable.c index d135026..7686437 100644 --- a/src/hildon2/modest-hildon-pannable-area-scrollable.c +++ b/src/hildon2/modest-hildon-pannable-area-scrollable.c @@ -70,6 +70,9 @@ enum { PROP_0, PROP_HORIZONTAL_POLICY, PROP_VERTICAL_POLICY, + PROP_MOVEMENT_MODE, + PROP_HORIZONTAL_MAX_OVERSHOOT, + PROP_VERTICAL_MAX_OVERSHOOT, }; /* globals */ @@ -131,6 +134,31 @@ modest_hildon_pannable_area_scrollable_class_init (ModestHildonPannableAreaScrol GTK_POLICY_AUTOMATIC, G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + g_object_class_install_property (gobject_class, + PROP_MOVEMENT_MODE, + g_param_spec_enum ("movement_mode", + "Directions scroll is allowed", + "Movements allowed in the scrollable", + MODEST_TYPE_MOVEMENT_MODE, + MODEST_MOVEMENT_MODE_VERTICAL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT)); + + g_object_class_install_property (gobject_class, + PROP_HORIZONTAL_MAX_OVERSHOOT, + g_param_spec_int ("horizontal-max-overshoot", + "Horizontal max overshoot", + "Horizontal maximum overshoot (0 disables)", + 0, G_MAXINT, 150, + G_PARAM_READWRITE |G_PARAM_CONSTRUCT)); + + g_object_class_install_property (gobject_class, + PROP_VERTICAL_MAX_OVERSHOOT, + g_param_spec_int ("vertical-max-overshoot", + "Vertical max overshoot", + "Vertical maximum overshoot (0 disables)", + 0, G_MAXINT, 150, + G_PARAM_READWRITE |G_PARAM_CONSTRUCT)); } static void @@ -167,6 +195,8 @@ modest_hildon_pannable_area_scrollable_get_property (GObject *obj, GParamSpec *pspec) { GtkPolicyType policy; + HildonMovementMode mov_mode; + gint overshoot; switch (prop_id) { case PROP_VERTICAL_POLICY: @@ -177,6 +207,29 @@ modest_hildon_pannable_area_scrollable_get_property (GObject *obj, g_object_get (obj, "hscrollbar-policy", &policy, NULL); g_value_set_enum (value, policy); break; + case PROP_MOVEMENT_MODE: + g_object_get (obj, "mov-mode", &mov_mode, NULL); + switch (mov_mode) { + case HILDON_MOVEMENT_MODE_HORIZ: + g_value_set_enum (value, MODEST_MOVEMENT_MODE_HORIZONTAL); + break; + case HILDON_MOVEMENT_MODE_BOTH: + g_value_set_enum (value, MODEST_MOVEMENT_MODE_BOTH); + break; + default: + case HILDON_MOVEMENT_MODE_VERT: + g_value_set_enum (value, MODEST_MOVEMENT_MODE_VERTICAL); + break; + } + break; + case PROP_HORIZONTAL_MAX_OVERSHOOT: + g_object_get (obj, "hovershoot-max", &overshoot, NULL); + g_value_set_int (value, overshoot); + break; + case PROP_VERTICAL_MAX_OVERSHOOT: + g_object_get (obj, "vovershoot-max", &overshoot, NULL); + g_value_set_int (value, overshoot); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); break; @@ -190,6 +243,8 @@ modest_hildon_pannable_area_scrollable_set_property (GObject *obj, GParamSpec *pspec) { GtkPolicyType policy; + ModestMovementMode mov_mode; + gint overshoot; switch (prop_id) { case PROP_VERTICAL_POLICY: @@ -200,6 +255,29 @@ modest_hildon_pannable_area_scrollable_set_property (GObject *obj, policy = g_value_get_enum (value); g_object_set (obj, "hscrollbar-policy", policy, NULL); break; + case PROP_MOVEMENT_MODE: + mov_mode = g_value_get_enum (value); + switch (mov_mode) { + case MODEST_MOVEMENT_MODE_HORIZONTAL: + g_object_set (obj, "mov-mode", HILDON_MOVEMENT_MODE_HORIZ, NULL); + break; + case HILDON_MOVEMENT_MODE_BOTH: + g_object_set (obj, "mov-mode", HILDON_MOVEMENT_MODE_BOTH, NULL); + break; + default: + case MODEST_MOVEMENT_MODE_VERTICAL: + g_object_set (obj, "mov-mode", HILDON_MOVEMENT_MODE_VERT, NULL); + break; + } + break; + case PROP_HORIZONTAL_MAX_OVERSHOOT: + overshoot = g_value_get_int (value); + g_object_set (obj, "hovershoot-max", overshoot, NULL); + break; + case PROP_VERTICAL_MAX_OVERSHOOT: + overshoot = g_value_get_int (value); + g_object_set (obj, "vovershoot-max", overshoot, NULL); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); break; diff --git a/src/modest-runtime.c b/src/modest-runtime.c index 4e98990..cc106e7 100644 --- a/src/modest-runtime.c +++ b/src/modest-runtime.c @@ -201,6 +201,13 @@ modest_runtime_get_platform_factory (void) return modest_singletons_get_platform_factory (_singletons); } +ModestToolkitFactory* +modest_runtime_get_toolkit_factory (void) +{ + g_return_val_if_fail (_singletons, NULL); + return modest_singletons_get_toolkit_factory (_singletons); +} + ModestTnySendQueue* modest_runtime_get_send_queue (TnyTransportAccount *account, gboolean create) diff --git a/src/modest-runtime.h b/src/modest-runtime.h index badd6c5..0fce328 100644 --- a/src/modest-runtime.h +++ b/src/modest-runtime.h @@ -45,6 +45,7 @@ #include #include #include +#include G_BEGIN_DECLS @@ -182,8 +183,14 @@ TnyDevice* modest_runtime_get_device (void); **/ TnyPlatformFactory* modest_runtime_get_platform_factory (void); - - +/** + * modest_runtime_get_toolkit_factory: + * + * get the #ModestToolkitFactory singleton instance + * + * Returns: the #ModestToolkitFactory singleton. This should NOT be unref'd. + **/ +ModestToolkitFactory* modest_runtime_get_toolkit_factory (void); /** * modest_runtime_get_mail_operation_queue: diff --git a/src/modest-singletons.c b/src/modest-singletons.c index ca28aeb..045ff09 100644 --- a/src/modest-singletons.c +++ b/src/modest-singletons.c @@ -55,6 +55,7 @@ struct _ModestSingletonsPrivate { ModestWindowMgr *window_mgr; ModestProtocolRegistry *protocol_registry; ModestPluginFactory *plugin_factory; + ModestToolkitFactory *toolkit_factory; TnyStreamCache *images_cache; }; #define MODEST_SINGLETONS_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ @@ -116,6 +117,7 @@ modest_singletons_init (ModestSingletons *obj) priv->window_mgr = NULL; priv->protocol_registry = NULL; priv->plugin_factory = NULL; + priv->toolkit_factory = NULL; priv->protocol_registry = modest_protocol_registry_new (); if (!priv->protocol_registry) { @@ -149,6 +151,12 @@ modest_singletons_init (ModestSingletons *obj) return; } + priv->toolkit_factory = modest_toolkit_factory_get_instance (); + if (!priv->toolkit_factory) { + g_printerr ("modest: cannot create toolkit factory instance\n"); + return; + } + priv->device = tny_platform_factory_new_device (priv->platform_fact); if (!priv->device) { g_printerr ("modest: cannot create tny device instance\n"); @@ -354,6 +362,13 @@ modest_singletons_get_platform_factory (ModestSingletons *self) return MODEST_SINGLETONS_GET_PRIVATE(self)->platform_fact; } +ModestToolkitFactory* +modest_singletons_get_toolkit_factory (ModestSingletons *self) +{ + g_return_val_if_fail (self, NULL); + return MODEST_SINGLETONS_GET_PRIVATE(self)->toolkit_factory; +} + ModestWindowMgr* modest_singletons_get_window_mgr (ModestSingletons *self) { diff --git a/src/modest-singletons.h b/src/modest-singletons.h index d2669ef..76f95322 100644 --- a/src/modest-singletons.h +++ b/src/modest-singletons.h @@ -39,6 +39,7 @@ #include #include #include +#include #include "modest-plugin-factory.h" #include "widgets/modest-window-mgr.h" #include "modest-protocol-registry.h" @@ -153,6 +154,18 @@ ModestCacheMgr* modest_singletons_get_cache_mgr (ModestSingletons **/ TnyPlatformFactory* modest_singletons_get_platform_factory (ModestSingletons *self); +/** + * modest_singletons_get_toolkit_factory: + * @self: a valid #ModestSingletons instance + * + * get the #TnyToolkitFactory singleton instance + * don't use this function directly, use the modest-runtime + * functions instead. + * + * Returns: the #ModestToolkitFactory singleton + **/ +ModestToolkitFactory* modest_singletons_get_toolkit_factory (ModestSingletons *self); + /** * modest_singletons_get_device: diff --git a/src/widgets/modest-msg-view-window.c b/src/widgets/modest-msg-view-window.c index bd2a5d9..d6081d8 100644 --- a/src/widgets/modest-msg-view-window.c +++ b/src/widgets/modest-msg-view-window.c @@ -48,7 +48,8 @@ #include #include #include -#include +#include +#include #include #include #include "modest-defs.h" @@ -349,7 +350,7 @@ modest_msg_view_window_scroll_child (ModestMsgViewWindow *self, } if (step) - modest_maemo_utils_scroll_pannable((HildonPannableArea *) priv->main_scroll, 0, step); + modest_scrollable_scroll ((ModestScrollable *) priv->main_scroll, 0, step); return (gboolean) step; } @@ -547,17 +548,15 @@ init_window (ModestMsgViewWindow *obj) priv->msg_view = GTK_WIDGET (tny_platform_factory_new_msg_view (modest_tny_platform_factory_get_instance ())); modest_msg_view_set_shadow_type (MODEST_MSG_VIEW (priv->msg_view), GTK_SHADOW_NONE); main_vbox = gtk_vbox_new (FALSE, 6); - /****** HILDON2:START - * create panning widget, and set parameters - */ - priv->main_scroll = hildon_pannable_area_new (); + + priv->main_scroll = modest_toolkit_factory_create_scrollable (modest_runtime_get_toolkit_factory ()); + modest_scrollable_set_horizontal_policy (MODEST_SCROLLABLE (priv->main_scroll), GTK_POLICY_AUTOMATIC); g_object_set (G_OBJECT (priv->main_scroll), - "mov-mode", HILDON_MOVEMENT_MODE_BOTH, - "hovershoot-max", 0, + "movement-mode", MODEST_MOVEMENT_MODE_BOTH, + "horizontal-max-overshoot", 0, NULL); gtk_container_add (GTK_CONTAINER (priv->main_scroll), priv->msg_view); gtk_box_pack_start (GTK_BOX(main_vbox), priv->main_scroll, TRUE, TRUE, 0); - /****** HILDON2:END */ gtk_container_add (GTK_CONTAINER(obj), main_vbox); /* NULL-ize fields if the window is destroyed */ diff --git a/src/widgets/modest-scrollable.c b/src/widgets/modest-scrollable.c index 97f4289..fab9450 100644 --- a/src/widgets/modest-scrollable.c +++ b/src/widgets/modest-scrollable.c @@ -216,6 +216,29 @@ modest_scrollable_base_init (gpointer g_iface) G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + g_object_interface_install_property (g_iface, + g_param_spec_enum ("movement_mode", + "Directions scroll is allowed", + "Movements allowed in the scrollable", + MODEST_TYPE_MOVEMENT_MODE, + MODEST_MOVEMENT_MODE_VERTICAL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT)); + + g_object_interface_install_property (g_iface, + g_param_spec_int ("horizontal-max-overshoot", + "Horizontal max overshoot", + "Horizontal maximum overshoot (0 disables)", + 0, G_MAXINT, 150, + G_PARAM_READWRITE |G_PARAM_CONSTRUCT)); + + g_object_interface_install_property (g_iface, + g_param_spec_int ("vertical-max-overshoot", + "Vertical max overshoot", + "Vertical maximum overshoot (0 disables)", + 0, G_MAXINT, 150, + G_PARAM_READWRITE |G_PARAM_CONSTRUCT)); + } } @@ -248,3 +271,58 @@ modest_scrollable_get_type (void) return type; } + +void +modest_scrollable_scroll (ModestScrollable *scrollable, + gint horizontal, gint vertical) +{ + g_return_if_fail (MODEST_IS_SCROLLABLE (scrollable)); + gint h_pos = -1; + gint v_pos = -1; + + g_assert (scrollable); + /* at atleast one of values have to be valid */ + g_return_if_fail (h_pos == -1 && v_pos == -1); + + if (horizontal != 0) { + GtkAdjustment *h_adj; + + h_adj = modest_scrollable_get_hadjustment (scrollable); + g_return_if_fail (h_adj); + + h_pos = h_adj->value + h_adj->step_increment * horizontal; + if (horizontal > 0) { + h_pos += h_adj->page_size; + } + } + + if (vertical != 0) { + GtkAdjustment *v_adj; + + v_adj = modest_scrollable_get_vadjustment (scrollable); + g_return_if_fail (v_adj); + + v_pos = v_adj->value + v_adj->step_increment * vertical; + if (vertical > 0) { + v_pos += v_adj->page_size; + } + } + + modest_scrollable_scroll_to (scrollable, h_pos, v_pos); +} + +GType +modest_movement_mode_get_type (void) +{ + static GType etype = 0; + if (etype == 0) { + static const GFlagsValue values[] = { + { MODEST_MOVEMENT_MODE_HORIZONTAL, "HILDON_MOVEMENT_MODE_HORIZONTAL", "horizontal" }, + { MODEST_MOVEMENT_MODE_VERTICAL, "MODEST_MOVEMENT_MODE_VERTICAL", "vertical" }, + { MODEST_MOVEMENT_MODE_BOTH, "MODEST_MOVEMENT_MODE_BOTH", "both" }, + { 0, NULL, NULL } + }; + etype = g_flags_register_static ("ModestMovementMode", values); + } + return etype; +} diff --git a/src/widgets/modest-scrollable.h b/src/widgets/modest-scrollable.h index aa95c44..c2d16db 100644 --- a/src/widgets/modest-scrollable.h +++ b/src/widgets/modest-scrollable.h @@ -59,12 +59,28 @@ struct _ModestScrollableIface void (*set_horizontal_policy) (ModestScrollable *self, GtkPolicyType policy); /* properties */ - /* hscrollbar-policy; */ - /* vscrollbar-policy; */ + /* horizontal-policy; */ + /* vertical-policy; */ + /* movement-mode */ + /* horizontal-max-overshoot */ + /* vertical-max-overshoot */ + }; GType modest_scrollable_get_type (void); +typedef enum { + MODEST_MOVEMENT_MODE_HORIZONTAL = 1 << 1, + MODEST_MOVEMENT_MODE_VERTICAL = 1 << 2, + MODEST_MOVEMENT_MODE_BOTH = 0x000006 +} ModestMovementMode; + + +GType modest_movement_mode_get_type (void); +#define MODEST_TYPE_MOVEMENT_MODE (modest_movement_mode_get_type()) + + +/* virtual methods */ void modest_scrollable_add_with_viewport (ModestScrollable *self, GtkWidget *widget); GtkAdjustment * modest_scrollable_get_vadjustment (ModestScrollable *self); GtkAdjustment * modest_scrollable_get_hadjustment (ModestScrollable *self); @@ -75,6 +91,9 @@ GtkPolicyType modest_scrollable_get_horizontal_policy (ModestScrollable *self); void modest_scrollable_set_vertical_policy (ModestScrollable *self, GtkPolicyType policy); void modest_scrollable_set_horizontal_policy (ModestScrollable *self, GtkPolicyType policy); +/* utils */ +void modest_scrollable_scroll (ModestScrollable *self, gint horizontal, gint vertical); + G_END_DECLS #endif diff --git a/src/widgets/modest-toolkit-factory.c b/src/widgets/modest-toolkit-factory.c index 539e4fe..a2451da 100644 --- a/src/widgets/modest-toolkit-factory.c +++ b/src/widgets/modest-toolkit-factory.c @@ -44,7 +44,7 @@ G_DEFINE_TYPE (ModestToolkitFactory, G_TYPE_OBJECT); ModestToolkitFactory * -modest_toolkit_factory_new (void) +modest_toolkit_factory_get_instance (void) { GObject* self = g_object_new (MODEST_TYPE_TOOLKIT_FACTORY, NULL); diff --git a/src/widgets/modest-toolkit-factory.h b/src/widgets/modest-toolkit-factory.h index f343dae..abf0594 100644 --- a/src/widgets/modest-toolkit-factory.h +++ b/src/widgets/modest-toolkit-factory.h @@ -48,7 +48,7 @@ GType modest_toolkit_factory_get_type (void) G_GNUC_CONST; ModestToolkitFactory * -modest_toolkit_factory_new (void); +modest_toolkit_factory_get_instance (void); GtkWidget * modest_toolkit_factory_create_scrollable (ModestToolkitFactory *self);