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_QUERY,
|
||||||
MU_ERROR_INTERNAL,
|
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 */
|
/* 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));
|
||||||
|
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue