* mug.c: show error dialogs for errors; focus query when there was a parse error

This commit is contained in:
Dirk-Jan C. Binnema 2010-11-24 09:03:06 +02:00
parent bb9b7081df
commit f59ac88118
4 changed files with 94 additions and 10 deletions

View File

@ -29,7 +29,7 @@ enum _MuResult {
MU_ERROR_QUERY, MU_ERROR_QUERY,
MU_ERROR_INTERNAL, MU_ERROR_INTERNAL,
MU_ERROR /* some error occured */ MU_ERROR /* some other error occured */

View File

@ -30,6 +30,7 @@ static void mug_msg_list_view_finalize (GObject *obj);
/* list my signals */ /* list my signals */
enum { enum {
MUG_MSG_SELECTED, MUG_MSG_SELECTED,
MUG_ERROR_OCCURED,
LAST_SIGNAL LAST_SIGNAL
}; };
@ -87,6 +88,15 @@ mug_msg_list_view_class_init (MugMsgListViewClass *klass)
NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__STRING, g_cclosure_marshal_VOID__STRING,
G_TYPE_NONE, 1, G_TYPE_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 * static MuMsgIter *
run_query (const char *xpath, const char *query) run_query (const char *xpath, const char *query,
MugMsgListView *self)
{ {
GError *err; GError *err;
MuQuery *xapian; MuQuery *xapian;
@ -319,6 +346,9 @@ run_query (const char *xpath, const char *query)
xapian = mu_query_new (xpath, &err); xapian = mu_query_new (xpath, &err);
if (!xapian) { if (!xapian) {
g_warning ("Error: %s", err->message); 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); g_error_free (err);
return NULL; return NULL;
} }
@ -329,6 +359,9 @@ run_query (const char *xpath, const char *query)
mu_query_destroy (xapian); mu_query_destroy (xapian);
if (!iter) { if (!iter) {
g_warning ("Error: %s", err->message); 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); g_error_free (err);
return NULL; return NULL;
} }
@ -369,12 +402,13 @@ add_row (GtkListStore *store, MuMsgIter *iter)
static int 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; MuMsgIter *iter;
int count; int count;
iter = run_query (xpath, query); iter = run_query (xpath, query, self);
if (!iter) { if (!iter) {
g_warning ("error: running query failed\n"); g_warning ("error: running query failed\n");
return -1; return -1;
@ -407,7 +441,8 @@ mug_msg_list_view_query (MugMsgListView *self, const char *query)
if (!query) if (!query)
return TRUE; 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)); gtk_tree_view_columns_autosize (GTK_TREE_VIEW(self));

View File

@ -21,7 +21,7 @@
#define __MUG_MSG_LIST_VIEW_H__ #define __MUG_MSG_LIST_VIEW_H__
#include <gtk/gtk.h> #include <gtk/gtk.h>
/* other include files */ #include "src/mu-result.h"
G_BEGIN_DECLS G_BEGIN_DECLS
@ -41,10 +41,20 @@ struct _MugMsgListView {
/* insert public members, if any */ /* 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 { struct _MugMsgListViewClass {
GtkTreeViewClass parent_class; GtkTreeViewClass parent_class;
/* insert signal callback declarations, e.g. */ /* insert signal callback declarations, e.g. */
void (* msg_selected) (MugMsgListView* obj, const char* msgpath); void (* msg_selected) (MugMsgListView* obj, const char* msgpath);
void (* error_occured) (MugMsgListView* obj, MugError err);
}; };
/* member functions */ /* member functions */

View File

@ -74,18 +74,20 @@ static void
on_tool_button_clicked (GtkToolButton *btn, MugData *mugdata) on_tool_button_clicked (GtkToolButton *btn, MugData *mugdata)
{ {
ToolAction action; ToolAction action;
action = (ToolAction)GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(btn), action = (ToolAction)GPOINTER_TO_UINT(
"action")); g_object_get_data(G_OBJECT(btn),"action"));
switch (action) { switch (action) {
case ACTION_DO_QUIT: case ACTION_DO_QUIT:
gtk_main_quit(); gtk_main_quit();
break; break;
case ACTION_NEXT_MSG: 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; break;
case ACTION_PREV_MSG: 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; break;
case ACTION_ABOUT: case ACTION_ABOUT:
about_mug (mugdata); 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* static GtkWidget*
mug_querybar (void) mug_querybar (void)
@ -235,6 +272,8 @@ mug_query_area (MugData *mugdata)
mug_msg_view_set_msg (MUG_MSG_VIEW(mugdata->msgview), NULL); mug_msg_view_set_msg (MUG_MSG_VIEW(mugdata->msgview), NULL);
g_signal_connect (G_OBJECT(mugdata->mlist), "msg-selected", g_signal_connect (G_OBJECT(mugdata->mlist), "msg-selected",
G_CALLBACK(on_msg_selected), mugdata); 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); gtk_paned_add2 (GTK_PANED (paned), mugdata->msgview);
mugdata->querybar = mug_querybar(); mugdata->querybar = mug_querybar();