aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Barnes <mbarnes@redhat.com>2014-03-27 02:06:11 +0800
committerMatthew Barnes <mbarnes@redhat.com>2014-03-27 08:24:34 +0800
commita9465c3506ae0310751b5f1503117f0eb8350b4b (patch)
tree9426639a64777b14283ffe9a0255cf973dc30afb
parentf7688facc941a569bcf7d6fa78bb28f90a24a007 (diff)
downloadgsoc2013-evolution-a9465c3506ae0310751b5f1503117f0eb8350b4b.tar
gsoc2013-evolution-a9465c3506ae0310751b5f1503117f0eb8350b4b.tar.gz
gsoc2013-evolution-a9465c3506ae0310751b5f1503117f0eb8350b4b.tar.bz2
gsoc2013-evolution-a9465c3506ae0310751b5f1503117f0eb8350b4b.tar.lz
gsoc2013-evolution-a9465c3506ae0310751b5f1503117f0eb8350b4b.tar.xz
gsoc2013-evolution-a9465c3506ae0310751b5f1503117f0eb8350b4b.tar.zst
gsoc2013-evolution-a9465c3506ae0310751b5f1503117f0eb8350b4b.zip
EMFolderSelector: Use an ETreeViewFrame.
Convert the folder selector's "New" button to a [+] button on an inline toolbar beneath the folder tree. The symbolic button looks better, and clicking it no longer triggers a "response" signal, which terminates a gtk_dialog_run() call. We don't want gtk_dialog_run() to terminate in this case.
-rw-r--r--mail/em-folder-selector.c121
1 files changed, 62 insertions, 59 deletions
diff --git a/mail/em-folder-selector.c b/mail/em-folder-selector.c
index 5f9c0e5505..a62d073e18 100644
--- a/mail/em-folder-selector.c
+++ b/mail/em-folder-selector.c
@@ -39,17 +39,14 @@
(G_TYPE_INSTANCE_GET_PRIVATE \
((obj), EM_TYPE_FOLDER_SELECTOR, EMFolderSelectorPrivate))
-/* Dialog response code. */
-#define EM_FOLDER_SELECTOR_RESPONSE_NEW 1
-
#define DEFAULT_BUTTON_LABEL N_("_OK")
struct _EMFolderSelectorPrivate {
- EMFolderTree *folder_tree; /* not referenced */
EMFolderTreeModel *model;
GtkWidget *alert_bar;
GtkWidget *caption_label;
GtkWidget *content_area;
+ GtkWidget *tree_view_frame;
GtkEntry *name_entry;
gchar *selected_uri;
@@ -129,6 +126,29 @@ folder_selector_activated_cb (EMFolderTree *emft,
}
static void
+folder_selector_action_add_cb (ETreeViewFrame *tree_view_frame,
+ GtkAction *action,
+ EMFolderSelector *selector)
+{
+ EMFolderTree *folder_tree;
+ EMailSession *session;
+ const gchar *uri;
+
+ folder_tree = em_folder_selector_get_folder_tree (selector);
+
+ g_object_set_data (
+ G_OBJECT (folder_tree),
+ "select", GUINT_TO_POINTER (1));
+
+ session = em_folder_tree_get_session (folder_tree);
+
+ uri = em_folder_selector_get_selected_uri (selector);
+
+ em_folder_utils_create_folder (
+ GTK_WINDOW (selector), session, folder_tree, uri);
+}
+
+static void
folder_selector_set_model (EMFolderSelector *selector,
EMFolderTreeModel *model)
{
@@ -223,6 +243,7 @@ folder_selector_dispose (GObject *object)
g_clear_object (&priv->alert_bar);
g_clear_object (&priv->caption_label);
g_clear_object (&priv->content_area);
+ g_clear_object (&priv->tree_view_frame);
/* Chain up to parent's dispose() method. */
G_OBJECT_CLASS (em_folder_selector_parent_class)->dispose (object);
@@ -249,6 +270,7 @@ folder_selector_constructed (GObject *object)
EMFolderSelector *selector;
EMailSession *session;
EMFolderTreeModel *model;
+ GtkAction *action;
GtkWidget *content_area;
GtkWidget *container;
GtkWidget *widget;
@@ -275,7 +297,6 @@ folder_selector_constructed (GObject *object)
gtk_dialog_add_buttons (
GTK_DIALOG (selector),
- _("_New"), EM_FOLDER_SELECTOR_RESPONSE_NEW,
_("_Cancel"), GTK_RESPONSE_CANCEL,
selector->priv->default_button_label, GTK_RESPONSE_OK, NULL);
@@ -285,14 +306,6 @@ folder_selector_constructed (GObject *object)
GTK_DIALOG (selector), GTK_RESPONSE_OK);
widget = gtk_dialog_get_widget_for_response (
- GTK_DIALOG (selector), EM_FOLDER_SELECTOR_RESPONSE_NEW);
-
- g_object_bind_property (
- selector, "can-create",
- widget, "visible",
- G_BINDING_SYNC_CREATE);
-
- widget = gtk_dialog_get_widget_for_response (
GTK_DIALOG (selector), GTK_RESPONSE_OK);
/* No need to synchronize properties. */
@@ -306,22 +319,32 @@ folder_selector_constructed (GObject *object)
selector->priv->alert_bar = g_object_ref (widget);
/* EAlertBar controls its own visibility. */
- widget = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_policy (
- GTK_SCROLLED_WINDOW (widget),
- GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_set_shadow_type (
- GTK_SCROLLED_WINDOW (widget), GTK_SHADOW_IN);
+ widget = e_tree_view_frame_new ();
gtk_box_pack_end (GTK_BOX (container), widget, TRUE, TRUE, 0);
+ selector->priv->tree_view_frame = g_object_ref (widget);
gtk_widget_show (widget);
+ g_signal_connect (
+ widget,
+ "toolbar-action-activate::"
+ E_TREE_VIEW_FRAME_ACTION_ADD,
+ G_CALLBACK (folder_selector_action_add_cb),
+ selector);
+
+ g_object_bind_property (
+ selector, "can-create",
+ widget, "toolbar-visible",
+ G_BINDING_SYNC_CREATE);
+
container = widget;
widget = em_folder_tree_new_with_model (
session, E_ALERT_SINK (selector), model);
emu_restore_folder_tree_state (EM_FOLDER_TREE (widget));
- gtk_container_add (GTK_CONTAINER (container), widget);
- selector->priv->folder_tree = EM_FOLDER_TREE (widget);
+ e_tree_view_frame_set_tree_view (
+ E_TREE_VIEW_FRAME (container),
+ GTK_TREE_VIEW (widget));
+ gtk_widget_grab_focus (widget);
gtk_widget_show (widget);
g_signal_connect (
@@ -346,38 +369,15 @@ folder_selector_constructed (GObject *object)
widget, "label",
G_BINDING_DEFAULT);
- gtk_widget_grab_focus (GTK_WIDGET (selector->priv->folder_tree));
-}
-
-static void
-folder_selector_response (GtkDialog *dialog,
- gint response_id)
-{
- EMFolderSelectorPrivate *priv;
-
- /* Do not chain up. GtkDialog does not implement this method. */
-
- priv = EM_FOLDER_SELECTOR_GET_PRIVATE (dialog);
+ action = e_tree_view_frame_lookup_toolbar_action (
+ E_TREE_VIEW_FRAME (selector->priv->tree_view_frame),
+ E_TREE_VIEW_FRAME_ACTION_ADD);
+ gtk_action_set_tooltip (action, _("Create a new folder"));
- if (response_id == EM_FOLDER_SELECTOR_RESPONSE_NEW) {
- EMailSession *session;
- const gchar *uri;
-
- g_object_set_data (
- G_OBJECT (priv->folder_tree),
- "select", GUINT_TO_POINTER (1));
-
- session = em_folder_tree_get_session (priv->folder_tree);
-
- uri = em_folder_selector_get_selected_uri (
- EM_FOLDER_SELECTOR (dialog));
-
- em_folder_utils_create_folder (
- GTK_WINDOW (dialog), session,
- priv->folder_tree, uri);
-
- g_signal_stop_emission_by_name (dialog, "response");
- }
+ action = e_tree_view_frame_lookup_toolbar_action (
+ E_TREE_VIEW_FRAME (selector->priv->tree_view_frame),
+ E_TREE_VIEW_FRAME_ACTION_REMOVE);
+ gtk_action_set_visible (action, FALSE);
}
static void
@@ -427,7 +427,6 @@ static void
em_folder_selector_class_init (EMFolderSelectorClass *class)
{
GObjectClass *object_class;
- GtkDialogClass *dialog_class;
g_type_class_add_private (class, sizeof (EMFolderSelectorPrivate));
@@ -438,9 +437,6 @@ em_folder_selector_class_init (EMFolderSelectorClass *class)
object_class->finalize = folder_selector_finalize;
object_class->constructed = folder_selector_constructed;
- dialog_class = GTK_DIALOG_CLASS (class);
- dialog_class->response = folder_selector_response;
-
class->folder_selected = folder_selector_folder_selected;
g_object_class_install_property (
@@ -774,9 +770,15 @@ em_folder_selector_get_content_area (EMFolderSelector *selector)
EMFolderTree *
em_folder_selector_get_folder_tree (EMFolderSelector *selector)
{
+ ETreeViewFrame *tree_view_frame;
+ GtkTreeView *tree_view;
+
g_return_val_if_fail (EM_IS_FOLDER_SELECTOR (selector), NULL);
- return selector->priv->folder_tree;
+ tree_view_frame = E_TREE_VIEW_FRAME (selector->priv->tree_view_frame);
+ tree_view = e_tree_view_frame_get_tree_view (tree_view_frame);
+
+ return EM_FOLDER_TREE (tree_view);
}
/**
@@ -833,16 +835,17 @@ em_folder_selector_set_selected (EMFolderSelector *selector,
CamelStore *store,
const gchar *folder_name)
{
+ EMFolderTree *folder_tree;
gchar *folder_uri;
g_return_if_fail (EM_IS_FOLDER_SELECTOR (selector));
g_return_if_fail (CAMEL_IS_STORE (store));
g_return_if_fail (folder_name != NULL);
+ folder_tree = em_folder_selector_get_folder_tree (selector);
folder_uri = e_mail_folder_uri_build (store, folder_name);
- em_folder_tree_set_selected (
- selector->priv->folder_tree, folder_uri, FALSE);
+ em_folder_tree_set_selected (folder_tree, folder_uri, FALSE);
g_free (folder_uri);
}