[anjal] Redo message list unread marking.



commit 9e06d240d0dc9644cd5efef164618d9c105476a1
Author: Srinivasa Ragavan <sragavan novell com>
Date:   Mon Jul 27 17:06:12 2009 +0530

    Redo message list unread marking.

 src/custom-cell-renderer-toggle-pixbuf.c |    9 ++-
 src/mail-folder-view.c                   |   98 ++++++++++++++++++++++++++++--
 src/mail-folder-view.h                   |    3 +
 3 files changed, 101 insertions(+), 9 deletions(-)
---
diff --git a/src/custom-cell-renderer-toggle-pixbuf.c b/src/custom-cell-renderer-toggle-pixbuf.c
index 55c9cad..4480b62 100644
--- a/src/custom-cell-renderer-toggle-pixbuf.c
+++ b/src/custom-cell-renderer-toggle-pixbuf.c
@@ -283,9 +283,12 @@ custom_cell_renderer_toggle_pixbuf_render (GtkCellRenderer      *cell,
     return;
   
   gdk_cairo_set_source_pixbuf (cr, celltoggle->active ? priv->active : priv->inactive, cell_area->x+x_offset + cell->xpad, cell_area->y+y_offset-cell->ypad);
-  if (!sel_hlight)
-	   cairo_paint_with_alpha (cr, celltoggle->active ? 1.0 : 0.15);
-  else {
+  if (!sel_hlight) {
+	  if (flags & GTK_CELL_RENDERER_PRELIT)
+		cairo_paint_with_alpha (cr, 0.5);
+	  else
+	   	cairo_paint_with_alpha (cr, celltoggle->active ? 1.0 : 0.15);
+  } else {
 	   double alpha = (flags & GTK_CELL_RENDERER_SELECTED) ?    1.0 : 0.3;
 	   if (flags & GTK_CELL_RENDERER_SELECTED &&  0) {
 			gtk_paint_box (widget->style, window, GTK_STATE_NORMAL, GTK_SHADOW_ETCHED_OUT, NULL, NULL, "button", cell_area->x+x_offset-1, cell_area->y+y_offset-cell->ypad-2, 22, 22);
diff --git a/src/mail-folder-view.c b/src/mail-folder-view.c
index 86ac3c9..9f669da 100644
--- a/src/mail-folder-view.c
+++ b/src/mail-folder-view.c
@@ -74,6 +74,9 @@ struct  _MailFolderViewPrivate {
 	GtkCellRenderer *from_to;
 	GtkTreeViewColumn *cols[3];
 
+	GtkCellRenderer *unread_toggle;
+	gpointer *last_active_cell;
+
 	char *folder_name;
 };
 
@@ -92,6 +95,7 @@ static void mfv_delete (MailFolderView *mfv, gboolean del);
 static void mfv_read (MailFolderView *mfv, gboolean del);
 static void mfv_junk  (MailFolderView *mfv, gboolean junk);
 static void mfv_folder_renamed (CamelStore *store, void *event, void *data);
+static gboolean mfv_msg_unread  (GtkCellRenderer *cell, GdkEvent *event,GtkWidget *widget,const gchar *path,const GdkRectangle *background_area,const GdkRectangle *cell_area,GtkCellRendererState flags);
 
 
 static guint signals[LAST_SIGNAL] = { 0 };
@@ -1164,6 +1168,25 @@ static gboolean
 mfv_button_clicked (GtkWidget *w, GdkEventButton *event, MailFolderView *mfv)
 {
 	gboolean outgoing = FALSE;
+	int x, y;
+	GtkTreePath *path = NULL;
+	GtkTreeViewColumn *column = NULL;
+
+
+	x = (int) event->x;
+	y = (int) event->y;
+
+	if (gtk_tree_view_get_path_at_pos (mfv->tree, x, y, &path, &column, NULL, NULL) && column == mfv->priv->cols[0]) {
+		char *str = gtk_tree_path_to_string (path);
+
+		mfv_msg_unread (mfv->priv->unread_toggle, NULL, w, str, NULL, NULL, 0);
+		g_free (str);
+		gtk_tree_path_free (path);
+
+		return TRUE;
+	}
+	if (path)
+		gtk_tree_path_free (path);
 
 	if (em_utils_folder_is_drafts(mfv->priv->folder, mfv->uri)
 		|| em_utils_folder_is_outbox(mfv->priv->folder, mfv->uri))
@@ -1276,7 +1299,7 @@ mfv_selection_mark (MailFolderView *mfv, guint32 mask, guint32 set)
 	 selected = gtk_tree_selection_get_selected (sel, NULL, &iter);
 	 if(!selected)
 		  return;
-	 
+
 	 camel_message_info_set_flags (info, mask, set);
 	 msgs = em_tree_store_get_child_infos ((EMTreeStore *)mfv->model, &iter);
 	 for (i=0; i<msgs->len; i++)
@@ -1319,6 +1342,28 @@ mfv_get_info (GObject *obj, char *path)
 }
 #endif
 
+static void
+mfv_selection_mark_signal (MailFolderView *mfv, guint32 mask, guint32 set)
+{
+	 GtkTreeIter iter;
+	 CamelMessageInfo *info;
+	 GPtrArray *msgs = NULL;
+	 int i;
+	 GtkTreePath *path = NULL;
+
+	 if (!gtk_tree_view_get_path_at_pos (mfv->tree, mfv->x_pos, mfv->y_pos, &path, NULL, NULL, NULL))
+		 return;
+
+	 gtk_tree_model_get_iter (mfv->model, &iter, path);
+	 gtk_tree_path_free (path);
+
+	 info = (CamelMessageInfo *)em_tree_store_get_info_from_iter((EMTreeStore *)mfv->model, &iter);
+	 camel_message_info_set_flags (info, mask, set);
+	 msgs = em_tree_store_get_child_infos ((EMTreeStore *)mfv->model, &iter);
+	 for (i=0; i<msgs->len; i++)
+		  camel_message_info_set_flags ((CamelMessageInfo *)msgs->pdata[i], mask, set);
+}
+
 static gboolean
 mfv_msg_delete  (GtkCellRenderer *cell, GdkEvent *event,GtkWidget *widget,const gchar *path,const GdkRectangle *background_area,const GdkRectangle *cell_area,GtkCellRendererState flags)
 {
@@ -1332,13 +1377,21 @@ static gboolean
 mfv_msg_unread  (GtkCellRenderer *cell, GdkEvent *event,GtkWidget *widget,const gchar *path,const GdkRectangle *background_area,const GdkRectangle *cell_area,GtkCellRendererState flags)
 {
 	 MailFolderView *mfv = g_object_get_data((GObject *)cell, "mfv");
-	 CustomCellRendererTogglePixbuf *toggle = (CustomCellRendererTogglePixbuf *)cell;
-	 gboolean active = toggle->active;
+	 GtkTreeIter iter;
+	 CamelMessageInfo *info;
+	 GtkTreePath *tpath = NULL;
 
-	 if (active)
-		  mfv_selection_mark (mfv, CAMEL_MESSAGE_SEEN, CAMEL_MESSAGE_SEEN);
+	 if (!gtk_tree_view_get_path_at_pos (mfv->tree, mfv->x_pos, mfv->y_pos, &tpath, NULL, NULL, NULL))
+		 return TRUE;
+
+	 gtk_tree_model_get_iter (mfv->model, &iter, tpath);
+	 gtk_tree_path_free (tpath);
+	 info = (CamelMessageInfo *)em_tree_store_get_info_from_iter((EMTreeStore *)mfv->model, &iter);
+
+	 if ((camel_message_info_flags(info) & CAMEL_MESSAGE_SEEN) == 0)
+		  mfv_selection_mark_signal (mfv, CAMEL_MESSAGE_SEEN, CAMEL_MESSAGE_SEEN);
 	 else
-		  mfv_selection_mark (mfv, CAMEL_MESSAGE_SEEN|CAMEL_MESSAGE_DELETED, 0);
+		  mfv_selection_mark_signal (mfv, CAMEL_MESSAGE_SEEN|CAMEL_MESSAGE_DELETED, 0);
 	 /*
 	if (camel_message_info_flags(info) & CAMEL_MESSAGE_SEEN)
 		 camel_message_info_set_flags (info, CAMEL_MESSAGE_SEEN|CAMEL_MESSAGE_DELETED, 0);
@@ -1355,6 +1408,7 @@ mfv_msg_junk (GtkCellRenderer *cell, GdkEvent *event,GtkWidget *widget,const gch
 	 
 	  mfv_selection_mark (mfv, CAMEL_MESSAGE_SEEN|CAMEL_MESSAGE_JUNK|CAMEL_MESSAGE_NOTJUNK|CAMEL_MESSAGE_JUNK_LEARN, CAMEL_MESSAGE_SEEN|CAMEL_MESSAGE_JUNK|CAMEL_MESSAGE_JUNK_LEARN);	 
           // camel_message_info_set_flags (info, CAMEL_MESSAGE_SEEN|CAMEL_MESSAGE_JUNK|CAMEL_MESSAGE_NOTJUNK|CAMEL_MESSAGE_JUNK_LEARN, CAMEL_MESSAGE_SEEN|CAMEL_MESSAGE_JUNK|CAMEL_MESSAGE_JUNK_LEARN);	 
+
 	 return TRUE;
 }
 
@@ -1429,6 +1483,32 @@ mfv_drag_data_delete (GtkWidget *w, GdkDragContext *drag_context, gpointer data)
 	g_signal_stop_emission_by_name (w, "drag-data-delete");
 }
 
+static gboolean
+mfv_motion_tree (GtkWidget *w, GdkEventMotion *event, MailFolderView *mfv)
+{
+	int x, y;
+	GtkTreePath *path = NULL;
+	GtkTreeViewColumn *column = NULL;
+	int cell_x=0, cell_y=0;
+
+
+	x = (int) event->x;
+	y = (int) event->y;
+
+	if (gtk_tree_view_get_path_at_pos (mfv->tree, x, y, &path, &column, &cell_x, &cell_y) && column == mfv->priv->cols[0]) {
+		GtkTreeIter iter;
+		
+		mfv->x_pos = x;
+		mfv->y_pos = y;
+		gtk_tree_model_get_iter (mfv->model, &iter, path);
+		if (!mfv->priv->last_active_cell || mfv->priv->last_active_cell != iter.user_data) {
+			mfv->priv->last_active_cell = iter.user_data;
+		}
+	}
+
+	return FALSE;
+}
+
 void
 mail_folder_view_construct (MailFolderView *shell)
 {
@@ -1465,6 +1545,10 @@ mail_folder_view_construct (MailFolderView *shell)
 	gtk_widget_show ((GtkWidget *)shell);
 	
 	shell->tree = (GtkTreeView *)gtk_tree_view_new ();
+	g_signal_connect (shell->tree, "motion-notify-event", G_CALLBACK(mfv_motion_tree), shell);
+	//g_signal_connect (shell->tree, "enter-notify-event", G_CALLBACK(mfv_motion_tree), shell);
+	//g_signal_connect (shell->tree, "leave-notify-event", G_CALLBACK(mfv_motion_tree), shell);
+
 	sel  = gtk_tree_view_get_selection (shell->tree);
 	gtk_tree_selection_set_mode (sel, GTK_SELECTION_BROWSE);
 	gtk_tree_view_set_enable_search (shell->tree, FALSE);
@@ -1520,6 +1604,8 @@ mail_folder_view_construct (MailFolderView *shell)
 	else 
 		g_object_set_data ((GObject *)cell, "data", GINT_TO_POINTER (EMTS_COL_UNREAD));
 	custom_cell_renderer_vbox_append (vbox, cell);
+	shell->priv->unread_toggle = cell; /* Store the cell_render */
+	g_object_set_data ((GObject *)cell, "mfv", shell);
 
 	/* dummy renderers for nice packing */
 	cell = custom_cell_renderer_toggle_pixbuf_new (gdk_pixbuf_new_from_xpm_data ((const char **) empty_xpm), gdk_pixbuf_new_from_xpm_data ((const char **) empty_xpm));	
diff --git a/src/mail-folder-view.h b/src/mail-folder-view.h
index 48a54b1..45d6bc1 100644
--- a/src/mail-folder-view.h
+++ b/src/mail-folder-view.h
@@ -57,6 +57,9 @@ typedef struct _MailFolderView {
 	char *search;
 	char *search_str;
 	char *search_state;
+
+	int x_pos;
+	int y_pos;
 } MailFolderView;
 
 typedef struct _MailFolderViewClass {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]