Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/shell
diff options
context:
space:
mode:
Diffstat (limited to 'shell')
-rw-r--r--shell/ev-print-operation.c1
-rw-r--r--shell/ev-properties-dialog.c1
-rw-r--r--shell/ev-sidebar-attachments.c25
-rw-r--r--shell/ev-sidebar-layers.c28
-rw-r--r--shell/ev-sidebar-links.c128
-rw-r--r--shell/ev-sidebar-page.c16
-rw-r--r--shell/ev-sidebar-page.h13
-rw-r--r--shell/ev-sidebar-thumbnails.c120
-rw-r--r--shell/ev-sidebar-thumbnails.h8
-rw-r--r--shell/ev-sidebar.c51
-rw-r--r--shell/ev-sidebar.h18
-rw-r--r--shell/ev-window.c373
-rw-r--r--shell/ev-window.h1
13 files changed, 448 insertions, 335 deletions
diff --git a/shell/ev-print-operation.c b/shell/ev-print-operation.c
index fe5ef54..eb0f9be 100644
--- a/shell/ev-print-operation.c
+++ b/shell/ev-print-operation.c
@@ -28,7 +28,6 @@
#include <glib/gstdio.h>
#include <unistd.h>
-#include "ev-page-cache.h"
#include "ev-file-exporter.h"
#include "ev-jobs.h"
#include "ev-job-scheduler.h"
diff --git a/shell/ev-properties-dialog.c b/shell/ev-properties-dialog.c
index 0ca4661..b19408e 100644
--- a/shell/ev-properties-dialog.c
+++ b/shell/ev-properties-dialog.c
@@ -26,7 +26,6 @@
#include <gtk/gtk.h>
#include "ev-document-fonts.h"
-#include "ev-page-cache.h"
#include "ev-properties-dialog.h"
#include "ev-properties-fonts.h"
#include "ev-properties-view.h"
diff --git a/shell/ev-sidebar-attachments.c b/shell/ev-sidebar-attachments.c
index b63c5ef..d89617b 100644
--- a/shell/ev-sidebar-attachments.c
+++ b/shell/ev-sidebar-attachments.c
@@ -651,13 +651,21 @@ job_finished_callback (EvJobAttachments *job,
g_object_unref (job);
}
+
static void
-ev_sidebar_attachments_set_document (EvSidebarPage *page,
- EvDocument *document)
+ev_sidebar_attachments_document_changed_cb (EvDocumentModel *model,
+ GParamSpec *pspec,
+ EvSidebarAttachments *ev_attachbar)
{
- EvSidebarAttachments *ev_attachbar = EV_SIDEBAR_ATTACHMENTS (page);
+ EvDocument *document = ev_document_model_get_document (model);
EvJob *job;
+ if (!EV_IS_DOCUMENT_ATTACHMENTS (document))
+ return;
+
+ if (!ev_document_attachments_has_attachments (EV_DOCUMENT_ATTACHMENTS (document)))
+ return;
+
if (!ev_attachbar->priv->icon_theme) {
GdkScreen *screen;
@@ -682,6 +690,15 @@ ev_sidebar_attachments_set_document (EvSidebarPage *page,
ev_job_scheduler_push_job (job, EV_JOB_PRIORITY_NONE);
}
+static void
+ev_sidebar_attachments_set_model (EvSidebarPage *page,
+ EvDocumentModel *model)
+{
+ g_signal_connect (model, "notify::document",
+ G_CALLBACK (ev_sidebar_attachments_document_changed_cb),
+ page);
+}
+
static gboolean
ev_sidebar_attachments_support_document (EvSidebarPage *sidebar_page,
EvDocument *document)
@@ -700,7 +717,7 @@ static void
ev_sidebar_attachments_page_iface_init (EvSidebarPageIface *iface)
{
iface->support_document = ev_sidebar_attachments_support_document;
- iface->set_document = ev_sidebar_attachments_set_document;
+ iface->set_model = ev_sidebar_attachments_set_model;
iface->get_label = ev_sidebar_attachments_get_label;
}
diff --git a/shell/ev-sidebar-layers.c b/shell/ev-sidebar-layers.c
index cebd96d..5f16895 100644
--- a/shell/ev-sidebar-layers.c
+++ b/shell/ev-sidebar-layers.c
@@ -346,18 +346,15 @@ job_finished_callback (EvJobLayers *job,
}
static void
-ev_sidebar_layers_set_document (EvSidebarPage *sidebar_page,
- EvDocument *document)
+ev_sidebar_layers_document_changed_cb (EvDocumentModel *model,
+ GParamSpec *pspec,
+ EvSidebarLayers *sidebar_layers)
{
- EvSidebarLayers *sidebar_layers;
- EvSidebarLayersPrivate *priv;
-
- g_return_if_fail (EV_IS_SIDEBAR_PAGE (sidebar_page));
- g_return_if_fail (EV_IS_DOCUMENT (document));
-
- sidebar_layers = EV_SIDEBAR_LAYERS (sidebar_page);
+ EvDocument *document = ev_document_model_get_document (model);
+ EvSidebarLayersPrivate *priv = sidebar_layers->priv;
- priv = sidebar_layers->priv;
+ if (!EV_IS_DOCUMENT_LAYERS (document))
+ return;
if (priv->document) {
gtk_tree_view_set_model (GTK_TREE_VIEW (priv->tree_view), NULL);
@@ -381,6 +378,15 @@ ev_sidebar_layers_set_document (EvSidebarPage *sidebar_page,
ev_job_scheduler_push_job (priv->job, EV_JOB_PRIORITY_NONE);
}
+static void
+ev_sidebar_layers_set_model (EvSidebarPage *sidebar_page,
+ EvDocumentModel *model)
+{
+ g_signal_connect (model, "notify::document",
+ G_CALLBACK (ev_sidebar_layers_document_changed_cb),
+ sidebar_page);
+}
+
static gboolean
ev_sidebar_layers_support_document (EvSidebarPage *sidebar_page,
EvDocument *document)
@@ -399,7 +405,7 @@ static void
ev_sidebar_layers_page_iface_init (EvSidebarPageIface *iface)
{
iface->support_document = ev_sidebar_layers_support_document;
- iface->set_document = ev_sidebar_layers_set_document;
+ iface->set_model = ev_sidebar_layers_set_model;
iface->get_label = ev_sidebar_layers_get_label;
}
diff --git a/shell/ev-sidebar-links.c b/shell/ev-sidebar-links.c
index 8993e5f..6eb7e23 100644
--- a/shell/ev-sidebar-links.c
+++ b/shell/ev-sidebar-links.c
@@ -46,7 +46,7 @@ struct _EvSidebarLinksPrivate {
EvJob *job;
GtkTreeModel *model;
EvDocument *document;
- EvPageCache *page_cache;
+ EvDocumentModel *doc_model;
};
enum {
@@ -60,18 +60,20 @@ enum {
N_SIGNALS
};
-static void update_page_callback (EvPageCache *page_cache,
- gint current_page,
- EvSidebarLinks *sidebar_links);
+static void update_page_callback (EvSidebarLinks *sidebar_links,
+ gint old_page,
+ gint current_page);
static void row_activated_callback (GtkTreeView *treeview,
GtkTreePath *arg1,
GtkTreeViewColumn *arg2,
gpointer user_data);
+static void ev_sidebar_links_set_links_model (EvSidebarLinks *links,
+ GtkTreeModel *model);
static void job_finished_callback (EvJobLinks *job,
EvSidebarLinks *sidebar_links);
+static void ev_sidebar_links_set_current_page (EvSidebarLinks *sidebar_links,
+ gint current_page);
static void ev_sidebar_links_page_iface_init (EvSidebarPageIface *iface);
-static void ev_sidebar_links_set_document (EvSidebarPage *sidebar_page,
- EvDocument *document);
static gboolean ev_sidebar_links_support_document (EvSidebarPage *sidebar_page,
EvDocument *document);
static const gchar* ev_sidebar_links_get_label (EvSidebarPage *sidebar_page);
@@ -95,18 +97,12 @@ ev_sidebar_links_set_property (GObject *object,
const GValue *value,
GParamSpec *pspec)
{
- EvSidebarLinks *ev_sidebar_links;
- GtkTreeModel *model;
-
- ev_sidebar_links = EV_SIDEBAR_LINKS (object);
+ EvSidebarLinks *ev_sidebar_links = EV_SIDEBAR_LINKS (object);
switch (prop_id)
{
case PROP_MODEL:
- model = ev_sidebar_links->priv->model;
- ev_sidebar_links->priv->model = GTK_TREE_MODEL (g_value_dup_object (value));
- if (model)
- g_object_unref (model);
+ ev_sidebar_links_set_links_model (ev_sidebar_links, g_value_get_object (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -159,7 +155,7 @@ ev_sidebar_links_dispose (GObject *object)
if (sidebar->priv->document) {
g_object_unref (sidebar->priv->document);
sidebar->priv->document = NULL;
- sidebar->priv->page_cache = NULL;
+ sidebar->priv->doc_model = NULL;
}
G_OBJECT_CLASS (ev_sidebar_links_parent_class)->dispose (object);
@@ -175,9 +171,8 @@ ev_sidebar_links_map (GtkWidget *widget)
GTK_WIDGET_CLASS (ev_sidebar_links_parent_class)->map (widget);
if (links->priv->model) {
- update_page_callback (links->priv->page_cache,
- ev_page_cache_get_current_page (links->priv->page_cache),
- links);
+ ev_sidebar_links_set_current_page (links,
+ ev_document_model_get_page (links->priv->doc_model));
}
}
@@ -239,10 +234,10 @@ selection_changed_callback (GtkTreeSelection *selection,
if (link == NULL)
return;
- g_signal_handler_block (ev_sidebar_links->priv->page_cache,
+ g_signal_handler_block (ev_sidebar_links->priv->doc_model,
ev_sidebar_links->priv->page_changed_id);
g_signal_emit (ev_sidebar_links, signals[LINK_ACTIVATED], 0, link);
- g_signal_handler_unblock (ev_sidebar_links->priv->page_cache,
+ g_signal_handler_unblock (ev_sidebar_links->priv->doc_model,
ev_sidebar_links->priv->page_changed_id);
g_object_unref (link);
@@ -523,7 +518,7 @@ update_page_callback_foreach (GtkTreeModel *model,
dest_page = ev_link_get_page (link);
g_object_unref (link);
- current_page = ev_page_cache_get_current_page (sidebar_links->priv->page_cache);
+ current_page = ev_document_model_get_page (sidebar_links->priv->doc_model);
if (dest_page == current_page) {
gtk_tree_view_expand_to_path (GTK_TREE_VIEW (sidebar_links->priv->tree_view),
@@ -539,9 +534,8 @@ update_page_callback_foreach (GtkTreeModel *model,
}
static void
-update_page_callback (EvPageCache *page_cache,
- gint current_page,
- EvSidebarLinks *sidebar_links)
+ev_sidebar_links_set_current_page (EvSidebarLinks *sidebar_links,
+ gint current_page)
{
GtkTreeSelection *selection;
GtkTreeModel *model;
@@ -586,6 +580,14 @@ update_page_callback (EvPageCache *page_cache,
g_signal_handler_unblock (sidebar_links->priv->tree_view, sidebar_links->priv->row_activated_id);
}
+static void
+update_page_callback (EvSidebarLinks *sidebar_links,
+ gint old_page,
+ gint new_page)
+{
+ ev_sidebar_links_set_current_page (sidebar_links, new_page);
+}
+
static void
row_activated_callback (GtkTreeView *treeview,
GtkTreePath *arg1,
@@ -622,19 +624,32 @@ expand_open_links (GtkTreeView *tree_view, GtkTreeModel *model, GtkTreeIter *par
} while (gtk_tree_model_iter_next (model, &iter));
}
}
-
+
+static void
+ev_sidebar_links_set_links_model (EvSidebarLinks *sidebar_links,
+ GtkTreeModel *model)
+{
+ EvSidebarLinksPrivate *priv = sidebar_links->priv;
+
+ if (priv->model == model)
+ return;
+
+ if (priv->model)
+ g_object_unref (priv->model);
+ priv->model = g_object_ref (model);
+
+ g_object_notify (G_OBJECT (sidebar_links), "model");
+}
+
static void
job_finished_callback (EvJobLinks *job,
EvSidebarLinks *sidebar_links)
{
- EvSidebarLinksPrivate *priv;
+ EvSidebarLinksPrivate *priv = sidebar_links->priv;
GtkTreeSelection *selection;
- priv = sidebar_links->priv;
-
- priv->model = job->model;
- g_object_notify (G_OBJECT (sidebar_links), "model");
-
+ ev_sidebar_links_set_links_model (sidebar_links, job->model);
+
gtk_tree_model_foreach (priv->model, (GtkTreeModelForeachFunc)fill_page_labels, sidebar_links);
gtk_tree_view_set_model (GTK_TREE_VIEW (priv->tree_view), job->model);
@@ -653,34 +668,34 @@ job_finished_callback (EvJobLinks *job,
G_CALLBACK (selection_changed_callback),
sidebar_links);
}
- priv->page_changed_id = g_signal_connect (priv->page_cache, "page-changed",
- G_CALLBACK (update_page_callback),
- sidebar_links);
+ priv->page_changed_id =
+ g_signal_connect_swapped (priv->doc_model, "page-changed",
+ G_CALLBACK (update_page_callback),
+ sidebar_links);
if (priv->row_activated_id <= 0) {
priv->row_activated_id =
g_signal_connect (priv->tree_view, "row-activated",
G_CALLBACK (row_activated_callback),
sidebar_links);
}
-
- update_page_callback (priv->page_cache,
- ev_page_cache_get_current_page (priv->page_cache),
- sidebar_links);
+
+ ev_sidebar_links_set_current_page (sidebar_links,
+ ev_document_model_get_page (priv->doc_model));
}
static void
-ev_sidebar_links_set_document (EvSidebarPage *sidebar_page,
- EvDocument *document)
+ev_sidebar_links_document_changed_cb (EvDocumentModel *model,
+ GParamSpec *pspec,
+ EvSidebarLinks *sidebar_links)
{
- EvSidebarLinks *sidebar_links;
- EvSidebarLinksPrivate *priv;
+ EvDocument *document = ev_document_model_get_document (model);
+ EvSidebarLinksPrivate *priv = sidebar_links->priv;
- g_return_if_fail (EV_IS_SIDEBAR_PAGE (sidebar_page));
- g_return_if_fail (EV_IS_DOCUMENT (document));
-
- sidebar_links = EV_SIDEBAR_LINKS (sidebar_page);
+ if (!EV_IS_DOCUMENT_LINKS (document))
+ return;
- priv = sidebar_links->priv;
+ if (!ev_document_links_has_document_links (EV_DOCUMENT_LINKS (document)))
+ return;
if (priv->document) {
gtk_tree_view_set_model (GTK_TREE_VIEW (priv->tree_view), NULL);
@@ -688,7 +703,6 @@ ev_sidebar_links_set_document (EvSidebarPage *sidebar_page,
}
priv->document = g_object_ref (document);
- priv->page_cache = ev_page_cache_get (document);
if (priv->job) {
g_signal_handlers_disconnect_by_func (priv->job,
@@ -706,6 +720,22 @@ ev_sidebar_links_set_document (EvSidebarPage *sidebar_page,
ev_job_scheduler_push_job (priv->job, EV_JOB_PRIORITY_NONE);
}
+static void
+ev_sidebar_links_set_model (EvSidebarPage *sidebar_page,
+ EvDocumentModel *model)
+{
+ EvSidebarLinks *sidebar_links = EV_SIDEBAR_LINKS (sidebar_page);
+ EvSidebarLinksPrivate *priv = sidebar_links->priv;
+
+ if (priv->doc_model == model)
+ return;
+
+ priv->doc_model = model;
+ g_signal_connect (model, "notify::document",
+ G_CALLBACK (ev_sidebar_links_document_changed_cb),
+ sidebar_page);
+}
+
static gboolean
ev_sidebar_links_support_document (EvSidebarPage *sidebar_page,
EvDocument *document)
@@ -724,7 +754,7 @@ static void
ev_sidebar_links_page_iface_init (EvSidebarPageIface *iface)
{
iface->support_document = ev_sidebar_links_support_document;
- iface->set_document = ev_sidebar_links_set_document;
+ iface->set_model = ev_sidebar_links_set_model;
iface->get_label = ev_sidebar_links_get_label;
}
diff --git a/shell/ev-sidebar-page.c b/shell/ev-sidebar-page.c
index 14bb847..e0cf814 100644
--- a/shell/ev-sidebar-page.c
+++ b/shell/ev-sidebar-page.c
@@ -39,25 +39,25 @@ ev_sidebar_page_support_document (EvSidebarPage *sidebar_page,
iface = EV_SIDEBAR_PAGE_GET_IFACE (sidebar_page);
- g_return_val_if_fail (iface->set_document, FALSE);
+ g_return_val_if_fail (iface->support_document, FALSE);
return iface->support_document (sidebar_page, document);
}
-void
-ev_sidebar_page_set_document (EvSidebarPage *sidebar_page,
- EvDocument *document)
+void
+ev_sidebar_page_set_model (EvSidebarPage *sidebar_page,
+ EvDocumentModel *model)
{
EvSidebarPageIface *iface;
g_return_if_fail (EV_IS_SIDEBAR_PAGE (sidebar_page));
- g_return_if_fail (EV_IS_DOCUMENT (document));
+ g_return_if_fail (EV_IS_DOCUMENT_MODEL (model));
iface = EV_SIDEBAR_PAGE_GET_IFACE (sidebar_page);
- g_assert (iface->set_document);
-
- iface->set_document (sidebar_page, document);
+ g_assert (iface->set_model);
+
+ iface->set_model (sidebar_page, model);
}
const gchar *
diff --git a/shell/ev-sidebar-page.h b/shell/ev-sidebar-page.h
index 3739a07..a3c0f13 100644
--- a/shell/ev-sidebar-page.h
+++ b/shell/ev-sidebar-page.h
@@ -25,6 +25,7 @@
#include <glib.h>
#include "ev-document.h"
+#include "ev-document-model.h"
G_BEGIN_DECLS
@@ -45,16 +46,16 @@ struct _EvSidebarPageIface
/* Methods */
gboolean (* support_document) (EvSidebarPage *sidebar_page,
EvDocument *document);
- void (* set_document) (EvSidebarPage *sidebar_page,
- EvDocument *document);
- const gchar*(* get_label) (EvSidebarPage *sidebar_page);
+ void (* set_model) (EvSidebarPage *sidebar_page,
+ EvDocumentModel *model);
+ const gchar*(* get_label) (EvSidebarPage *sidebar_page);
};
-GType ev_sidebar_page_get_type (void);
+GType ev_sidebar_page_get_type (void) G_GNUC_CONST;
gboolean ev_sidebar_page_support_document (EvSidebarPage *sidebar_page,
EvDocument *document);
-void ev_sidebar_page_set_document (EvSidebarPage *sidebar_page,
- EvDocument *document);
+void ev_sidebar_page_set_model (EvSidebarPage *sidebar_page,
+ EvDocumentModel *model);
const gchar* ev_sidebar_page_get_label (EvSidebarPage *page);
diff --git a/shell/ev-sidebar-thumbnails.c b/shell/ev-sidebar-thumbnails.c
index 7137fa1..e104c3e 100644
--- a/shell/ev-sidebar-thumbnails.c
+++ b/shell/ev-sidebar-thumbnails.c
@@ -66,7 +66,7 @@ struct _EvSidebarThumbnailsPrivate {
GtkListStore *list_store;
GHashTable *loading_icons;
EvDocument *document;
- EvPageCache *page_cache;
+ EvDocumentModel *model;
EvThumbsSizeCache *size_cache;
gint n_pages, pages_done;
@@ -94,8 +94,6 @@ static void ev_sidebar_thumbnails_clear_model (EvSidebarThumbnails
static gboolean ev_sidebar_thumbnails_support_document (EvSidebarPage *sidebar_page,
EvDocument *document);
static void ev_sidebar_thumbnails_page_iface_init (EvSidebarPageIface *iface);
-static void ev_sidebar_thumbnails_set_document (EvSidebarPage *sidebar_page,
- EvDocument *document);
static const gchar* ev_sidebar_thumbnails_get_label (EvSidebarPage *sidebar_page);
static void thumbnail_job_completed_callback (EvJobThumbnail *job,
EvSidebarThumbnails *sidebar_thumbnails);
@@ -585,34 +583,6 @@ ev_sidebar_thumbnails_fill_model (EvSidebarThumbnails *sidebar_thumbnails)
}
}
-static gboolean
-refresh (EvSidebarThumbnails *sidebar_thumbnails)
-{
- adjustment_changed_cb (sidebar_thumbnails);
- return FALSE;
-}
-
-void
-ev_sidebar_thumbnails_refresh (EvSidebarThumbnails *sidebar_thumbnails,
- int rotation)
-{
- sidebar_thumbnails->priv->rotation = rotation;
- if (sidebar_thumbnails->priv->loading_icons)
- g_hash_table_remove_all (sidebar_thumbnails->priv->loading_icons);
-
- if (sidebar_thumbnails->priv->document == NULL ||
- sidebar_thumbnails->priv->n_pages <= 0)
- return;
-
- ev_sidebar_thumbnails_clear_model (sidebar_thumbnails);
- ev_sidebar_thumbnails_fill_model (sidebar_thumbnails);
-
- /* Trigger a redraw */
- sidebar_thumbnails->priv->start_page = -1;
- sidebar_thumbnails->priv->end_page = -1;
- g_idle_add ((GSourceFunc)refresh, sidebar_thumbnails);
-}
-
static void
ev_sidebar_tree_selection_changed (GtkTreeSelection *selection,
EvSidebarThumbnails *ev_sidebar_thumbnails)
@@ -630,7 +600,7 @@ ev_sidebar_tree_selection_changed (GtkTreeSelection *selection,
page = gtk_tree_path_get_indices (path)[0];
gtk_tree_path_free (path);
- ev_page_cache_set_current_page_history (priv->page_cache, page);
+ ev_document_model_set_page (priv->model, page);
}
static void
@@ -655,7 +625,7 @@ ev_sidebar_icon_selection_changed (GtkIconView *icon_view,
gtk_tree_path_free (path);
g_list_free (selected);
- ev_page_cache_set_current_page_history (priv->page_cache, page);
+ ev_document_model_set_page (priv->model, page);
}
static void
@@ -749,9 +719,8 @@ ev_sidebar_thumbnails_init (EvSidebarThumbnails *ev_sidebar_thumbnails)
}
static void
-page_changed_cb (EvPageCache *page_cache,
- int page,
- EvSidebarThumbnails *sidebar)
+ev_sidebar_thumbnails_set_current_page (EvSidebarThumbnails *sidebar,
+ gint page)
{
GtkTreeView *tree_view;
GtkTreePath *path;
@@ -781,6 +750,45 @@ page_changed_cb (EvPageCache *page_cache,
}
static void
+page_changed_cb (EvSidebarThumbnails *sidebar,
+ gint old_page,
+ gint new_page)
+{
+ ev_sidebar_thumbnails_set_current_page (sidebar, new_page);
+}
+
+static gboolean
+refresh (EvSidebarThumbnails *sidebar_thumbnails)
+{
+ adjustment_changed_cb (sidebar_thumbnails);
+ return FALSE;
+}
+
+static void
+ev_sidebar_thumbnails_rotation_changed_cb (EvDocumentModel *model,
+ GParamSpec *pspec,
+ EvSidebarThumbnails *sidebar_thumbnails)
+{
+ gint rotation = ev_document_model_get_rotation (model);
+
+ sidebar_thumbnails->priv->rotation = rotation;
+ if (sidebar_thumbnails->priv->loading_icons)
+ g_hash_table_remove_all (sidebar_thumbnails->priv->loading_icons);
+
+ if (sidebar_thumbnails->priv->document == NULL ||
+ sidebar_thumbnails->priv->n_pages <= 0)
+ return;
+
+ ev_sidebar_thumbnails_clear_model (sidebar_thumbnails);
+ ev_sidebar_thumbnails_fill_model (sidebar_thumbnails);
+
+ /* Trigger a redraw */
+ sidebar_thumbnails->priv->start_page = -1;
+ sidebar_thumbnails->priv->end_page = -1;
+ g_idle_add ((GSourceFunc)refresh, sidebar_thumbnails);
+}
+
+static void
thumbnail_job_completed_callback (EvJobThumbnail *job,
EvSidebarThumbnails *sidebar_thumbnails)
{
@@ -797,15 +805,13 @@ thumbnail_job_completed_callback (EvJobThumbnail *job,
}
static void
-ev_sidebar_thumbnails_set_document (EvSidebarPage *sidebar_page,
- EvDocument *document)
+ev_sidebar_thumbnails_document_changed_cb (EvDocumentModel *model,
+ GParamSpec *pspec,
+ EvSidebarThumbnails *sidebar_thumbnails)
{
- EvSidebarThumbnails *sidebar_thumbnails = EV_SIDEBAR_THUMBNAILS (sidebar_page);
-
+ EvDocument *document = ev_document_model_get_document (model);
EvSidebarThumbnailsPrivate *priv = sidebar_thumbnails->priv;
- priv->page_cache = ev_page_cache_get (document);
-
if (!EV_IS_DOCUMENT_THUMBNAILS (document) ||
ev_document_get_n_pages (document) <= 0 ||
!ev_document_check_dimensions (document)) {
@@ -849,15 +855,35 @@ ev_sidebar_thumbnails_set_document (EvSidebarPage *sidebar_page,
}
/* Connect to the signal and trigger a fake callback */
- g_signal_connect (priv->page_cache, "page-changed", G_CALLBACK (page_changed_cb), sidebar_thumbnails);
+ g_signal_connect_swapped (priv->model, "page-changed",
+ G_CALLBACK (page_changed_cb),
+ sidebar_thumbnails);
+ g_signal_connect (priv->model, "notify::rotation",
+ G_CALLBACK (ev_sidebar_thumbnails_rotation_changed_cb),
+ sidebar_thumbnails);
sidebar_thumbnails->priv->start_page = -1;
sidebar_thumbnails->priv->end_page = -1;
- page_changed_cb (priv->page_cache,
- ev_page_cache_get_current_page (priv->page_cache),
- sidebar_thumbnails);
+ ev_sidebar_thumbnails_set_current_page (sidebar_thumbnails,
+ ev_document_model_get_page (model));
adjustment_changed_cb (sidebar_thumbnails);
}
+static void
+ev_sidebar_thumbnails_set_model (EvSidebarPage *sidebar_page,
+ EvDocumentModel *model)
+{
+ EvSidebarThumbnails *sidebar_thumbnails = EV_SIDEBAR_THUMBNAILS (sidebar_page);
+ EvSidebarThumbnailsPrivate *priv = sidebar_thumbnails->priv;
+
+ if (priv->model == model)
+ return;
+
+ priv->model = model;
+ g_signal_connect (model, "notify::document",
+ G_CALLBACK (ev_sidebar_thumbnails_document_changed_cb),
+ sidebar_page);
+}
+
static gboolean
ev_sidebar_thumbnails_clear_job (GtkTreeModel *model,
GtkTreePath *path,
@@ -903,7 +929,7 @@ static void
ev_sidebar_thumbnails_page_iface_init (EvSidebarPageIface *iface)
{
iface->support_document = ev_sidebar_thumbnails_support_document;
- iface->set_document = ev_sidebar_thumbnails_set_document;
+ iface->set_model = ev_sidebar_thumbnails_set_model;
iface->get_label = ev_sidebar_thumbnails_get_label;
}
diff --git a/shell/ev-sidebar-thumbnails.h b/shell/ev-sidebar-thumbnails.h
index 5a3ddda..d49836d 100644
--- a/shell/ev-sidebar-thumbnails.h
+++ b/shell/ev-sidebar-thumbnails.h
@@ -26,8 +26,6 @@
#include <gtk/gtk.h>
-#include "ev-document.h"
-
G_BEGIN_DECLS
typedef struct _EvSidebarThumbnails EvSidebarThumbnails;
@@ -37,7 +35,7 @@ typedef struct _EvSidebarThumbnailsPrivate EvSidebarThumbnailsPrivate;
#define EV_TYPE_SIDEBAR_THUMBNAILS (ev_sidebar_thumbnails_get_type())
#define EV_SIDEBAR_THUMBNAILS(object) (G_TYPE_CHECK_INSTANCE_CAST((object), EV_TYPE_SIDEBAR_THUMBNAILS, EvSidebarThumbnails))
#define EV_SIDEBAR_THUMBNAILS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), EV_TYPE_SIDEBAR_THUMBNAILS, EvSidebarThumbnailsClass))
-#define EV_IS_SIDEBAR_THUMBNAILS(object) (G_TYPE_CHECK_INSTANCE_TYPE((object), EV_TYPE_SIDEBAR_THUMBNAILS))
+#define EV_IS_SIDEBAR_THUMBNAILS(object) (G_TYPE_CHECK_INSTANCE_TYPE((object), EV_TYPE_SIDEBAR_THUMBNAILS))
#define EV_IS_SIDEBAR_THUMBNAILS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), EV_TYPE_SIDEBAR_THUMBNAILS))
#define EV_SIDEBAR_THUMBNAILS_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS((object), EV_TYPE_SIDEBAR_THUMBNAILS, EvSidebarThumbnailsClass))
@@ -51,10 +49,8 @@ struct _EvSidebarThumbnailsClass {
GtkVBoxClass base_class;
};
-GType ev_sidebar_thumbnails_get_type (void);
+GType ev_sidebar_thumbnails_get_type (void) G_GNUC_CONST;
GtkWidget *ev_sidebar_thumbnails_new (void);
-void ev_sidebar_thumbnails_refresh (EvSidebarThumbnails *sidebar_thumbnails,
- int rotation);
G_END_DECLS
diff --git a/shell/ev-sidebar.c b/shell/ev-sidebar.c
index 2d97381..f15b376 100644
--- a/shell/ev-sidebar.c
+++ b/shell/ev-sidebar.c
@@ -53,7 +53,8 @@ struct _EvSidebarPrivate {
GtkWidget *menu;
GtkWidget *hbox;
GtkWidget *label;
-
+
+ EvDocumentModel *model;
GtkTreeModel *page_model;
};
@@ -439,7 +440,9 @@ ev_sidebar_add_page (EvSidebar *ev_sidebar,
g_return_if_fail (EV_IS_SIDEBAR (ev_sidebar));
g_return_if_fail (EV_IS_SIDEBAR_PAGE (main_widget));
g_return_if_fail (GTK_IS_WIDGET (main_widget));
-
+
+ ev_sidebar_page_set_model (EV_SIDEBAR_PAGE (main_widget),
+ ev_sidebar->priv->model);
title = ev_sidebar_page_get_label (EV_SIDEBAR_PAGE (main_widget));
index = gtk_notebook_append_page (GTK_NOTEBOOK (ev_sidebar->priv->notebook),
@@ -480,22 +483,17 @@ ev_sidebar_add_page (EvSidebar *ev_sidebar,
g_free (label_title);
}
-void
-ev_sidebar_set_document (EvSidebar *sidebar,
- EvDocument *document)
+static void
+ev_sidebar_document_changed_cb (EvDocumentModel *model,
+ GParamSpec *pspec,
+ EvSidebar *sidebar)
{
- EvSidebarPrivate *priv;
+ EvSidebarPrivate *priv = sidebar->priv;
+ EvDocument *document = ev_document_model_get_document (model);
GtkTreeIter iter;
gboolean valid;
- gboolean has_pages;
-
- g_return_if_fail (EV_IS_SIDEBAR (sidebar));
- g_return_if_fail (EV_IS_DOCUMENT (document));
-
- priv = sidebar->priv;
-
- has_pages = FALSE;
-
+ gboolean has_pages = FALSE;
+
for (valid = gtk_tree_model_get_iter_first (priv->page_model, &iter);
valid;
valid = gtk_tree_model_iter_next (priv->page_model, &iter)) {
@@ -506,18 +504,16 @@ ev_sidebar_set_document (EvSidebar *sidebar,
PAGE_COLUMN_MAIN_WIDGET, &widget,
PAGE_COLUMN_MENU_ITEM, &menu_widget,
-1);
-
if (ev_sidebar_page_support_document (EV_SIDEBAR_PAGE (widget), document)) {
- ev_sidebar_page_set_document (EV_SIDEBAR_PAGE (widget), document);
- has_pages = TRUE;
+ has_pages = TRUE;
} else {
- gtk_widget_set_sensitive (menu_widget, FALSE);
+ gtk_widget_set_sensitive (menu_widget, FALSE);
}
g_object_unref (widget);
g_object_unref (menu_widget);
}
-
+
if (!has_pages) {
gtk_widget_hide (GTK_WIDGET (sidebar));
} else {
@@ -526,3 +522,18 @@ ev_sidebar_set_document (EvSidebar *sidebar,
}
}
+void
+ev_sidebar_set_model (EvSidebar *sidebar,
+ EvDocumentModel *model)
+{
+ g_return_if_fail (EV_IS_SIDEBAR (sidebar));
+ g_return_if_fail (EV_IS_DOCUMENT_MODEL (model));
+
+ if (model == sidebar->priv->model)
+ return;
+
+ sidebar->priv->model = model;
+ g_signal_connect (model, "notify::document",
+ G_CALLBACK (ev_sidebar_document_changed_cb),
+ sidebar);
+}
diff --git a/shell/ev-sidebar.h b/shell/ev-sidebar.h
index 5f01132..3601b73 100644
--- a/shell/ev-sidebar.h
+++ b/shell/ev-sidebar.h
@@ -26,7 +26,7 @@
#include <gtk/gtk.h>
-#include "ev-document.h"
+#include "ev-document-model.h"
G_BEGIN_DECLS
@@ -51,14 +51,14 @@ struct _EvSidebarClass {
GtkVBoxClass base_class;
};
-GType ev_sidebar_get_type (void);
-GtkWidget *ev_sidebar_new (void);
-void ev_sidebar_add_page (EvSidebar *ev_sidebar,
- GtkWidget *main_widget);
-void ev_sidebar_set_page (EvSidebar *ev_sidebar,
- GtkWidget *main_widget);
-void ev_sidebar_set_document (EvSidebar *ev_sidebar,
- EvDocument *document);
+GType ev_sidebar_get_type (void) G_GNUC_CONST;
+GtkWidget *ev_sidebar_new (void);
+void ev_sidebar_add_page (EvSidebar *ev_sidebar,
+ GtkWidget *main_widget);
+void ev_sidebar_set_page (EvSidebar *ev_sidebar,
+ GtkWidget *main_widget);
+void ev_sidebar_set_model (EvSidebar *sidebar,
+ EvDocumentModel *model);
G_END_DECLS
diff --git a/shell/ev-window.c b/shell/ev-window.c
index 7593fd8..82425dc 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -176,6 +176,7 @@ struct _EvWindowPrivate {
GList *attach_list;
/* Document */
+ EvDocumentModel *model;
char *uri;
glong uri_mtime;
char *local_uri;
@@ -185,7 +186,6 @@ struct _EvWindowPrivate {
EvDocument *document;
EvHistory *history;
- EvPageCache *page_cache;
EvWindowPageMode page_mode;
EvWindowTitle *title;
@@ -226,6 +226,9 @@ struct _EvWindowPrivate {
#define ATTACHMENTS_SIDEBAR_ID "attachments"
#define LAYERS_SIDEBAR_ID "layers"
+#define MIN_SCALE 0.05409
+#define MAX_SCALE 4.0
+
static const gchar *document_print_settings[] = {
GTK_PRINT_SETTINGS_N_COPIES,
GTK_PRINT_SETTINGS_COLLATE,
@@ -254,10 +257,10 @@ static void ev_window_set_icon_from_thumbnail (EvJobThumbnail *job,
EvWindow *ev_window);
static void ev_window_save_job_cb (EvJob *save,
EvWindow *window);
-static void ev_window_sizing_mode_changed_cb (EvView *view,
+static void ev_window_sizing_mode_changed_cb (EvDocumentModel *model,
GParamSpec *pspec,
EvWindow *ev_window);
-static void ev_window_zoom_changed_cb (EvView *view,
+static void ev_window_zoom_changed_cb (EvDocumentModel *model,
GParamSpec *pspec,
EvWindow *ev_window);
static void ev_window_add_recent (EvWindow *window,
@@ -339,11 +342,8 @@ ev_window_setup_action_sensitivity (EvWindow *ev_window)
if (document) {
has_document = TRUE;
- info = ev_document_get_info (document);
- }
-
- if (has_document && ev_window->priv->page_cache) {
has_pages = ev_document_get_n_pages (document) > 0;
+ info = ev_document_get_info (document);
}
if (!info || info->fields_mask == 0) {
@@ -422,9 +422,10 @@ ev_window_update_actions (EvWindow *ev_window)
gboolean has_pages = FALSE;
gboolean presentation_mode;
gboolean can_find_in_page = FALSE;
+ EvSizingMode sizing_mode;
- if (ev_window->priv->document && ev_window->priv->page_cache) {
- page = ev_page_cache_get_current_page (ev_window->priv->page_cache);
+ 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;
}
@@ -466,17 +467,16 @@ ev_window_update_actions (EvWindow *ev_window)
ev_window_set_action_sensitive (ev_window, "GoLastPage", FALSE);
}
- if (has_pages &&
- ev_view_get_sizing_mode (view) != EV_SIZING_FIT_WIDTH &&
- ev_view_get_sizing_mode (view) != EV_SIZING_BEST_FIT) {
+ sizing_mode = ev_document_model_get_sizing_mode (ev_window->priv->model);
+ if (has_pages && sizing_mode != EV_SIZING_FIT_WIDTH && sizing_mode != EV_SIZING_BEST_FIT) {
GtkAction *action;
float zoom;
float real_zoom;
- action = gtk_action_group_get_action (ev_window->priv->action_group,
+ action = gtk_action_group_get_action (ev_window->priv->action_group,
ZOOM_CONTROL_ACTION);
- real_zoom = ev_view_get_zoom (EV_VIEW (ev_window->priv->view));
+ real_zoom = ev_document_model_get_scale (ev_window->priv->model);
real_zoom *= 72.0 / get_screen_dpi (GTK_WINDOW (ev_window));
zoom = ephy_zoom_get_nearest_zoom_level (real_zoom);
@@ -732,19 +732,6 @@ ev_window_warning_message (EvWindow *window,
ev_window_set_message_area (window, area);
}
-static void
-page_changed_cb (EvPageCache *page_cache,
- gint page,
- EvWindow *ev_window)
-{
- ev_window_update_actions (ev_window);
-
- ev_window_update_find_status_message (ev_window);
-
- if (!ev_window_is_empty (ev_window))
- ev_metadata_manager_set_int (ev_window->priv->uri, "page", page);
-}
-
typedef struct _FindTask {
const gchar *page_label;
gchar *chapter;
@@ -843,23 +830,29 @@ ev_window_add_history (EvWindow *window, gint page, EvLink *link)
static void
view_handle_link_cb (EvView *view, EvLink *link, EvWindow *window)
{
- int current_page = ev_page_cache_get_current_page (window->priv->page_cache);
+ int current_page = ev_document_model_get_page (window->priv->model);
ev_window_add_history (window, 0, link);
ev_window_add_history (window, current_page, NULL);
}
static void
-history_changed_cb (EvPageCache *page_cache,
- gint page,
- EvWindow *window)
+ev_window_page_changed_cb (EvWindow *ev_window,
+ gint old_page,
+ gint new_page,
+ EvDocumentModel *model)
{
- int current_page = ev_page_cache_get_current_page (window->priv->page_cache);
+ ev_window_update_actions (ev_window);
- ev_window_add_history (window, page, NULL);
- ev_window_add_history (window, current_page, NULL);
+ ev_window_update_find_status_message (ev_window);
- return;
+ if (abs (new_page - old_page) > 1) {
+ ev_window_add_history (ev_window, new_page, NULL);
+ ev_window_add_history (ev_window, old_page, NULL);
+ }
+
+ if (!ev_window_is_empty (ev_window))
+ ev_metadata_manager_set_int (ev_window->priv->uri, "page", new_page);
}
static void
@@ -940,6 +933,66 @@ setup_sidebar_from_metadata (EvWindow *window)
}
static void
+setup_model_from_metadata (EvWindow *window)
+{
+ gchar *uri = window->priv->uri;
+ GValue page = { 0, };
+ GValue sizing_mode = { 0, };
+ GValue zoom = { 0, };
+ GValue rotation = { 0, };
+
+ /* Current page */
+ if (ev_metadata_manager_get (uri, "page", &page, TRUE)) {
+ ev_document_model_set_page (window->priv->model,
+ g_value_get_int (&page));
+ g_value_unset (&page);
+ }
+
+ /* Sizing mode */
+ if (ev_metadata_manager_get (uri, "sizing_mode", &sizing_mode, FALSE)) {
+ GEnumValue *enum_value;
+
+ enum_value = g_enum_get_value_by_nick
+ (g_type_class_peek (EV_TYPE_SIZING_MODE), g_value_get_string (&sizing_mode));
+ ev_document_model_set_sizing_mode (window->priv->model, enum_value->value);
+ g_value_unset (&sizing_mode);
+ }
+
+ /* Zoom */
+ if (ev_document_model_get_sizing_mode (window->priv->model) == EV_SIZING_FREE &&
+ ev_metadata_manager_get (uri, "zoom", &zoom, FALSE)) {
+ gdouble zoom_value;
+
+ zoom_value = g_value_get_double (&zoom);
+ zoom_value *= get_screen_dpi (GTK_WINDOW (window)) / 72.0;
+ ev_document_model_set_scale (window->priv->model, zoom_value);
+ g_value_unset (&zoom);
+ }
+
+ /* Rotation */
+ if (ev_metadata_manager_get (uri, "rotation", &rotation, TRUE)) {
+ gint rotation_value;
+
+ switch (g_value_get_int (&rotation)) {
+ case 90:
+ rotation_value = 90;
+ break;
+ case 180:
+ rotation_value = 180;
+ break;
+ case 270:
+ rotation_value = 270;
+ break;
+ default:
+ rotation_value = 0;
+ break;
+ }
+ ev_document_model_set_rotation (window->priv->model, rotation_value);
+ g_value_unset (&rotation);
+ }
+}
+
+static void
setup_document_from_metadata (EvWindow *window)
{
gchar *uri = window->priv->uri;
@@ -949,20 +1002,21 @@ setup_document_from_metadata (EvWindow *window)
GValue width_ratio = { 0, };
GValue height_ratio = { 0, };
+#if 0 /* FIXME */
/* View the previously shown page, but make sure to not open a document on
* the last page, since closing it on the last page most likely means the
* user was finished reading the document. In that case, reopening should
* show the first page. */
- if (uri && ev_metadata_manager_get (uri, "page", &page, TRUE)) {
+ if (ev_metadata_manager_get (uri, "page", &page, TRUE)) {
gint n_pages;
gint new_page;
n_pages = ev_document_get_n_pages (window->priv->document);
new_page = CLAMP (g_value_get_int (&page), 0, n_pages - 1);
- ev_page_cache_set_current_page (window->priv->page_cache,
- new_page);
+ ev_document_model_set_page (window->priv->model, new_page);
g_value_unset (&page);
}
+#endif
setup_sidebar_from_metadata (window);
@@ -1045,33 +1099,10 @@ setup_view_from_metadata (EvWindow *window)
{
EvView *view = EV_VIEW (window->priv->view);
gchar *uri = window->priv->uri;
- GEnumValue *enum_value;
- GValue sizing_mode = { 0, };
- GValue zoom = { 0, };
GValue continuous = { 0, };
GValue dual_page = { 0, };
GValue presentation = { 0, };
GValue fullscreen = { 0, };
- GValue rotation = { 0, };
-
- /* Sizing mode */
- if (ev_metadata_manager_get (uri, "sizing_mode", &sizing_mode, FALSE)) {
- enum_value = g_enum_get_value_by_nick
- (g_type_class_peek (EV_TYPE_SIZING_MODE), g_value_get_string (&sizing_mode));
- g_value_unset (&sizing_mode);
- ev_view_set_sizing_mode (view, enum_value->value);
- }
-
- /* Zoom */
- if (ev_metadata_manager_get (uri, "zoom", &zoom, FALSE) &&
- ev_view_get_sizing_mode (view) == EV_SIZING_FREE) {
- gdouble zoom_value;
-
- zoom_value = g_value_get_double (&zoom);
- zoom_value *= get_screen_dpi (GTK_WINDOW (window)) / 72.0;
- ev_view_set_zoom (view, zoom_value, FALSE);
- g_value_unset (&zoom);
- }
/* Continuous */
if (ev_metadata_manager_get (uri, "continuous", &continuous, FALSE)) {
@@ -1100,26 +1131,6 @@ setup_view_from_metadata (EvWindow *window)
}
g_value_unset (&fullscreen);
}
-
- /* Rotation */
- if (ev_metadata_manager_get (uri, "rotation", &rotation, TRUE)) {
- if (g_value_get_int (&rotation)) {
- switch (g_value_get_int (&rotation)) {
- case 90:
- ev_view_set_rotation (view, 90);
- break;
- case 180:
- ev_view_set_rotation (view, 180);
- break;
- case 270:
- ev_view_set_rotation (view, 270);
- break;
- default:
- break;
- }
- }
- g_value_unset (&rotation);
- }
}
static void
@@ -1179,7 +1190,6 @@ ev_window_setup_document (EvWindow *ev_window)
{
const EvDocumentInfo *info;
EvDocument *document = ev_window->priv->document;
- EvSidebar *sidebar = EV_SIDEBAR (ev_window->priv->sidebar);
GtkAction *action;
ev_window->priv->setup_document_idle = 0;
@@ -1190,10 +1200,6 @@ ev_window_setup_document (EvWindow *ev_window)
ev_window_title_set_document (ev_window->priv->title, document);
ev_window_title_set_uri (ev_window->priv->title, ev_window->priv->uri);
- ev_sidebar_set_document (sidebar, document);
-
- action = gtk_action_group_get_action (ev_window->priv->action_group, PAGE_SELECTOR_ACTION);
- ev_page_action_set_document (EV_PAGE_ACTION (action), document);
ev_window_setup_action_sensitivity (ev_window);
if (ev_window->priv->history)
@@ -1219,19 +1225,14 @@ ev_window_setup_document (EvWindow *ev_window)
static void
ev_window_set_document (EvWindow *ev_window, EvDocument *document)
{
- EvView *view = EV_VIEW (ev_window->priv->view);
+ if (ev_window->priv->document == document)
+ return;
if (ev_window->priv->document)
g_object_unref (ev_window->priv->document);
ev_window->priv->document = g_object_ref (document);
ev_window_set_message_area (ev_window, NULL);
-
- ev_window->priv->page_cache = ev_page_cache_get (ev_window->priv->document);
- g_signal_connect (ev_window->priv->page_cache, "page-changed",
- G_CALLBACK (page_changed_cb), ev_window);
- g_signal_connect (ev_window->priv->page_cache, "history-changed",
- G_CALLBACK (history_changed_cb), ev_window);
if (ev_window->priv->in_reload && ev_window->priv->dest) {
gint page;
@@ -1240,7 +1241,7 @@ ev_window_set_document (EvWindow *ev_window, EvDocument *document)
page = CLAMP (ev_link_dest_get_page (ev_window->priv->dest),
0,
ev_document_get_n_pages (document) - 1);
- ev_page_cache_set_current_page (ev_window->priv->page_cache, page);
+ ev_document_model_set_page (ev_window->priv->model, page);
g_object_unref (ev_window->priv->dest);
ev_window->priv->dest = NULL;
}
@@ -1251,8 +1252,6 @@ ev_window_set_document (EvWindow *ev_window, EvDocument *document)
} else if (!ev_document_check_dimensions (document)) {
ev_window_warning_message (ev_window, "%s",
_("The document contains only empty pages"));
- } else {
- ev_view_set_document (view, document);
}
if (ev_window->priv->setup_document_idle > 0)
@@ -1386,7 +1385,7 @@ ev_window_load_job_cb (EvJob *job,
/* Success! */
if (!ev_job_is_failed (job)) {
- ev_window_set_document (ev_window, document);
+ ev_document_model_set_document (ev_window->priv->model, document);
setup_document_from_metadata (ev_window);
setup_view_from_metadata (ev_window);
@@ -1503,8 +1502,8 @@ ev_window_reload_job_cb (EvJob *job,
if (ev_window->priv->dest) {
dest = g_object_ref (ev_window->priv->dest);
}
- ev_window_set_document (ev_window, job->document);
-
+ ev_document_model_set_document (ev_window->priv->model,
+ job->document);
ev_window_handle_link (ev_window, dest);
/* Restart the search after reloading */
@@ -1839,6 +1838,7 @@ ev_window_open_uri (EvWindow *ev_window,
ev_window->priv->dest = dest ? g_object_ref (dest) : NULL;
setup_size_from_metadata (ev_window);
+ setup_model_from_metadata (ev_window);
ev_window->priv->load_job = ev_job_load_new (uri);
g_signal_connect (ev_window->priv->load_job,
@@ -2013,7 +2013,7 @@ ev_window_reload_document (EvWindow *ev_window,
ev_window_clear_reload_job (ev_window);
ev_window->priv->in_reload = TRUE;
- page = ev_page_cache_get_current_page (ev_window->priv->page_cache);
+ page = ev_document_model_get_page (ev_window->priv->model);
if (ev_window->priv->dest)
g_object_unref (ev_window->priv->dest);
@@ -2194,13 +2194,11 @@ ev_window_cmd_file_open_copy_at_dest (EvWindow *window, EvLinkDest *dest)
static void
ev_window_cmd_file_open_copy (GtkAction *action, EvWindow *window)
{
- EvPageCache *page_cache;
EvLinkDest *dest;
gint current_page;
- page_cache = ev_page_cache_get (window->priv->document);
- current_page = ev_page_cache_get_current_page (page_cache);
-
+ current_page = ev_document_model_get_page (window->priv->model);
+
dest = ev_link_dest_new_page (current_page);
ev_window_cmd_file_open_copy_at_dest (window, dest);
g_object_unref (dest);
@@ -2988,7 +2986,6 @@ ev_window_print_range (EvWindow *ev_window,
gint last_page)
{
EvPrintOperation *op;
- EvPageCache *page_cache;
gint current_page;
gint document_last_page;
@@ -3014,8 +3011,7 @@ ev_window_print_range (EvWindow *ev_window,
G_CALLBACK (ev_window_print_operation_done),
(gpointer)ev_window);
- page_cache = ev_page_cache_get (ev_window->priv->document);
- current_page = ev_page_cache_get_current_page (page_cache);
+ current_page = ev_document_model_get_page (ev_window->priv->model);
document_last_page = ev_document_get_n_pages (ev_window->priv->document);
if (!ev_window->priv->print_settings) {
@@ -3238,9 +3234,9 @@ ev_window_cmd_view_best_fit (GtkAction *action, EvWindow *ev_window)
ev_window_stop_presentation (ev_window, TRUE);
if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
- ev_view_set_sizing_mode (EV_VIEW (ev_window->priv->view), EV_SIZING_BEST_FIT);
+ ev_document_model_set_sizing_mode (ev_window->priv->model, EV_SIZING_BEST_FIT);
} else {
- ev_view_set_sizing_mode (EV_VIEW (ev_window->priv->view), EV_SIZING_FREE);
+ ev_document_model_set_sizing_mode (ev_window->priv->model, EV_SIZING_FREE);
}
ev_window_update_actions (ev_window);
}
@@ -3251,9 +3247,9 @@ ev_window_cmd_view_page_width (GtkAction *action, EvWindow *ev_window)
ev_window_stop_presentation (ev_window, TRUE);
if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
- ev_view_set_sizing_mode (EV_VIEW (ev_window->priv->view), EV_SIZING_FIT_WIDTH);
+ ev_document_model_set_sizing_mode (ev_window->priv->model, EV_SIZING_FIT_WIDTH);
} else {
- ev_view_set_sizing_mode (EV_VIEW (ev_window->priv->view), EV_SIZING_FREE);
+ ev_document_model_set_sizing_mode (ev_window->priv->model, EV_SIZING_FREE);
}
ev_window_update_actions (ev_window);
}
@@ -3665,15 +3661,17 @@ ev_window_screen_changed (GtkWidget *widget,
EvWindow *window = EV_WINDOW (widget);
EvWindowPrivate *priv = window->priv;
GdkScreen *screen;
+ gdouble dpi;
screen = gtk_widget_get_screen (widget);
if (screen == old_screen)
return;
ev_window_setup_gtk_settings (window);
- ev_view_set_screen_dpi (EV_VIEW (priv->view),
- get_screen_dpi (GTK_WINDOW (window)));
-
+ dpi = get_screen_dpi (GTK_WINDOW (window));
+ ev_document_model_set_min_scale (priv->model, MIN_SCALE * dpi / 72.0);
+ ev_document_model_set_max_scale (priv->model, MAX_SCALE * dpi / 72.0);
+
if (GTK_WIDGET_CLASS (ev_window_parent_class)->screen_changed) {
GTK_WIDGET_CLASS (ev_window_parent_class)->screen_changed (widget, old_screen);
}
@@ -3745,13 +3743,17 @@ ev_window_set_page_mode (EvWindow *window,
static void
ev_window_cmd_edit_rotate_left (GtkAction *action, EvWindow *ev_window)
{
- ev_view_rotate_left (EV_VIEW (ev_window->priv->view));
+ gint rotation = ev_document_model_get_rotation (ev_window->priv->model);
+
+ ev_document_model_set_rotation (ev_window->priv->model, rotation - 90);
}
static void
ev_window_cmd_edit_rotate_right (GtkAction *action, EvWindow *ev_window)
{
- ev_view_rotate_right (EV_VIEW (ev_window->priv->view));
+ gint rotation = ev_document_model_get_rotation (ev_window->priv->model);
+
+ ev_document_model_set_rotation (ev_window->priv->model, rotation + 90);
}
static void
@@ -3803,7 +3805,7 @@ ev_window_cmd_view_zoom_in (GtkAction *action, EvWindow *ev_window)
{
g_return_if_fail (EV_IS_WINDOW (ev_window));
- ev_view_set_sizing_mode (EV_VIEW (ev_window->priv->view), EV_SIZING_FREE);
+ ev_document_model_set_sizing_mode (ev_window->priv->model, EV_SIZING_FREE);
ev_view_zoom_in (EV_VIEW (ev_window->priv->view));
}
@@ -3812,7 +3814,7 @@ ev_window_cmd_view_zoom_out (GtkAction *action, EvWindow *ev_window)
{
g_return_if_fail (EV_IS_WINDOW (ev_window));
- ev_view_set_sizing_mode (EV_VIEW (ev_window->priv->view), EV_SIZING_FREE);
+ ev_document_model_set_sizing_mode (ev_window->priv->model, EV_SIZING_FREE);
ev_view_zoom_out (EV_VIEW (ev_window->priv->view));
}
@@ -3837,7 +3839,7 @@ ev_window_cmd_go_first_page (GtkAction *action, EvWindow *ev_window)
{
g_return_if_fail (EV_IS_WINDOW (ev_window));
- ev_page_cache_set_current_page (ev_window->priv->page_cache, 0);
+ ev_document_model_set_page (ev_window->priv->model, 0);
}
static void
@@ -3845,8 +3847,8 @@ ev_window_cmd_go_last_page (GtkAction *action, EvWindow *ev_window)
{
g_return_if_fail (EV_IS_WINDOW (ev_window));
- ev_page_cache_set_current_page (ev_window->priv->page_cache,
- ev_document_get_n_pages (ev_window->priv->document) - 1);
+ ev_document_model_set_page (ev_window->priv->model,
+ ev_document_get_n_pages (ev_window->priv->document) - 1);
}
static void
@@ -3857,10 +3859,11 @@ ev_window_cmd_go_forward (GtkAction *action, EvWindow *ev_window)
g_return_if_fail (EV_IS_WINDOW (ev_window));
n_pages = ev_document_get_n_pages (ev_window->priv->document);
- current_page = ev_page_cache_get_current_page (ev_window->priv->page_cache);
+ current_page = ev_document_model_get_page (ev_window->priv->model);
- if (current_page + 10 < n_pages)
- ev_page_cache_set_current_page (ev_window->priv->page_cache, current_page + 10);
+ if (current_page + 10 < n_pages) {
+ ev_document_model_set_page (ev_window->priv->model, current_page + 10);
+ }
}
static void
@@ -3870,10 +3873,11 @@ ev_window_cmd_go_backward (GtkAction *action, EvWindow *ev_window)
g_return_if_fail (EV_IS_WINDOW (ev_window));
- current_page = ev_page_cache_get_current_page (ev_window->priv->page_cache);
+ current_page = ev_document_model_get_page (ev_window->priv->model);
- if (current_page - 10 >= 0)
- ev_page_cache_set_current_page (ev_window->priv->page_cache, current_page - 10);
+ if (current_page - 10 >= 0) {
+ ev_document_model_set_page (ev_window->priv->model, current_page - 10);
+ }
}
static void
@@ -3957,23 +3961,30 @@ save_sizing_mode (EvWindow *window)
EvSizingMode mode;
GEnumValue *enum_value;
- mode = ev_view_get_sizing_mode (EV_VIEW (window->priv->view));
- enum_value = g_enum_get_value (g_type_class_peek (EV_TYPE_SIZING_MODE), mode);
+ if (ev_window_is_empty (window))
+ return;
- if (!ev_window_is_empty (window))
- ev_metadata_manager_set_string (window->priv->uri, "sizing_mode",
- enum_value->value_nick);
+ mode = ev_document_model_get_sizing_mode (window->priv->model);
+ enum_value = g_enum_get_value (g_type_class_peek (EV_TYPE_SIZING_MODE), mode);
+ ev_metadata_manager_set_string (window->priv->uri, "sizing_mode",
+ enum_value->value_nick);
}
-static void
-ev_window_sizing_mode_changed_cb (EvView *view, GParamSpec *pspec,
- EvWindow *ev_window)
+static void
+ev_window_document_changed_cb (EvDocumentModel *model,
+ GParamSpec *pspec,
+ EvWindow *ev_window)
{
- EvSizingMode sizing_mode;
+ ev_window_set_document (ev_window,
+ ev_document_model_get_document (model));
+}
- g_object_get (ev_window->priv->view,
- "sizing-mode", &sizing_mode,
- NULL);
+static void
+ev_window_sizing_mode_changed_cb (EvDocumentModel *model,
+ GParamSpec *pspec,
+ EvWindow *ev_window)
+{
+ EvSizingMode sizing_mode = ev_document_model_get_sizing_mode (model);
g_object_set (ev_window->priv->scrolled_window,
"hscrollbar-policy",
@@ -3986,15 +3997,15 @@ ev_window_sizing_mode_changed_cb (EvView *view, GParamSpec *pspec,
save_sizing_mode (ev_window);
}
-static void
-ev_window_zoom_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *ev_window)
+static void
+ev_window_zoom_changed_cb (EvDocumentModel *model, GParamSpec *pspec, EvWindow *ev_window)
{
ev_window_update_actions (ev_window);
- if (ev_view_get_sizing_mode (view) == EV_SIZING_FREE && !ev_window_is_empty (ev_window)) {
+ if (ev_document_model_get_sizing_mode (model) == EV_SIZING_FREE && !ev_window_is_empty (ev_window)) {
gdouble zoom;
- zoom = ev_view_get_zoom (view);
+ zoom = ev_document_model_get_scale (model);
zoom *= 72.0 / get_screen_dpi (GTK_WINDOW(ev_window));
ev_metadata_manager_set_double (ev_window->priv->uri, "zoom", zoom);
}
@@ -4038,19 +4049,15 @@ ev_window_continuous_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *ev_w
ev_view_get_continuous (EV_VIEW (ev_window->priv->view)));
}
-static void
-ev_window_rotation_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *window)
+static void
+ev_window_rotation_changed_cb (EvDocumentModel *model, GParamSpec *pspec, EvWindow *window)
{
- int rotation;
-
- rotation = ev_view_get_rotation (EV_VIEW (window->priv->view));
+ gint rotation = ev_document_model_get_rotation (model);
if (!ev_window_is_empty (window))
ev_metadata_manager_set_int (window->priv->uri, "rotation",
rotation);
- ev_sidebar_thumbnails_refresh (EV_SIDEBAR_THUMBNAILS (window->priv->sidebar_thumbs),
- rotation);
ev_window_refresh_window_thumbnail (window, rotation);
}
@@ -4376,7 +4383,7 @@ ev_window_update_find_status_message (EvWindow *ev_window)
gint n_results;
n_results = ev_job_find_get_n_results (EV_JOB_FIND (ev_window->priv->find_job),
- ev_page_cache_get_current_page (ev_window->priv->page_cache));
+ ev_document_model_get_page (ev_window->priv->model));
/* TRANS: Sometimes this could be better translated as
"%d hit(s) on this page". Therefore this string
contains plural cases. */
@@ -4479,7 +4486,7 @@ find_bar_search_changed_cb (EggFindBar *find_bar,
if (search_string && search_string[0]) {
ev_window->priv->find_job = ev_job_find_new (ev_window->priv->document,
- ev_page_cache_get_current_page (ev_window->priv->page_cache),
+ ev_document_model_get_page (ev_window->priv->model),
ev_document_get_n_pages (ev_window->priv->document),
search_string,
case_sensitive);
@@ -4534,8 +4541,6 @@ zoom_control_changed_cb (EphyZoomAction *action,
EvWindow *ev_window)
{
EvSizingMode mode;
-
- g_return_if_fail (EV_IS_WINDOW (ev_window));
if (zoom == EPHY_ZOOM_BEST_FIT) {
mode = EV_SIZING_BEST_FIT;
@@ -4545,12 +4550,11 @@ zoom_control_changed_cb (EphyZoomAction *action,
mode = EV_SIZING_FREE;
}
- ev_view_set_sizing_mode (EV_VIEW (ev_window->priv->view), mode);
-
+ ev_document_model_set_sizing_mode (ev_window->priv->model, mode);
+
if (mode == EV_SIZING_FREE) {
- ev_view_set_zoom (EV_VIEW (ev_window->priv->view),
- zoom * get_screen_dpi (GTK_WINDOW (ev_window)) / 72.0,
- FALSE);
+ ev_document_model_set_scale (ev_window->priv->model,
+ zoom * get_screen_dpi (GTK_WINDOW (ev_window)) / 72.0);
}
}
@@ -4671,9 +4675,12 @@ ev_window_dispose (GObject *object)
priv->recent_ui_id = 0;
- if (priv->page_cache) {
- g_signal_handlers_disconnect_by_func (priv->page_cache, page_changed_cb, window);
- priv->page_cache = NULL;
+ if (priv->model) {
+ g_signal_handlers_disconnect_by_func (priv->model,
+ ev_window_page_changed_cb,
+ window);
+ g_object_unref (priv->model);
+ priv->model = NULL;
}
if (priv->document) {
@@ -5103,6 +5110,8 @@ register_custom_actions (EvWindow *window, GtkActionGroup *group)
"icon_name", "text-x-generic",
"visible_overflown", FALSE,
NULL);
+ ev_page_action_set_model (EV_PAGE_ACTION (action),
+ window->priv->model);
g_signal_connect (action, "activate_link",
G_CALLBACK (activate_link_cb), window);
gtk_action_group_add_action (group, action);
@@ -5213,7 +5222,7 @@ sidebar_widget_model_set (EvSidebarLinks *ev_sidebar_links,
NULL);
action = gtk_action_group_get_action (ev_window->priv->action_group, PAGE_SELECTOR_ACTION);
- ev_page_action_set_model (EV_PAGE_ACTION (action), model);
+ ev_page_action_set_links_model (EV_PAGE_ACTION (action), model);
g_object_unref (model);
}
@@ -5858,6 +5867,7 @@ ev_window_init (EvWindow *ev_window)
GtkWidget *sidebar_widget;
GObject *mpkeys;
gchar *ui_path;
+ gdouble dpi;
g_signal_connect (ev_window, "configure_event",
G_CALLBACK (window_configure_event_cb), NULL);
@@ -5866,6 +5876,8 @@ ev_window_init (EvWindow *ev_window)
ev_window->priv = EV_WINDOW_GET_PRIVATE (ev_window);
+ ev_window->priv->model = ev_document_model_new ();
+
ev_window->priv->page_mode = PAGE_MODE_DOCUMENT;
ev_window->priv->title = ev_window_title_new (ev_window);
@@ -5964,6 +5976,8 @@ ev_window_init (EvWindow *ev_window)
gtk_widget_show (ev_window->priv->hpaned);
ev_window->priv->sidebar = ev_sidebar_new ();
+ ev_sidebar_set_model (EV_SIDEBAR (ev_window->priv->sidebar),
+ ev_window->priv->model);
gtk_paned_pack1 (GTK_PANED (ev_window->priv->hpaned),
ev_window->priv->sidebar, FALSE, FALSE);
gtk_widget_show (ev_window->priv->sidebar);
@@ -6031,6 +6045,10 @@ ev_window_init (EvWindow *ev_window)
gtk_widget_show (ev_window->priv->view_box);
ev_window->priv->view = ev_view_new ();
+ ev_view_set_model (EV_VIEW (ev_window->priv->view), ev_window->priv->model);
+ dpi = get_screen_dpi (GTK_WINDOW (ev_window));
+ ev_document_model_set_min_scale (ev_window->priv->model, MIN_SCALE * dpi / 72.0);
+ ev_document_model_set_max_scale (ev_window->priv->model, MAX_SCALE * dpi / 72.0);
ev_view_set_screen_dpi (EV_VIEW (ev_window->priv->view),
get_screen_dpi (GTK_WINDOW (ev_window)));
ev_window->priv->password_view = ev_password_view_new (GTK_WINDOW (ev_window));
@@ -6070,14 +6088,29 @@ ev_window_init (EvWindow *ev_window)
gtk_container_add (GTK_CONTAINER (ev_window->priv->scrolled_window),
ev_window->priv->view);
- g_signal_connect (ev_window->priv->view,
+ /* Connect to model signals */
+ g_signal_connect_swapped (ev_window->priv->model,
+ "page-changed",
+ G_CALLBACK (ev_window_page_changed_cb),
+ ev_window);
+ g_signal_connect (ev_window->priv->model,
+ "notify::document",
+ G_CALLBACK (ev_window_document_changed_cb),
+ ev_window);
+ g_signal_connect (ev_window->priv->model,
+ "notify::scale",
+ G_CALLBACK (ev_window_zoom_changed_cb),
+ ev_window);
+ g_signal_connect (ev_window->priv->model,
"notify::sizing-mode",
G_CALLBACK (ev_window_sizing_mode_changed_cb),
ev_window);
- g_signal_connect (ev_window->priv->view,
- "notify::zoom",
- G_CALLBACK (ev_window_zoom_changed_cb),
+ g_signal_connect (ev_window->priv->model,
+ "notify::rotation",
+ G_CALLBACK (ev_window_rotation_changed_cb),
ev_window);
+
+ /* Connect to view signals */
g_signal_connect (ev_window->priv->view,
"notify::dual-page",
G_CALLBACK (ev_window_dual_mode_changed_cb),
@@ -6087,10 +6120,6 @@ ev_window_init (EvWindow *ev_window)
G_CALLBACK (ev_window_continuous_changed_cb),
ev_window);
g_signal_connect (ev_window->priv->view,
- "notify::rotation",
- G_CALLBACK (ev_window_rotation_changed_cb),
- ev_window);
- g_signal_connect (ev_window->priv->view,
"notify::has-selection",
G_CALLBACK (ev_window_has_selection_changed_cb),
ev_window);
@@ -6169,7 +6198,7 @@ ev_window_init (EvWindow *ev_window)
setup_view_from_metadata (ev_window);
setup_sidebar_from_metadata (ev_window);
- ev_window_sizing_mode_changed_cb (EV_VIEW (ev_window->priv->view), NULL, ev_window);
+ ev_window_sizing_mode_changed_cb (ev_window->priv->model, NULL, ev_window);
ev_window_setup_action_sensitivity (ev_window);
/* Drag and Drop */
diff --git a/shell/ev-window.h b/shell/ev-window.h
index 1df15ec..c95c1a4 100644
--- a/shell/ev-window.h
+++ b/shell/ev-window.h
@@ -27,7 +27,6 @@
#include <gtk/gtk.h>
#include "ev-link.h"
-#include "ev-page-cache.h"
G_BEGIN_DECLS