[anjal] Smarter tabs for anjal. Also fixes GNOME bugzilla enhancements #595802 and #595799



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]