[evince/wip/recent-view: 9/10] shell: Integrate recent view into the main window



commit 8833ea3c751d6af63443189f3d73ec5d0c1f98e2
Author: Germán Poo-Caamaño <gpoo gnome org>
Date:   Tue Jun 24 20:02:23 2014 -0700

    shell: Integrate recent view into the main window
    
    https://bugzilla.gnome.org/show_bug.cgi?id=633501

 shell/ev-application.c |    2 +
 shell/ev-window.c      |  148 +++++++++++++++++++++++++++++++++++++++---------
 shell/ev-window.h      |    1 +
 3 files changed, 123 insertions(+), 28 deletions(-)
---
diff --git a/shell/ev-application.c b/shell/ev-application.c
index d1aa053..bf5851b 100644
--- a/shell/ev-application.c
+++ b/shell/ev-application.c
@@ -680,6 +680,8 @@ ev_application_open_window (EvApplication *application,
        {
                gtk_window_present_with_time (GTK_WINDOW (new_window), timestamp);
        }
+
+       ev_window_open_recent_view (EV_WINDOW (new_window));
 }
 
 #ifdef ENABLE_DBUS
diff --git a/shell/ev-window.c b/shell/ev-window.c
index 4ae4829..89e636d 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -51,7 +51,6 @@
 #include "ev-document-images.h"
 #include "ev-document-links.h"
 #include "ev-document-annotations.h"
-#include "ev-document-type-builtins.h"
 #include "ev-document-misc.h"
 #include "ev-file-exporter.h"
 #include "ev-file-helpers.h"
@@ -89,6 +88,7 @@
 #include "ev-zoom-action.h"
 #include "ev-toolbar.h"
 #include "ev-bookmarks.h"
+#include "ev-recent-view.h"
 
 #ifdef ENABLE_DBUS
 #include "ev-gdbus-generated.h"
@@ -182,6 +182,9 @@ struct _EvWindowPrivate {
        GtkWidget    *attachment_popup;
        GList        *attach_list;
 
+       /* For bookshelf view of recent items*/
+       EvRecentView *recent_view;
+
        /* Document */
        EvDocumentModel *model;
        char *uri;
@@ -368,6 +371,11 @@ static void     ev_window_setup_bookmarks               (EvWindow         *windo
 static void     ev_window_show_find_bar                 (EvWindow         *ev_window,
                                                         gboolean          restart);
 static void     ev_window_close_find_bar                (EvWindow         *ev_window);
+static void     ev_window_show_recent_view              (EvWindow         *ev_window);
+static void     ev_window_hide_recent_view              (EvWindow         *ev_window);
+static void     recent_view_item_activated_cb           (EvRecentView     *recent_view,
+                                                         const char       *uri,
+                                                         EvWindow         *ev_window);
 
 static gchar *nautilus_sendto = NULL;
 
@@ -394,9 +402,11 @@ ev_window_set_action_enabled (EvWindow   *ev_window,
 }
 
 static void
-ev_window_setup_action_sensitivity (EvWindow *ev_window)
+ev_window_update_actions_sensitivity (EvWindow *ev_window)
 {
        EvDocument *document = ev_window->priv->document;
+       EvView     *view = EV_VIEW (ev_window->priv->view);
+       GAction    *action;
        const EvDocumentInfo *info = NULL;
        gboolean has_document = FALSE;
        gboolean ok_to_print = TRUE;
@@ -404,13 +414,20 @@ ev_window_setup_action_sensitivity (EvWindow *ev_window)
        gboolean has_properties = TRUE;
        gboolean override_restrictions = TRUE;
        gboolean can_get_text = FALSE;
-       gboolean has_pages = FALSE;
        gboolean can_find = FALSE;
+       gboolean can_find_in_page = FALSE;
+       gboolean presentation_mode;
+       gboolean dual_mode = FALSE;
+       gboolean has_pages = FALSE;
+       int      n_pages = 0, page = -1;
 
        if (document) {
                has_document = TRUE;
-               has_pages = ev_document_get_n_pages (document) > 0;
                info = ev_document_get_info (document);
+               page = ev_document_model_get_page (ev_window->priv->model);
+               n_pages = ev_document_get_n_pages (ev_window->priv->document);
+               has_pages = n_pages > 0;
+               dual_mode = ev_document_model_get_dual_page (ev_window->priv->model);
        }
 
        if (!info || info->fields_mask == 0) {
@@ -477,25 +494,14 @@ ev_window_setup_action_sensitivity (EvWindow *ev_window)
        ev_window_set_action_enabled (ev_window, "add-bookmark",
                                        has_pages && ev_window->priv->bookmarks);
 
-        ev_window_update_actions_sensitivity (ev_window);
-}
-
-static void
-ev_window_update_actions_sensitivity (EvWindow *ev_window)
-{
-       EvView *view = EV_VIEW (ev_window->priv->view);
-       int n_pages = 0, page = -1;
-       gboolean has_pages = FALSE;
-       gboolean presentation_mode;
-       gboolean can_find_in_page = FALSE;
-       gboolean dual_mode = FALSE;
+       /* Recent View */
+       ev_window_set_action_enabled (ev_window, "recent-view", has_document);
+       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 (ev_window->priv->document) {
-               page = ev_document_model_get_page (ev_window->priv->model);
-               n_pages = ev_document_get_n_pages (ev_window->priv->document);
-               has_pages = n_pages > 0;
-               dual_mode = ev_document_model_get_dual_page (ev_window->priv->model);
-       }
+       ev_window_set_action_enabled (ev_window, "recent-view", has_document);
+       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));
 
        can_find_in_page = (ev_window->priv->find_job &&
                            ev_job_find_has_results (EV_JOB_FIND (ev_window->priv->find_job)));
@@ -1395,7 +1401,7 @@ override_restrictions_changed (GSettings *settings,
                               gchar     *key,
                               EvWindow  *ev_window)
 {
-       ev_window_setup_action_sensitivity (ev_window);
+       ev_window_update_actions_sensitivity (ev_window);
 }
 
 #ifdef HAVE_DESKTOP_SCHEMAS
@@ -1404,7 +1410,7 @@ lockdown_changed (GSettings   *lockdown,
                  const gchar *key,
                  EvWindow    *ev_window)
 {
-       ev_window_setup_action_sensitivity (ev_window);
+       ev_window_update_actions_sensitivity (ev_window);
 }
 #endif
 
@@ -1455,7 +1461,7 @@ ev_window_setup_document (EvWindow *ev_window)
        }
 #endif
 
-       ev_window_setup_action_sensitivity (ev_window);
+       ev_window_update_actions_sensitivity (ev_window);
 
        if (ev_window->priv->properties) {
                ev_properties_dialog_set_document (EV_PROPERTIES_DIALOG (ev_window->priv->properties),
@@ -1534,6 +1540,8 @@ ev_window_set_document (EvWindow *ev_window, EvDocument *document)
                                           _("The document contains only empty pages"));
        }
 
+       ev_window_hide_recent_view (ev_window);
+
        if (EV_WINDOW_IS_PRESENTATION (ev_window)) {
                gint current_page;
 
@@ -2232,6 +2240,12 @@ ev_window_open_document (EvWindow       *ev_window,
                                  ev_window);
 }
 
+void
+ev_window_open_recent_view (EvWindow *ev_window)
+{
+       ev_window_show_recent_view (EV_WINDOW (ev_window));
+}
+
 static void
 ev_window_reload_local (EvWindow *ev_window)
 {
@@ -4070,6 +4084,7 @@ ev_window_run_fullscreen (EvWindow *window)
 
        if (window->priv->metadata && !ev_window_is_empty (window))
                ev_metadata_set_boolean (window->priv->metadata, "fullscreen", TRUE);
+       ev_window_update_actions_sensitivity (window);
 }
 
 static void
@@ -4105,6 +4120,7 @@ ev_window_stop_fullscreen (EvWindow *window,
 
        if (window->priv->metadata && !ev_window_is_empty (window))
                ev_metadata_set_boolean (window->priv->metadata, "fullscreen", FALSE);
+       ev_window_update_actions_sensitivity (window);
 }
 
 static void
@@ -4552,6 +4568,20 @@ ev_window_cmd_go_backwards (GSimpleAction *action,
        }
 }
 
+static void
+ev_window_cmd_toggle_recent_view (GSimpleAction *action,
+                                  GVariant      *parameter,
+                                  gpointer      user_data)
+{
+       EvWindow  *ev_window = user_data;
+       EvToolbar *toolbar = EV_TOOLBAR (ev_window->priv->toolbar);
+
+       if (ev_toolbar_get_mode (toolbar) == EV_TOOLBAR_MODE_NORMAL)
+               ev_window_show_recent_view (ev_window);
+       else
+               ev_window_hide_recent_view (ev_window);
+}
+
 static gint
 compare_bookmarks (EvBookmark *a,
                   EvBookmark *b)
@@ -5033,6 +5063,21 @@ find_sidebar_result_activated_cb (EvFindSidebar *find_sidebar,
 }
 
 static void
+recent_view_item_activated_cb (EvRecentView *recent_view,
+                               const char   *uri,
+                               EvWindow     *ev_window)
+{
+       if (g_strcmp0 (ev_window->priv->uri, uri) == 0) {
+               ev_window_hide_recent_view (ev_window);
+               return;
+       }
+
+       ev_application_open_uri_at_dest (EV_APP, uri,
+                                        gtk_window_get_screen (GTK_WINDOW (ev_window)),
+                                        NULL, 0, NULL, gtk_get_current_event_time ());
+}
+
+static void
 ev_window_update_find_status_message (EvWindow *ev_window)
 {
        gchar *message;
@@ -5708,6 +5753,7 @@ static const GActionEntry actions[] = {
        { "escape", ev_window_cmd_escape },
        { "open-menu", ev_window_cmd_action_menu },
        { "caret-navigation", NULL, NULL, "false", ev_window_cmd_view_toggle_caret_navigation },
+       { "recent-view", NULL, NULL, "false", ev_window_cmd_toggle_recent_view },
 
        /* Popups specific items */
        { "open-link", ev_window_popup_cmd_open_link },
@@ -6775,7 +6821,7 @@ ev_window_init (EvWindow *ev_window)
        gtk_box_pack_start (GTK_BOX (ev_window->priv->main_box),
                            ev_window->priv->find_bar,
                            FALSE, TRUE, 0);
-
+       
        /* Add the main area */
        ev_window->priv->hpaned = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
        g_signal_connect (ev_window->priv->hpaned,
@@ -7054,7 +7100,7 @@ ev_window_init (EvWindow *ev_window)
         gtk_window_set_hide_titlebar_when_maximized (GTK_WINDOW (ev_window), TRUE);
 
         ev_window_sizing_mode_changed_cb (ev_window->priv->model, NULL, ev_window);
-       ev_window_setup_action_sensitivity (ev_window);
+       ev_window_update_actions_sensitivity (ev_window);
 
        /* Drag and Drop */
        gtk_drag_dest_set (GTK_WIDGET (ev_window),
@@ -7069,7 +7115,8 @@ ev_window_init (EvWindow *ev_window)
  *
  * Creates a #GtkWidget that represents the window.
  *
- * Returns: the #GtkWidget that represents the window.
+ * Returns: the #GtkWidget that represents the window with the Recent View
+ * activated..
  */
 GtkWidget *
 ev_window_new (void)
@@ -7085,6 +7132,51 @@ ev_window_new (void)
        return ev_window;
 }
 
+static void
+ev_window_show_recent_view (EvWindow *ev_window)
+{
+       GAction *action;
+       gboolean has_document;
+       EvToolbar *toolbar = EV_TOOLBAR (ev_window->priv->toolbar);
+
+       has_document = ev_window->priv->document != NULL;
+
+       gtk_widget_hide (ev_window->priv->hpaned);
+       gtk_widget_hide (ev_window->priv->find_bar);
+
+       if (!ev_window->priv->recent_view) {
+               ev_window->priv->recent_view = EV_RECENT_VIEW (ev_recent_view_new ());
+               g_signal_connect_object (ev_window->priv->recent_view,
+                                        "item-activated",
+                                        G_CALLBACK (recent_view_item_activated_cb),
+                                        ev_window, 0);
+               gtk_box_pack_start (GTK_BOX (ev_window->priv->main_box),
+                                   GTK_WIDGET (ev_window->priv->recent_view),
+                                   TRUE, TRUE, 0);
+       }
+
+       ev_window_set_action_enabled (ev_window, "recent-view", has_document);
+       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));
+       gtk_widget_show (GTK_WIDGET (ev_window->priv->recent_view));
+
+       ev_toolbar_set_mode (toolbar, EV_TOOLBAR_MODE_RECENT_VIEW);
+}
+
+static void
+ev_window_hide_recent_view (EvWindow *ev_window)
+{
+       EvToolbar *toolbar = EV_TOOLBAR (ev_window->priv->toolbar);
+
+       if (ev_window->priv->recent_view)
+               gtk_widget_hide (GTK_WIDGET (ev_window->priv->recent_view));
+
+       gtk_widget_show (ev_window->priv->hpaned);
+       ev_window_update_actions_sensitivity (ev_window);
+
+       ev_toolbar_set_mode (toolbar, EV_TOOLBAR_MODE_NORMAL);
+}
+
 const gchar *
 ev_window_get_dbus_object_path (EvWindow *ev_window)
 {
diff --git a/shell/ev-window.h b/shell/ev-window.h
index f420e97..a3795cf 100644
--- a/shell/ev-window.h
+++ b/shell/ev-window.h
@@ -83,6 +83,7 @@ void          ev_window_open_document                  (EvWindow       *ev_window,
                                                           EvLinkDest     *dest,
                                                           EvWindowRunMode mode,
                                                           const gchar    *search_string);
+void       ev_window_open_recent_view           (EvWindow       *ev_window);
 gboolean       ev_window_is_empty                       (const EvWindow *ev_window);
 void           ev_window_print_range                    (EvWindow       *ev_window,
                                                           int             first_page,


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