Implement top toolbar and titles in ModestShellWindow
authorJose Dapena Paz <jdapena@igalia.com>
Tue, 1 Dec 2009 09:39:40 +0000 (10:39 +0100)
committerJose Dapena Paz <jdapena@igalia.com>
Tue, 1 Dec 2009 09:39:40 +0000 (10:39 +0100)
src/gtk/modest-shell.c
src/gtk/modest-shell.h

index 8762843..581a3b8 100644 (file)
@@ -36,11 +36,18 @@ static void modest_shell_class_init (ModestShellClass *klass);
 static void modest_shell_instance_init (ModestShell *obj);
 static void modest_shell_finalize   (GObject *obj);
 
+static void update_title (ModestShell *self);
+
 
 typedef struct _ModestShellPrivate ModestShellPrivate;
 struct _ModestShellPrivate {
        GtkWidget *main_vbox;
        GtkWidget *notebook;
+       GtkWidget *top_toolbar;
+       GtkToolItem *back_button;
+       GtkToolItem *title_button;
+       GtkWidget *title_label;
+       GtkWidget *subtitle_label;
 };
 #define MODEST_SHELL_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
                                                                      MODEST_TYPE_SHELL, \
@@ -90,16 +97,40 @@ static void
 modest_shell_instance_init (ModestShell *obj)
 {
        ModestShellPrivate *priv;
+       GtkWidget *title_vbox;
 
        priv = MODEST_SHELL_GET_PRIVATE(obj);
 
        priv->main_vbox = gtk_vbox_new (FALSE, 0);
        gtk_widget_show (priv->main_vbox);
 
+       priv->top_toolbar = gtk_toolbar_new ();
+       gtk_widget_show (priv->top_toolbar);
+       gtk_box_pack_start (GTK_BOX (priv->main_vbox), priv->top_toolbar, FALSE, FALSE, 0);
+
+       priv->back_button = gtk_tool_button_new_from_stock (GTK_STOCK_GO_BACK);
+       gtk_toolbar_insert (GTK_TOOLBAR (priv->top_toolbar), priv->back_button, -1);
+       gtk_widget_show (GTK_WIDGET (priv->back_button));
+
+       title_vbox = gtk_vbox_new (FALSE, 0);
+       priv->title_label = gtk_label_new (NULL);
+       priv->subtitle_label = gtk_label_new (NULL);
+       gtk_widget_show (priv->title_label);
+       gtk_widget_show (priv->subtitle_label);
+       gtk_box_pack_start (GTK_BOX (title_vbox), priv->title_label, TRUE, TRUE, 0);
+       gtk_box_pack_start (GTK_BOX (title_vbox), priv->subtitle_label, FALSE, FALSE, 0);
+
+       priv->title_button = gtk_tool_button_new (NULL, NULL);
+       gtk_widget_show (GTK_WIDGET (priv->title_button));
+       gtk_tool_button_set_label_widget (GTK_TOOL_BUTTON (priv->title_button), title_vbox);
+       gtk_toolbar_insert (GTK_TOOLBAR (priv->top_toolbar), priv->title_button, -1);
+       gtk_container_child_set (GTK_CONTAINER (priv->top_toolbar), GTK_WIDGET (priv->title_button), "expand", TRUE, NULL);
+
        priv->notebook = gtk_notebook_new ();
        gtk_widget_show (priv->notebook);
        gtk_box_pack_start (GTK_BOX (priv->main_vbox), priv->notebook, TRUE, TRUE, 0);
        gtk_container_add (GTK_CONTAINER (obj), priv->main_vbox);
+
 }
 
 static void
@@ -147,6 +178,8 @@ modest_shell_delete_window (ModestShell *shell, ModestWindow *window)
                }
        }
 
+       update_title (shell);
+
        return ret_value;
 }
 
@@ -157,6 +190,7 @@ modest_shell_add_window (ModestShell *shell, ModestWindow *window)
 
        priv = MODEST_SHELL_GET_PRIVATE (shell);
        gtk_notebook_append_page (GTK_NOTEBOOK (priv->notebook), GTK_WIDGET (window), NULL);
+       update_title (shell);
 }
 
 gint
@@ -177,6 +211,8 @@ modest_shell_set_title (ModestShell *shell, ModestWindow *window, const gchar *t
        priv = MODEST_SHELL_GET_PRIVATE (shell);
 
        gtk_notebook_set_tab_label_text (GTK_NOTEBOOK (priv->notebook), GTK_WIDGET (window), title);
+
+       update_title (shell);
 }
 
 void
@@ -184,3 +220,36 @@ modest_shell_show_progress (ModestShell *shell, ModestWindow *window, gboolean s
 {
 }
 
+static void
+update_title (ModestShell *self)
+{
+       gint n_pages, i;
+       ModestShellPrivate *priv;
+       GtkWidget *child;
+       GString *subtitle_buffer;
+
+       priv = MODEST_SHELL_GET_PRIVATE (self);
+
+       n_pages = gtk_notebook_get_n_pages (GTK_NOTEBOOK (priv->notebook));
+       if (n_pages == 0) {
+               gtk_label_set_text (GTK_LABEL (priv->title_label), "");
+               gtk_label_set_text (GTK_LABEL (priv->subtitle_label), "");
+               return;
+       }
+
+       child = gtk_notebook_get_nth_page (GTK_NOTEBOOK (priv->notebook), n_pages - 1);
+       gtk_label_set_text (GTK_LABEL (priv->title_label), 
+                           gtk_notebook_get_tab_label_text (GTK_NOTEBOOK (priv->notebook), child));
+
+       subtitle_buffer = g_string_new ("");
+       for (i = 0; i < n_pages - 1; i++) {
+               if (i != 0) {
+                       subtitle_buffer = g_string_append (subtitle_buffer, " / ");
+               }
+               subtitle_buffer = g_string_append (subtitle_buffer,
+                                                  gtk_notebook_get_tab_label_text (GTK_NOTEBOOK (priv->notebook), child));
+       }
+       gtk_label_set_text (GTK_LABEL (priv->title_label), 
+                           subtitle_buffer->str);
+       g_string_free (subtitle_buffer, TRUE);
+}
index 750ade9..9fa6ad3 100644 (file)
@@ -32,7 +32,7 @@
 
 #include <glib-object.h>
 #include <gtk/gtk.h>
-#include <modest-window.h>
+#include <widgets/modest-window.h>
 
 G_BEGIN_DECLS