diff options
Diffstat (limited to 'shell')
-rw-r--r-- | shell/ev-print-operation.c | 1 | ||||
-rw-r--r-- | shell/ev-properties-dialog.c | 1 | ||||
-rw-r--r-- | shell/ev-sidebar-attachments.c | 25 | ||||
-rw-r--r-- | shell/ev-sidebar-layers.c | 28 | ||||
-rw-r--r-- | shell/ev-sidebar-links.c | 128 | ||||
-rw-r--r-- | shell/ev-sidebar-page.c | 16 | ||||
-rw-r--r-- | shell/ev-sidebar-page.h | 13 | ||||
-rw-r--r-- | shell/ev-sidebar-thumbnails.c | 120 | ||||
-rw-r--r-- | shell/ev-sidebar-thumbnails.h | 8 | ||||
-rw-r--r-- | shell/ev-sidebar.c | 51 | ||||
-rw-r--r-- | shell/ev-sidebar.h | 18 | ||||
-rw-r--r-- | shell/ev-window.c | 373 | ||||
-rw-r--r-- | shell/ev-window.h | 1 |
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 |