[evince/wip/recent-view: 57/58] ev-toolbar: Implement toolbar with multiple modes



commit f1fcd2314c4ea203f2390a36aca4cbd7a87fc56d
Author: Germán Poo-Caamaño <gpoo gnome org>
Date:   Tue Jun 24 20:01:12 2014 -0700

    ev-toolbar: Implement toolbar with multiple modes
    
    Given the restrictions of GtkHeaderBar for reparenting, we must
    implement multiple modes for the toolbar, which can be customized
    for Recent View, Full Screen, Preview and Document (normal).
    
    For now, Full Screen, Preview and Document are the same.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=633501

 shell/ev-toolbar.c |   85 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 shell/ev-toolbar.h |   10 ++++++
 shell/ev-window.c  |   21 ++++++++++---
 3 files changed, 110 insertions(+), 6 deletions(-)
---
diff --git a/shell/ev-toolbar.c b/shell/ev-toolbar.c
index 11a651a..62d589b 100644
--- a/shell/ev-toolbar.c
+++ b/shell/ev-toolbar.c
@@ -1,7 +1,8 @@
 /* ev-toolbar.h
  *  this file is part of evince, a gnome document viewer
  *
- * Copyright (C) 2012 Carlos Garcia Campos <carlosgc gnome org>
+ * Copyright (C) 2012-2014 Carlos Garcia Campos <carlosgc gnome org>
+ * Copyright (C) 2014 Germán Poo-Caamaño <gpoo gnome org>
  *
  * Evince is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by
@@ -48,7 +49,13 @@ struct _EvToolbarPrivate {
         GtkWidget *history_action;
         GtkWidget *zoom_action;
         GtkWidget *page_selector;
+        GtkWidget *navigation_action;
+        GtkWidget *find_button;
+        GtkWidget *recent_view_button;
+        GtkWidget *open_button;
         GMenu *bookmarks_section;
+
+        EvToolbarMode toolbar_mode;
 };
 
 G_DEFINE_TYPE (EvToolbar, ev_toolbar, GTK_TYPE_HEADER_BAR)
@@ -211,8 +218,38 @@ ev_toolbar_constructed (GObject *object)
 
         builder = gtk_builder_new_from_resource ("/org/gnome/evince/shell/ui/menus.ui");
 
+        /* View of recent items */
+        button = ev_toolbar_create_toggle_button (ev_toolbar, "win.recent-view",
+                                                  "view-grid-symbolic",
+                                                  _("Toggle between view of recent items and open 
document"));
+        ev_toolbar->priv->recent_view_button = button;
+        tool_item = GTK_WIDGET (gtk_tool_item_new ());
+        gtk_container_add (GTK_CONTAINER (tool_item), button);
+        gtk_widget_show (button);
+        if (rtl)
+                gtk_widget_set_margin_left (tool_item, 6);
+        else
+                gtk_widget_set_margin_right (tool_item, 6);
+        gtk_container_add (GTK_CONTAINER (ev_toolbar), tool_item);
+        gtk_widget_show (tool_item);
+
+        button = ev_toolbar_create_button (ev_toolbar, "win.open",
+                                           "document-open-symbolic",
+                                           _("Open an existenting document"));
+        tool_item = GTK_WIDGET (gtk_tool_item_new ());
+        ev_toolbar->priv->open_button = tool_item;
+        gtk_container_add (GTK_CONTAINER (tool_item), button);
+        gtk_widget_show (button);
+        if (rtl)
+                gtk_widget_set_margin_left (tool_item, 6);
+        else
+                gtk_widget_set_margin_right (tool_item, 6);
+        gtk_container_add (GTK_CONTAINER (ev_toolbar), tool_item);
+        gtk_widget_show (tool_item);
+
         /* Navigation */
         hbox = ev_toolbar_create_button_group (ev_toolbar);
+        ev_toolbar->priv->navigation_action = hbox;
 
         button = ev_toolbar_create_button (ev_toolbar, "win.go-previous-page",
                                            "go-up-symbolic", _("Previous Page"));
@@ -265,6 +302,7 @@ ev_toolbar_constructed (GObject *object)
         /* Find */
         button = ev_toolbar_create_toggle_button (ev_toolbar, "win.toggle-find", "edit-find-symbolic",
                                                   _("Find a word or phrase in the document"));
+        ev_toolbar->priv->find_button = button;
         tool_item = GTK_WIDGET (gtk_tool_item_new ());
         gtk_container_add (GTK_CONTAINER (tool_item), button);
         gtk_widget_show (button);
@@ -334,6 +372,7 @@ ev_toolbar_constructed (GObject *object)
                           ev_toolbar);
         ev_toolbar_setup_bookmarks_menu (ev_toolbar, bookmarks_submenu_model);
 
+        ev_toolbar->priv->toolbar_mode = EV_TOOLBAR_MODE_NORMAL;
         g_object_unref (builder);
 }
 
@@ -417,3 +456,47 @@ ev_toolbar_get_page_selector (EvToolbar *ev_toolbar)
 
         return ev_toolbar->priv->page_selector;
 }
+
+void
+ev_toolbar_set_mode (EvToolbar     *ev_toolbar,
+                     EvToolbarMode  mode)
+{
+        EvToolbarPrivate *priv;
+
+        g_return_if_fail (EV_IS_TOOLBAR (ev_toolbar));
+
+        priv = ev_toolbar->priv;
+
+        if (priv->toolbar_mode == mode)
+                return;
+
+        priv->toolbar_mode = mode;
+
+        switch (mode) {
+        case EV_TOOLBAR_MODE_NORMAL:
+        case EV_TOOLBAR_MODE_FULL_SCREEN:
+        case EV_TOOLBAR_MODE_PRESENTATION:
+        case EV_TOOLBAR_MODE_PREVIEW:
+                gtk_widget_show (priv->view_menu_button);
+                gtk_widget_show (priv->action_menu_button);
+                gtk_widget_show (priv->history_action);
+                gtk_widget_show (priv->zoom_action);
+                gtk_widget_show (priv->page_selector);
+                gtk_widget_show (priv->navigation_action);
+                gtk_widget_show (priv->find_button);
+                gtk_widget_show (priv->recent_view_button);
+                gtk_widget_hide (priv->open_button);
+                break;
+        case EV_TOOLBAR_MODE_RECENT_VIEW:
+                gtk_widget_hide (priv->view_menu_button);
+                gtk_widget_hide (priv->action_menu_button);
+                gtk_widget_hide (priv->history_action);
+                gtk_widget_hide (priv->zoom_action);
+                gtk_widget_hide (priv->page_selector);
+                gtk_widget_hide (priv->navigation_action);
+                gtk_widget_hide (priv->find_button);
+                gtk_widget_show (priv->recent_view_button);
+                gtk_widget_show (priv->open_button);
+                break;
+        }
+}
diff --git a/shell/ev-toolbar.h b/shell/ev-toolbar.h
index 8eba914..2a9478c 100644
--- a/shell/ev-toolbar.h
+++ b/shell/ev-toolbar.h
@@ -26,6 +26,14 @@
 
 G_BEGIN_DECLS
 
+typedef enum {
+       EV_TOOLBAR_MODE_NORMAL,
+       EV_TOOLBAR_MODE_FULL_SCREEN,
+       EV_TOOLBAR_MODE_PRESENTATION,
+       EV_TOOLBAR_MODE_PREVIEW,
+       EV_TOOLBAR_MODE_RECENT_VIEW,
+} EvToolbarMode;
+
 #define EV_TYPE_TOOLBAR              (ev_toolbar_get_type())
 #define EV_TOOLBAR(object)           (G_TYPE_CHECK_INSTANCE_CAST((object), EV_TYPE_TOOLBAR, EvToolbar))
 #define EV_IS_TOOLBAR(object)        (G_TYPE_CHECK_INSTANCE_TYPE((object), EV_TYPE_TOOLBAR))
@@ -52,6 +60,8 @@ GtkWidget *ev_toolbar_new                (EvWindow *window);
 gboolean   ev_toolbar_has_visible_popups (EvToolbar *ev_toolbar);
 void       ev_toolbar_action_menu_popup  (EvToolbar *ev_toolbar);
 GtkWidget *ev_toolbar_get_page_selector  (EvToolbar *ev_toolbar);
+void       ev_toolbar_set_mode           (EvToolbar     *ev_toolbar,
+                                         EvToolbarMode  mode);
 
 G_END_DECLS
 
diff --git a/shell/ev-window.c b/shell/ev-window.c
index 14eb6eb..4f957ce 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -490,6 +490,13 @@ ev_window_setup_action_sensitivity (EvWindow *ev_window)
        action = g_action_map_lookup_action (G_ACTION_MAP (ev_window), "recent-view");
        g_simple_action_set_state (G_SIMPLE_ACTION (action), g_variant_new_boolean (has_document));
 
+       if (has_document)
+               ev_toolbar_set_mode (EV_TOOLBAR (ev_window->priv->toolbar),
+                                    EV_TOOLBAR_MODE_NORMAL);
+       else
+               ev_toolbar_set_mode (EV_TOOLBAR (ev_window->priv->toolbar),
+                                    EV_TOOLBAR_MODE_RECENT_VIEW);
+
         ev_window_update_actions_sensitivity (ev_window);
 }
 
@@ -4568,15 +4575,16 @@ ev_window_cmd_toggle_recent_view (GSimpleAction *action,
                                   GVariant      *parameter,
                                   gpointer      user_data)
 {
-       EvWindow *ev_window = user_data;
+       EvWindow  *ev_window = user_data;
+       EvToolbar *toolbar = EV_TOOLBAR (ev_window->priv->toolbar);
 
-       if (!ev_window->priv->recent_view)
+       if (!ev_window->priv->recent_view) {
                ev_window_show_recent_view (ev_window);
-       else {
+               ev_toolbar_set_mode (toolbar, EV_TOOLBAR_MODE_RECENT_VIEW);
+       } else {
                ev_window_swap_out_recent_view_if_needed (ev_window);
-               ev_window_setup_action_sensitivity (ev_window);
+               ev_toolbar_set_mode (toolbar, EV_TOOLBAR_MODE_NORMAL);
        }
-       return;
 }
 
 static gint
@@ -5066,8 +5074,11 @@ ev_window_swap_out_recent_view_if_needed (EvWindow *ev_window)
        {
                gtk_widget_hide (GTK_WIDGET (ev_window->priv->recent_view));
                ev_window->priv->recent_view = NULL;
+               ev_toolbar_set_mode (EV_TOOLBAR (ev_window->priv->toolbar),
+                                    EV_TOOLBAR_MODE_NORMAL);
        }
        gtk_widget_show (ev_window->priv->hpaned);
+       ev_window_update_actions_sensitivity (ev_window);
 }
 
 static void


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]