static void modest_main_window_finalize (GObject *obj);
static gboolean modest_main_window_window_state_event (GtkWidget *widget,
- GdkEventWindowState *event,
- gpointer userdata);
+ GdkEventWindowState *event,
+ gpointer userdata);
static void connect_signals (ModestMainWindow *self);
static void set_at_least_one_account_visible(ModestMainWindow *self);
+static void on_updating_msg_list (ModestHeaderView *header_view,
+ gboolean starting,
+ gpointer user_data);
+
+static gboolean restore_paned_timeout_handler (gpointer *data);
+
typedef struct _ModestMainWindowPrivate ModestMainWindowPrivate;
struct _ModestMainWindowPrivate {
GtkWidget *msg_paned;
ModestMainWindowContentsStyle contents_style;
guint progress_bar_timeout;
+ guint restore_paned_timeout;
/* Signal handler UIDs */
GList *queue_err_signals;
GSList *sighandlers;
+
+ /* "Updating" banner for header view */
+ GtkWidget *updating_banner;
+ guint updating_banner_timeout;
};
#define MODEST_MAIN_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
MODEST_TYPE_MAIN_WINDOW, \
priv->optimized_view = FALSE;
priv->send_receive_in_progress = FALSE;
priv->progress_bar_timeout = 0;
+ priv->restore_paned_timeout = 0;
priv->sighandlers = NULL;
+ priv->updating_banner = NULL;
+ priv->updating_banner_timeout = 0;
}
static void
priv->progress_bar_timeout = 0;
}
+ if (priv->updating_banner_timeout > 0) {
+ g_source_remove (priv->updating_banner_timeout);
+ priv->updating_banner_timeout = 0;
+ }
+
+ if (priv->restore_paned_timeout > 0) {
+ g_source_remove (priv->restore_paned_timeout);
+ priv->restore_paned_timeout = 0;
+ }
+
G_OBJECT_CLASS(parent_class)->finalize (obj);
}
return widget ? GTK_WIDGET(widget) : NULL;
}
+static gboolean
+restore_paned_timeout_handler (gpointer *data)
+{
+ ModestMainWindow *main_window = MODEST_MAIN_WINDOW (data);
+ ModestMainWindowPrivate *priv = MODEST_MAIN_WINDOW_GET_PRIVATE (main_window);
+ ModestConf *conf;
+
+ if (GTK_WIDGET_VISIBLE (main_window)) {
+ conf = modest_runtime_get_conf ();
+ modest_widget_memory_restore (conf, G_OBJECT(priv->main_paned),
+ MODEST_CONF_MAIN_PANED_KEY);
+ }
+ return FALSE;
+}
+
static void
restore_settings (ModestMainWindow *self, gboolean do_folder_view_too)
modest_widget_memory_restore (conf, G_OBJECT(priv->main_paned),
MODEST_CONF_MAIN_PANED_KEY);
+ g_timeout_add (500, (GSourceFunc) restore_paned_timeout_handler, self);
+
/* We need to force a redraw here in order to get the right
position of the horizontal paned separator */
gtk_widget_show (GTK_WIDGET (self));
priv->sighandlers =
modest_signal_mgr_connect (priv->sighandlers,G_OBJECT (priv->header_view), "focus-in-event",
G_CALLBACK (on_header_view_focus_in), self);
+ priv->sighandlers =
+ modest_signal_mgr_connect (priv->sighandlers,
+ G_OBJECT (priv->header_view),
+ "updating-msg-list",
+ G_CALLBACK (on_updating_msg_list),
+ self);
/* Header view CSM */
menu = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/HeaderViewCSM");
gtk_widget_tap_and_hold_setup (GTK_WIDGET (priv->header_view), menu, NULL, 0);
- priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,G_OBJECT(priv->header_view), "tap-and-hold",
- G_CALLBACK(_header_view_csm_menu_activated),
- self);
+ priv->sighandlers =
+ modest_signal_mgr_connect (priv->sighandlers,G_OBJECT(priv->header_view), "tap-and-hold",
+ G_CALLBACK(_header_view_csm_menu_activated),
+ self);
/* window */
- priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,G_OBJECT (self), "window-state-event",
- G_CALLBACK (modest_main_window_window_state_event),
- NULL);
-
+ priv->sighandlers =
+ modest_signal_mgr_connect (priv->sighandlers,G_OBJECT (self), "window-state-event",
+ G_CALLBACK (modest_main_window_window_state_event),
+ NULL);
+
/* Mail Operation Queue */
priv->sighandlers =
modest_signal_mgr_connect (priv->sighandlers,
gtk_widget_show (GTK_WIDGET (priv->folder_view));
/* Connect signals */
- connect_signals ((ModestMainWindow*)self);
+ connect_signals (MODEST_MAIN_WINDOW (self));
/* Set account store */
tny_account_store_view_set_account_store (TNY_ACCOUNT_STORE_VIEW (priv->folder_view),
* hibernation: */
modest_osso_load_state ();
- /* Restore window & widget settings */
-
+ /* Restore window & widget settings */
restore_settings (MODEST_MAIN_WINDOW(self), TRUE);
- /* The UI spec wants us to show a connection dialog when the application is
- * started by the user, if there is no connection.
- * Do this before showing the account wizard,
- * because wizard needs a connection to discover capabilities. */
- modest_platform_connect_and_wait (GTK_WINDOW (self), NULL);
+/* /\* The UI spec wants us to show a connection dialog when the application is */
+/* * started by the user, if there is no connection. */
+/* * Do this before showing the account wizard, */
+/* * because wizard needs a connection to discover capabilities. *\/ */
+/* modest_platform_connect_and_wait (GTK_WINDOW (self), NULL); */
/* Check if accounts exist and show the account wizard if not */
gboolean accounts_exist =
return MODEST_WINDOW(self);
}
-gboolean
-modest_main_window_close_all (ModestMainWindow *self)
-{
- GtkWidget *note;
- GtkResponseType response;
-
- /* Create the confirmation dialog MSG-NOT308 */
- note = hildon_note_new_confirmation_add_buttons (GTK_WINDOW (self),
- _("emev_nc_close_windows"),
- _("mcen_bd_yes"), GTK_RESPONSE_YES,
- _("mcen_bd_no"), GTK_RESPONSE_NO,
- NULL);
-
- response = gtk_dialog_run (GTK_DIALOG (note));
- gtk_widget_destroy (GTK_WIDGET (note));
-
- if (response == GTK_RESPONSE_YES)
- return TRUE;
- else
- return FALSE;
-}
-
-
void
modest_main_window_set_style (ModestMainWindow *self,
ModestMainWindowStyle style)
if (event->keyval == GDK_Left)
gtk_widget_grab_focus (GTK_WIDGET (priv->folder_view));
else if ((event->keyval == GDK_Return)||(event->keyval == GDK_KP_Enter)) {
- hildon_banner_show_information (NULL, NULL, _("mcen_ib_select_one_message"));
- return TRUE;
+ guint selected_headers = modest_header_view_count_selected_headers (MODEST_HEADER_VIEW (widget));
+ if (selected_headers > 1) {
+ hildon_banner_show_information (NULL, NULL, _("mcen_ib_select_one_message"));
+ return TRUE;
+ }
}
} else if (MODEST_IS_FOLDER_VIEW (widget) && event->keyval == GDK_Right)
gtk_widget_grab_focus (GTK_WIDGET (priv->header_view));
TnyAccount *account = TNY_ACCOUNT(folder_store);
time_t last_updated;
- gchar *last_updated_string;
+ const gchar *last_updated_string;
/* Get last updated from configuration */
last_updated = modest_account_mgr_get_last_updated (modest_runtime_get_account_mgr (),
tny_account_get_id (account));
label_w = gtk_label_new (NULL);
gtk_label_set_markup (GTK_LABEL (label_w), label);
gtk_box_pack_start (GTK_BOX (vbox), label_w, FALSE, FALSE, 0);
- g_free (last_updated_string);
g_free (label);
}
refresh_account (const gchar *account_name)
{
ModestWindow *win;
-
- win = MODEST_WINDOW (modest_window_mgr_get_main_window (modest_runtime_get_window_mgr ()));
-
+
+ /* win must already exists here, obviously */
+ win = modest_window_mgr_get_main_window (modest_runtime_get_window_mgr (),
+ FALSE);
+ if (!win) {
+ g_warning ("%s: BUG: no main window!", __FUNCTION__);
+ return;
+ }
+
/* If account_name == NULL, we must update all (option All) */
if (!account_name)
modest_ui_actions_do_send_receive_all (win);
show_clipboard = show_delete = show_cancel_send = TRUE;
show_reply = show_forward = FALSE;
break;
+ case TNY_FOLDER_TYPE_INVALID:
+ g_warning ("%s: BUG: TNY_FOLDER_TYPE_INVALID", __FUNCTION__);
+ break;
default:
show_reply = show_forward = show_clipboard = show_delete = TRUE;
show_cancel_send = FALSE;
return TRUE;
}
+static gboolean
+show_updating_banner (gpointer user_data)
+{
+ ModestMainWindowPrivate *priv = NULL;
+
+ priv = MODEST_MAIN_WINDOW_GET_PRIVATE (user_data);
+
+ priv->updating_banner =
+ modest_platform_animation_banner (GTK_WIDGET (user_data), NULL,
+ _CS ("ckdg_pb_updating"));
+
+ /* Remove timeout */
+ priv->updating_banner_timeout = 0;
+ return FALSE;
+}
+
+/**
+ * We use this function to show/hide a progress banner showing
+ * "Updating" while the header view is being filled. We're not showing
+ * it unless the update takes more than 2 seconds
+ *
+ * If starting = TRUE then the refresh is starting, otherwise it means
+ * that is has just finished
+ */
+static void
+on_updating_msg_list (ModestHeaderView *header_view,
+ gboolean starting,
+ gpointer user_data)
+{
+ ModestMainWindowPrivate *priv = NULL;
+
+ priv = MODEST_MAIN_WINDOW_GET_PRIVATE (user_data);
+
+ /* Remove old timeout */
+ if (priv->updating_banner_timeout > 0) {
+ g_source_remove (priv->updating_banner_timeout);
+ priv->updating_banner_timeout = 0;
+ }
+
+ /* Create a new timeout */
+ if (starting) {
+ priv->updating_banner_timeout =
+ g_timeout_add (2000, show_updating_banner, user_data);
+ } else {
+ /* Remove the banner if exists */
+ if (priv->updating_banner) {
+ gtk_widget_destroy (priv->updating_banner);
+ priv->updating_banner = NULL;
+ }
+ }
+}