mirror of https://github.com/djcb/mu.git
* mug.c: show error dialogs for errors; focus query when there was a parse error
This commit is contained in:
parent
bb9b7081df
commit
f59ac88118
|
@ -29,7 +29,7 @@ enum _MuResult {
|
|||
MU_ERROR_QUERY,
|
||||
MU_ERROR_INTERNAL,
|
||||
|
||||
MU_ERROR /* some error occured */
|
||||
MU_ERROR /* some other error occured */
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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));
|
||||
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
#define __MUG_MSG_LIST_VIEW_H__
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
/* 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 */
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue