diff --git a/mug/Makefile.am b/mug/Makefile.am index 72e3e452..337c5ab3 100644 --- a/mug/Makefile.am +++ b/mug/Makefile.am @@ -44,7 +44,9 @@ mug_SOURCES= \ mug-msg-view.h \ mug-msg-view.c \ mug-query-bar.h \ - mug-query-bar.c + mug-query-bar.c \ + mug-shortcuts.c \ + mug-shortcuts.h mug_LDADD= \ ${top_builddir}/src/libmu.la \ diff --git a/mug/mug-query-bar.c b/mug/mug-query-bar.c index 698010b0..ee5fd6a3 100644 --- a/mug/mug-query-bar.c +++ b/mug/mug-query-bar.c @@ -94,7 +94,6 @@ mug_query_bar_init (MugQueryBar *obj) priv = MUG_QUERY_BAR_GET_PRIVATE(obj); priv->_entry = gtk_entry_new (); - /* gtk_entry_set_max_length (GTK_ENTRY(priv->_entry), 32); */ g_signal_connect (priv->_entry, "activate", G_CALLBACK(on_entry_activated), obj); @@ -116,6 +115,20 @@ mug_query_bar_new (void) } +void +mug_query_bar_set_query (MugQueryBar *self, const char *query, gboolean run) +{ + MugQueryBarPrivate *priv; + + g_return_if_fail (MUG_IS_QUERY_BAR(self)); + priv = MUG_QUERY_BAR_GET_PRIVATE(self); + + gtk_entry_set_text (priv->_entry, query ? query : ""); + + if (run) + on_entry_activated (priv->_entry, self); +} + void mug_query_bar_grab_focus (MugQueryBar *self) diff --git a/mug/mug-query-bar.h b/mug/mug-query-bar.h index 7181a6aa..2c954cf3 100644 --- a/mug/mug-query-bar.h +++ b/mug/mug-query-bar.h @@ -40,6 +40,8 @@ GtkWidget* mug_query_bar_new (void); void mug_query_bar_grab_focus (MugQueryBar *self); +void mug_query_bar_set_query (MugQueryBar *self, const char *query, gboolean run); + G_END_DECLS #endif /* __MUG_QUERY_BAR_H__ */ diff --git a/mug/mug-shortcuts.c b/mug/mug-shortcuts.c new file mode 100644 index 00000000..808b2fc1 --- /dev/null +++ b/mug/mug-shortcuts.c @@ -0,0 +1,155 @@ +/* +** Copyright (C) 2010 Dirk-Jan C. Binnema +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 3, or (at your option) any +** later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software Foundation, +** Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +** +*/ + +#include "mug-shortcuts.h" +#include "mu-bookmarks.h" + +/* include other impl specific header files */ + +/* 'private'/'protected' functions */ +static void mug_shortcuts_class_init (MugShortcutsClass *klass); +static void mug_shortcuts_init (MugShortcuts *obj); +static void mug_shortcuts_finalize (GObject *obj); + +#define MUG_SHORTCUT_BOOKMARK "bookmark" + +/* list my signals */ +enum { + SHORTCUT_CLICKED, + /* MY_SIGNAL_1, */ + /* MY_SIGNAL_2, */ + LAST_SIGNAL +}; + +struct _MugShortcutsPrivate { + GtkWidget *_bbox; + +}; +#define MUG_SHORTCUTS_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ + MUG_TYPE_SHORTCUTS, \ + MugShortcutsPrivate)) +/* globals */ +static GtkVBoxClass *parent_class = NULL; + +static guint signals[LAST_SIGNAL] = {0}; + +G_DEFINE_TYPE (MugShortcuts, mug_shortcuts, GTK_TYPE_VBOX); + +static void +mug_shortcuts_class_init (MugShortcutsClass *klass) +{ + GObjectClass *gobject_class; + gobject_class = (GObjectClass*) klass; + + parent_class = g_type_class_peek_parent (klass); + gobject_class->finalize = mug_shortcuts_finalize; + + g_type_class_add_private (gobject_class, sizeof(MugShortcutsPrivate)); + + /* signal definitions go here, e.g.: */ + signals[SHORTCUT_CLICKED] = + g_signal_new ("clicked", + G_TYPE_FROM_CLASS(gobject_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET(MugShortcutsClass, clicked), + NULL, NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, 1, G_TYPE_STRING); + + +/* signals[MY_SIGNAL_2] = */ +/* g_signal_new ("my_signal_2",....); */ +/* etc. */ +} + +static void +mug_shortcuts_init (MugShortcuts *obj) +{ + obj->_priv = MUG_SHORTCUTS_GET_PRIVATE(obj); + + obj->_priv->_bbox = gtk_vbutton_box_new (); + gtk_button_box_set_layout (GTK_BUTTON_BOX(obj->_priv->_bbox), + GTK_BUTTONBOX_START); + gtk_box_pack_start (GTK_BOX(obj), obj->_priv->_bbox, TRUE, TRUE, 0); +} + +static void +mug_shortcuts_finalize (GObject *obj) +{ +/* free/unref instance resources here */ + G_OBJECT_CLASS(parent_class)->finalize (obj); +} + +static void +on_button_clicked (GtkWidget *button, MugShortcuts *self) +{ + g_signal_emit (G_OBJECT(self), + signals[SHORTCUT_CLICKED], 0, + (const gchar*)g_object_get_data (G_OBJECT(button), + MUG_SHORTCUT_BOOKMARK)); +} + + +static void +each_bookmark (const char* key, const char* val, MugShortcuts *self) +{ + GtkWidget *button; + + button = gtk_button_new_with_label (key); + g_object_set_data_full (G_OBJECT(button), MUG_SHORTCUT_BOOKMARK, + g_strdup(val), g_free); + g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(on_button_clicked), + self); + + gtk_container_add (GTK_CONTAINER(self->_priv->_bbox), button); +} + +static gboolean +init_shortcuts (MugShortcuts *self, const char* bmpath) +{ + MuBookmarks *bookmarks; + + bookmarks = mu_bookmarks_new (bmpath); + if (!bookmarks) + return TRUE; + + mu_bookmarks_foreach (bookmarks, (MuBookmarksForeachFunc)each_bookmark, + self); + + mu_bookmarks_destroy (bookmarks); + return TRUE; +} + +GtkWidget* +mug_shortcuts_new (const char *bmpath) +{ + MugShortcuts *self; + + self = MUG_SHORTCUTS(g_object_new(MUG_TYPE_SHORTCUTS, NULL)); + if (!init_shortcuts (self, bmpath)) { + g_object_unref (self); + return NULL; + } + + return GTK_WIDGET(self); +} + +/* following: other function implementations */ +/* such as mug_shortcuts_do_something, or mug_shortcuts_has_foo */ + diff --git a/mug/mug-shortcuts.h b/mug/mug-shortcuts.h new file mode 100644 index 00000000..16970fc9 --- /dev/null +++ b/mug/mug-shortcuts.h @@ -0,0 +1,69 @@ +/* +** Copyright (C) 2010 Dirk-Jan C. Binnema +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 3, or (at your option) any +** later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software Foundation, +** Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +** +*/ + + +#ifndef __MUG_SHORTCUTS_H__ +#define __MUG_SHORTCUTS_H__ + +#include +/* other include files */ + +G_BEGIN_DECLS + +/* convenience macros */ +#define MUG_TYPE_SHORTCUTS (mug_shortcuts_get_type()) +#define MUG_SHORTCUTS(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),MUG_TYPE_SHORTCUTS,MugShortcuts)) +#define MUG_SHORTCUTS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),MUG_TYPE_SHORTCUTS,MugShortcutsClass)) +#define MUG_IS_SHORTCUTS(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),MUG_TYPE_SHORTCUTS)) +#define MUG_IS_SHORTCUTS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),MUG_TYPE_SHORTCUTS)) +#define MUG_SHORTCUTS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),MUG_TYPE_SHORTCUTS,MugShortcutsClass)) + +typedef struct _MugShortcuts MugShortcuts; +typedef struct _MugShortcutsClass MugShortcutsClass; +typedef struct _MugShortcutsPrivate MugShortcutsPrivate; + +struct _MugShortcuts { + GtkVBox parent; + /* insert public members, if any */ + + /* private */ + MugShortcutsPrivate *_priv; +}; + +struct _MugShortcutsClass { + GtkVBoxClass parent_class; + void (*clicked) (MugShortcuts* obj, const char* query); +}; + +/* member functions */ +GType mug_shortcuts_get_type (void) G_GNUC_CONST; + +/* parameter-less _new function (constructor) */ +/* if this is a kind of GtkWidget, it should probably return at GtkWidget* */ +GtkWidget* mug_shortcuts_new (const char *bmpath); + +/* fill in other public functions, e.g.: */ +/* void mug_shortcuts_do_something (MugShortcuts *self, const gchar* param); */ +/* gboolean mug_shortcuts_has_foo (MugShortcuts *self, gint value); */ + + +G_END_DECLS + +#endif /* __MUG_SHORTCUTS_H__ */ + diff --git a/mug/mug.cc b/mug/mug.cc index dc8d97a4..31af9ff9 100644 --- a/mug/mug.cc +++ b/mug/mug.cc @@ -31,6 +31,7 @@ #include "mug-msg-list-view.h" #include "mug-query-bar.h" #include "mug-msg-view.h" +#include "mug-shortcuts.h" struct _MugData { GtkWidget *win; @@ -39,6 +40,7 @@ struct _MugData { GtkWidget *toolbar; GtkWidget *msgview; GtkWidget *querybar; + GtkWidget *shortcuts; gchar *muhome; }; typedef struct _MugData MugData; @@ -134,6 +136,31 @@ mug_toolbar (MugData *mugdata) return toolbar; } +static void +on_shortcut_clicked (GtkWidget *w, const gchar *query, MugData *mdata) +{ + mug_query_bar_set_query (MUG_QUERY_BAR(mdata->querybar), + query, TRUE); +} + + +static GtkWidget* +mug_shortcuts_bar (MugData *data) +{ + gchar* bmpath; + + bmpath = mu_util_guess_bookmark_file (data->muhome); + data->shortcuts = mug_shortcuts_new (bmpath); + + g_free (bmpath); + + g_signal_connect (G_OBJECT(data->shortcuts), "clicked", + G_CALLBACK(on_shortcut_clicked), data); + + return data->shortcuts; +} + + static GtkWidget* mug_statusbar (void) { @@ -239,9 +266,12 @@ mug_main_area (MugData *mugdata) { GtkWidget *mainarea; - mainarea = gtk_hpaned_new (); - //gtk_paned_add1 (GTK_PANED (mainarea), mug_shortcuts()); - gtk_paned_add2 (GTK_PANED (mainarea), mug_query_area (mugdata)); + mainarea = gtk_hbox_new (FALSE, 0); + + gtk_box_pack_start (GTK_BOX(mainarea), mug_shortcuts_bar(mugdata), + FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(mainarea), mug_query_area(mugdata), + TRUE, TRUE, 0); return mainarea; }