[anjal] Smarter tabs for anjal. Also fixes GNOME bugzilla enhancements #595802 and #595799
- From: Srinivasa Ragavan <sragavan src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [anjal] Smarter tabs for anjal. Also fixes GNOME bugzilla enhancements #595802 and #595799
- Date: Wed, 20 Jan 2010 10:39:33 +0000 (UTC)
commit b7be2e9ab11926382033d2ea0d870f137fa0a9b9
Author: Srinivasa Ragavan <sragavan gnome org>
Date: Wed Jan 20 15:59:38 2010 +0530
Smarter tabs for anjal. Also fixes GNOME bugzilla enhancements #595802 and #595799
src/mail-shell.c | 3 +-
src/mail-view.c | 129 +++++++++++++++++++++++++++++++++++++----------------
2 files changed, 92 insertions(+), 40 deletions(-)
---
diff --git a/src/mail-shell.c b/src/mail-shell.c
index 02adf8a..7f60bc8 100644
--- a/src/mail-shell.c
+++ b/src/mail-shell.c
@@ -596,7 +596,8 @@ mail_shell_create_composer (void)
{
MailView *view = (MailView *)default_shell->priv->view;
- return mail_view_add_page ((MailView *)view, MAIL_VIEW_COMPOSER, NULL);
+ /* HACK: We need to distinguis this way of creating composer :/ */
+ return mail_view_add_page ((MailView *)view, MAIL_VIEW_COMPOSER, (gpointer)-1);
}
MailViewChild *
diff --git a/src/mail-view.c b/src/mail-view.c
index ab74671..8dacad7 100644
--- a/src/mail-view.c
+++ b/src/mail-view.c
@@ -69,6 +69,11 @@ G_DEFINE_TYPE (MailView, mail_view, ANJAL_MAIL_VIEW_TYPE)
static MailConvView * mv_switch_message_view (MailView *mv, const char *uri);
#endif
+#define REALIGN_NODES(list,pdata) if (list->data != pdata) { \
+ list = g_list_remove (list, pdata); \
+ list = g_list_prepend (list, pdata); \
+ }
+
void anjal_shell_view_restore_state (EShellView *view, const char *uri);
static void
@@ -162,14 +167,14 @@ mv_switch (GtkNotebook *notebook,GtkNotebookPage *page, guint page_num, gpoi
gtk_notebook_set_current_page (shell, g_list_length (shell->priv->children)-1);
} else {
#endif
- MailViewChild *child;
- GList *node = g_list_nth (priv->children, page_num);
-
- if (!node)
- priv->current_view = priv->children->data;
- else
- priv->current_view = node->data;
- child = (MailViewChild *)priv->current_view;
+ MailViewChild *child;
+ int current_child = gtk_notebook_get_current_page (notebook);
+
+ child = (MailViewChild *)gtk_notebook_get_nth_page (notebook, current_child);
+
+ priv->current_view = child;
+ REALIGN_NODES(shell->priv->children,child);
+
#ifndef ANJAL_SETTINGS
if (child->type == MAIL_VIEW_COMPOSER)
mail_composer_view_activate ((MailComposerView *)child, shell->folder_tree, shell->check_mail, shell->sort_by, TRUE);
@@ -297,12 +302,27 @@ list_data_pos (GList *list, gpointer data)
return i;
}
+static int
+mv_get_page_number (GtkNotebook *note, GtkWidget *widget)
+{
+ int i, total;
+
+ total = gtk_notebook_get_n_pages (note);
+ for (i=0; i<total; i++) {
+ if (gtk_notebook_get_nth_page(note, i) == widget)
+ return i;
+ }
+
+ return total-1;
+}
+
static void
mv_close_mcv (MailViewChild *mfv, MailView *mv)
{
- int n = list_data_pos (mv->priv->children, mfv);
+ int n = mv_get_page_number ((GtkNotebook *)mv, mfv);
int pos = gtk_notebook_get_current_page ((GtkNotebook *)mv);
MailViewChild *child;
+ gboolean removing_viewed = FALSE;
if (g_list_length(mv->priv->children) == 1)
return;
@@ -330,15 +350,23 @@ mv_close_mcv (MailViewChild *mfv, MailView *mv)
return;
}
#endif
+
g_signal_handlers_block_by_func(mv, mv_switch, mv);
gtk_notebook_remove_page ((GtkNotebook *)mv, n);
g_signal_handlers_unblock_by_func(mv, mv_switch, mv);
- if (pos == g_list_length(mv->priv->children) -1)
- gtk_notebook_set_current_page ((GtkNotebook *)mv, pos -1);
+
+ if (mfv == mv->priv->children->data)
+ removing_viewed = TRUE;
mv->priv->children = g_list_remove (mv->priv->children, mfv);
- pos = gtk_notebook_get_current_page ((GtkNotebook *)mv);
- child = g_list_nth_data(mv->priv->children, pos);
+
+ if (!removing_viewed)
+ return;
+
+ child = (MailViewChild *)mv->priv->children->data;
mv->priv->current_view = child;
+ pos = mv_get_page_number ((GtkNotebook *)mv, (GtkWidget *)child);
+ gtk_notebook_set_current_page ((GtkNotebook *)mv, pos);
+
#ifndef ANJAL_SETTINGS
if (child->type == MAIL_VIEW_COMPOSER)
mail_composer_view_activate ((MailComposerView *)child, mv->folder_tree, mv->check_mail, mv->sort_by, TRUE);
@@ -399,10 +427,11 @@ mail_view_add_folder (MailView *mv, gpointer data, gboolean block)
MailFolderView *mfv = mail_folder_view_new ();
gint position = 0;
mail_folder_view_set_folder_pane (mfv, mv->folder_tree);
- mv->priv->current_view = (MailViewChild *)mfv;
- mv->priv->children = g_list_append (mv->priv->children, mfv);
+ if(!block)
+ mv->priv->current_view = (MailViewChild *)mfv;
+ mv->priv->children = block ? g_list_append(mv->priv->children, mfv) : g_list_prepend (mv->priv->children, mfv);
position = gtk_notebook_append_page ((GtkNotebook *)mv, (GtkWidget *)mfv, mfv->tab_label);
- gtk_notebook_set_tab_reorderable (GTK_NOTEBOOK (mv), (GtkWidget *)mfv, FALSE);
+ gtk_notebook_set_tab_reorderable (GTK_NOTEBOOK (mv), (GtkWidget *)mfv, TRUE);
gtk_notebook_set_tab_detachable (GTK_NOTEBOOK (mv), (GtkWidget *)mfv, FALSE);
g_signal_connect (mfv, "view-close", G_CALLBACK(mv_close_mcv), mv);
@@ -424,17 +453,27 @@ mail_view_add_composer (MailView *mv, gpointer data, gboolean block)
{
MailComposerView *mcv;
gint position = 0;
+ gboolean special = FALSE;
if (!data)
mcv = mail_composer_view_new ();
- else
+ else if (data == (gpointer)-1) {
+ special = TRUE;
+ data = NULL;
+ } else
mcv = mail_composer_view_new_with_composer ((GtkWidget *)data);
-
- mv->priv->current_view = (MailViewChild *)mcv;
- mv->priv->children = g_list_append (mv->priv->children, mcv);
+ if (!block)
+ mv->priv->current_view = (MailViewChild *)mcv;
+ mv->priv->children = block ? g_list_append(mv->priv->children, mcv) : g_list_prepend (mv->priv->children, mcv);
- position = gtk_notebook_append_page ((GtkNotebook *)mv, (GtkWidget *)mcv, mcv->tab_label);
- gtk_notebook_set_tab_reorderable (GTK_NOTEBOOK (mv), (GtkWidget *)mcv, FALSE);
+ if (!special)
+ position = gtk_notebook_append_page ((GtkNotebook *)mv, (GtkWidget *)mcv, mcv->tab_label);
+ else {
+ int position = gtk_notebook_get_current_page ((GtkNotebook *)mv);
+ gtk_notebook_insert_page ((GtkNotebook *)mv, (GtkWidget *)mcv, mcv->tab_label, position+1);
+ }
+
+ gtk_notebook_set_tab_reorderable (GTK_NOTEBOOK (mv), (GtkWidget *)mcv, TRUE);
gtk_notebook_set_tab_detachable (GTK_NOTEBOOK (mv), (GtkWidget *)mcv, FALSE);
if (!block)
gtk_notebook_set_current_page ((GtkNotebook *)mv, position);
@@ -457,14 +496,16 @@ mail_view_add_message (MailView *mv, gpointer data, gboolean block)
gtk_widget_show ((GtkWidget *)mcv);
mcv->type = MAIL_VIEW_MESSAGE;
- mv->priv->current_view = (MailViewChild *)mcv;
- mv->priv->children = g_list_append (mv->priv->children, mcv);
+ if(!block)
+ mv->priv->current_view = (MailViewChild *)mcv;
+ mv->priv->children = block ? g_list_append(mv->priv->children, mcv) : g_list_prepend (mv->priv->children, mcv);
- position = gtk_notebook_append_page ((GtkNotebook *)mv, (GtkWidget *)mcv, mail_conv_view_get_tab_widget(mcv));
- gtk_notebook_set_tab_reorderable (GTK_NOTEBOOK (mv), (GtkWidget *)mcv, FALSE);
+ position = gtk_notebook_get_current_page ((GtkNotebook *)mv);
+ gtk_notebook_insert_page ((GtkNotebook *)mv, (GtkWidget *)mcv, mail_conv_view_get_tab_widget(mcv), position+1);
+ gtk_notebook_set_tab_reorderable (GTK_NOTEBOOK (mv), (GtkWidget *)mcv, TRUE);
gtk_notebook_set_tab_detachable (GTK_NOTEBOOK (mv), (GtkWidget *)mcv, FALSE);
if (!block)
- gtk_notebook_set_current_page ((GtkNotebook *)mv, position);
+ gtk_notebook_set_current_page ((GtkNotebook *)mv, position+1);
gtk_notebook_set_tab_label_packing ((GtkNotebook *)mv, (GtkWidget *)mcv, FALSE, FALSE, 0);
if (!block)
mail_conv_view_activate (mcv, mv->tree, mv->folder_tree, mv->check_mail, mv->sort_by, FALSE);
@@ -490,12 +531,14 @@ mail_view_add_settings (MailView *mv, gpointer data, gboolean block)
gint position = 0;
gtk_widget_show ((GtkWidget *)msv);
- mv->priv->current_view = (MailViewChild *)msv;
- mv->priv->children = g_list_append (mv->priv->children, msv);
+ if(!block)
+ mv->priv->current_view = (MailViewChild *)msv;
+ mv->priv->children = block ? g_list_append(mv->priv->children, msv) : g_list_prepend (mv->priv->children, msv);
+
position = gtk_notebook_append_page ((GtkNotebook *)mv, (GtkWidget *)msv, mail_settings_view_get_tab_widget(msv));
g_signal_connect (msv, "view-close", G_CALLBACK(mv_close_mcv), mv);
g_signal_connect (msv, "show-account", G_CALLBACK(mv_show_acc_mcv), mv);
- gtk_notebook_set_tab_reorderable (GTK_NOTEBOOK (mv), (GtkWidget *)msv, FALSE);
+ gtk_notebook_set_tab_reorderable (GTK_NOTEBOOK (mv), (GtkWidget *)msv, TRUE);
gtk_notebook_set_tab_detachable (GTK_NOTEBOOK (mv), (GtkWidget *)msv, FALSE);
if (!block)
gtk_notebook_set_current_page ((GtkNotebook *)mv, position);
@@ -513,7 +556,8 @@ mail_view_switch_to_people (MailView* mv, MailViewChild *mpv)
GList *tmp = mv->priv->children;
int position = 0;
- position = g_list_index (tmp, mpv);
+ position = mv_get_page_number(mv, mpv);
+ REALIGN_NODES(mv->priv->children,mpv);
gtk_notebook_set_current_page ((GtkNotebook *)mv, position);
mail_people_view_activate ((MailPeopleView *)mpv, mv->tree, mv->folder_tree, mv->check_mail, mv->sort_by, mv->slider, FALSE);
}
@@ -525,7 +569,8 @@ mail_view_switch_to_settings (MailView* mv, MailViewChild *mpv)
GList *tmp = mv->priv->children;
int position = 0;
- position = g_list_index (tmp, mpv);
+ position = mv_get_page_number((GtkNotebook *)mv, (GtkWidget *)mpv);
+ REALIGN_NODES(mv->priv->children,mpv);
gtk_notebook_set_current_page ((GtkNotebook *)mv, position);
mail_settings_view_activate ((MailSettingsView *)mpv, mv->tree, mv->folder_tree, mv->check_mail, mv->sort_by, mv->slider, FALSE);
}
@@ -538,11 +583,12 @@ mail_view_add_people (MailView *mv, gpointer data, gboolean block)
gint position = 0;
gtk_widget_show ((GtkWidget *)msv);
- mv->priv->current_view = (MailViewChild *)msv;
- mv->priv->children = g_list_append (mv->priv->children, msv);
+ if (!block)
+ mv->priv->current_view = (MailViewChild *)msv;
+ mv->priv->children = block ? g_list_append(mv->priv->children, msv) : g_list_prepend (mv->priv->children, msv);
position = gtk_notebook_append_page ((GtkNotebook *)mv, (GtkWidget *)msv, mail_people_view_get_tab_widget(msv));
g_signal_connect (msv, "view-close", G_CALLBACK(mv_close_mcv), mv);
- gtk_notebook_set_tab_reorderable (GTK_NOTEBOOK (mv), (GtkWidget *)msv, FALSE);
+ gtk_notebook_set_tab_reorderable (GTK_NOTEBOOK (mv), (GtkWidget *)msv, TRUE);
gtk_notebook_set_tab_detachable (GTK_NOTEBOOK (mv), (GtkWidget *)msv, FALSE);
if (!block)
gtk_notebook_set_current_page ((GtkNotebook *)mv, position);
@@ -561,11 +607,12 @@ mail_view_add_account (MailView *mv, gpointer data, gboolean block)
gint position = 0;
gtk_widget_show ((GtkWidget *)msv);
- mv->priv->current_view = (MailViewChild *)msv;
- mv->priv->children = g_list_append (mv->priv->children, msv);
+ if (!block)
+ mv->priv->current_view = (MailViewChild *)msv;
+ mv->priv->children = block ? g_list_append(mv->priv->children, msv) : g_list_prepend (mv->priv->children, msv);
position = gtk_notebook_append_page ((GtkNotebook *)mv, (GtkWidget *)msv, mail_account_view_get_tab_widget(msv));
g_signal_connect_after (msv, "view-close", G_CALLBACK(mv_close_mcv), mv);
- gtk_notebook_set_tab_reorderable (GTK_NOTEBOOK (mv), (GtkWidget *)msv, FALSE);
+ gtk_notebook_set_tab_reorderable (GTK_NOTEBOOK (mv), (GtkWidget *)msv, TRUE);
gtk_notebook_set_tab_detachable (GTK_NOTEBOOK (mv), (GtkWidget *)msv, FALSE);
if(!block)
gtk_notebook_set_current_page ((GtkNotebook *)mv, position);
@@ -634,7 +681,10 @@ mv_switch_folder_view (MailView *mv, const char *uri)
while (tmp) {
MailViewChild *child = tmp->data;
if (child->type == MAIL_VIEW_FOLDER && !strcmp (uri, child->uri)) {
- gtk_notebook_set_current_page ((GtkNotebook *)mv, i);
+ if(child != mv->priv->current_view) {
+ gtk_notebook_set_current_page ((GtkNotebook *)mv, i);
+ REALIGN_NODES(mv->priv->children, child);
+ }
return;
}
i++;
@@ -655,6 +705,7 @@ mv_switch_message_view (MailView *mv, const char *uri)
if (child->type == MAIL_VIEW_MESSAGE && !strcmp (uri, child->uri)) {
gtk_notebook_set_current_page ((GtkNotebook *)mv, i);
mail_conv_view_activate ((MailConvView *)child, mv->tree, mv->folder_tree, mv->check_mail, mv->sort_by, FALSE);
+ REALIGN_NODES(mv->priv->children,child);
return NULL;
}
i++;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]