From f59ac881184ad02c3cb59b287bfa9cd3dd853908 Mon Sep 17 00:00:00 2001 From: "Dirk-Jan C. Binnema" Date: Wed, 24 Nov 2010 09:03:06 +0200 Subject: [PATCH] * mug.c: show error dialogs for errors; focus query when there was a parse error --- src/mu-result.h | 2 +- toys/mug/mug-msg-list-view.c | 43 ++++++++++++++++++++++++++++++--- toys/mug/mug-msg-list-view.h | 12 ++++++++- toys/mug/mug.cc | 47 +++++++++++++++++++++++++++++++++--- 4 files changed, 94 insertions(+), 10 deletions(-) diff --git a/src/mu-result.h b/src/mu-result.h index a9b88a58..38411854 100644 --- a/src/mu-result.h +++ b/src/mu-result.h @@ -29,7 +29,7 @@ enum _MuResult { MU_ERROR_QUERY, MU_ERROR_INTERNAL, - MU_ERROR /* some error occured */ + MU_ERROR /* some other error occured */ diff --git a/toys/mug/mug-msg-list-view.c b/toys/mug/mug-msg-list-view.c index 798eab2c..864ec402 100644 --- a/toys/mug/mug-msg-list-view.c +++ b/toys/mug/mug-msg-list-view.c @@ -30,6 +30,7 @@ static void mug_msg_list_view_finalize (GObject *obj); /* list my signals */ enum { MUG_MSG_SELECTED, + MUG_ERROR_OCCURED, LAST_SIGNAL }; @@ -87,6 +88,15 @@ mug_msg_list_view_class_init (MugMsgListViewClass *klass) NULL, NULL, g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, 1, G_TYPE_STRING); + signals[MUG_ERROR_OCCURED] = + g_signal_new ("error-occured", + G_TYPE_FROM_CLASS(gobject_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET(MugMsgListViewClass, + error_occured), + NULL, NULL, + g_cclosure_marshal_VOID__UINT, + G_TYPE_NONE, 1, G_TYPE_UINT); } @@ -308,8 +318,25 @@ empty_or_display_contact (const gchar* str) } +static MugError +mu_result_to_mug_error (MuResult r) +{ + switch (r) { + case MU_ERROR_XAPIAN_DIR: + return MUG_ERROR_XAPIAN_DIR; + case MU_ERROR_XAPIAN_NOT_UPTODATE: + return MUG_ERROR_XAPIAN_NOT_UPTODATE; + case MU_ERROR_QUERY: + return MUG_ERROR_QUERY; + default: + return MUG_ERROR_OTHER; + } +} + + static MuMsgIter * -run_query (const char *xpath, const char *query) +run_query (const char *xpath, const char *query, + MugMsgListView *self) { GError *err; MuQuery *xapian; @@ -319,6 +346,9 @@ run_query (const char *xpath, const char *query) xapian = mu_query_new (xpath, &err); if (!xapian) { g_warning ("Error: %s", err->message); + g_signal_emit (G_OBJECT(self), + signals[MUG_ERROR_OCCURED], 0, + mu_result_to_mug_error (err->code)); g_error_free (err); return NULL; } @@ -329,6 +359,9 @@ run_query (const char *xpath, const char *query) mu_query_destroy (xapian); if (!iter) { g_warning ("Error: %s", err->message); + g_signal_emit (G_OBJECT(self), + signals[MUG_ERROR_OCCURED], 0, + mu_result_to_mug_error (err->code)); g_error_free (err); return NULL; } @@ -369,12 +402,13 @@ add_row (GtkListStore *store, MuMsgIter *iter) static int -update_model (GtkListStore *store, const char *xpath, const char *query) +update_model (GtkListStore *store, const char *xpath, const char *query, + MugMsgListView *self) { MuMsgIter *iter; int count; - iter = run_query (xpath, query); + iter = run_query (xpath, query, self); if (!iter) { g_warning ("error: running query failed\n"); return -1; @@ -407,7 +441,8 @@ mug_msg_list_view_query (MugMsgListView *self, const char *query) if (!query) return TRUE; - rv = update_model (priv->_store, priv->_xpath, query); + rv = update_model (priv->_store, priv->_xpath, query, + self); gtk_tree_view_columns_autosize (GTK_TREE_VIEW(self)); diff --git a/toys/mug/mug-msg-list-view.h b/toys/mug/mug-msg-list-view.h index 755cc5e9..d59b99d7 100644 --- a/toys/mug/mug-msg-list-view.h +++ b/toys/mug/mug-msg-list-view.h @@ -21,7 +21,7 @@ #define __MUG_MSG_LIST_VIEW_H__ #include -/* other include files */ +#include "src/mu-result.h" G_BEGIN_DECLS @@ -41,10 +41,20 @@ struct _MugMsgListView { /* insert public members, if any */ }; +enum _MugError { + MUG_ERROR_XAPIAN_NOT_UPTODATE, + MUG_ERROR_XAPIAN_DIR, + MUG_ERROR_QUERY, + MUG_ERROR_OTHER +}; +typedef enum _MugError MugError; + + struct _MugMsgListViewClass { GtkTreeViewClass parent_class; /* insert signal callback declarations, e.g. */ void (* msg_selected) (MugMsgListView* obj, const char* msgpath); + void (* error_occured) (MugMsgListView* obj, MugError err); }; /* member functions */ diff --git a/toys/mug/mug.cc b/toys/mug/mug.cc index 34940afd..d201eb9b 100644 --- a/toys/mug/mug.cc +++ b/toys/mug/mug.cc @@ -74,18 +74,20 @@ static void on_tool_button_clicked (GtkToolButton *btn, MugData *mugdata) { ToolAction action; - action = (ToolAction)GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(btn), - "action")); + action = (ToolAction)GPOINTER_TO_UINT( + g_object_get_data(G_OBJECT(btn),"action")); switch (action) { case ACTION_DO_QUIT: gtk_main_quit(); break; case ACTION_NEXT_MSG: - mug_msg_list_view_move_next (MUG_MSG_LIST_VIEW(mugdata->mlist)); + mug_msg_list_view_move_next + (MUG_MSG_LIST_VIEW(mugdata->mlist)); break; case ACTION_PREV_MSG: - mug_msg_list_view_move_prev (MUG_MSG_LIST_VIEW(mugdata->mlist)); + mug_msg_list_view_move_prev + (MUG_MSG_LIST_VIEW(mugdata->mlist)); break; case ACTION_ABOUT: about_mug (mugdata); @@ -199,6 +201,41 @@ on_msg_selected (MugMsgListView *mlist, const char* mpath, MugData *mugdata) } +static void +on_list_view_error (MugMsgListView *mlist, MugError err, + MugData *mugdata) +{ + GtkWidget *errdialog; + const char* msg; + + switch (err) { + case MUG_ERROR_XAPIAN_NOT_UPTODATE: + msg = "The Xapian Database has the wrong version\n" + "Please run 'mu index --rebuild'"; break; + case MUG_ERROR_XAPIAN_DIR: + msg = "Cannot find the Xapian database dir\n" + "Please restart mug with --muhome=... pointing\n" + "to your mu home directory"; break; + case MUG_ERROR_QUERY: + msg = "Error in query"; break; + default: + msg = "Some error occured"; break; + } + + errdialog = gtk_message_dialog_new + (GTK_WINDOW(mugdata->win), GTK_DIALOG_MODAL, + GTK_MESSAGE_ERROR,GTK_BUTTONS_OK, "%s", msg); + + gtk_dialog_run (GTK_DIALOG(errdialog)); + gtk_widget_destroy (errdialog); + + if (err == MUG_ERROR_QUERY) { + mug_query_bar_grab_focus + (MUG_QUERY_BAR(mugdata->querybar)); + } +} + + static GtkWidget* mug_querybar (void) @@ -235,6 +272,8 @@ mug_query_area (MugData *mugdata) mug_msg_view_set_msg (MUG_MSG_VIEW(mugdata->msgview), NULL); g_signal_connect (G_OBJECT(mugdata->mlist), "msg-selected", G_CALLBACK(on_msg_selected), mugdata); + g_signal_connect (G_OBJECT(mugdata->mlist), "error-occured", + G_CALLBACK(on_list_view_error), mugdata); gtk_paned_add2 (GTK_PANED (paned), mugdata->msgview); mugdata->querybar = mug_querybar();