X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-header-view.c;h=ff745ba1b3041a32ea28f378257b164ff9f1497a;hp=1898172f5274ba77c376dbe87f7e5bd6ccf447e6;hb=fecb964ed9e028e9f1c169b6904ad2064ea59304;hpb=2657b59fbb82d49daa8fb1576ea3052fcee8aa41 diff --git a/src/widgets/modest-header-view.c b/src/widgets/modest-header-view.c index 1898172..ff745ba 100644 --- a/src/widgets/modest-header-view.c +++ b/src/widgets/modest-header-view.c @@ -73,6 +73,7 @@ struct _ModestHeaderViewPrivate { TnyFolderMonitor *monitor; GMutex *monitor_lock; + gint sort_colid[2][TNY_FOLDER_TYPE_NUM]; }; #define MODEST_HEADER_VIEW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ @@ -216,7 +217,7 @@ remove_all_columns (ModestHeaderView *obj) } gboolean -modest_header_view_set_columns (ModestHeaderView *self, const GList *columns) +modest_header_view_set_columns (ModestHeaderView *self, const GList *columns, TnyFolderType type) { GtkTreeModel *sortable; GtkTreeViewColumn *column=NULL; @@ -236,6 +237,9 @@ modest_header_view_set_columns (ModestHeaderView *self, const GList *columns) renderer_comptact_flag = gtk_cell_renderer_pixbuf_new (); renderer_compact_date = gtk_cell_renderer_text_new (); + g_object_set(G_OBJECT(renderer_header), + "ellipsize", PANGO_ELLIPSIZE_END, + NULL); g_object_set(G_OBJECT(renderer_compact_date), "xalign", 1.0, NULL); @@ -328,21 +332,38 @@ modest_header_view_set_columns (ModestHeaderView *self, const GList *columns) break; case MODEST_HEADER_VIEW_COLUMN_RECEIVED_DATE: - column = get_new_column (_("Received"), renderer_compact_date, TRUE, + column = get_new_column (_("Received"), renderer_header, TRUE, TNY_GTK_HEADER_LIST_MODEL_DATE_RECEIVED_TIME_T_COLUMN, TRUE, (GtkTreeCellDataFunc)_modest_header_view_date_cell_data, GINT_TO_POINTER(TRUE)); break; - case MODEST_HEADER_VIEW_COLUMN_SENT_DATE: - column = get_new_column (_("Sent"), renderer_compact_date, TRUE, + case MODEST_HEADER_VIEW_COLUMN_SENT_DATE: + column = get_new_column (_("Sent"), renderer_header, TRUE, TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, TRUE, (GtkTreeCellDataFunc)_modest_header_view_date_cell_data, GINT_TO_POINTER(FALSE)); break; + case MODEST_HEADER_VIEW_COLUMN_COMPACT_RECEIVED_DATE: + column = get_new_column (_("Received"), renderer_compact_date, FALSE, + TNY_GTK_HEADER_LIST_MODEL_DATE_RECEIVED_TIME_T_COLUMN, + TRUE, + (GtkTreeCellDataFunc)_modest_header_view_compact_date_cell_data, + GINT_TO_POINTER(TRUE)); + gtk_tree_view_column_set_fixed_width (column, 130); + break; + + case MODEST_HEADER_VIEW_COLUMN_COMPACT_SENT_DATE: + column = get_new_column (_("Sent"), renderer_compact_date, FALSE, + TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, + TRUE, + (GtkTreeCellDataFunc)_modest_header_view_compact_date_cell_data, + GINT_TO_POINTER(FALSE)); + gtk_tree_view_column_set_fixed_width (column, 130); + break; case MODEST_HEADER_VIEW_COLUMN_SIZE: column = get_new_column (_("Size"), renderer_header, TRUE, TNY_GTK_HEADER_LIST_MODEL_MESSAGE_SIZE_COLUMN, @@ -362,7 +383,7 @@ modest_header_view_set_columns (ModestHeaderView *self, const GList *columns) g_return_val_if_reached(FALSE); } - if (sortable) + if (sortable) gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE(sortable), col, (GtkTreeIterCompareFunc)cmp_rows, column, NULL); @@ -376,7 +397,8 @@ modest_header_view_set_columns (ModestHeaderView *self, const GList *columns) self); gtk_tree_view_append_column (GTK_TREE_VIEW(self), column); } - + + return TRUE; } @@ -384,6 +406,7 @@ static void modest_header_view_init (ModestHeaderView *obj) { ModestHeaderViewPrivate *priv; + guint i, j; priv = MODEST_HEADER_VIEW_GET_PRIVATE(obj); @@ -391,7 +414,9 @@ modest_header_view_init (ModestHeaderView *obj) priv->monitor = NULL; priv->monitor_lock = g_mutex_new (); - + for (j=0; j < 2; j++) + for (i=0; i < TNY_FOLDER_TYPE_NUM; i++) + priv->sort_colid[j][i] = -1; setup_drag_and_drop (GTK_TREE_VIEW (obj)); } @@ -786,6 +811,30 @@ modest_header_view_set_folder_intern (ModestHeaderView *self, TnyFolder *folder) } void +modest_header_view_set_sort_column_id (ModestHeaderView *self, guint sort_colid, TnyFolderType type) +{ + ModestHeaderViewPrivate *priv; + ModestHeaderViewStyle style; + + style = modest_header_view_get_style (self); + priv = MODEST_HEADER_VIEW_GET_PRIVATE(self); + + priv->sort_colid[style][type] = sort_colid; +} + +gint +modest_header_view_get_sort_column_id (ModestHeaderView *self, TnyFolderType type) +{ + ModestHeaderViewPrivate *priv; + ModestHeaderViewStyle style; + + style = modest_header_view_get_style (self); + priv = MODEST_HEADER_VIEW_GET_PRIVATE(self); + + return priv->sort_colid[style][type]; +} + +void modest_header_view_set_folder (ModestHeaderView *self, TnyFolder *folder) { ModestHeaderViewPrivate *priv; @@ -930,9 +979,10 @@ cmp_rows (GtkTreeModel *tree_model, GtkTreeIter *iter1, GtkTreeIter *iter2, gint t1, t2; gint val1, val2; gchar *s1, *s2; - gint cmp; - + gint cmp; static int counter = 0; + + g_return_val_if_fail (G_IS_OBJECT(user_data), 0); col_id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(user_data), MODEST_HEADER_VIEW_COLUMN)); if (!(++counter % 100)) { @@ -946,6 +996,7 @@ cmp_rows (GtkTreeModel *tree_model, GtkTreeIter *iter1, GtkTreeIter *iter2, /* first one, we decide based on the time */ case MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER_IN: + case MODEST_HEADER_VIEW_COLUMN_COMPACT_RECEIVED_DATE: case MODEST_HEADER_VIEW_COLUMN_RECEIVED_DATE: gtk_tree_model_get (tree_model, iter1, @@ -957,6 +1008,7 @@ cmp_rows (GtkTreeModel *tree_model, GtkTreeIter *iter1, GtkTreeIter *iter2, return t1 - t2; case MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER_OUT: + case MODEST_HEADER_VIEW_COLUMN_COMPACT_SENT_DATE: case MODEST_HEADER_VIEW_COLUMN_SENT_DATE: gtk_tree_model_get (tree_model, iter1, TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, @@ -1137,7 +1189,8 @@ on_focus_in (GtkWidget *self, { GtkTreeSelection *selection; GtkTreeModel *model; - GList *selected; + GList *selected = NULL; + GtkTreePath *selected_path = NULL; model = gtk_tree_view_get_model (GTK_TREE_VIEW (self)); if (!model) @@ -1149,7 +1202,10 @@ on_focus_in (GtkWidget *self, GtkTreeIter iter; GtkTreePath *path; - gtk_tree_model_get_iter_first (model, &iter); + /* Return if the model is empty */ + if (!gtk_tree_model_get_iter_first (model, &iter)) + return FALSE; + path = gtk_tree_model_get_path (model, &iter); gtk_tree_selection_select_path (selection, path); gtk_tree_path_free (path); @@ -1157,14 +1213,29 @@ on_focus_in (GtkWidget *self, /* Need to get the all the rows because is selection multiple */ selected = gtk_tree_selection_get_selected_rows (selection, &model); - - /* Scroll to first path */ - gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (self), - (GtkTreePath *) selected->data, - NULL, - TRUE, - 0.5, - 0.0); + selected_path = (GtkTreePath *) selected->data; + + /* Check if we need to scroll */ + #if GTK_CHECK_VERSION(2, 8, 0) /* TODO: gtk_tree_view_get_visible_range() is only available in GTK+ 2.8 */ + GtkTreePath *start_path = NULL; + GtkTreePath *end_path = NULL; + if (gtk_tree_view_get_visible_range (GTK_TREE_VIEW (self), + &start_path, + &end_path)) { + + if ((gtk_tree_path_compare (start_path, selected_path) != -1) || + (gtk_tree_path_compare (end_path, selected_path) != 1)) { + + /* Scroll to first path */ + gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (self), + selected_path, + NULL, + TRUE, + 0.5, + 0.0); + } + } + #endif /* GTK_CHECK_VERSION */ /* Frees */ g_list_foreach (selected, (GFunc) gtk_tree_path_free, NULL);