diff options
Diffstat (limited to 'mail')
-rw-r--r-- | mail/Makefile.am | 13 | ||||
-rw-r--r-- | mail/e-mail-notebook-view.c | 627 | ||||
-rw-r--r-- | mail/e-mail-reader.c | 19 | ||||
-rw-r--r-- | mail/e-mail-tab-picker.c | 1347 | ||||
-rw-r--r-- | mail/e-mail-tab-picker.h | 105 | ||||
-rw-r--r-- | mail/e-mail-tab.c | 1919 | ||||
-rw-r--r-- | mail/e-mail-tab.h | 115 | ||||
-rw-r--r-- | mail/message-list.c | 89 |
8 files changed, 0 insertions, 4234 deletions
diff --git a/mail/Makefile.am b/mail/Makefile.am index 3cc30971f7..1995e642d7 100644 --- a/mail/Makefile.am +++ b/mail/Makefile.am @@ -112,13 +112,6 @@ mailinclude_HEADERS = \ mail-vfolder-ui.h \ message-list.h -if ENABLE_CLUTTER -mailinclude_HEADERS += \ - e-mail-tab.h \ - e-mail-tab-picker.h - -endif - libevolution_mail_la_SOURCES = \ e-http-request.c \ e-mail-account-manager.c \ @@ -193,12 +186,6 @@ libevolution_mail_la_SOURCES = \ mail-vfolder-ui.c \ message-list.c -if ENABLE_CLUTTER -libevolution_mail_la_SOURCES += \ - e-mail-tab.c \ - e-mail-tab-picker.c -endif - if ENABLE_SMIME SMIME_LIBS = \ $(top_builddir)/smime/lib/libessmime.la \ diff --git a/mail/e-mail-notebook-view.c b/mail/e-mail-notebook-view.c index 86b47f6b92..28e10dd3b2 100644 --- a/mail/e-mail-notebook-view.c +++ b/mail/e-mail-notebook-view.c @@ -36,15 +36,6 @@ #include <shell/e-shell-window-actions.h> -#if HAVE_CLUTTER -#include <clutter/clutter.h> -#include <mx/mx.h> -#include <clutter-gtk/clutter-gtk.h> -#include <math.h> - -#include "e-mail-tab-picker.h" -#endif - #define E_MAIL_NOTEBOOK_VIEW_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE \ ((obj), E_TYPE_MAIL_NOTEBOOK_VIEW, EMailNotebookViewPrivate)) @@ -54,13 +45,6 @@ struct _EMailNotebookViewPrivate { EMailView *current_view; GHashTable *views; gboolean inited; - -#if HAVE_CLUTTER - EMailTabPicker *tab_picker; - GtkWidget *embed; - ClutterActor *actor; - ClutterActor *stage; -#endif }; enum { @@ -83,20 +67,6 @@ G_DEFINE_TYPE_WITH_CODE ( G_IMPLEMENT_INTERFACE ( E_TYPE_EXTENSIBLE, NULL)) -#if HAVE_CLUTTER -static void -mnv_set_current_tab (EMailNotebookView *view, - gint page) -{ - clutter_actor_set_opacity (view->priv->actor, 0); - gtk_notebook_set_current_page (view->priv->book, page); - - clutter_actor_animate ( - (ClutterActor *) view->priv->actor, - CLUTTER_EASE_IN_SINE, 500, "opacity", 255, NULL); -} -#endif - static gint emnv_get_page_num (EMailNotebookView *view, GtkWidget *widget) @@ -162,188 +132,6 @@ mnv_page_changed (GtkNotebook *book, g_object_unref (folder_tree); } -#if HAVE_CLUTTER -static void -fix_tab_picker_width (GtkWidget *widget, - GtkAllocation *allocation, - ClutterActor *actor) -{ - ClutterActor *stage = g_object_get_data ((GObject *)actor, "stage"); - - clutter_actor_set_size (actor, allocation->width - 1, -1); - clutter_actor_set_size (stage, allocation->width - 1, -1); -} - -static void -fix_height_cb (ClutterActor *actor, - GParamSpec *pspec, - ClutterActor *table) -{ - GtkWidget *embed = (GtkWidget *)g_object_get_data ((GObject *)actor, "embed"); - ClutterActor *stage = g_object_get_data ((GObject *)actor, "stage"); - - clutter_actor_set_height (stage, clutter_actor_get_height (actor)); - gtk_widget_set_size_request (embed, -1, (gint) clutter_actor_get_height (actor)); -} - -static void -chooser_clicked_cb (EMailTabPicker *picker, - EMailNotebookView *view) -{ - EMailNotebookViewPrivate *priv; - - gboolean preview_mode; - - priv = view->priv; - preview_mode = !e_mail_tab_picker_get_preview_mode (priv->tab_picker); - - e_mail_tab_picker_set_preview_mode (priv->tab_picker , preview_mode); -} - -static void -tab_picker_preview_mode_notify (EMailTabPicker *picker, - GParamSpec *pspec, - EMailNotebookView *view) -{ - GList *tabs, *t; - gboolean preview_mode = e_mail_tab_picker_get_preview_mode (picker); - - clutter_actor_set_name ( - CLUTTER_ACTOR (picker), - preview_mode ? "tab-picker-preview" : NULL); - - tabs = e_mail_tab_picker_get_tabs (picker); - for (t = tabs; t; t = t->next) { - EMailTab *tab; - ClutterActor *preview; - tab = E_MAIL_TAB (t->data); - - preview = e_mail_tab_get_preview_actor (tab); - - if (!preview) - continue; - - if (preview_mode) { - /* Show all pages so that the preview clones work correctly */ - clutter_actor_set_opacity (preview, 255); - clutter_actor_show (preview); - } else { - clutter_actor_hide (preview); - } - } - g_list_free (tabs); -} - -static void -mnv_tab_anim_frame_cb (ClutterTimeline *timeline, - gint frame_num, - EMailTab *tab) -{ - if (!clutter_actor_get_parent (CLUTTER_ACTOR (tab))) { - clutter_timeline_stop (timeline); - g_object_unref (timeline); - g_object_unref (tab); - - return; - } - - e_mail_tab_set_width (tab, 200 * clutter_timeline_get_progress (timeline)); -} - -static void -mnv_tab_anim_complete_cb (ClutterTimeline *timeline, - EMailTab *tab) -{ - e_mail_tab_set_width (tab, 200); - g_object_unref (tab); - g_object_unref (timeline); -} - -struct _tab_data { - gboolean select; - EMailNotebookView *view; - EMailTab *tab; -}; - -static void -mnv_tab_closed_cb (ClutterTimeline *timeline, - struct _tab_data *data) -{ - EMailView *page = g_object_get_data ((GObject *)data->tab, "page"); - EMailView *prev; - gint num; - - if (E_IS_MAIL_FOLDER_PANE (page)) { - CamelFolder *folder; - gchar *folder_uri; - - folder = e_mail_reader_get_folder (E_MAIL_READER (page)); - folder_uri = e_mail_folder_uri_from_folder (folder); - g_hash_table_remove (data->view->priv->views, folder_uri); - g_free (folder_uri); - } - - prev = e_mail_view_get_previous_view (page); - if (prev) { - num = emnv_get_page_num (data->view, (GtkWidget *) prev); - mnv_set_current_tab (data->view, num); - e_mail_tab_picker_set_current_tab (data->view->priv->tab_picker, num); - } - - e_mail_tab_picker_remove_tab (data->view->priv->tab_picker, data->tab); - gtk_notebook_remove_page (data->view->priv->book, - gtk_notebook_page_num (data->view->priv->book, (GtkWidget *) page)); - -} - -static void -mnv_tab_closed (EMailTab *tab, - EMailNotebookView *view) -{ - EMailNotebookViewPrivate *priv = view->priv; - gint page, cur; - gboolean select = FALSE; - ClutterTimeline *timeline; - struct _tab_data *data = g_new0 (struct _tab_data, 1); - - if (e_mail_tab_picker_get_n_tabs (priv->tab_picker) == 1) - return; - - page = e_mail_tab_picker_get_tab_no (priv->tab_picker, - tab); - cur = e_mail_tab_picker_get_current_tab (priv->tab_picker); - - if (cur == page) - select = TRUE; - - data->select = select; - data->tab = tab; - data->view = view; - - clutter_actor_set_reactive (CLUTTER_ACTOR (tab), FALSE); - timeline = clutter_timeline_new (150); - clutter_timeline_set_direction (timeline, CLUTTER_TIMELINE_BACKWARD); - g_signal_connect ( - timeline, "new-frame", - G_CALLBACK (mnv_tab_anim_frame_cb), tab); - g_signal_connect ( - timeline, "completed", - G_CALLBACK (mnv_tab_closed_cb), data); - clutter_timeline_start (timeline); -} - -static void -tab_activated_cb (EMailTabPicker *picker, - EMailTab *tab, - EMailNotebookView *view) -{ - EMailView *page = g_object_get_data ((GObject *)tab, "page"); - gint num = emnv_get_page_num (view, (GtkWidget *) page); - - mnv_set_current_tab (view, num); -} -#endif - static void tab_remove_gtk_cb (GtkWidget *button, EMailNotebookView *view) @@ -448,67 +236,6 @@ create_tab_label (EMailNotebookView *view, return container; } -#if HAVE_CLUTTER - -static ClutterActor * -create_gtk_actor (GtkWidget *vbox) -{ - GtkWidget *bin; - ClutterActor *gtk_actor; - - gtk_actor = gtk_clutter_actor_new (); - bin = gtk_clutter_actor_get_widget (GTK_CLUTTER_ACTOR (gtk_actor)); - - gtk_container_add (GTK_CONTAINER (bin), vbox); - - gtk_widget_show (bin); - gtk_widget_show (vbox); - return gtk_actor; -} - -static void -fix_clutter_embed_width (GtkWidget *widget, - GtkAllocation *allocation, - ClutterActor *actor) -{ - GtkWidget *embed = (GtkWidget *)g_object_get_data ((GObject *)actor, "embed"); - GtkAllocation galoc; - - gtk_widget_get_allocation (embed, &galoc); - clutter_actor_set_size (actor, allocation->width - 1, galoc.height); -} - -static GtkWidget * -create_under_clutter (GtkWidget *widget, - GtkWidget *paned) -{ - GtkWidget *embed; - ClutterActor *stage, *actor; - - embed = gtk_clutter_embed_new (); - gtk_widget_show (embed); - - actor = create_gtk_actor (widget); - clutter_actor_show (actor); - stage = gtk_clutter_embed_get_stage ((GtkClutterEmbed *) embed); - clutter_container_add_actor ((ClutterContainer *) stage, actor); - - g_object_set_data ((GObject *)actor, "embed", embed); - g_object_set_data ((GObject *)actor, "stage", stage); - g_object_set_data ((GObject *)actor, "widget", widget); - g_object_set_data ((GObject *)widget, "actor", actor); - g_object_set_data ((GObject *)embed, "actor", actor); - - g_signal_connect ( - paned, "size-allocate", - G_CALLBACK (fix_clutter_embed_width), actor); - clutter_actor_show (stage); - - return embed; -} - -#endif - static void mail_notebook_view_constructed (GObject *object) { @@ -516,103 +243,17 @@ mail_notebook_view_constructed (GObject *object) EShellView *shell_view; GtkWidget *container; GtkWidget *widget; -#if HAVE_CLUTTER - EMailTab *tab; - ClutterActor *stage, *clone; - ClutterTimeline *timeline; -#endif priv = E_MAIL_NOTEBOOK_VIEW_GET_PRIVATE (object); container = GTK_WIDGET (object); -#if HAVE_CLUTTER - widget = gtk_clutter_embed_new (); - gtk_widget_show (widget); - gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0); - - stage = gtk_clutter_embed_get_stage ((GtkClutterEmbed *) widget); - clutter_actor_show (stage); - clutter_actor_set_reactive (stage, TRUE); - - priv->tab_picker = (EMailTabPicker *) e_mail_tab_picker_new (); - clutter_actor_show ((ClutterActor *) priv->tab_picker); - g_signal_connect ( - priv->tab_picker, "tab-activated", - G_CALLBACK (tab_activated_cb), object); - g_signal_connect ( - priv->tab_picker, "chooser-clicked", - G_CALLBACK (chooser_clicked_cb), object); - g_signal_connect ( - priv->tab_picker, "notify::preview-mode", - G_CALLBACK (tab_picker_preview_mode_notify), object); - g_signal_connect ( - priv->tab_picker, "notify::height", - G_CALLBACK (fix_height_cb), widget); - - clutter_container_add_actor ( - (ClutterContainer *) stage, - (ClutterActor *) priv->tab_picker); - - e_mail_tab_picker_enable_drop (priv->tab_picker, TRUE); - - g_object_set_data ((GObject *)priv->tab_picker, "embed", widget); - g_object_set_data ((GObject *)priv->tab_picker, "stage", stage); - - g_signal_connect ( - object, "size-allocate", - G_CALLBACK (fix_tab_picker_width), priv->tab_picker); - - clutter_actor_set_height ( - stage, clutter_actor_get_height ( - (ClutterActor *) priv->tab_picker)); - gtk_widget_set_size_request ( - widget, -1, (gint) clutter_actor_get_height ( - (ClutterActor *) priv->tab_picker)); - - tab = (EMailTab *) e_mail_tab_new_full ("", NULL, 1); - clone = e_mail_tab_new_full ("", NULL, 200); - - e_mail_tab_set_can_close ((EMailTab *) clone, FALSE); - clutter_actor_set_reactive (clone, FALSE); - clutter_actor_show (clone); - - e_mail_tab_set_preview_actor ((EMailTab *) tab, clone); - e_mail_tab_set_can_close (tab, TRUE); - - e_mail_tab_picker_add_tab (priv->tab_picker, tab, -1); - clutter_actor_show ((ClutterActor *) tab); - e_mail_tab_picker_set_current_tab (priv->tab_picker, 0); - e_mail_tab_enable_drag (tab, TRUE); - - g_object_ref (tab); - timeline = clutter_timeline_new (150); - g_signal_connect ( - timeline, "new-frame", - G_CALLBACK (mnv_tab_anim_frame_cb), tab); - g_signal_connect ( - timeline, "completed", - G_CALLBACK (mnv_tab_anim_complete_cb), tab); - clutter_timeline_start (timeline); -#endif - widget = gtk_notebook_new (); priv->book = (GtkNotebook *) widget; gtk_widget_show (widget); -#if HAVE_CLUTTER - priv->embed = create_under_clutter (widget, container); - gtk_box_pack_start (GTK_BOX (container), priv->embed, TRUE, TRUE, 0); - priv->actor = g_object_get_data((GObject *)priv->embed, "actor"); - priv->stage = g_object_get_data((GObject *)priv->actor, "stage"); -#else gtk_box_pack_start (GTK_BOX (container), widget, TRUE, TRUE, 0); -#endif -#if HAVE_CLUTTER - gtk_notebook_set_show_tabs ((GtkNotebook *) widget, FALSE); -#else gtk_notebook_set_scrollable ((GtkNotebook *) widget, TRUE); -#endif gtk_notebook_set_show_border ((GtkNotebook *) widget, FALSE); @@ -1022,21 +663,8 @@ mail_netbook_view_open_mail (EMailView *view, CamelMessageInfo *info; gint pos; -#if HAVE_CLUTTER - EMailTab *tab; - ClutterActor *clone; - ClutterTimeline *timeline; - GtkWidget *mlist; -#endif - priv = nview->priv; -#if HAVE_CLUTTER - e_mail_tab_set_active ( - e_mail_tab_picker_get_tab (priv->tab_picker, - e_mail_tab_picker_get_current_tab (priv->tab_picker)), FALSE); -#endif - shell_view = e_mail_view_get_shell_view (E_MAIL_VIEW (nview)); pos = emnv_get_page_num (nview, GTK_WIDGET (priv->current_view)); pane = e_mail_message_pane_new (shell_view); @@ -1055,50 +683,7 @@ mail_netbook_view_open_mail (EMailView *view, create_tab_label (nview, priv->current_view, camel_message_info_subject (info)), pos + 1); -#if HAVE_CLUTTER - mlist = e_mail_reader_get_message_list (E_MAIL_READER (pane)); - mnv_set_current_tab (nview, page); - g_object_set_data ((GObject *)priv->current_view, "stage", priv->stage); - g_object_set_data ((GObject *)mlist, "stage", priv->stage); - g_object_set_data ((GObject *)mlist, "preview-actor", priv->actor); -#else gtk_notebook_set_current_page (priv->book, page); -#endif - -#if HAVE_CLUTTER - tab = (EMailTab *) e_mail_tab_new_full ( - camel_message_info_subject (info), NULL, 1); - g_object_set_data ((GObject *)tab, "page", pane); - g_object_set_data ((GObject *)pane, "tab", tab); - - clutter_actor_show ((ClutterActor *) tab); - - clone = e_mail_tab_new_full (camel_message_info_subject (info), NULL, 200); - clutter_actor_set_reactive (clone, FALSE); - clutter_actor_show (clone); - - e_mail_tab_set_preview_actor (tab, clone); - e_mail_tab_set_can_close (tab, TRUE); - e_mail_tab_picker_add_tab (priv->tab_picker, tab, pos + 1); - e_mail_tab_enable_drag (tab, TRUE); - - page = e_mail_tab_picker_get_tab_no (priv->tab_picker, tab); - e_mail_tab_picker_set_current_tab (priv->tab_picker, page); - - g_signal_connect ( - tab , "closed", - G_CALLBACK (mnv_tab_closed), nview); - - g_object_ref (tab); - timeline = clutter_timeline_new (150); - g_signal_connect ( - timeline, "new-frame", - G_CALLBACK (mnv_tab_anim_frame_cb), tab); - g_signal_connect ( - timeline, "completed", - G_CALLBACK (mnv_tab_anim_complete_cb), tab); - clutter_timeline_start (timeline); -#endif g_signal_connect ( E_MAIL_READER(pane), "changed", @@ -1117,89 +702,6 @@ mail_netbook_view_open_mail (EMailView *view, camel_message_info_free (info); } -#if HAVE_CLUTTER -static ClutterActor * -build_histogram (GtkWidget *widget, - CamelFolder *folder) -{ - gint week_time = 60 * 60 * 24 * 7; - gint weeks[54]; - gint i; - GPtrArray *uids; - gint max = 1; - ClutterActor *texture; - cairo_t *cr; - gfloat ratio; - gint x = 0; - time_t now = time (NULL); - - for (i = 0; i < 54; i++) - weeks[i] = 0; - - uids = camel_folder_get_uids (folder); - camel_folder_summary_prepare_fetch_all (folder->summary, NULL); - for (i = 0; i < uids->len; i++) { - CamelMessageInfo *info; - - info = camel_folder_get_message_info (folder, uids->pdata[i]); - if (info) { - time_t dreceived = now - camel_message_info_date_received (info); - gint week; - - week = (dreceived / week_time) - 1; - if (week > 52) - weeks[53]++; - else - weeks[week]++; - - camel_message_info_free (info); - } - } - - for (i = 0; i< 53; i++) { - if (weeks[i] > max) - max = weeks[i]; - } - - ratio = 50.0 / max; - - camel_folder_free_uids (folder, uids); - - texture = clutter_cairo_texture_new (200, 50); - clutter_actor_set_size (texture, 200, 50); - cr = clutter_cairo_texture_create (CLUTTER_CAIRO_TEXTURE (texture)); - - clutter_actor_show_all (texture); - - cairo_save (cr); - cairo_new_path (cr); - cairo_move_to (cr, x, 50 - (weeks[52] * ratio)); - - cairo_set_source_rgba (cr, 0.3, 0.2, 0.4, 1.0); - - for (i = 51; i >= 0; i--) { - x+=3; - cairo_line_to (cr, x, 50 - (weeks[i]*ratio)); - - } - - cairo_stroke (cr); - cairo_restore (cr); - - cairo_save (cr); - - cairo_set_source_rgba (cr, 0.8, 0.5, 0.3, 1.0); - cairo_arc (cr, x, 50 - (weeks[0] * ratio), 3, 0, 2 *M_PI); - - cairo_fill (cr); - cairo_restore (cr); - - cairo_destroy (cr); - - return texture; -} -#endif - static void mail_notebook_view_set_folder (EMailReader *reader, CamelFolder *folder) @@ -1207,11 +709,6 @@ mail_notebook_view_set_folder (EMailReader *reader, EMailNotebookViewPrivate *priv; GtkWidget *new_view; gchar *folder_uri; -#if HAVE_CLUTTER - EMailTab *tab; - ClutterActor *clone; - ClutterTimeline *timeline; -#endif if (folder == NULL) return; @@ -1224,38 +721,15 @@ mail_notebook_view_set_folder (EMailReader *reader, if (new_view) { gint curr = emnv_get_page_num (E_MAIL_NOTEBOOK_VIEW (reader), new_view); -#if HAVE_CLUTTER - EMailTab *tab; - - if (curr == e_mail_tab_picker_get_current_tab (priv->tab_picker)) - return; - - e_mail_tab_set_active (e_mail_tab_picker_get_tab (priv->tab_picker, - e_mail_tab_picker_get_current_tab (priv->tab_picker)), - FALSE); -#endif priv->current_view = (EMailView *) new_view; -#if HAVE_CLUTTER - mnv_set_current_tab (E_MAIL_NOTEBOOK_VIEW (reader), curr); -#else gtk_notebook_set_current_page (priv->book, curr); -#endif - -#if HAVE_CLUTTER - tab = (EMailTab *)g_object_get_data ((GObject *)priv->current_view, "page"); - curr = e_mail_tab_picker_get_tab_no (priv->tab_picker, tab); - e_mail_tab_picker_set_current_tab (priv->tab_picker, curr); -#endif return; } /* FIXME Redundant NULL check. */ if (folder != NULL) { gint page; -#if HAVE_CLUTTER - GtkWidget *list; -#endif if (priv->inited) { EMailView *old_view = priv->current_view; @@ -1271,53 +745,8 @@ mail_notebook_view_set_folder (EMailReader *reader, E_MAIL_NOTEBOOK_VIEW (reader), priv->current_view, camel_folder_get_full_name (folder))); -#if HAVE_CLUTTER - mnv_set_current_tab (E_MAIL_NOTEBOOK_VIEW (reader), page); -#else gtk_notebook_set_current_page (priv->book, page); -#endif -#if HAVE_CLUTTER - e_mail_tab_set_active ( - e_mail_tab_picker_get_tab ( - priv->tab_picker, - e_mail_tab_picker_get_current_tab ( - priv->tab_picker)), - FALSE); - - tab = (EMailTab *) e_mail_tab_new_full ( - camel_folder_get_full_name (folder), NULL, 1); - g_object_set_data ((GObject *)tab, "page", priv->current_view); - g_object_set_data ((GObject *)priv->current_view, "page", tab); - g_object_set_data ((GObject *)priv->current_view, "tab", tab); - - clutter_actor_show ((ClutterActor *) tab); - - clone = build_histogram ((GtkWidget *) reader, folder); - clutter_actor_set_reactive (clone, FALSE); - clutter_actor_show (clone); - - e_mail_tab_set_preview_actor (tab, clone); - e_mail_tab_set_can_close (tab, TRUE); - e_mail_tab_set_preview_mode ( - tab, e_mail_tab_picker_get_preview_mode ( - priv->tab_picker)); - - e_mail_tab_picker_add_tab (priv->tab_picker, tab, -1); - page = e_mail_tab_picker_get_tab_no (priv->tab_picker, tab); - e_mail_tab_picker_set_current_tab (priv->tab_picker, page); - - e_mail_tab_enable_drag (tab, TRUE); - g_object_ref (tab); - timeline = clutter_timeline_new (150); - g_signal_connect ( - timeline, "new-frame", - G_CALLBACK (mnv_tab_anim_frame_cb), tab); - g_signal_connect ( - timeline, "completed", - G_CALLBACK (mnv_tab_anim_complete_cb), tab); - clutter_timeline_start (timeline); -#endif } else { priv->inited = TRUE; gtk_notebook_set_tab_label ( @@ -1327,34 +756,8 @@ mail_notebook_view_set_folder (EMailReader *reader, E_MAIL_NOTEBOOK_VIEW (reader), priv->current_view, camel_folder_get_full_name (folder))); - -#if HAVE_CLUTTER - tab = e_mail_tab_picker_get_tab ( - priv->tab_picker, - e_mail_tab_picker_get_current_tab ( - priv->tab_picker)); - g_object_set_data ((GObject *)tab, "page", priv->current_view); - g_object_set_data ((GObject *)priv->current_view, "page", tab); - g_object_set_data ((GObject *)priv->current_view, "tab", tab); - - e_mail_tab_set_text (tab, camel_folder_get_full_name (folder)); - clone = build_histogram ((GtkWidget *) reader, folder); - clutter_actor_set_reactive (clone, FALSE); - clutter_actor_show (clone); - e_mail_tab_set_preview_actor (tab, clone); -#endif } -#if HAVE_CLUTTER - list = e_mail_reader_get_message_list (E_MAIL_READER (priv->current_view)); - g_signal_connect ( - tab , "closed", - G_CALLBACK (mnv_tab_closed), reader); - g_object_set_data ((GObject *)priv->current_view, "stage", priv->stage); - g_object_set_data ((GObject *)list, "stage", priv->stage); - g_object_set_data ((GObject *)list, "actor", priv->actor); - -#endif e_mail_reader_set_folder (E_MAIL_READER (priv->current_view), folder); folder_uri = e_mail_folder_uri_from_folder (folder); @@ -1484,12 +887,7 @@ emnv_show_folder (EMailNotebookView *view, view, (GtkWidget *) E_MAIL_MESSAGE_PANE ( priv->current_view)->parent_folder_view); -#if HAVE_CLUTTER - e_mail_tab_picker_set_current_tab (priv->tab_picker, pos); - mnv_set_current_tab (E_MAIL_NOTEBOOK_VIEW (view), pos); -#else gtk_notebook_set_current_page (priv->book, pos); -#endif } @@ -1504,17 +902,9 @@ emnv_show_prevtab (EMailNotebookView *view, view, (GtkWidget *) E_MAIL_MESSAGE_PANE ( priv->current_view)->parent_folder_view); -#if HAVE_CLUTTER - pos = e_mail_tab_picker_get_current_tab (priv->tab_picker); - if (pos > 0) { - e_mail_tab_picker_set_current_tab (priv->tab_picker, pos - 1); - mnv_set_current_tab (E_MAIL_NOTEBOOK_VIEW (view), pos - 1); - } -#else pos = gtk_notebook_get_current_page (priv->book); if (pos > 0 ) gtk_notebook_set_current_page (priv->book, pos - 1); -#endif } @@ -1525,18 +915,9 @@ emnv_show_nexttab (EMailNotebookView *view, gint pos; EMailNotebookViewPrivate *priv = view->priv; -#if HAVE_CLUTTER - pos = e_mail_tab_picker_get_current_tab (priv->tab_picker); - - if (pos < (gtk_notebook_get_n_pages (priv->book) - 1)) { - e_mail_tab_picker_set_current_tab (priv->tab_picker, pos + 1); - mnv_set_current_tab (E_MAIL_NOTEBOOK_VIEW (view), pos + 1); - } -#else pos = gtk_notebook_get_current_page (priv->book); if (pos < (gtk_notebook_get_n_pages (priv->book) - 1)) gtk_notebook_set_current_page (priv->book, pos + 1); -#endif } @@ -1546,18 +927,10 @@ emnv_close_tab (EMailNotebookView *view, { EMailNotebookViewPrivate *priv = view->priv; -#if HAVE_CLUTTER - mnv_tab_closed ( - g_object_get_data ( - G_OBJECT (priv->current_view), "tab"), - view); -#else tab_remove_gtk_cb ( g_object_get_data ( G_OBJECT (priv->current_view), "close-button"), view); -#endif - } GtkWidget * diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c index b90b77d160..33b604a017 100644 --- a/mail/e-mail-reader.c +++ b/mail/e-mail-reader.c @@ -62,12 +62,6 @@ #include <em-format/e-mail-parser.h> #include <em-format/e-mail-part-utils.h> -#if HAVE_CLUTTER -#include <clutter/clutter.h> -#include <mx/mx.h> -#include <clutter-gtk/clutter-gtk.h> -#endif - #define E_MAIL_READER_GET_PRIVATE(obj) \ ((EMailReaderPrivate *) g_object_get_qdata \ (G_OBJECT (obj), quark_private)) @@ -1040,9 +1034,6 @@ action_mail_next_cb (GtkAction *action, GtkWidget *message_list; MessageListSelectDirection direction; guint32 flags, mask; -#if HAVE_CLUTTER - ClutterActor *actor; -#endif direction = MESSAGE_LIST_SELECT_NEXT; flags = 0; @@ -1050,16 +1041,6 @@ action_mail_next_cb (GtkAction *action, message_list = e_mail_reader_get_message_list (reader); -#if HAVE_CLUTTER - actor = g_object_get_data (G_OBJECT (message_list), "preview-actor"); - if (actor != NULL) { - clutter_actor_set_opacity (actor, 0); - clutter_actor_animate ( - actor, CLUTTER_EASE_OUT_SINE, - 500, "opacity", 255, NULL); - } -#endif - message_list_select ( MESSAGE_LIST (message_list), direction, flags, mask); } diff --git a/mail/e-mail-tab-picker.c b/mail/e-mail-tab-picker.c deleted file mode 100644 index c5751ca90f..0000000000 --- a/mail/e-mail-tab-picker.c +++ /dev/null @@ -1,1347 +0,0 @@ -/* - * Borrowed from Moblin-Web-Browser: The web browser for Moblin - * Copyright (c) 2009, Intel Corporation. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU Lesser General Public License, - * version 2.1, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public - * License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "e-mail-tab-picker.h" - -#define E_MAIL_TAB_PICKER_GET_PRIVATE(obj) \ - (G_TYPE_INSTANCE_GET_PRIVATE \ - ((obj), E_TYPE_MAIL_TAB_PICKER, EMailTabPickerPrivate)) - -static void mx_droppable_iface_init (MxDroppableIface *iface); -static gint e_mail_tab_picker_find_tab_cb (gconstpointer a, gconstpointer b); - -G_DEFINE_TYPE_WITH_CODE ( - EMailTabPicker, - e_mail_tab_picker, - MX_TYPE_WIDGET, - G_IMPLEMENT_INTERFACE ( - MX_TYPE_DROPPABLE, mx_droppable_iface_init)) - -#define TAB_PICKER_PRIVATE(o) \ - (G_TYPE_INSTANCE_GET_PRIVATE ((o), E_MAIL_TYPE_TAB_PICKER, EMailTabPickerPrivate)) - -enum -{ - PROP_0, - - PROP_PREVIEW_MODE, - PROP_DROP_ENABLED, -}; - -enum -{ - TAB_ACTIVATED, - CHOOSER_CLICKED, - - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0, }; - -typedef struct -{ - EMailTab *tab; - gfloat position; - gfloat width; - gboolean docking; - gboolean docked; -} EMailTabPickerProps; - -struct _EMailTabPickerPrivate -{ - GList *tabs; - gint n_tabs; - ClutterActor *chooser_button; - ClutterActor *close_button; - gint current_tab; - gboolean preview_mode; - gboolean drop_enabled; - gboolean in_drag; - gboolean drag_preview; - - gint width; - gint total_width; - gint max_offset; - gboolean docked_tabs; - - ClutterTimeline *scroll_timeline; - ClutterAlpha *scroll_alpha; - gint scroll_start; - gint scroll_end; - gint scroll_offset; - gboolean keep_current_visible; - MxAdjustment *scroll_adjustment; - ClutterActor *scroll_bar; - - ClutterTimeline *preview_timeline; - gfloat preview_progress; -}; - -static void -e_mail_tab_picker_over_in (MxDroppable *droppable, - MxDraggable *draggable) -{ -} - -static void -e_mail_tab_picker_over_out (MxDroppable *droppable, - MxDraggable *draggable) -{ -} - -static void -e_mail_tab_picker_drop (MxDroppable *droppable, - MxDraggable *draggable, - gfloat event_x, - gfloat event_y, - gint button, - ClutterModifierType modifiers) -{ - GList *t; - EMailTabPickerProps *tab; - ClutterActor *parent; - gint current_position, new_position; - - EMailTabPicker *picker = E_MAIL_TAB_PICKER (droppable); - EMailTabPickerPrivate *priv = picker->priv; - - /* Make sure this is a valid drop */ - if (!priv->drop_enabled) - return; - - if (!E_MAIL_IS_TAB (draggable)) - return; - - parent = clutter_actor_get_parent (CLUTTER_ACTOR (draggable)); - if (parent != (ClutterActor *) picker) - return; - - /* Get current position and property data structure */ - t = g_list_find_custom (priv->tabs, draggable, e_mail_tab_picker_find_tab_cb); - tab = (EMailTabPickerProps *) t->data; - if (!tab) { - g_warning ("Tab that's parented to a picker not actually in picker"); - return; - } - current_position = g_list_position (priv->tabs, t); - - /* Work out new position */ - for (new_position = 0, t = priv->tabs; t; t = t->next) { - EMailTabPickerProps *props = t->data; - - /* Ignore docked tabs */ - if (!props->docked) { - /* If the tab is beyond the dragged tab and not - * draggable, we don't want to drag past it. */ - if ((event_x >= props->position + priv->scroll_offset) && - (tab->position + tab->width <= props->position) && - !mx_draggable_is_enabled (MX_DRAGGABLE (props->tab))) { - new_position--; - break; - } - - /* The same check for dragging left instead of right */ - if ((event_x < props->position + props->width + priv->scroll_offset) && - (tab->position >= props->position) && - !mx_draggable_is_enabled (MX_DRAGGABLE (props->tab))) - break; - - /* If the tab-end position is after the drop position, - * break - we want to drop before here. */ - if (props->position + props->width + priv->scroll_offset > event_x) - break; - } - - /* Increment the position */ - new_position++; - } - - /* Re-order */ - e_mail_tab_picker_reorder (picker, current_position, new_position); -} - -static void -mx_droppable_iface_init (MxDroppableIface *iface) -{ - iface->over_in = e_mail_tab_picker_over_in; - iface->over_out = e_mail_tab_picker_over_out; - iface->drop = e_mail_tab_picker_drop; -} - -static void -e_mail_tab_picker_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec) -{ - EMailTabPicker *tab_picker = E_MAIL_TAB_PICKER (object); - EMailTabPickerPrivate *priv = tab_picker->priv; - - switch (property_id) { - case PROP_PREVIEW_MODE: - g_value_set_boolean ( - value, e_mail_tab_picker_get_preview_mode ( - E_MAIL_TAB_PICKER (object))); - return; - - case PROP_DROP_ENABLED: - g_value_set_boolean (value, priv->drop_enabled); - return; - } - - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); -} - -static void -e_mail_tab_picker_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec) -{ - EMailTabPicker *tab_picker = E_MAIL_TAB_PICKER (object); - EMailTabPickerPrivate *priv = tab_picker->priv; - - switch (property_id) { - case PROP_PREVIEW_MODE: - e_mail_tab_picker_set_preview_mode ( - E_MAIL_TAB_PICKER (object), - g_value_get_boolean (value)); - return; - - case PROP_DROP_ENABLED: - priv->drop_enabled = g_value_get_boolean (value); - return; - } - - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); -} - -static void -e_mail_tab_picker_dispose (GObject *object) -{ - EMailTabPicker *picker = E_MAIL_TAB_PICKER (object); - EMailTabPickerPrivate *priv = picker->priv; - - if (priv->scroll_bar) { - clutter_actor_unparent (CLUTTER_ACTOR (priv->scroll_bar)); - priv->scroll_bar = NULL; - } - - if (priv->scroll_timeline) { - clutter_timeline_stop (priv->scroll_timeline); - g_object_unref (priv->scroll_alpha); - g_object_unref (priv->scroll_timeline); - priv->scroll_timeline = NULL; - priv->scroll_alpha = NULL; - } - - if (priv->preview_timeline) { - clutter_timeline_stop (priv->preview_timeline); - g_object_unref (priv->preview_timeline); - priv->preview_timeline = NULL; - } - - if (priv->chooser_button) { - clutter_actor_unparent (CLUTTER_ACTOR (priv->chooser_button)); - priv->chooser_button = NULL; - } - - if (priv->close_button) { - clutter_actor_unparent (CLUTTER_ACTOR (priv->close_button)); - priv->close_button = NULL; - } - - while (priv->tabs) { - EMailTabPickerProps *props = priv->tabs->data; - e_mail_tab_picker_remove_tab (picker, props->tab); - } - - /* Chain up to parent's dispose() method. */ - G_OBJECT_CLASS (e_mail_tab_picker_parent_class)->dispose (object); -} - -static void -e_mail_tab_picker_paint (ClutterActor *actor) -{ - GList *t; - gfloat width, height, offset; - EMailTabPickerPrivate *priv; - - priv = E_MAIL_TAB_PICKER_GET_PRIVATE (actor); - - CLUTTER_ACTOR_CLASS (e_mail_tab_picker_parent_class)->paint (actor); - - clutter_actor_get_size (actor, &width, &height); - - cogl_clip_push_rectangle (0, 0, width, height); - - offset = priv->scroll_offset; - cogl_translate (-priv->scroll_offset, 0, 0); - - /* Draw normal tabs */ - for (t = priv->tabs; t; t = t->next) { - EMailTabPickerProps *props = t->data; - - if (props->docked) - continue; - if (props->position + props->width < offset) - continue; - if (props->position > width + offset) - break; - - if (CLUTTER_ACTOR_IS_MAPPED (props->tab)) - clutter_actor_paint (CLUTTER_ACTOR (props->tab)); - } - - cogl_translate (priv->scroll_offset, 0, 0); - - /* Draw docked tabs */ - if (priv->docked_tabs) { - for (t = priv->tabs; t; t = t->next) { - EMailTabPickerProps *props = t->data; - - if (!props->docked) - continue; - - if (CLUTTER_ACTOR_IS_MAPPED (props->tab)) - clutter_actor_paint (CLUTTER_ACTOR (props->tab)); - } - } - - cogl_clip_pop (); - - /* Draw tab chooser button */ - if (CLUTTER_ACTOR_IS_MAPPED (priv->chooser_button)) - clutter_actor_paint (CLUTTER_ACTOR (priv->chooser_button)); - - /* Draw scrollbar */ - if (CLUTTER_ACTOR_IS_MAPPED (priv->scroll_bar)) { - gfloat height; - clutter_actor_get_preferred_height ( - CLUTTER_ACTOR (priv->close_button), - -1, NULL, &height); - height *= priv->preview_progress; - if (height >= 1.0) { - cogl_clip_push_rectangle (0, 0, width, height); - if (CLUTTER_ACTOR_IS_MAPPED (priv->close_button)) - clutter_actor_paint (CLUTTER_ACTOR (priv->close_button)); - clutter_actor_paint (CLUTTER_ACTOR (priv->scroll_bar)); - cogl_clip_pop (); - } - } -} - -static void -e_mail_tab_picker_pick (ClutterActor *actor, - const ClutterColor *color) -{ - EMailTabPickerPrivate *priv; - - priv = E_MAIL_TAB_PICKER_GET_PRIVATE (actor); - - /* Chain up to paint background */ - CLUTTER_ACTOR_CLASS (e_mail_tab_picker_parent_class)->pick (actor, color); - - if (!priv->in_drag) - e_mail_tab_picker_paint (actor); -} - -static void -e_mail_tab_picker_get_preferred_width (ClutterActor *actor, - gfloat for_height, - gfloat *min_width_p, - gfloat *natural_width_p) -{ - GList *t; - MxPadding padding; - EMailTabPickerPrivate *priv; - - priv = E_MAIL_TAB_PICKER_GET_PRIVATE (actor); - - clutter_actor_get_preferred_width ( - CLUTTER_ACTOR (priv->chooser_button), - for_height, min_width_p, natural_width_p); - - mx_widget_get_padding (MX_WIDGET (actor), &padding); - if (min_width_p) - *min_width_p += padding.left + padding.right; - if (natural_width_p) - *natural_width_p += padding.left + padding.right; - - for (t = priv->tabs; t; t = t->next) { - gfloat min_width, natural_width; - EMailTabPickerProps *props = t->data; - - clutter_actor_get_preferred_width ( - CLUTTER_ACTOR (props->tab), for_height, - &min_width, &natural_width); - - if (min_width_p && !t->prev) - *min_width_p += min_width; - if (natural_width_p) - *natural_width_p += natural_width; - } -} - -void -e_mail_tab_picker_get_preferred_height (EMailTabPicker *tab_picker, - gfloat for_width, - gfloat *min_height_p, - gfloat *natural_height_p, - gboolean with_previews) -{ - MxPadding padding; - - ClutterActor *actor = CLUTTER_ACTOR (tab_picker); - EMailTabPickerPrivate *priv = tab_picker->priv; - - clutter_actor_get_preferred_height ( - CLUTTER_ACTOR (priv->chooser_button), - for_width, min_height_p, natural_height_p); - - if (priv->tabs) { - gfloat min_height, natural_height, scroll_height; - EMailTabPickerProps *props = priv->tabs->data; - - /* Get the height of the first tab - it's assumed that - * tabs are fixed height. */ - if (with_previews) { - clutter_actor_get_preferred_height ( - CLUTTER_ACTOR (props->tab), - for_width, &min_height, - &natural_height); - - if (CLUTTER_ACTOR_IS_VISIBLE (priv->scroll_bar)) { - /* Add the height of the scrollbar-section */ - clutter_actor_get_preferred_height ( - CLUTTER_ACTOR (priv->close_button), - -1, NULL, &scroll_height); - scroll_height *= priv->preview_progress; - - min_height += scroll_height; - natural_height += scroll_height; - } - } else - e_mail_tab_get_height_no_preview ( - props->tab, for_width, - &min_height, &natural_height); - - if (min_height_p && (*min_height_p < min_height)) - *min_height_p = min_height; - if (natural_height_p && (*natural_height_p < natural_height)) - *natural_height_p = natural_height; - } - - mx_widget_get_padding (MX_WIDGET (actor), &padding); - if (min_height_p) - *min_height_p += padding.top + padding.bottom; - if (natural_height_p) - *natural_height_p += padding.top + padding.bottom; -} - -static void -_e_mail_tab_picker_get_preferred_height (ClutterActor *actor, - gfloat for_width, - gfloat *min_height_p, - gfloat *natural_height_p) -{ - e_mail_tab_picker_get_preferred_height ( - E_MAIL_TAB_PICKER (actor), for_width, - min_height_p, natural_height_p, TRUE); -} - -static void -e_mail_tab_picker_allocate_docked (EMailTabPicker *tab_picker, - const ClutterActorBox *picker_box_p, - const ClutterActorBox *chooser_box_p, - ClutterAllocationFlags flags) -{ - GList *t; - MxPadding padding; - ClutterActorBox picker_box, chooser_box, child_box; - gfloat offset, width, left, right, height; - - EMailTabPickerPrivate *priv = tab_picker->priv; - - if (!picker_box_p) { - clutter_actor_get_allocation_box ( - CLUTTER_ACTOR (tab_picker), &picker_box); - picker_box_p = &picker_box; - } - - if (!chooser_box_p) { - clutter_actor_get_allocation_box ( - CLUTTER_ACTOR (priv->chooser_button), &chooser_box); - chooser_box_p = &chooser_box; - } - - mx_widget_get_padding (MX_WIDGET (tab_picker), &padding); - - /* Calculate available width and height */ - width = picker_box_p->x2 - picker_box_p->x1 - padding.right; - - e_mail_tab_picker_get_preferred_height ( - tab_picker, -1, NULL, &height, FALSE); - child_box.y2 = picker_box_p->y2 - picker_box_p->y1 - padding.bottom; - child_box.y1 = child_box.y2 - height; - - /* Don't dock over the chooser button */ - width -= chooser_box_p->x2 - chooser_box_p->x1; - - offset = priv->scroll_offset; - - left = 0; - right = width; - priv->docked_tabs = FALSE; - - for (t = g_list_last (priv->tabs); t; t = t->prev) { - EMailTabPickerProps *props = t->data; - - props->docked = FALSE; - - if (!props->docking) - continue; - - if (props->position < offset) { - /* Dock left */ - priv->docked_tabs = TRUE; - props->docked = TRUE; - child_box.x1 = left; - child_box.x2 = child_box.x1 + props->width; - left += props->width; - } else if (props->position + props->width > width + offset) { - /* Dock right */ - priv->docked_tabs = TRUE; - props->docked = TRUE; - child_box.x2 = right; - child_box.x1 = child_box.x2 - props->width; - right -= props->width; - } else { - child_box.x1 = props->position; - child_box.x2 = child_box.x1 + props->width; - } - - clutter_actor_allocate ( - CLUTTER_ACTOR (props->tab), &child_box, flags); - } -} - -static void -e_mail_tab_picker_scroll_new_frame_cb (ClutterTimeline *timeline, - guint msecs, - EMailTabPicker *tab_picker) -{ - EMailTabPickerPrivate *priv = tab_picker->priv; - gdouble alpha = clutter_alpha_get_alpha (priv->scroll_alpha); - - priv->scroll_offset = - (priv->scroll_start * (1.0 - alpha)) + - (priv->scroll_end * alpha); - mx_adjustment_set_value (priv->scroll_adjustment, priv->scroll_offset); - e_mail_tab_picker_allocate_docked (tab_picker, NULL, NULL, 0); - clutter_actor_queue_redraw (CLUTTER_ACTOR (tab_picker)); -} - -static void -e_mail_tab_picker_scroll_completed_cb (ClutterTimeline *timeline, - EMailTabPicker *tab_picker) -{ - EMailTabPickerPrivate *priv = tab_picker->priv; - - priv->scroll_offset = priv->scroll_end; - mx_adjustment_set_value (priv->scroll_adjustment, priv->scroll_offset); - e_mail_tab_picker_allocate_docked (tab_picker, NULL, NULL, 0); - clutter_actor_queue_redraw (CLUTTER_ACTOR (tab_picker)); - - g_object_unref (priv->scroll_alpha); - g_object_unref (priv->scroll_timeline); - priv->scroll_alpha = NULL; - priv->scroll_timeline = NULL; -} - -static void -e_mail_tab_picker_scroll_to (EMailTabPicker *tab_picker, - gint destination, - guint duration) -{ - EMailTabPickerPrivate *priv = tab_picker->priv; - - priv->scroll_start = priv->scroll_offset; - priv->scroll_end = CLAMP (destination, 0, priv->max_offset); - - if (priv->scroll_timeline) { - clutter_timeline_stop (priv->scroll_timeline); - clutter_timeline_rewind (priv->scroll_timeline); - clutter_timeline_set_duration (priv->scroll_timeline, duration); - } else { - if (priv->scroll_end == priv->scroll_offset) - return; - - priv->scroll_timeline = clutter_timeline_new (duration); - priv->scroll_alpha = clutter_alpha_new_full ( - priv->scroll_timeline, CLUTTER_EASE_OUT_QUAD); - g_signal_connect ( - priv->scroll_timeline, "new_frame", - G_CALLBACK (e_mail_tab_picker_scroll_new_frame_cb), - tab_picker); - g_signal_connect ( - priv->scroll_timeline, "completed", - G_CALLBACK (e_mail_tab_picker_scroll_completed_cb), - tab_picker); - } - - clutter_timeline_start (priv->scroll_timeline); -} - -static void -e_mail_tab_picker_allocate (ClutterActor *actor, - const ClutterActorBox *box, - ClutterAllocationFlags flags) -{ - GList *t; - MxPadding padding; - gint old_max_offset, old_scroll_offset; - ClutterActorBox child_box, scroll_box; - gfloat width, total_width, height; - - EMailTabPicker *tab_picker = E_MAIL_TAB_PICKER (actor); - EMailTabPickerPrivate *priv = tab_picker->priv; - - mx_widget_get_padding (MX_WIDGET (actor), &padding); - - /* Allocate for scroll-bar and close button */ - clutter_actor_get_preferred_size ( - CLUTTER_ACTOR (priv->close_button), - NULL, NULL, &width, &height); - child_box.x1 = 0; - child_box.x2 = box->x2 - box->x1 - padding.right; - child_box.y1 = 0; - child_box.y2 = child_box.y1 + height; - clutter_actor_allocate ( - CLUTTER_ACTOR (priv->close_button), &child_box, flags); - - /* FIXME: Make this a property */ -#define SPACING 4.0 - /* Work out allocation for scroll-bar, but allocate it later */ - scroll_box = child_box; - scroll_box.x2 -= width + SPACING; - scroll_box.x1 += SPACING; - scroll_box.y1 += SPACING; - scroll_box.y2 -= SPACING; - - child_box.y1 += (height * priv->preview_progress) + padding.top; - - /* Allocate for tabs */ - total_width = 0; - child_box.x1 = padding.left; - e_mail_tab_picker_get_preferred_height ( - tab_picker, -1, NULL, &height, FALSE); - for (t = priv->tabs; t; t = t->next) { - EMailTabPickerProps *props = t->data; - ClutterActor *actor = CLUTTER_ACTOR (props->tab); - - clutter_actor_get_preferred_width ( - actor, child_box.y2, NULL, &width); - - /* Fill out data - note it's ok to fill out docking here - * as when it changes, the tab queues a relayout. */ - props->docking = e_mail_tab_get_docking (props->tab); - props->position = child_box.x1; - props->width = width; - - total_width += width; - - /* Don't stretch tabs without a preview to fit tabs - * with a preview. */ - if (e_mail_tab_get_preview_actor (props->tab)) - child_box.y2 = box->y2 - box->y1 - padding.bottom; - else - child_box.y2 = child_box.y1 + height; - - child_box.x2 = child_box.x1 + width; - clutter_actor_allocate (actor, &child_box, flags); - - child_box.x1 = child_box.x2; - } - - /* Allocate for the chooser button */ - clutter_actor_get_preferred_width ( - CLUTTER_ACTOR (priv->chooser_button), - box->y2 - box->y1, NULL, &width); - - child_box.x2 = box->x2 - box->x1 - padding.right; - child_box.x1 = child_box.x2 - width; - child_box.y1 = 0; - child_box.y2 = child_box.y1 + height; - clutter_actor_allocate ( - CLUTTER_ACTOR (priv->chooser_button), &child_box, flags); - - /* Cache some useful size values */ - priv->width = (gint)(box->x2 - box->x1); - - priv->total_width = (gint)(total_width + padding.left + padding.right); - - old_max_offset = priv->max_offset; - priv->max_offset = - priv->total_width - priv->width + - (gint) (child_box.x2 - child_box.x1); - if (priv->max_offset < 0) - priv->max_offset = 0; - - /* Allocate for tab picker */ - old_scroll_offset = priv->scroll_offset; - priv->scroll_offset = CLAMP (priv->scroll_offset, 0, priv->max_offset); - e_mail_tab_picker_allocate_docked (tab_picker, box, &child_box, flags); - - /* Chain up (store box) */ - CLUTTER_ACTOR_CLASS (e_mail_tab_picker_parent_class)-> - allocate (actor, box, flags); - - /* Sync up the scroll-bar properties */ - g_object_set ( - priv->scroll_adjustment, - "page-increment", (gdouble)(box->x2 - box->x1), - "page-size", (gdouble)(box->x2 - box->x1), - "upper", (gdouble)total_width, - NULL); - - if ((priv->max_offset != old_max_offset) || - (priv->scroll_offset != old_scroll_offset)) - mx_adjustment_set_value ( - priv->scroll_adjustment, - (gdouble) priv->scroll_offset); - - /* Allocate for scroll-bar */ - clutter_actor_allocate ( - CLUTTER_ACTOR (priv->scroll_bar), &scroll_box, flags); - - /* Keep current tab visible */ - if (priv->keep_current_visible) { - EMailTabPickerProps *current; - - current = g_list_nth_data (priv->tabs, priv->current_tab); - - if ((current->position < priv->scroll_offset) || - (current->position + current->width >= priv->max_offset)) - e_mail_tab_picker_scroll_to ( - tab_picker, current->position, 150); - } -} - -static void -e_mail_tab_picker_map (ClutterActor *actor) -{ - GList *t; - EMailTabPickerPrivate *priv; - - priv = E_MAIL_TAB_PICKER_GET_PRIVATE (actor); - - CLUTTER_ACTOR_CLASS (e_mail_tab_picker_parent_class)->map (actor); - - clutter_actor_map (CLUTTER_ACTOR (priv->chooser_button)); - clutter_actor_map (CLUTTER_ACTOR (priv->close_button)); - clutter_actor_map (CLUTTER_ACTOR (priv->scroll_bar)); - - for (t = priv->tabs; t; t = t->next) { - EMailTabPickerProps *props = t->data; - clutter_actor_map (CLUTTER_ACTOR (props->tab)); - } -} - -static void -e_mail_tab_picker_unmap (ClutterActor *actor) -{ - GList *t; - EMailTabPickerPrivate *priv; - - priv = E_MAIL_TAB_PICKER_GET_PRIVATE (actor); - - CLUTTER_ACTOR_CLASS (e_mail_tab_picker_parent_class)->unmap (actor); - - clutter_actor_unmap (CLUTTER_ACTOR (priv->chooser_button)); - clutter_actor_unmap (CLUTTER_ACTOR (priv->close_button)); - clutter_actor_unmap (CLUTTER_ACTOR (priv->scroll_bar)); - - for (t = priv->tabs; t; t = t->next) { - EMailTabPickerProps *props = t->data; - clutter_actor_unmap (CLUTTER_ACTOR (props->tab)); - } -} - -static void -e_mail_tab_picker_class_init (EMailTabPickerClass *class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (class); - ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (class); - - g_type_class_add_private (class, sizeof (EMailTabPickerPrivate)); - - object_class->get_property = e_mail_tab_picker_get_property; - object_class->set_property = e_mail_tab_picker_set_property; - object_class->dispose = e_mail_tab_picker_dispose; - - actor_class->paint = e_mail_tab_picker_paint; - actor_class->pick = e_mail_tab_picker_pick; - actor_class->get_preferred_width = e_mail_tab_picker_get_preferred_width; - actor_class->get_preferred_height = _e_mail_tab_picker_get_preferred_height; - actor_class->allocate = e_mail_tab_picker_allocate; - actor_class->map = e_mail_tab_picker_map; - actor_class->unmap = e_mail_tab_picker_unmap; - - g_object_class_install_property ( - object_class, - PROP_PREVIEW_MODE, - g_param_spec_boolean ( - "preview-mode", - "Preview mode", - "Whether to display " - "in preview mode.", - FALSE, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - g_object_class_override_property ( - object_class, - PROP_DROP_ENABLED, - "drop-enabled"); - - signals[TAB_ACTIVATED] = g_signal_new ( - "tab-activated", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EMailTabPickerClass, tab_activated), - NULL, NULL, - g_cclosure_marshal_VOID__OBJECT, - G_TYPE_NONE, 1, - E_TYPE_MAIL_TAB); - - signals[CHOOSER_CLICKED] = g_signal_new ( - "chooser-clicked", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EMailTabPickerClass, chooser_clicked), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); -} - -static void -e_mail_tab_picker_chooser_clicked_cb (ClutterActor *button, - EMailTabPicker *picker) -{ - g_signal_emit (picker, signals[CHOOSER_CLICKED], 0); -} - -static gboolean -e_mail_tab_picker_scroll_event_cb (ClutterActor *actor, - ClutterScrollEvent *event, - gpointer user_data) -{ - EMailTabPicker *picker = E_MAIL_TAB_PICKER (actor); - EMailTabPickerPrivate *priv = picker->priv; - - priv->keep_current_visible = FALSE; - - switch (event->direction) { - case CLUTTER_SCROLL_UP : - case CLUTTER_SCROLL_LEFT : - e_mail_tab_picker_scroll_to ( - picker, priv->scroll_end - 200, 150); - break; - - case CLUTTER_SCROLL_DOWN : - case CLUTTER_SCROLL_RIGHT : - e_mail_tab_picker_scroll_to ( - picker, priv->scroll_end + 200, 150); - break; - } - - return TRUE; -} - -static void -e_mail_tab_picker_scroll_value_cb (MxAdjustment *adjustment, - GParamSpec *pspec, - EMailTabPicker *picker) -{ - EMailTabPickerPrivate *priv = picker->priv; - gdouble value = mx_adjustment_get_value (adjustment); - - if ((gint) value != priv->scroll_offset) { - priv->keep_current_visible = FALSE; - priv->scroll_offset = (gint) value; - clutter_actor_queue_relayout (CLUTTER_ACTOR (picker)); - } -} - -static void -e_mail_tab_picker_init (EMailTabPicker *picker) -{ - picker->priv = E_MAIL_TAB_PICKER_GET_PRIVATE (picker); - - clutter_actor_set_reactive (CLUTTER_ACTOR (picker), TRUE); - - picker->priv->chooser_button = mx_button_new (); - clutter_actor_set_name ( - CLUTTER_ACTOR (picker->priv->chooser_button), - "chooser-button"); - clutter_actor_set_parent ( - CLUTTER_ACTOR (picker->priv->chooser_button), - CLUTTER_ACTOR (picker)); - - picker->priv->close_button = mx_button_new (); - clutter_actor_set_name ( - CLUTTER_ACTOR (picker->priv->close_button), - "chooser-close-button"); - clutter_actor_set_parent ( - CLUTTER_ACTOR (picker->priv->close_button), - CLUTTER_ACTOR (picker)); - clutter_actor_hide (CLUTTER_ACTOR (picker->priv->close_button)); - - picker->priv->scroll_adjustment = - mx_adjustment_new_with_values (0, 0, 0, 100, 200, 200); - picker->priv->scroll_bar = - mx_scroll_bar_new_with_adjustment ( - picker->priv->scroll_adjustment); - g_object_unref (picker->priv->scroll_adjustment); - clutter_actor_set_parent ( - CLUTTER_ACTOR (picker->priv->scroll_bar), - CLUTTER_ACTOR (picker)); - clutter_actor_hide (CLUTTER_ACTOR (picker->priv->scroll_bar)); - - g_signal_connect ( - picker->priv->chooser_button, "clicked", - G_CALLBACK (e_mail_tab_picker_chooser_clicked_cb), picker); - g_signal_connect ( - picker->priv->close_button, "clicked", - G_CALLBACK (e_mail_tab_picker_chooser_clicked_cb), picker); - g_signal_connect ( - picker, "scroll-event", - G_CALLBACK (e_mail_tab_picker_scroll_event_cb), NULL); -} - -static gint -e_mail_tab_picker_find_tab_cb (gconstpointer a, - gconstpointer b) -{ - EMailTabPickerProps *props = (EMailTabPickerProps *) a; - EMailTab *tab = (EMailTab *) b; - - return (props->tab == tab) ? 0 : -1; -} - -static void -e_mail_tab_picker_tab_clicked_cb (EMailTab *tab, - EMailTabPicker *picker) -{ - EMailTabPickerPrivate *priv = picker->priv; - EMailTab *old_tab; - GList *new_tab_link; - - old_tab = ((EMailTabPickerProps *) g_list_nth_data ( - priv->tabs, priv->current_tab))->tab; - new_tab_link = g_list_find_custom ( - priv->tabs, tab, e_mail_tab_picker_find_tab_cb); - - if (!new_tab_link) - return; - - priv->keep_current_visible = TRUE; - - /* If the same tab is clicked, make sure we remain active and return */ - if (tab == old_tab) { - e_mail_tab_set_active (tab, TRUE); - if (priv->preview_mode) - g_signal_emit (picker, signals[TAB_ACTIVATED], 0, tab); - return; - } - - /* Deselect old tab */ - e_mail_tab_set_active (old_tab, FALSE); - - /* Set new tab */ - priv->current_tab = g_list_position (priv->tabs, new_tab_link); - g_signal_emit (picker, signals[TAB_ACTIVATED], 0, tab); -} - -ClutterActor * -e_mail_tab_picker_new (void) -{ - return g_object_new (E_TYPE_MAIL_TAB_PICKER, NULL); -} - -static void -e_mail_tab_picker_tab_drag_begin_cb (MxDraggable *draggable, - gfloat event_x, - gfloat event_y, - gint event_button, - ClutterModifierType modifiers, - EMailTabPicker *picker) -{ - EMailTabPickerPrivate *priv = picker->priv; - priv->in_drag = TRUE; - - if (!priv->preview_mode) { - e_mail_tab_picker_set_preview_mode (picker, TRUE); - priv->drag_preview = TRUE; - } -} - -static void -e_mail_tab_picker_tab_drag_end_cb (MxDraggable *draggable, - gfloat event_x, - gfloat event_y, - EMailTabPicker *picker) -{ - EMailTabPickerPrivate *priv = picker->priv; - priv->in_drag = FALSE; - - if (priv->drag_preview) { - e_mail_tab_picker_set_preview_mode (picker, FALSE); - priv->drag_preview = FALSE; - } -} - -void -e_mail_tab_picker_add_tab (EMailTabPicker *picker, - EMailTab *tab, - gint position) -{ - EMailTabPickerProps *props; - EMailTabPickerPrivate *priv = picker->priv; - - if (priv->tabs && (priv->current_tab >= position)) - priv->current_tab++; - - props = g_slice_new (EMailTabPickerProps); - props->tab = tab; - priv->tabs = g_list_insert (priv->tabs, props, position); - priv->n_tabs++; - - clutter_actor_set_parent (CLUTTER_ACTOR (tab), CLUTTER_ACTOR (picker)); - mx_draggable_set_axis (MX_DRAGGABLE (tab), MX_DRAG_AXIS_X); - - g_signal_connect_after ( - tab, "clicked", - G_CALLBACK (e_mail_tab_picker_tab_clicked_cb), picker); - g_signal_connect ( - tab, "drag-begin", - G_CALLBACK (e_mail_tab_picker_tab_drag_begin_cb), picker); - g_signal_connect ( - tab, "drag-end", - G_CALLBACK (e_mail_tab_picker_tab_drag_end_cb), picker); - - e_mail_tab_set_preview_mode (tab, priv->preview_mode); - clutter_actor_queue_relayout (CLUTTER_ACTOR (picker)); -} - -void -e_mail_tab_picker_remove_tab (EMailTabPicker *picker, - EMailTab *tab) -{ - GList *tab_link; - EMailTabPickerPrivate *priv = picker->priv; - - tab_link = g_list_find_custom ( - priv->tabs, tab, e_mail_tab_picker_find_tab_cb); - - if (!tab_link) - return; - - g_signal_handlers_disconnect_by_func ( - tab, e_mail_tab_picker_tab_clicked_cb, picker); - g_signal_handlers_disconnect_by_func ( - tab, e_mail_tab_picker_tab_drag_begin_cb, picker); - g_signal_handlers_disconnect_by_func ( - tab, e_mail_tab_picker_tab_drag_end_cb, picker); - - /* We don't want to do this during dispose, checking if chooser_button - * exists is a way of checking if we're in dispose without keeping an - * extra variable around. */ - if (priv->chooser_button) { - gint position = g_list_position (priv->tabs, tab_link); - if (priv->current_tab) { - if (priv->current_tab > position) - priv->current_tab--; - else if (priv->current_tab == position) - e_mail_tab_picker_set_current_tab ( - picker, priv->current_tab - 1); - } else if (priv->tabs->next && (position == 0)) { - e_mail_tab_picker_set_current_tab ( - picker, priv->current_tab + 1); - priv->current_tab--; - } - } - - g_slice_free (EMailTabPickerProps, tab_link->data); - priv->tabs = g_list_delete_link (priv->tabs, tab_link); - clutter_actor_unparent (CLUTTER_ACTOR (tab)); - priv->n_tabs--; - - clutter_actor_queue_relayout (CLUTTER_ACTOR (picker)); -} - -GList * -e_mail_tab_picker_get_tabs (EMailTabPicker *picker) -{ - GList *tab_list, *t; - - EMailTabPickerPrivate *priv = picker->priv; - - tab_list = NULL; - for (t = g_list_last (priv->tabs); t; t = t->prev) { - EMailTabPickerProps *props = t->data; - tab_list = g_list_prepend (tab_list, props->tab); - } - - return tab_list; -} - -EMailTab * -e_mail_tab_picker_get_tab (EMailTabPicker *picker, - gint tab) -{ - EMailTabPickerProps *props = g_list_nth_data (picker->priv->tabs, tab); - return props->tab; -} - -gint -e_mail_tab_picker_get_tab_no (EMailTabPicker *picker, - EMailTab *tab) -{ - GList *tab_link; - - tab_link = g_list_find_custom ( - picker->priv->tabs, tab, - e_mail_tab_picker_find_tab_cb); - - return g_list_position (picker->priv->tabs, tab_link); -} - -gint -e_mail_tab_picker_get_current_tab (EMailTabPicker *picker) -{ - return picker->priv->current_tab; -} - -void -e_mail_tab_picker_set_current_tab (EMailTabPicker *picker, - gint tab_no) -{ - EMailTabPickerPrivate *priv = picker->priv; - EMailTabPickerProps *props; - - printf("OLD %d new %d\n", priv->current_tab, tab_no); - if (priv->n_tabs == 0) - return; - - if (ABS (tab_no) >= priv->n_tabs) - return; - - if (tab_no < 0) - tab_no = priv->n_tabs + tab_no; - - props = g_list_nth_data (priv->tabs, (guint) tab_no); - - if (props) { - e_mail_tab_picker_tab_clicked_cb (props->tab, picker); - e_mail_tab_set_active (props->tab, TRUE); - } -} - -void -e_mail_tab_picker_reorder (EMailTabPicker *picker, - gint old_position, - gint new_position) -{ - GList *link; - gpointer data; - - EMailTabPickerPrivate *priv = picker->priv; - - if (old_position == new_position) - return; - - if (!(link = g_list_nth (priv->tabs, old_position))) - return; - - data = link->data; - priv->tabs = g_list_delete_link (priv->tabs, link); - priv->tabs = g_list_insert (priv->tabs, data, new_position); - - if (priv->current_tab == old_position) { - if (new_position < 0) - priv->current_tab = priv->n_tabs - 1; - else - priv->current_tab = CLAMP ( - new_position, 0, priv->n_tabs - 1); - } else if ((priv->current_tab > old_position) && - (new_position >= priv->current_tab)) - priv->current_tab--; - else if ((priv->current_tab < old_position) && - (new_position <= priv->current_tab)) - priv->current_tab++; - - clutter_actor_queue_relayout (CLUTTER_ACTOR (picker)); -} - -gint -e_mail_tab_picker_get_n_tabs (EMailTabPicker *picker) -{ - return picker->priv->n_tabs; -} - -static void -preview_new_frame_cb (ClutterTimeline *timeline, - guint msecs, - EMailTabPicker *picker) -{ - picker->priv->preview_progress = - clutter_timeline_get_progress (timeline); - clutter_actor_queue_relayout (CLUTTER_ACTOR (picker)); -} - -static void -preview_completed_cb (ClutterTimeline *timeline, - EMailTabPicker *picker) -{ - EMailTabPickerPrivate *priv = picker->priv; - - if (priv->preview_timeline) { - g_object_unref (priv->preview_timeline); - priv->preview_timeline = NULL; - - if (priv->preview_mode) { - priv->preview_progress = 1.0; - clutter_actor_hide ( - CLUTTER_ACTOR (priv->chooser_button)); - } else { - priv->preview_progress = 0.0; - clutter_actor_hide (CLUTTER_ACTOR (priv->scroll_bar)); - clutter_actor_hide (CLUTTER_ACTOR (priv->close_button)); - } - - clutter_actor_queue_relayout (CLUTTER_ACTOR (picker)); - } -} - -void -e_mail_tab_picker_set_preview_mode (EMailTabPicker *picker, - gboolean preview) -{ - GList *t; - - EMailTabPickerPrivate *priv = picker->priv; - - if ((priv->preview_mode ? 1 : 0) == (preview ? 1 : 0)) - return; - - priv->preview_mode = preview; - - /* Put all tabs in preview mode */ - for (t = priv->tabs; t; t = t->next) { - EMailTabPickerProps *prop = t->data; - e_mail_tab_set_preview_mode (prop->tab, preview); - } - - /* Slide in the scroll-bar */ - if (!priv->preview_timeline) { - if (preview) - clutter_actor_show (CLUTTER_ACTOR (priv->scroll_bar)); - - priv->preview_timeline = clutter_timeline_new (150); - g_signal_connect ( - priv->preview_timeline, "new-frame", - G_CALLBACK (preview_new_frame_cb), picker); - g_signal_connect ( - priv->preview_timeline, "completed", - G_CALLBACK (preview_completed_cb), picker); - clutter_timeline_start (priv->preview_timeline); - } - - clutter_timeline_set_direction ( - priv->preview_timeline, - preview ? CLUTTER_TIMELINE_FORWARD : - CLUTTER_TIMELINE_BACKWARD); - - /* Connect/disconnect the scrollbar */ - if (preview) - g_signal_connect ( - priv->scroll_adjustment, "notify::value", - G_CALLBACK (e_mail_tab_picker_scroll_value_cb), picker); - else - g_signal_handlers_disconnect_by_func ( - priv->scroll_adjustment, - e_mail_tab_picker_scroll_value_cb, picker); - - if (preview) { - /* Fade out the chooser button show close button */ - clutter_actor_animate ( - CLUTTER_ACTOR (priv->chooser_button), - CLUTTER_EASE_IN_OUT_QUAD, 150, - "opacity", 0x00, NULL); - clutter_actor_show (CLUTTER_ACTOR (priv->close_button)); - } else { - /* Fade in the chooser button */ - clutter_actor_show (CLUTTER_ACTOR (priv->chooser_button)); - clutter_actor_animate ( - CLUTTER_ACTOR (priv->chooser_button), - CLUTTER_EASE_IN_OUT_QUAD, 150, - "opacity", 0xff, NULL); - } - - clutter_actor_set_reactive ( - CLUTTER_ACTOR (priv->chooser_button), !preview); - - /* Remove the hover state, which likely got stuck when we clicked it */ - if (!preview) - mx_stylable_set_style_pseudo_class ( - MX_STYLABLE (priv->chooser_button), NULL); - - g_object_notify (G_OBJECT (picker), "preview-mode"); -} - -gboolean -e_mail_tab_picker_get_preview_mode (EMailTabPicker *picker) -{ - EMailTabPickerPrivate *priv = picker->priv; - return priv->preview_mode; -} - -void -e_mail_tab_picker_enable_drop (EMailTabPicker *picker, - gboolean enable) -{ - EMailTabPickerPrivate *priv = picker->priv; - - if ((priv->drop_enabled ? 1 : 0) == (enable ? 1 : 0)) - return; - - priv->drop_enabled = enable; - if (enable) - mx_droppable_enable (MX_DROPPABLE (picker)); - else - mx_droppable_disable (MX_DROPPABLE (picker)); - - g_object_notify (G_OBJECT (picker), "enabled"); -} - diff --git a/mail/e-mail-tab-picker.h b/mail/e-mail-tab-picker.h deleted file mode 100644 index 56a9b4ac43..0000000000 --- a/mail/e-mail-tab-picker.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Borrowed from Moblin-Web-Browser: The web browser for Moblin - * Copyright (c) 2009, Intel Corporation. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU Lesser General Public License, - * version 2.1, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public - * License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#ifndef E_MAIL_TAB_PICKER_H -#define E_MAIL_TAB_PICKER_H - -#include <clutter/clutter.h> -#include <mx/mx.h> -#include "e-mail-tab.h" - -/* Standard GObject macros */ -#define E_TYPE_MAIL_TAB_PICKER \ - (e_mail_tab_picker_get_type ()) -#define E_MAIL_TAB_PICKER(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST \ - ((obj), E_TYPE_MAIL_TAB_PICKER, EMailTabPicker)) -#define E_MAIL_TAB_PICKER_CLASS(cls) \ - (G_TYPE_CHECK_CLASS_CAST \ - ((cls), E_TYPE_MAIL_TAB_PICKER, EMailTabPickerClass)) -#define E_MAIL_IS_TAB_PICKER(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE \ - ((obj), E_TYPE_MAIL_TAB_PICKER)) -#define E_MAIL_IS_TAB_PICKER_CLASS(cls) \ - (G_TYPE_CHECK_CLASS_TYPE \ - ((cls), E_TYPE_MAIL_TAB_PICKER)) -#define E_MAIL_TAB_PICKER_GET_CLASS(obj) \ - (G_TYPE_INSTANCE_GET_CLASS \ - ((obj), E_TYPE_MAIL_TAB_PICKER, EMailTabPickerClass)) - -G_BEGIN_DECLS - -typedef struct _EMailTabPicker EMailTabPicker; -typedef struct _EMailTabPickerClass EMailTabPickerClass; -typedef struct _EMailTabPickerPrivate EMailTabPickerPrivate; - -struct _EMailTabPicker { - MxWidget parent; - EMailTabPickerPrivate *priv; -}; - -struct _EMailTabPickerClass { - MxWidgetClass parent_class; - - void (*tab_activated) (EMailTabPicker *picker, - EMailTab *tab); - void (*chooser_clicked) (EMailTabPicker *picker); -}; - -GType e_mail_tab_picker_get_type (void) G_GNUC_CONST; -ClutterActor * e_mail_tab_picker_new (void); -void e_mail_tab_picker_add_tab (EMailTabPicker *picker, - EMailTab *tab, - gint position); -void e_mail_tab_picker_remove_tab (EMailTabPicker *picker, - EMailTab *tab); -GList * e_mail_tab_picker_get_tabs (EMailTabPicker *picker); -gint e_mail_tab_picker_get_n_tabs (EMailTabPicker *picker); -EMailTab * e_mail_tab_picker_get_tab (EMailTabPicker *picker, - gint tab); -gint e_mail_tab_picker_get_tab_no (EMailTabPicker *picker, - EMailTab *tab); -gint e_mail_tab_picker_get_current_tab - (EMailTabPicker *picker); -void e_mail_tab_picker_set_current_tab - (EMailTabPicker *picker, - gint tab); -void e_mail_tab_picker_reorder (EMailTabPicker *picker, - gint old_position, - gint new_position); -void e_mail_tab_picker_set_tab_width (EMailTabPicker *picker, - gint width); -gint e_mail_tab_picker_get_tab_width (EMailTabPicker *picker); -void e_mail_tab_picker_get_preferred_height - (EMailTabPicker *tab_picker, - gfloat for_width, - gfloat *min_height_p, - gfloat *natural_height_p, - gboolean with_previews); -void e_mail_tab_picker_set_preview_mode - (EMailTabPicker *picker, - gboolean preview); -gboolean e_mail_tab_picker_get_preview_mode - (EMailTabPicker *picker); -void e_mail_tab_picker_enable_drop (EMailTabPicker *picker, - gboolean enable); - -G_END_DECLS - -#endif /* E_MAIL_TAB_PICKER_H */ - diff --git a/mail/e-mail-tab.c b/mail/e-mail-tab.c deleted file mode 100644 index a2a80436d0..0000000000 --- a/mail/e-mail-tab.c +++ /dev/null @@ -1,1919 +0,0 @@ -/* - * Borrowed from Moblin-Web-Browser: The web browser for Moblin - * Copyright (c) 2009, Intel Corporation. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU Lesser General Public License, - * version 2.1, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public - * License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <math.h> -#include <string.h> -#include <gtk/gtk.h> -#include "e-mail-tab.h" - -#define E_MAIL_TAB_GET_PRIVATE(obj) \ - (G_TYPE_INSTANCE_GET_PRIVATE \ - ((obj), E_TYPE_MAIL_TAB, EMailTabPrivate)) - -#define E_MAIL_PIXBOUND(u) ((gfloat)((gint)(u))) - -static void mx_draggable_iface_init (MxDraggableIface *iface); - -G_DEFINE_TYPE_WITH_CODE ( - EMailTab, - e_mail_tab, - MX_TYPE_WIDGET, - G_IMPLEMENT_INTERFACE ( - MX_TYPE_DRAGGABLE, mx_draggable_iface_init)) - -enum { - PROP_0, - PROP_ICON, - PROP_TEXT, - PROP_CAN_CLOSE, - PROP_TAB_WIDTH, - PROP_DOCKING, - PROP_PREVIEW, - PROP_PREVIEW_MODE, - PROP_PREVIEW_DURATION, - PROP_SPACING, - PROP_PRIVATE, - PROP_ACTIVE, - PROP_DRAG_THRESHOLD, - PROP_DRAG_AXIS, - PROP_DRAG_CONTAINMENT_AREA, - PROP_DRAG_ENABLED, - PROP_DRAG_ACTOR, -}; - -enum { - CLICKED, - CLOSED, - TRANSITION_COMPLETE, - LAST_SIGNAL -}; - -/* Animation stage lengths */ -#define TAB_S1_ANIM 0.75 -#define TAB_S2_ANIM (1.0-TAB_S1_ANIM) - -static guint signals[LAST_SIGNAL] = { 0, }; - -static void e_mail_tab_close_clicked_cb (MxButton *button, EMailTab *self); - -struct _EMailTabPrivate { - ClutterActor *icon; - ClutterActor *default_icon; - ClutterActor *label; - ClutterActor *close_button; - gboolean can_close; - gint width; - gboolean docking; - gfloat spacing; - gboolean private; - guint alert_count; - guint alert_source; - gboolean has_text; - - guint active : 1; - guint pressed : 1; - guint hover : 1; - - ClutterActor *preview; - gboolean preview_mode; - ClutterTimeline *preview_timeline; - gdouble preview_height_progress; - guint anim_length; - - ClutterActor *old_bg; - - ClutterActor *drag_actor; - ClutterActorBox drag_area; - gboolean drag_enabled; - MxDragAxis drag_axis; - gint drag_threshold; - gulong drag_threshold_handler; - gfloat press_x; - gfloat press_y; - gboolean in_drag; -}; - -static void -e_mail_tab_drag_begin (MxDraggable *draggable, - gfloat event_x, - gfloat event_y, - gint event_button, - ClutterModifierType modifiers) -{ - EMailTabPrivate *priv; - ClutterActor *self = CLUTTER_ACTOR (draggable); - ClutterActor *actor = mx_draggable_get_drag_actor (draggable); - ClutterActor *stage = clutter_actor_get_stage (self); - gfloat x, y; - - priv = E_MAIL_TAB_GET_PRIVATE (draggable); - priv->in_drag = TRUE; - - clutter_actor_get_transformed_position (self, &x, &y); - clutter_actor_set_position (actor, x, y); - - /* Start up animation */ - if (CLUTTER_IS_TEXTURE (actor)) { - /* TODO: Some neat deformation effect? */ - } else { - /* Fade in */ - clutter_actor_set_opacity (actor, 0x00); - clutter_actor_animate ( - actor, CLUTTER_LINEAR, 150, - "opacity", 0xff, - NULL); - } - - clutter_container_add_actor (CLUTTER_CONTAINER (stage), actor); -} - -static void -e_mail_tab_drag_motion (MxDraggable *draggable, - gfloat delta_x, - gfloat delta_y) -{ - ClutterActor *actor = mx_draggable_get_drag_actor (draggable); - clutter_actor_move_by (actor, delta_x, delta_y); -} - -static void -e_mail_tab_drag_end_anim_cb (ClutterAnimation *animation, - EMailTab *tab) -{ - ClutterActor *actor = - CLUTTER_ACTOR (clutter_animation_get_object (animation)); - ClutterActor *parent = clutter_actor_get_parent (actor); - - if (parent) - clutter_container_remove_actor ( - CLUTTER_CONTAINER (parent), actor); -} - -static void -e_mail_tab_drag_end (MxDraggable *draggable, - gfloat event_x, - gfloat event_y) -{ - EMailTab *self = E_MAIL_TAB (draggable); - EMailTabPrivate *priv = self->priv; - - priv->in_drag = FALSE; - - if (priv->drag_actor) { - ClutterActor *parent = clutter_actor_get_parent (priv->drag_actor); - if (parent) { - /* Animate drop */ - if (CLUTTER_IS_TEXTURE (priv->drag_actor)) { - /* TODO: Some neat deformation effect? */ - clutter_container_remove_actor ( - CLUTTER_CONTAINER (parent), - priv->drag_actor); - } else { - clutter_actor_animate ( - priv->drag_actor, - CLUTTER_LINEAR, 150, - "opacity", 0x00, - "signal::completed", - G_CALLBACK (e_mail_tab_drag_end_anim_cb), - self, NULL); - } - } - - g_object_unref (priv->drag_actor); - priv->drag_actor = NULL; - } -} - -static void -mx_draggable_iface_init (MxDraggableIface *iface) -{ - iface->drag_begin = e_mail_tab_drag_begin; - iface->drag_motion = e_mail_tab_drag_motion; - iface->drag_end = e_mail_tab_drag_end; -} - -static void -e_mail_tab_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec) -{ - EMailTab *tab = E_MAIL_TAB (object); - EMailTabPrivate *priv = tab->priv; - - switch (property_id) { - case PROP_ICON: - g_value_set_object (value, e_mail_tab_get_icon (tab)); - break; - - case PROP_TEXT: - g_value_set_string (value, e_mail_tab_get_text (tab)); - break; - - case PROP_CAN_CLOSE: - g_value_set_boolean (value, e_mail_tab_get_can_close (tab)); - break; - - case PROP_TAB_WIDTH: - g_value_set_int (value, e_mail_tab_get_width (tab)); - break; - - case PROP_DOCKING: - g_value_set_boolean (value, e_mail_tab_get_docking (tab)); - break; - - case PROP_PREVIEW: - g_value_set_object (value, e_mail_tab_get_preview_actor (tab)); - break; - - case PROP_PREVIEW_MODE: - g_value_set_boolean (value, e_mail_tab_get_preview_mode (tab)); - break; - - case PROP_PREVIEW_DURATION: - g_value_set_uint (value, e_mail_tab_get_preview_duration (tab)); - break; - - case PROP_SPACING: - g_value_set_float (value, e_mail_tab_get_spacing (tab)); - break; - - case PROP_PRIVATE: - g_value_set_boolean (value, e_mail_tab_get_private (tab)); - break; - - case PROP_ACTIVE: - g_value_set_boolean (value, e_mail_tab_get_active (tab)); - break; - - case PROP_DRAG_THRESHOLD: - g_value_set_uint (value, (guint) priv->drag_threshold); - break; - - case PROP_DRAG_AXIS: - g_value_set_enum (value, priv->drag_axis); - break; - - case PROP_DRAG_CONTAINMENT_AREA: - g_value_set_boxed (value, &priv->drag_area); - break; - - case PROP_DRAG_ENABLED: - g_value_set_boolean (value, priv->drag_enabled); - break; - - case PROP_DRAG_ACTOR: - if (!priv->drag_actor) - priv->drag_actor = g_object_ref_sink ( - clutter_clone_new (CLUTTER_ACTOR (tab))); - g_value_set_object (value, priv->drag_actor); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - } -} - -static void -e_mail_tab_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec) -{ - EMailTab *tab = E_MAIL_TAB (object); - EMailTabPrivate *priv = tab->priv; - - switch (property_id) { - case PROP_ICON: - e_mail_tab_set_icon ( - tab, g_value_get_object (value)); - break; - - case PROP_TEXT: - e_mail_tab_set_text ( - tab, g_value_get_string (value)); - break; - - case PROP_CAN_CLOSE: - e_mail_tab_set_can_close ( - tab, g_value_get_boolean (value)); - - case PROP_TAB_WIDTH: - e_mail_tab_set_width ( - tab, g_value_get_int (value)); - break; - - case PROP_DOCKING: - e_mail_tab_set_docking ( - tab, g_value_get_boolean (value)); - break; - - case PROP_PREVIEW: - e_mail_tab_set_preview_actor ( - tab, g_value_get_object (value)); - break; - - case PROP_PREVIEW_MODE: - e_mail_tab_set_preview_mode ( - tab, g_value_get_boolean (value)); - break; - - case PROP_PREVIEW_DURATION: - e_mail_tab_set_preview_duration ( - tab, g_value_get_uint (value)); - break; - - case PROP_SPACING: - e_mail_tab_set_spacing ( - tab, g_value_get_float (value)); - break; - - case PROP_PRIVATE: - e_mail_tab_set_private ( - tab, g_value_get_boolean (value)); - break; - - case PROP_ACTIVE: - e_mail_tab_set_active ( - tab, g_value_get_boolean (value)); - break; - - case PROP_DRAG_THRESHOLD: - break; - - case PROP_DRAG_AXIS: - priv->drag_axis = g_value_get_enum (value); - break; - - case PROP_DRAG_CONTAINMENT_AREA: - { - ClutterActorBox *box = g_value_get_boxed (value); - - if (box) - priv->drag_area = *box; - else - memset ( - &priv->drag_area, 0, - sizeof (ClutterActorBox)); - break; - } - - case PROP_DRAG_ENABLED: - priv->drag_enabled = g_value_get_boolean (value); - break; - - case PROP_DRAG_ACTOR: - { - ClutterActor *new_actor = g_value_get_object (value); - - if (priv->drag_actor) { - ClutterActor *parent; - - parent = clutter_actor_get_parent (priv->drag_actor); - - /* We know it's a container because we added it ourselves */ - if (parent) - clutter_container_remove_actor ( - CLUTTER_CONTAINER (parent), - priv->drag_actor); - - g_object_unref (priv->drag_actor); - priv->drag_actor = NULL; - } - - if (new_actor) - priv->drag_actor = g_object_ref_sink (new_actor); - - break; - } - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - } -} - -static void -e_mail_tab_dispose_old_bg (EMailTab *tab) -{ - EMailTabPrivate *priv = tab->priv; - - if (priv->old_bg) { - ClutterActor *parent; - - parent = clutter_actor_get_parent (priv->old_bg); - if (parent == (ClutterActor *) tab) - clutter_actor_unparent (priv->old_bg); - g_object_unref (priv->old_bg); - priv->old_bg = NULL; - } -} - -static void -e_mail_tab_dispose (GObject *object) -{ - EMailTab *tab = E_MAIL_TAB (object); - EMailTabPrivate *priv = tab->priv; - - e_mail_tab_dispose_old_bg (tab); - - if (priv->icon) { - clutter_actor_unparent (priv->icon); - priv->icon = NULL; - } - - if (priv->default_icon) { - g_object_unref (priv->default_icon); - priv->default_icon = NULL; - } - - if (priv->label) { - clutter_actor_unparent (CLUTTER_ACTOR (priv->label)); - priv->label = NULL; - } - - if (priv->close_button) { - clutter_actor_unparent (CLUTTER_ACTOR (priv->close_button)); - priv->close_button = NULL; - } - - if (priv->preview) { - clutter_actor_unparent (priv->preview); - priv->preview = NULL; - } - - if (priv->alert_source) { - g_source_remove (priv->alert_source); - priv->alert_source = 0; - } - - if (priv->drag_actor) { - ClutterActor *parent; - - parent = clutter_actor_get_parent (priv->drag_actor); - if (parent) - clutter_container_remove_actor ( - CLUTTER_CONTAINER (parent), - priv->drag_actor); - - g_object_unref (priv->drag_actor); - priv->drag_actor = NULL; - } - - if (priv->drag_threshold_handler) - g_signal_handler_disconnect ( - gtk_settings_get_default (), - priv->drag_threshold_handler); - priv->drag_threshold_handler = 0; - - G_OBJECT_CLASS (e_mail_tab_parent_class)->dispose (object); -} - -static void -e_mail_tab_get_preferred_width (ClutterActor *actor, - gfloat for_height, - gfloat *min_width_p, - gfloat *natural_width_p) -{ - EMailTabPrivate *priv; - MxPadding padding; - - priv = E_MAIL_TAB_GET_PRIVATE (actor); - - /* Get padding */ - mx_widget_get_padding (MX_WIDGET (actor), &padding); - if (min_width_p) - *min_width_p = padding.left + padding.right; - if (natural_width_p) - *natural_width_p = padding.left + padding.right; - - if (priv->width >= 0) { - if (natural_width_p) - *natural_width_p += priv->width; - } else { - gfloat min_width, nat_width, acc_min_width, acc_nat_width; - - acc_min_width = acc_nat_width = 0; - - if (priv->has_text) - clutter_actor_get_preferred_size ( - CLUTTER_ACTOR (priv->label), - &acc_min_width, NULL, - &acc_nat_width, NULL); - - if (priv->icon) - clutter_actor_get_preferred_size ( - priv->icon, - &min_width, NULL, - &nat_width, NULL); - acc_min_width += min_width; - acc_nat_width += nat_width; - - if (priv->can_close) - clutter_actor_get_preferred_size ( - CLUTTER_ACTOR (priv->close_button), - &min_width, NULL, - &nat_width, NULL); - acc_min_width += min_width; - acc_nat_width += nat_width; - - if (priv->preview && priv->preview_mode) { - clutter_actor_get_preferred_size ( - priv->preview, - &min_width, NULL, - &nat_width, NULL); - - if (min_width > acc_min_width) - acc_min_width = min_width; - if (nat_width > acc_nat_width) - acc_nat_width = nat_width; - } - - if (min_width_p) - *min_width_p += acc_min_width; - if (natural_width_p) - *natural_width_p += acc_nat_width; - } -} - -void -e_mail_tab_get_height_no_preview (EMailTab *tab, - gfloat for_width, - gfloat *min_height_p, - gfloat *natural_height_p) -{ - MxPadding padding; - gfloat min_height, nat_height, tmp_min_height, tmp_nat_height; - - ClutterActor *actor = CLUTTER_ACTOR (tab); - EMailTabPrivate *priv = tab->priv; - - /* Get padding */ - mx_widget_get_padding (MX_WIDGET (actor), &padding); - if (min_height_p) - *min_height_p = padding.top + padding.bottom; - if (natural_height_p) - *natural_height_p = padding.top + padding.bottom; - - min_height = nat_height = 0; - if (priv->has_text) - clutter_actor_get_preferred_height ( - CLUTTER_ACTOR (priv->label), -1, - &min_height, &nat_height); - - if (priv->icon) { - clutter_actor_get_preferred_height ( - priv->icon, -1, &tmp_min_height, &tmp_nat_height); - if (tmp_min_height > min_height) - min_height = tmp_min_height; - if (tmp_nat_height > nat_height) - nat_height = tmp_nat_height; - } - - if (priv->can_close) { - clutter_actor_get_preferred_height ( - CLUTTER_ACTOR (priv->close_button), - -1, &tmp_min_height, &tmp_nat_height); - - if (tmp_min_height > min_height) - min_height = tmp_min_height; - if (tmp_nat_height > nat_height) - nat_height = tmp_nat_height; - } - - if (min_height_p) - *min_height_p += min_height; - if (natural_height_p) - *natural_height_p += nat_height; -} - -static void -e_mail_tab_get_preferred_height (ClutterActor *actor, - gfloat for_width, - gfloat *min_height_p, - gfloat *natural_height_p) -{ - EMailTab *tab = E_MAIL_TAB (actor); - EMailTabPrivate *priv = tab->priv; - - e_mail_tab_get_height_no_preview ( - tab, for_width, min_height_p, natural_height_p); - - if (priv->preview) { - MxPadding padding; - gfloat min_height, nat_height; - gfloat label_min_height, label_nat_height; - - /* Get preview + padding height */ - mx_widget_get_padding (MX_WIDGET (actor), &padding); - - clutter_actor_get_preferred_height ( - priv->preview, - (gfloat) priv->width, - &min_height, &nat_height); - - /* Add label height */ - clutter_actor_get_preferred_height ( - CLUTTER_ACTOR (priv->label), -1, - &label_min_height, &label_nat_height); - - min_height = - (min_height * priv->preview_height_progress) + - padding.top + padding.bottom + priv->spacing + - label_min_height; - - nat_height = - (nat_height * priv->preview_height_progress) + - padding.top + padding.bottom + priv->spacing + - label_nat_height; - - /* Sometimes the preview's natural height will be nan due to - * keeping of the aspect ratio. This guards against that and - * stops Clutter from warning that the natural height is less - * than the minimum height. */ - if (isnan (nat_height)) - nat_height = min_height; - - if (min_height_p && (min_height > *min_height_p)) - *min_height_p = min_height; - if (natural_height_p && (nat_height > *natural_height_p)) - *natural_height_p = nat_height; - } -} - -static void -e_mail_tab_allocate (ClutterActor *actor, - const ClutterActorBox *box, - ClutterAllocationFlags flags) -{ - EMailTabPrivate *priv; - MxPadding padding; - ClutterActorBox child_box; - gfloat icon_width, icon_height; - gfloat label_width, label_height; - gfloat close_width, close_height; - gfloat preview_width, preview_height; - - priv = E_MAIL_TAB_GET_PRIVATE (actor); - - /* Chain up to store box */ - CLUTTER_ACTOR_CLASS (e_mail_tab_parent_class)->allocate (actor, box, flags); - - /* Possibly synchronise an axis if we're dragging */ - if (priv->in_drag) { - ClutterActor *drag_actor = - mx_draggable_get_drag_actor (MX_DRAGGABLE (actor)); - - if (drag_actor) { - gfloat x, y; - clutter_actor_get_transformed_position (actor, &x, &y); - - switch (mx_draggable_get_axis (MX_DRAGGABLE (actor))) { - case MX_DRAG_AXIS_X : - /* Synchronise y axis */ - clutter_actor_set_y (drag_actor, y); - break; - case MX_DRAG_AXIS_Y : - /* Synchronise x axis */ - clutter_actor_set_x (drag_actor, x); - break; - default: - break; - } - } - } - - /* Allocate old background texture */ - if (priv->old_bg) { - child_box.x1 = 0; - child_box.y1 = 0; - child_box.x2 = box->x2 - box->x1; - child_box.y2 = box->y2 - box->y1; - clutter_actor_allocate (priv->old_bg, &child_box, flags); - } - - mx_widget_get_padding (MX_WIDGET (actor), &padding); - - /* Get the preferred width/height of the icon, - * label and close-button first. */ - if (priv->icon) - clutter_actor_get_preferred_size ( - priv->icon, NULL, NULL, - &icon_width, &icon_height); - - clutter_actor_get_preferred_size ( - CLUTTER_ACTOR (priv->label), NULL, NULL, - &label_width, &label_height); - - if (priv->can_close) - clutter_actor_get_preferred_size ( - CLUTTER_ACTOR (priv->close_button), - NULL, NULL, &close_width, &close_height); - - /* Allocate for icon */ - if (priv->icon) { - child_box.x1 = padding.left; - child_box.x2 = child_box.x1 + icon_width; - child_box.y1 = E_MAIL_PIXBOUND ((box->y2 - box->y1) / 2 - icon_height / 2); - child_box.y2 = child_box.y1 + icon_height; - clutter_actor_allocate (priv->icon, &child_box, flags); - } - - /* Allocate for close button */ - if (priv->can_close) { - child_box.x2 = box->x2 - box->x1 - padding.right; - child_box.x1 = child_box.x2 - close_width; - child_box.y1 = E_MAIL_PIXBOUND ((box->y2 - box->y1) / 2 - close_height / 2); - child_box.y2 = child_box.y1 + close_height; - clutter_actor_allocate ( - CLUTTER_ACTOR (priv->close_button), - &child_box, flags); - } - - /* Allocate for preview widget */ - preview_height = 0; - if (priv->preview) { - preview_width = - (box->x2 - box->x1 - - padding.left - padding.right); - preview_height = - (box->y2 - box->y1 - - padding.top - padding.bottom - - priv->spacing - label_height); - - child_box.x1 = E_MAIL_PIXBOUND (padding.left); - child_box.y1 = E_MAIL_PIXBOUND (padding.top); - child_box.x2 = child_box.x1 + preview_width; - child_box.y2 = child_box.y1 + preview_height; - - clutter_actor_allocate (priv->preview, &child_box, flags); - } - - /* Allocate for label */ - if ((priv->preview_height_progress <= TAB_S1_ANIM) || (!priv->preview)) { - if (priv->icon) - child_box.x1 = E_MAIL_PIXBOUND ( - padding.left + icon_width + priv->spacing); - else - child_box.x1 = E_MAIL_PIXBOUND (padding.left); - child_box.x2 = (box->x2 - box->x1 - padding.right); - child_box.y1 = E_MAIL_PIXBOUND ( - (box->y2 - box->y1) / 2 - label_height / 2); - child_box.y2 = child_box.y1 + label_height; - - /* If close button is visible, don't overlap it */ - if (priv->can_close) - child_box.x2 -= close_width + priv->spacing; - } else { - /* Put label underneath preview */ - child_box.x1 = E_MAIL_PIXBOUND (padding.left); - child_box.x2 = (box->x2 - box->x1 - padding.right); - child_box.y1 = E_MAIL_PIXBOUND ( - padding.top + preview_height + priv->spacing); - child_box.y2 = child_box.y1 + label_height; - } - - clutter_actor_allocate (CLUTTER_ACTOR (priv->label), &child_box, flags); - - /* If we're in preview mode, re-allocate the background so it doesn't - * encompass the label. (A bit hacky?) - */ - if (priv->preview && CLUTTER_ACTOR_IS_VISIBLE (priv->preview)) { - gfloat max_height = padding.top + padding.bottom + preview_height; - if (box->y2 - box->y1 > max_height) { - MxWidget *widget = MX_WIDGET (actor); - ClutterActor *background = mx_widget_get_border_image (widget); - - if (!background) - background = mx_widget_get_background_image (widget); - - child_box.x1 = 0; - child_box.x2 = box->x2 - box->x1; - child_box.y1 = 0; - child_box.y2 = max_height; - - if (background) - clutter_actor_allocate ( - background, &child_box, flags); - - if (priv->old_bg && (priv->old_bg != background)) - clutter_actor_allocate ( - priv->old_bg, &child_box, flags); - } - } -} - -static void -e_mail_tab_paint (ClutterActor *actor) -{ - EMailTabPrivate *priv; - - priv = E_MAIL_TAB_GET_PRIVATE (actor); - - /* Chain up to paint background */ - CLUTTER_ACTOR_CLASS (e_mail_tab_parent_class)->paint (actor); - - if (priv->old_bg) - clutter_actor_paint (priv->old_bg); - - if (priv->icon) - clutter_actor_paint (priv->icon); - - clutter_actor_paint (CLUTTER_ACTOR (priv->label)); - - if (priv->can_close) - clutter_actor_paint (CLUTTER_ACTOR (priv->close_button)); - - if (priv->preview) - clutter_actor_paint (CLUTTER_ACTOR (priv->preview)); -} - -static void -e_mail_tab_pick (ClutterActor *actor, - const ClutterColor *c) -{ - CLUTTER_ACTOR_CLASS (e_mail_tab_parent_class)->pick (actor, c); - - if (clutter_actor_should_pick_paint (actor)) - e_mail_tab_paint (actor); -} - -static void -e_mail_tab_map (ClutterActor *actor) -{ - EMailTabPrivate *priv; - - priv = E_MAIL_TAB_GET_PRIVATE (actor); - - CLUTTER_ACTOR_CLASS (e_mail_tab_parent_class)->map (actor); - - clutter_actor_map (CLUTTER_ACTOR (priv->label)); - clutter_actor_map (CLUTTER_ACTOR (priv->close_button)); - - if (priv->icon) - clutter_actor_map (priv->icon); - if (priv->preview) - clutter_actor_map (priv->preview); - if (priv->old_bg) - clutter_actor_map (priv->old_bg); -} - -static void -e_mail_tab_unmap (ClutterActor *actor) -{ - EMailTabPrivate *priv; - - priv = E_MAIL_TAB_GET_PRIVATE (actor); - - CLUTTER_ACTOR_CLASS (e_mail_tab_parent_class)->unmap (actor); - - clutter_actor_unmap (CLUTTER_ACTOR (priv->label)); - clutter_actor_unmap (CLUTTER_ACTOR (priv->close_button)); - - if (priv->icon) - clutter_actor_unmap (priv->icon); - if (priv->preview) - clutter_actor_unmap (priv->preview); - if (priv->old_bg) - clutter_actor_unmap (priv->old_bg); -} - -static gboolean -e_mail_tab_button_press_event (ClutterActor *actor, - ClutterButtonEvent *event) -{ - EMailTabPrivate *priv; - - priv = E_MAIL_TAB_GET_PRIVATE (actor); - - if (event->button == 1) { - mx_stylable_set_style_pseudo_class ( - MX_STYLABLE (actor), "active"); - clutter_grab_pointer (actor); - priv->pressed = TRUE; - - priv->press_x = event->x; - priv->press_y = event->y; - } - - /* We have to always return false, or dragging won't work */ - return FALSE; -} - -static gboolean -e_mail_tab_button_release_event (ClutterActor *actor, - ClutterButtonEvent *event) -{ - EMailTab *tab = E_MAIL_TAB (actor); - EMailTabPrivate *priv = tab->priv; - - if (priv->pressed) { - clutter_ungrab_pointer (); - priv->pressed = FALSE; - - /* Note, no need to set the pseudo class here as clicking - * always results in being set active. */ - if (priv->hover) { - if (!priv->active) - e_mail_tab_set_active (tab, TRUE); - - g_signal_emit (actor, signals[CLICKED], 0); - } - } - - return FALSE; -} - -static gboolean -e_mail_tab_motion_event (ClutterActor *actor, - ClutterMotionEvent *event) -{ - EMailTab *tab = E_MAIL_TAB (actor); - EMailTabPrivate *priv = tab->priv; - - if (priv->pressed && priv->drag_enabled) { - if ((ABS (event->x - priv->press_x) >= priv->drag_threshold) || - (ABS (event->y - priv->press_y) >= priv->drag_threshold)) { - /* Ungrab the pointer so that the MxDraggable code can take over */ - clutter_ungrab_pointer (); - priv->pressed = FALSE; - if (!priv->active) { - if (priv->hover) - mx_stylable_set_style_pseudo_class ( - MX_STYLABLE (actor), "hover"); - else - mx_stylable_set_style_pseudo_class ( - MX_STYLABLE (actor), NULL); - } - } - } - - return FALSE; -} - -static gboolean -e_mail_tab_enter_event (ClutterActor *actor, - ClutterCrossingEvent *event) -{ - EMailTabPrivate *priv; - - priv = E_MAIL_TAB_GET_PRIVATE (actor); - - if (event->source != actor) - return FALSE; - - priv->hover = TRUE; - - if (priv->pressed) - mx_stylable_set_style_pseudo_class ( - MX_STYLABLE (actor), "active"); - else if (!priv->active) - mx_stylable_set_style_pseudo_class ( - MX_STYLABLE (actor), "hover"); - - return FALSE; -} - -static gboolean -e_mail_tab_leave_event (ClutterActor *actor, - ClutterCrossingEvent *event) -{ - EMailTabPrivate *priv; - - priv = E_MAIL_TAB_GET_PRIVATE (actor); - - if ((event->source != actor) || - (event->related == (ClutterActor *) priv->close_button)) - return FALSE; - - priv->hover = FALSE; - - if (!priv->active) - mx_stylable_set_style_pseudo_class (MX_STYLABLE (actor), NULL); - - return FALSE; -} - -static void -e_mail_tab_class_init (EMailTabClass *class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (class); - ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (class); - - g_type_class_add_private (class, sizeof (EMailTabPrivate)); - - object_class->get_property = e_mail_tab_get_property; - object_class->set_property = e_mail_tab_set_property; - object_class->dispose = e_mail_tab_dispose; - - actor_class->get_preferred_width = e_mail_tab_get_preferred_width; - actor_class->get_preferred_height = e_mail_tab_get_preferred_height; - actor_class->button_press_event = e_mail_tab_button_press_event; - actor_class->button_release_event = e_mail_tab_button_release_event; - actor_class->motion_event = e_mail_tab_motion_event; - actor_class->enter_event = e_mail_tab_enter_event; - actor_class->leave_event = e_mail_tab_leave_event; - actor_class->allocate = e_mail_tab_allocate; - actor_class->paint = e_mail_tab_paint; - actor_class->pick = e_mail_tab_pick; - actor_class->map = e_mail_tab_map; - actor_class->unmap = e_mail_tab_unmap; - - g_object_class_install_property ( - object_class, - PROP_ICON, - g_param_spec_object ( - "icon", - "Icon", - "Icon actor.", - CLUTTER_TYPE_ACTOR, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_TEXT, - g_param_spec_string ( - "text", - "Text", - "Tab text.", - "", - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_CAN_CLOSE, - g_param_spec_boolean ( - "can-close", - "Can close", - "Whether the tab can " - "close.", - TRUE, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_TAB_WIDTH, - g_param_spec_int ( - "tab-width", - "Tab width", - "Tab width.", - -1, G_MAXINT, -1, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_DOCKING, - g_param_spec_boolean ( - "docking", - "Docking", - "Whether the tab should dock to edges when scrolled.", - FALSE, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_PREVIEW, - g_param_spec_object ( - "preview", - "Preview actor", - "ClutterActor used " - "when in preview mode.", - CLUTTER_TYPE_ACTOR, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_PREVIEW_MODE, - g_param_spec_boolean ( - "preview-mode", - "Preview mode", - "Whether to display " - "in preview mode.", - FALSE, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_PREVIEW_DURATION, - g_param_spec_uint ( - "preview-duration", - "Preview duration", - "How long the transition " - "between preview mode " - "states lasts, in ms.", - 0, G_MAXUINT, 200, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_SPACING, - g_param_spec_float ( - "spacing", - "Spacing", - "Spacing between " - "tab elements.", - 0, G_MAXFLOAT, - 6.0, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_PRIVATE, - g_param_spec_boolean ( - "private", - "Private", - "Set if the tab is " - "'private'.", - FALSE, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_ACTIVE, - g_param_spec_boolean ( - "active", - "Active", - "Set if the tab is " - "active.", - FALSE, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - g_object_class_override_property ( - object_class, - PROP_DRAG_THRESHOLD, - "drag-threshold"); - - g_object_class_override_property ( - object_class, - PROP_DRAG_AXIS, - "axis"); - - g_object_class_override_property ( - object_class, - PROP_DRAG_CONTAINMENT_AREA, - "containment-area"); - - g_object_class_override_property ( - object_class, - PROP_DRAG_ENABLED, - "drag-enabled"); - - g_object_class_override_property ( - object_class, - PROP_DRAG_ACTOR, - "drag-actor"); - - signals[CLICKED] = g_signal_new ( - "clicked", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EMailTabClass, clicked), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - signals[CLOSED] = g_signal_new ( - "closed", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EMailTabClass, closed), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - signals[TRANSITION_COMPLETE] = g_signal_new ( - "transition-complete", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EMailTabClass, transition_complete), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); -} - -static void -e_mail_tab_close_clicked_cb (MxButton *button, - EMailTab *self) -{ - g_signal_emit (self, signals[CLOSED], 0); -} - -static void -e_mail_tab_anim_completed_cb (ClutterAnimation *animation, - EMailTab *tab) -{ - e_mail_tab_dispose_old_bg (tab); -} - -static void -e_mail_tab_style_changed_cb (MxWidget *widget) -{ - EMailTabPrivate *priv; - - priv = E_MAIL_TAB_GET_PRIVATE (widget); - - /* Don't transition on hover */ - if (g_strcmp0 (mx_stylable_get_style_pseudo_class ( - MX_STYLABLE (widget)), "hover") == 0) - return; - - if (priv->old_bg) { - if (!clutter_actor_get_parent (priv->old_bg)) { - ClutterActorBox box; - ClutterActor *background; - ClutterActor *actor = CLUTTER_ACTOR (widget); - - clutter_actor_set_parent (priv->old_bg, actor); - - /* Try to allocate the same size as the background - * widget, otherwise allocate the same size as the - * widget itself. */ - background = mx_widget_get_border_image (widget); - if (!background) - background = mx_widget_get_background_image (widget); - - if (background) - clutter_actor_get_allocation_box (background, &box); - else { - clutter_actor_get_allocation_box (actor, &box); - box.x2 -= box.x1; - box.y2 -= box.y1; - box.x1 = 0; - box.y1 = 0; - } - - clutter_actor_allocate (priv->old_bg, &box, 0); - } - - clutter_actor_animate ( - priv->old_bg, CLUTTER_LINEAR, 150, - "opacity", 0, "signal::completed", - G_CALLBACK (e_mail_tab_anim_completed_cb), - widget, NULL); - } -} - -static void -e_mail_tab_stylable_changed_cb (MxStylable *stylable) -{ - EMailTab *tab = E_MAIL_TAB (stylable); - EMailTabPrivate *priv = tab->priv; - - e_mail_tab_dispose_old_bg (tab); - - priv->old_bg = mx_widget_get_border_image (MX_WIDGET (tab)); - if (priv->old_bg) - g_object_ref (priv->old_bg); -} - -static void -e_mail_tab_dnd_notify_cb (GObject *settings, - GParamSpec *pspec, - EMailTab *tab) -{ - g_object_get ( - settings, - "gtk-dnd-drag-threshold", &tab->priv->drag_threshold, - NULL); -} - -static void -e_mail_tab_init (EMailTab *tab) -{ - ClutterActor *text; - GtkSettings *settings; - - tab->priv = E_MAIL_TAB_GET_PRIVATE (tab); - - tab->priv->width = -1; - tab->priv->anim_length = 200; - tab->priv->spacing = 6.0; - tab->priv->can_close = TRUE; - - tab->priv->label = mx_label_new (); - g_object_set (tab->priv->label, "clip-to-allocation", TRUE, NULL); - text = mx_label_get_clutter_text (MX_LABEL (tab->priv->label)); - clutter_text_set_ellipsize (CLUTTER_TEXT (text), PANGO_ELLIPSIZE_END); - clutter_actor_set_parent ( - CLUTTER_ACTOR (tab->priv->label), CLUTTER_ACTOR (tab)); - - tab->priv->close_button = mx_button_new (); - clutter_actor_set_name ( - CLUTTER_ACTOR (tab->priv->close_button), "tab-close-button"); - clutter_actor_set_parent ( - CLUTTER_ACTOR (tab->priv->close_button), CLUTTER_ACTOR (tab)); - - g_signal_connect ( - tab->priv->close_button, "clicked", - G_CALLBACK (e_mail_tab_close_clicked_cb), tab); - - /* Connect up styling signals */ - g_signal_connect ( - tab, "style-changed", - G_CALLBACK (e_mail_tab_style_changed_cb), NULL); - g_signal_connect ( - tab, "stylable-changed", - G_CALLBACK (e_mail_tab_stylable_changed_cb), NULL); - - clutter_actor_set_reactive (CLUTTER_ACTOR (tab), TRUE); - - settings = gtk_settings_get_default (); - tab->priv->drag_threshold_handler = g_signal_connect ( - settings, "notify::gtk-dnd-drag-threshold", - G_CALLBACK (e_mail_tab_dnd_notify_cb), tab); - g_object_get ( - G_OBJECT (settings), - "gtk-dnd-drag-threshold", &tab->priv->drag_threshold, - NULL); -} - -ClutterActor * -e_mail_tab_new (void) -{ - return g_object_new (E_TYPE_MAIL_TAB, NULL); -} - -ClutterActor * -e_mail_tab_new_full (const gchar *text, - ClutterActor *icon, - gint width) -{ - return g_object_new ( - E_TYPE_MAIL_TAB, - "text", text, - "icon", icon, - "tab-width", width, - NULL); -} - -void -e_mail_tab_set_text (EMailTab *tab, - const gchar *text) -{ - EMailTabPrivate *priv = tab->priv; - - if (!text) - text = ""; - - priv->has_text = (text[0] != '\0'); - - if (priv->label) - mx_label_set_text (MX_LABEL (priv->label), text); - - g_object_notify (G_OBJECT (tab), "text"); -} - -void -e_mail_tab_set_default_icon (EMailTab *tab, - ClutterActor *icon) -{ - EMailTabPrivate *priv = tab->priv; - gboolean changed = !priv->icon || (priv->icon == priv->default_icon); - - if (icon) - g_object_ref_sink (icon); - - if (priv->default_icon) - g_object_unref (priv->default_icon); - - priv->default_icon = icon; - - if (changed) - e_mail_tab_set_icon (tab, NULL); -} - -void -e_mail_tab_set_icon (EMailTab *tab, - ClutterActor *icon) -{ - EMailTabPrivate *priv = tab->priv; - - /* passing NULL for icon will use default icon if available */ - - if (priv->icon) - clutter_actor_unparent (priv->icon); - - if (icon) - priv->icon = icon; - else - priv->icon = priv->default_icon; - - if (priv->icon) - clutter_actor_set_parent (priv->icon, CLUTTER_ACTOR (tab)); - - clutter_actor_queue_relayout (CLUTTER_ACTOR (tab)); - - g_object_notify (G_OBJECT (tab), "icon"); -} - -const gchar * -e_mail_tab_get_text (EMailTab *tab) -{ - EMailTabPrivate *priv = tab->priv; - - if (priv->label) - return mx_label_get_text (MX_LABEL (priv->label)); - else - return NULL; -} - -ClutterActor * -e_mail_tab_get_icon (EMailTab *tab) -{ - EMailTabPrivate *priv = tab->priv; - return priv->icon == priv->default_icon ? NULL : priv->icon; -} - -void -e_mail_tab_set_can_close (EMailTab *tab, - gboolean can_close) -{ - EMailTabPrivate *priv = tab->priv; - - if ((priv->can_close ? 1 : 0) == (can_close ? 1 : 0)) - return; - - priv->can_close = can_close; - - clutter_actor_queue_relayout (CLUTTER_ACTOR (tab)); - - g_object_notify (G_OBJECT (tab), "can-close"); -} - -gboolean -e_mail_tab_get_can_close (EMailTab *tab) -{ - return tab->priv->can_close; -} - -void -e_mail_tab_set_width (EMailTab *tab, - gint width) -{ - EMailTabPrivate *priv = tab->priv; - - if (priv->width == width) - return; - - priv->width = width; - - clutter_actor_queue_relayout (CLUTTER_ACTOR (tab)); - - g_object_notify (G_OBJECT (tab), "tab-width"); -} - -gint -e_mail_tab_get_width (EMailTab *tab) -{ - EMailTabPrivate *priv = tab->priv; - return priv->width; -} - -void -e_mail_tab_set_docking (EMailTab *tab, - gboolean docking) -{ - EMailTabPrivate *priv = tab->priv; - - if ((priv->docking ? 1 : 0) == (docking ? 1 : 0)) - return; - - priv->docking = docking; - - clutter_actor_queue_relayout (CLUTTER_ACTOR (tab)); - - g_object_notify (G_OBJECT (tab), "docking"); -} - -gboolean -e_mail_tab_get_docking (EMailTab *tab) -{ - EMailTabPrivate *priv = tab->priv; - return priv->docking; -} - -void -e_mail_tab_set_preview_actor (EMailTab *tab, - ClutterActor *actor) -{ - EMailTabPrivate *priv = tab->priv; - - if (priv->preview) - clutter_actor_unparent (priv->preview); - - priv->preview = actor; - - if (actor) { - clutter_actor_set_parent (actor, CLUTTER_ACTOR (tab)); - - clutter_actor_set_opacity ( - actor, priv->preview_mode ? 0xff : 0x00); - if (!priv->preview_mode) - clutter_actor_hide (actor); - } - - clutter_actor_queue_relayout (CLUTTER_ACTOR (tab)); - - g_object_notify (G_OBJECT (tab), "preview"); -} - -ClutterActor * -e_mail_tab_get_preview_actor (EMailTab *tab) -{ - EMailTabPrivate *priv = tab->priv; - return priv->preview; -} - -static void -preview_new_frame_cb (ClutterTimeline *timeline, - guint msecs, - EMailTab *tab) -{ - gboolean forwards; - EMailTabPrivate *priv = tab->priv; - - forwards = - (clutter_timeline_get_direction (timeline) == - CLUTTER_TIMELINE_FORWARD); - if (priv->preview_mode) - forwards = !forwards; - - priv->preview_height_progress = - clutter_timeline_get_progress (timeline); - if (forwards) - priv->preview_height_progress = - 1.0 - priv->preview_height_progress; - - if (priv->preview) - clutter_actor_queue_relayout (CLUTTER_ACTOR (tab)); -} - -static void -preview_completed_cb (ClutterTimeline *timeline, - EMailTab *tab) -{ - EMailTabPrivate *priv = tab->priv; - - if (priv->preview_timeline) { - clutter_timeline_stop (priv->preview_timeline); - g_object_unref (priv->preview_timeline); - priv->preview_timeline = NULL; - - if (priv->preview_mode) - priv->preview_height_progress = 1.0; - else { - priv->preview_height_progress = 0.0; - if (priv->preview) - clutter_actor_hide (priv->preview); - if (priv->can_close) - clutter_actor_set_reactive ( - CLUTTER_ACTOR (priv->close_button), - TRUE); - } - - /* Remove style hint if we're not in preview mode */ - if (priv->preview) { - if (!priv->preview_mode) - clutter_actor_set_name ( - CLUTTER_ACTOR (tab), - priv->private ? "private-tab" : NULL); - } else { - /* If there's no preview actor, disable the tab */ - clutter_actor_set_reactive ( - CLUTTER_ACTOR (tab), !priv->preview_mode); - } - - if (priv->preview) - clutter_actor_queue_relayout (CLUTTER_ACTOR (tab)); - - g_signal_emit (tab, signals[TRANSITION_COMPLETE], 0); - } -} - -static void -preview_s1_started_cb (ClutterTimeline *timeline, - EMailTab *tab) -{ - EMailTabPrivate *priv = tab->priv; - - if (!priv->preview) - clutter_actor_animate_with_timeline ( - CLUTTER_ACTOR (priv->label), - CLUTTER_EASE_IN_OUT_QUAD, - timeline, - "opacity", 0xff, - NULL); -} - -static void -preview_s2_started_cb (ClutterTimeline *timeline, - EMailTab *tab) -{ - EMailTabPrivate *priv = tab->priv; - - if (priv->preview) - clutter_actor_animate_with_timeline ( - CLUTTER_ACTOR (priv->label), - CLUTTER_EASE_IN_OUT_QUAD, - timeline, - "opacity", 0xff, - NULL); -} - -void -e_mail_tab_set_preview_mode (EMailTab *tab, - gboolean preview) -{ - EMailTabPrivate *priv = tab->priv; - - if (priv->preview_mode != preview) { - ClutterTimeline *timeline, *timeline2; - gdouble progress, total_duration, duration1, duration2; - - priv->preview_mode = preview; - - /* Disable the close button in preview mode */ - if (preview && priv->can_close) - clutter_actor_set_reactive (CLUTTER_ACTOR (priv->close_button), FALSE); - -#define DEBUG_MULT 1 - if (priv->preview_timeline) { - progress = 1.0 - clutter_timeline_get_progress ( - priv->preview_timeline); - clutter_timeline_stop (priv->preview_timeline); - g_object_unref (priv->preview_timeline); - } else - progress = 0.0; - - total_duration = priv->anim_length * (1.0 - progress) * DEBUG_MULT; - duration1 = total_duration * TAB_S1_ANIM; - duration2 = total_duration * TAB_S2_ANIM; - - priv->preview_timeline = - clutter_timeline_new (priv->anim_length * DEBUG_MULT); - clutter_timeline_skip ( - priv->preview_timeline, clutter_timeline_get_duration ( - priv->preview_timeline) * progress); - - g_signal_connect ( - priv->preview_timeline, "completed", - G_CALLBACK (preview_completed_cb), tab); - - clutter_timeline_start (priv->preview_timeline); - - if (!priv->preview) { - clutter_actor_animate_with_timeline ( - CLUTTER_ACTOR (tab), - CLUTTER_EASE_IN_OUT_QUAD, - priv->preview_timeline, - "opacity", preview ? 0x00 : 0xff, - NULL); - return; - } - - g_signal_connect ( - priv->preview_timeline, "new-frame", - G_CALLBACK (preview_new_frame_cb), tab); - - timeline = clutter_timeline_new ((guint) duration1); - timeline2 = clutter_timeline_new ((guint) duration2); - - g_signal_connect ( - timeline, "started", - G_CALLBACK (preview_s1_started_cb), tab); - g_signal_connect ( - timeline2, "started", - G_CALLBACK (preview_s2_started_cb), tab); - - if (preview) - clutter_timeline_set_delay (timeline2, duration1); - else - clutter_timeline_set_delay (timeline, duration2); - - /* clutter_actor_animate_with_timeline will start the timelines */ - clutter_actor_animate_with_timeline ( - CLUTTER_ACTOR (priv->label), - CLUTTER_EASE_IN_OUT_QUAD, - preview ? timeline : timeline2, - "opacity", 0x00, NULL); - - if (priv->icon) - clutter_actor_animate_with_timeline ( - priv->icon, - CLUTTER_EASE_IN_OUT_QUAD, - timeline, - "opacity", preview ? 0x00 : 0xff, - NULL); - - if (priv->can_close) - clutter_actor_animate_with_timeline ( - CLUTTER_ACTOR (priv->close_button), - CLUTTER_EASE_IN_OUT_QUAD, - timeline, - "opacity", preview ? 0x00 : 0xff, - NULL); - - if (priv->preview) - clutter_actor_show (priv->preview); - clutter_actor_animate_with_timeline ( - priv->preview, - CLUTTER_EASE_IN_OUT_QUAD, - timeline2, - "opacity", preview ? 0xff : 0x00, - NULL); - - /* The animations have references on these, drop ours */ - g_object_unref (timeline); - g_object_unref (timeline2); - - /* Add an actor name, for style */ - clutter_actor_set_name ( - CLUTTER_ACTOR (tab), - priv->private ? "private-preview-tab" : - "preview-tab"); - } -} - -gboolean -e_mail_tab_get_preview_mode (EMailTab *tab) -{ - EMailTabPrivate *priv = tab->priv; - return priv->preview_mode; -} - -void -e_mail_tab_set_preview_duration (EMailTab *tab, - guint duration) -{ - EMailTabPrivate *priv = tab->priv; - - if (priv->anim_length != duration) { - priv->anim_length = duration; - g_object_notify (G_OBJECT (tab), "preview-duration"); - } -} - -guint -e_mail_tab_get_preview_duration (EMailTab *tab) -{ - EMailTabPrivate *priv = tab->priv; - return priv->anim_length; -} - -void -e_mail_tab_set_spacing (EMailTab *tab, - gfloat spacing) -{ - EMailTabPrivate *priv = tab->priv; - - if (priv->spacing != spacing) { - priv->spacing = spacing; - g_object_notify (G_OBJECT (tab), "spacing"); - clutter_actor_queue_relayout (CLUTTER_ACTOR (tab)); - } -} - -gfloat -e_mail_tab_get_spacing (EMailTab *tab) -{ - EMailTabPrivate *priv = tab->priv; - return priv->spacing; -} - -void -e_mail_tab_set_private (EMailTab *tab, - gboolean private) -{ - EMailTabPrivate *priv = tab->priv; - - if ((priv->private ? 1 : 0) == (private ? 1 : 0)) - return; - - priv->private = private; - - if (!priv->preview_mode) - clutter_actor_set_name ( - CLUTTER_ACTOR (tab), private ? "private-tab" : NULL); - - g_object_notify (G_OBJECT (tab), "private"); -} - -gboolean -e_mail_tab_get_private (EMailTab *tab) -{ - EMailTabPrivate *priv = tab->priv; - return priv->private; -} - -void -e_mail_tab_set_active (EMailTab *tab, - gboolean active) -{ - EMailTabPrivate *priv = tab->priv; - - if ((priv->active ? 1 : 0) == (active ? 1 : 0)) - return; - - priv->active = active; - - g_object_notify (G_OBJECT (tab), "active"); - - if (active) - mx_stylable_set_style_pseudo_class (MX_STYLABLE (tab), "active"); - else if (!priv->pressed) { - if (priv->hover) - mx_stylable_set_style_pseudo_class (MX_STYLABLE (tab), "hover"); - else - mx_stylable_set_style_pseudo_class (MX_STYLABLE (tab), NULL); - } -} - -gboolean -e_mail_tab_get_active (EMailTab *tab) -{ - EMailTabPrivate *priv = tab->priv; - return priv->active; -} - -static gboolean -e_mail_tab_alert_cb (EMailTab *tab) -{ - const gchar *name; - EMailTabPrivate *priv = tab->priv; - - /* FIXME: Work in preview mode */ - - /* Alternate between private mode and non-private to alert */ - name = (priv->private ^ (priv->alert_count % 2)) ? NULL : "private-tab"; - if (!priv->preview_mode) - clutter_actor_set_name (CLUTTER_ACTOR (tab), name); - priv->alert_count++; - - if (priv->alert_count < 4) - return TRUE; - - priv->alert_source = 0; - - return FALSE; -} - -void -e_mail_tab_alert (EMailTab *tab) -{ - EMailTabPrivate *priv = tab->priv; - - priv->alert_count = 0; - if (!priv->alert_source) - priv->alert_source = - g_timeout_add_full (G_PRIORITY_HIGH, - 500, - (GSourceFunc) e_mail_tab_alert_cb, - tab, - NULL); -} - -void -e_mail_tab_enable_drag (EMailTab *tab, - gboolean enable) -{ - EMailTabPrivate *priv = tab->priv; - - if (priv->drag_enabled == enable) - return; - - priv->drag_enabled = enable; - if (enable) - mx_draggable_enable (MX_DRAGGABLE (tab)); - else - mx_draggable_disable (MX_DRAGGABLE (tab)); -} - diff --git a/mail/e-mail-tab.h b/mail/e-mail-tab.h deleted file mode 100644 index 5f3f8666b8..0000000000 --- a/mail/e-mail-tab.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Borrowed from Moblin-Web-Browser: The web browser for Moblin - * Copyright (c) 2009, Intel Corporation. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU Lesser General Public License, - * version 2.1, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public - * License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#ifndef E_MAIL_TAB_H -#define E_MAIL_TAB_H - -#include <clutter/clutter.h> -#include <mx/mx.h> - -/* Standard GObject macros */ -#define E_TYPE_MAIL_TAB \ - (e_mail_tab_get_type ()) -#define E_MAIL_TAB(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST \ - ((obj), E_TYPE_MAIL_TAB, EMailTab)) -#define E_MAIL_TAB_CLASS(cls) \ - (G_TYPE_CHECK_CLASS_CAST \ - ((cls), E_TYPE_MAIL_TAB, EMailTabClass)) -#define E_MAIL_IS_TAB(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE \ - ((obj), E_TYPE_MAIL_TAB)) -#define E_MAIL_IS_TAB_CLASS(cls) \ - (G_TYPE_CHECK_CLASS_TYPE \ - ((cls), E_TYPE_MAIL_TAB)) -#define E_MAIL_TAB_GET_CLASS(obj) \ - (G_TYPE_INSTANCE_GET_CLASS ( \ - (obj), E_TYPE_MAIL_TAB, EMailTabClass)) - -G_BEGIN_DECLS - -typedef struct _EMailTab EMailTab; -typedef struct _EMailTabClass EMailTabClass; -typedef struct _EMailTabPrivate EMailTabPrivate; - -struct _EMailTab { - MxWidget parent; - EMailTabPrivate *priv; -}; - -struct _EMailTabClass { - MxWidgetClass parent_class; - - void (*clicked) (EMailTab *tab); - void (*closed) (EMailTab *tab); - void (*transition_complete) (EMailTab *tab); -}; - -GType e_mail_tab_get_type (void) G_GNUC_CONST; -ClutterActor * e_mail_tab_new (void); -ClutterActor * e_mail_tab_new_full (const gchar *text, - ClutterActor *icon, - gint width); -void e_mail_tab_set_text (EMailTab *tab, - const gchar *text); -void e_mail_tab_set_default_icon (EMailTab *tab, - ClutterActor *icon); -void e_mail_tab_set_icon (EMailTab *tab, - ClutterActor *icon); -void e_mail_tab_set_can_close (EMailTab *tab, - gboolean can_close); -void e_mail_tab_set_width (EMailTab *tab, - gint width); -void e_mail_tab_set_docking (EMailTab *tab, - gboolean docking); -void e_mail_tab_set_preview_actor (EMailTab *tab, - ClutterActor *actor); -void e_mail_tab_set_preview_mode (EMailTab *tab, - gboolean preview); -void e_mail_tab_set_preview_duration (EMailTab *tab, - guint duration); -void e_mail_tab_set_spacing (EMailTab *tab, - gfloat spacing); -void e_mail_tab_set_private (EMailTab *tab, - gboolean private_); -void e_mail_tab_set_active (EMailTab *tab, - gboolean active); -const gchar * e_mail_tab_get_text (EMailTab *tab); -ClutterActor * e_mail_tab_get_icon (EMailTab *tab); -gboolean e_mail_tab_get_can_close (EMailTab *tab); -gint e_mail_tab_get_width (EMailTab *tab); -gboolean e_mail_tab_get_docking (EMailTab *tab); -ClutterActor * e_mail_tab_get_preview_actor (EMailTab *tab); -gboolean e_mail_tab_get_preview_mode (EMailTab *tab); -void e_mail_tab_get_height_no_preview - (EMailTab *tab, - gfloat for_width, - gfloat *min_height_p, - gfloat *natural_height_p); -guint e_mail_tab_get_preview_duration (EMailTab *tab); -gfloat e_mail_tab_get_spacing (EMailTab *tab); -gboolean e_mail_tab_get_private (EMailTab *tab); -gboolean e_mail_tab_get_active (EMailTab *tab); -void e_mail_tab_alert (EMailTab *tab); -void e_mail_tab_enable_drag (EMailTab *tab, - gboolean enable); - -G_END_DECLS - -#endif /* E_MAIL_TAB_H */ - diff --git a/mail/message-list.c b/mail/message-list.c index 9e2a31acc8..3a6f6efee5 100644 --- a/mail/message-list.c +++ b/mail/message-list.c @@ -69,12 +69,6 @@ #include "mail/em-utils.h" #include "mail/message-list.h" -#if HAVE_CLUTTER -#include <clutter/clutter.h> -#include <mx/mx.h> -#include <clutter-gtk/clutter-gtk.h> -#endif - /*#define TIMEIT */ #ifdef TIMEIT @@ -126,11 +120,6 @@ struct _MessageListPrivate { const gchar *newest_read_uid; time_t oldest_unread_date; const gchar *oldest_unread_uid; - -#if HAVE_CLUTTER - ClutterActor *search_texture; - ClutterTimeline *timeline; -#endif }; enum { @@ -2568,11 +2557,6 @@ message_list_init (MessageList *message_list) message_list->priv = MESSAGE_LIST_GET_PRIVATE (message_list); -#if HAVE_CLUTTER - message_list->priv->timeline = NULL; - message_list->priv->search_texture = NULL; -#endif - message_list->normalised_hash = g_hash_table_new_full ( g_str_hash, g_str_equal, (GDestroyNotify) NULL, @@ -4376,58 +4360,6 @@ void message_list_set_search (MessageList *ml, const gchar *search) { -#if HAVE_CLUTTER - if (ml->priv->timeline == NULL) { - ClutterActor *stage = g_object_get_data ((GObject *)ml, "stage"); - - if (stage) { - ClutterActor *texture = NULL; - ClutterPath *path; - ClutterBehaviour *behaviour; - ClutterAlpha *alpha; - GtkIconInfo *info; - - info = gtk_icon_theme_lookup_icon (gtk_icon_theme_get_default (), - "system-search", - 72, - GTK_ICON_LOOKUP_NO_SVG); - - if (info) { - texture = clutter_texture_new_from_file (gtk_icon_info_get_filename (info), NULL); - gtk_icon_info_free (info); - } - clutter_container_add_actor ((ClutterContainer *) stage, texture); - ml->priv->search_texture = texture; - - ml->priv->timeline = clutter_timeline_new (2 * 1000); - alpha = clutter_alpha_new_full (ml->priv->timeline, CLUTTER_LINEAR); - path = clutter_path_new (); - behaviour = clutter_behaviour_path_new (alpha, path); - clutter_actor_hide (texture); - clutter_path_clear (path); - clutter_path_add_move_to (path, 100, 50); - clutter_path_add_line_to (path, 200, 50); - clutter_path_add_line_to (path, 200, 100); - clutter_path_add_line_to (path, 100, 100); - clutter_path_add_line_to (path, 100, 50); - - clutter_behaviour_apply (behaviour, texture); - clutter_timeline_set_loop (ml->priv->timeline, TRUE); - - g_signal_connect_swapped ( - ml->priv->timeline, "started", - G_CALLBACK (clutter_actor_show), texture); - g_signal_connect ( - ml->priv->timeline, "paused", - G_CALLBACK (clutter_actor_hide), texture); - - clutter_timeline_pause (ml->priv->timeline); - clutter_timeline_stop (ml->priv->timeline); - - } - } -#endif - if (search == NULL || search[0] == '\0') if (ml->search == NULL || ml->search[0] == '\0') return; @@ -4440,11 +4372,6 @@ message_list_set_search (MessageList *ml, ml->thread_tree = NULL; } -#if HAVE_CLUTTER - if (ml->priv->timeline) - clutter_timeline_start (ml->priv->timeline); -#endif - if (ml->frozen == 0) mail_regen_list (ml, search, NULL, NULL, TRUE); else { @@ -4944,22 +4871,6 @@ regen_list_done (struct _regen_list_msg *m) g_signal_emit (m->ml, message_list_signals[MESSAGE_LIST_BUILT], 0); m->ml->priv->any_row_changed = FALSE; - -#if HAVE_CLUTTER - if (m->ml->priv->timeline && clutter_timeline_is_playing (m->ml->priv->timeline)) { - clutter_timeline_pause (m->ml->priv->timeline); - clutter_actor_hide (m->ml->priv->search_texture); - } else { - ClutterActor *pane = g_object_get_data ((GObject *)m->ml, "actor"); - - if (pane) { - clutter_actor_set_opacity (pane, 0); - clutter_actor_animate ( - pane, CLUTTER_EASE_OUT_SINE, - 150, "opacity", 255, NULL); - } - } -#endif } static void |