[anjal] Redo message list unread marking.
- From: Srinivasa Ragavan <sragavan src gnome org>
- To: svn-commits-list gnome org
- Subject: [anjal] Redo message list unread marking.
- Date: Mon, 27 Jul 2009 11:39:43 +0000 (UTC)
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]