call this function before */
modest_main_window_disconnect_signals (MODEST_WINDOW (obj));
modest_main_window_cleanup_queue_error_signals ((ModestMainWindow *) obj);
+
+ if (priv->empty_view) {
+ g_object_unref (priv->empty_view);
+ priv->empty_view = NULL;
+ }
+
+ if (priv->header_view) {
+ g_object_unref (priv->header_view);
+ priv->header_view = NULL;
+ }
g_slist_free (priv->progress_widgets);
compare_display_names (ModestAccountSettings *a,
ModestAccountSettings *b)
{
- return strcmp (modest_account_settings_get_display_name (a),
- modest_account_settings_get_display_name (b));
+ return g_utf8_collate (modest_account_settings_get_display_name (a),
+ modest_account_settings_get_display_name (b));
+
}
/* We use this function to prevent the send&receive CSM to be shown
/* Add ui from account data. We allow 2^9-1 account
changes in a single execution because we're
downcasting the guint to a guint8 in order to use a
- GByteArray. It should be enough. */
+ GByteArray. It should be enough :-) */
item_name = g_strconcat (account_name, "Menu", NULL);
merge_id = (guint8) gtk_ui_manager_new_merge_id (parent_priv->ui_manager);
priv->merge_ids = g_byte_array_append (priv->merge_ids, &merge_id, 1);
item = gtk_menu_item_new ();
gtk_container_add (GTK_CONTAINER (item), label);
- gtk_menu_shell_prepend (GTK_MENU_SHELL (priv->accounts_popup), GTK_WIDGET (item));
+ gtk_menu_shell_prepend (GTK_MENU_SHELL (priv->accounts_popup),
+ GTK_WIDGET (item));
g_signal_connect_data (G_OBJECT (item),
"activate",
G_CALLBACK (on_send_receive_csm_activated),
/* header view */
priv->header_view =
MODEST_HEADER_VIEW (modest_header_view_new (NULL, MODEST_HEADER_VIEW_STYLE_DETAILS));
+ g_object_ref (priv->header_view);
if (!priv->header_view)
g_printerr ("modest: cannot instantiate header view\n");
modest_header_view_set_style (priv->header_view, MODEST_HEADER_VIEW_STYLE_TWOLINES);
/* Empty view */
priv->empty_view = create_empty_view ();
gtk_widget_show (priv->empty_view);
+ g_object_ref (priv->empty_view);
/* Create scrolled windows */
folder_win = gtk_scrolled_window_new (NULL, NULL);
ModestWindowPrivate *parent_priv;
GtkAction *action;
gboolean active;
-
+ GtkTreeSelection *sel;
+ GList *rows, *list;
+
g_return_if_fail (MODEST_IS_MAIN_WINDOW (self));
priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
g_signal_handlers_unblock_by_func (action, modest_ui_actions_toggle_folders_view, self);
}
+ /* We need to store the selection because it's lost when the
+ widget is reparented */
+ sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->header_view));
+ rows = gtk_tree_selection_get_selected_rows (sel, NULL);
+
priv->style = style;
switch (style) {
case MODEST_MAIN_WINDOW_STYLE_SIMPLE:
break;
default:
+ g_list_foreach (rows, (GFunc) gtk_tree_path_free, NULL);
+ g_list_free (rows);
g_return_if_reached ();
}
+ /* Reselect the previously selected folders. We disable the
+ dimming rules execution during that time because there is
+ no need to work out it again and it could take a lot of
+ time if all the headers are selected */
+ list = rows;
+ modest_window_disable_dimming (MODEST_WINDOW (self));
+ while (list) {
+ gtk_tree_selection_select_path (sel, (GtkTreePath *) list->data);
+ list = g_list_next (list);
+ }
+ modest_window_enable_dimming (MODEST_WINDOW (self));
+
+ /* Free */
+ g_list_foreach (rows, (GFunc) gtk_tree_path_free, NULL);
+ g_list_free (rows);
+
/* Let header view grab the focus if it's being shown */
if (priv->contents_style == MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS)
gtk_widget_grab_focus (GTK_WIDGET (priv->header_view));
return label;
}
+typedef struct
+{
+ GtkWidget *count_label;
+ GtkWidget *msg_count_label;
+ GtkWidget *size_label;
+ gchar *color_markup;
+} DetailsWidgets;
+
+static gchar *
+create_uint_label (const gchar *markup,
+ const gchar *name,
+ guint count)
+{
+ return g_markup_printf_escaped ("<span color='%s'>%s:</span> %d", markup, name, count);
+}
+
+static gchar *
+create_gchar_label (const gchar *markup,
+ const gchar *name,
+ gchar *count)
+{
+ return g_markup_printf_escaped ("<span color='%s'>%s:</span> %s", markup, name, count);
+}
+
+static void
+update_folder_stats_status_cb (ModestFolderStats stats,
+ gpointer user_data)
+{
+ DetailsWidgets *widgets = (DetailsWidgets *) user_data;
+ gchar *label, *tmp;
+
+ label = create_uint_label (widgets->color_markup, _("mcen_fi_rootfolder_folders"), stats.folders);
+ gtk_label_set_markup (GTK_LABEL (widgets->count_label), label);
+ g_free (label);
+
+ label = create_uint_label (widgets->color_markup, _("mcen_fi_rootfolder_messages"), stats.msg_count);
+ gtk_label_set_markup (GTK_LABEL (widgets->msg_count_label), label);
+ g_free (label);
+
+ if (widgets->size_label) {
+ tmp = modest_text_utils_get_display_size (stats.local_size);
+ label = create_gchar_label (widgets->color_markup, _("mcen_fi_rootfolder_size"), tmp);
+ gtk_label_set_markup (GTK_LABEL (widgets->size_label), label);
+ g_free (label);
+ g_free (tmp);
+ }
+}
+
+static void
+update_folder_stats_cb (ModestFolderStats stats,
+ gpointer user_data)
+{
+ DetailsWidgets *widgets = (DetailsWidgets *) user_data;
+
+ /* refresh data */
+ update_folder_stats_status_cb (stats, user_data);
+
+ /* frees. Note that the widgets could have been destroyed but
+ we still keep a reference */
+ g_free (widgets->color_markup);
+ if (widgets->count_label)
+ g_object_unref (widgets->count_label);
+ if (widgets->msg_count_label)
+ g_object_unref (widgets->msg_count_label);
+ if (widgets->size_label)
+ g_object_unref (widgets->size_label);
+ g_slice_free (DetailsWidgets, widgets);
+}
+
static GtkWidget *
create_details_widget (GtkWidget *styled_widget, TnyAccount *account)
{
GtkWidget *label_w;
gchar *label;
gchar *gray_color_markup;
+ DetailsWidgets *widgets;
vbox = gtk_vbox_new (FALSE, 0);
+ widgets = g_slice_new0 (DetailsWidgets);
gray_color_markup = get_gray_color_markup (styled_widget);
+ widgets->color_markup = g_strdup (gray_color_markup);
/* Account description: */
if (modest_tny_account_is_virtual_local_folders (account)
/* Message count */
TnyFolderStore *folder_store = TNY_FOLDER_STORE (account);
- label = g_markup_printf_escaped ("<span color='%s'>%s:</span> %d",
- gray_color_markup, _("mcen_fi_rootfolder_messages"),
- modest_tny_folder_store_get_message_count (folder_store));
+ label = create_uint_label (gray_color_markup, _("mcen_fi_rootfolder_messages"), 0);
label_w = gtk_label_new (NULL);
gtk_label_set_markup (GTK_LABEL (label_w), label);
gtk_label_set_ellipsize (GTK_LABEL (label_w), PANGO_ELLIPSIZE_END);
gtk_box_pack_start (GTK_BOX (vbox), label_w, FALSE, FALSE, 0);
g_free (label);
+ widgets->msg_count_label = g_object_ref (label_w);
+
/* Folder count */
- label = g_markup_printf_escaped ("<span color='%s'>%s:</span> %d",
- gray_color_markup,
- _("mcen_fi_rootfolder_folders"),
- modest_tny_folder_store_get_folder_count (folder_store));
+ label = create_uint_label (gray_color_markup, _("mcen_fi_rootfolder_folders"), 0);
label_w = gtk_label_new (NULL);
gtk_label_set_markup (GTK_LABEL (label_w), label);
gtk_label_set_ellipsize (GTK_LABEL (label_w), PANGO_ELLIPSIZE_END);
gtk_box_pack_start (GTK_BOX (vbox), label_w, FALSE, FALSE, 0);
g_free (label);
+ widgets->count_label = g_object_ref (label_w);
+
/* Size / Date */
if (modest_tny_account_is_virtual_local_folders (account)
|| modest_tny_account_is_memory_card_account (account)) {
- gchar *size = modest_text_utils_get_display_size (
- modest_tny_folder_store_get_local_size (folder_store));
-
- label = g_markup_printf_escaped ("<span color='%s'>%s:</span> %s",
- gray_color_markup, _("mcen_fi_rootfolder_size"),
- size);
- g_free (size);
+ label = create_gchar_label (gray_color_markup, _("mcen_fi_rootfolder_size"), "0");
label_w = gtk_label_new (NULL);
gtk_label_set_markup (GTK_LABEL (label_w), label);
gtk_label_set_ellipsize (GTK_LABEL (label_w), PANGO_ELLIPSIZE_END);
gtk_box_pack_start (GTK_BOX (vbox), label_w, FALSE, FALSE, 0);
g_free (label);
+
+ widgets->size_label = g_object_ref (label_w);
+
} else if (TNY_IS_ACCOUNT(folder_store)) {
TnyAccount *account = TNY_ACCOUNT(folder_store);
g_free (gray_color_markup);
+ /* Refresh folder stats asynchronously */
+ modest_tny_folder_store_get_folder_stats (TNY_FOLDER_STORE (account),
+ update_folder_stats_cb,
+ update_folder_stats_status_cb,
+ widgets);
+
/* Set alignment */
gtk_container_foreach (GTK_CONTAINER (vbox), (GtkCallback) set_alignment, NULL);
details widget */
GtkWidget *content = gtk_bin_get_child (GTK_BIN (priv->contents_widget));
if (content) {
- if (priv->contents_style == MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS)
- g_object_ref (content);
- else if (priv->contents_style == MODEST_MAIN_WINDOW_CONTENTS_STYLE_EMPTY) {
- g_object_ref (priv->empty_view);
+ if (priv->contents_style == MODEST_MAIN_WINDOW_CONTENTS_STYLE_EMPTY) {
gtk_container_remove (GTK_CONTAINER (content), priv->empty_view);
}
mail_op);
modest_mail_operation_sync_folder (mail_op, TNY_FOLDER (folder_store), FALSE);
g_object_unref (mail_op);
+ g_object_unref (folder_store);
}
}
}