From 34148304a0237fd9fd7c4ea05ca2e053d9ddd3ff Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos Date: Sun, 23 Aug 2009 16:02:41 +0000 Subject: Remove EvPageCache and use EvDocumentModel instead EvView is now another view for the common model EvDocumentModel. Now it's possible to have several windows for the same document without the symlink hack. Every window has its own model, while the document object is shared. --- (limited to 'libmisc') diff --git a/libmisc/Makefile.am b/libmisc/Makefile.am index 290f574..38a43fa 100644 --- a/libmisc/Makefile.am +++ b/libmisc/Makefile.am @@ -10,6 +10,7 @@ libevmisc_la_CFLAGS = \ -DDATADIR=\"$(pkgdatadir)\" \ -I$(top_srcdir) \ -I$(top_srcdir)/libdocument \ + -I$(top_srcdir)/libview \ $(SHELL_CORE_CFLAGS) \ $(WARNING_CFLAGS) \ $(DISABLE_DEPRECATED) diff --git a/libmisc/ev-page-action-widget.c b/libmisc/ev-page-action-widget.c index 249775c..2b29e78 100644 --- a/libmisc/ev-page-action-widget.c +++ b/libmisc/ev-page-action-widget.c @@ -43,7 +43,7 @@ struct _EvPageActionWidget GtkToolItem parent; EvDocument *document; - EvPageCache *page_cache; + EvDocumentModel *doc_model; GtkWidget *entry; GtkWidget *label; @@ -74,9 +74,8 @@ update_pages_label (EvPageActionWidget *action_widget, } static void -page_changed_cb (EvPageCache *page_cache, - gint page, - EvPageActionWidget *action_widget) +ev_page_action_widget_set_current_page (EvPageActionWidget *action_widget, + gint page) { if (page >= 0) { gchar *page_label; @@ -97,19 +96,28 @@ page_changed_cb (EvPageCache *page_cache, update_pages_label (action_widget, page); } +static void +page_changed_cb (EvDocumentModel *model, + gint old_page, + gint new_page, + EvPageActionWidget *action_widget) +{ + ev_page_action_widget_set_current_page (action_widget, new_page); +} + static gboolean page_scroll_cb (EvPageActionWidget *action_widget, GdkEventScroll *event) { - EvPageCache *page_cache = action_widget->page_cache; + EvDocumentModel *model = action_widget->doc_model; gint pageno; - pageno = ev_page_cache_get_current_page (page_cache); + pageno = ev_document_model_get_page (model); if ((event->direction == GDK_SCROLL_DOWN) && (pageno < ev_document_get_n_pages (action_widget->document) - 1)) pageno++; if ((event->direction == GDK_SCROLL_UP) && (pageno > 0)) pageno--; - ev_page_cache_set_current_page (page_cache, pageno); + ev_document_model_set_page (model, pageno); return TRUE; } @@ -117,7 +125,7 @@ page_scroll_cb (EvPageActionWidget *action_widget, GdkEventScroll *event) static void activate_cb (EvPageActionWidget *action_widget) { - EvPageCache *page_cache; + EvDocumentModel *model; const char *text; gchar *page_label; EvLinkDest *link_dest; @@ -139,9 +147,9 @@ activate_cb (EvPageActionWidget *action_widget) /* rest the entry to the current page if we were unable to * change it */ - page_cache = action_widget->page_cache; + model = action_widget->doc_model; page_label = ev_document_get_page_label (action_widget->document, - ev_page_cache_get_current_page (page_cache)); + ev_document_model_get_page (model)); gtk_entry_set_text (GTK_ENTRY (action_widget->entry), page_label); gtk_editable_set_position (GTK_EDITABLE (action_widget->entry), -1); g_free (page_label); @@ -187,38 +195,48 @@ ev_page_action_widget_init (EvPageActionWidget *action_widget) gtk_widget_show (GTK_WIDGET (action_widget)); } -void -ev_page_action_widget_set_document (EvPageActionWidget *action_widget, - EvDocument *document) +static void +ev_page_action_widget_document_changed_cb (EvDocumentModel *model, + GParamSpec *pspec, + EvPageActionWidget *action_widget) { - EvPageCache *page_cache = ev_page_cache_get (document); + EvDocument *document = ev_document_model_get_document (model); g_object_ref (document); if (action_widget->document) g_object_unref (action_widget->document); action_widget->document = document; - if (action_widget->page_cache != NULL) { - if (action_widget->signal_id > 0) { - g_signal_handler_disconnect (action_widget->page_cache, - action_widget->signal_id); - action_widget->signal_id = 0; - } - g_object_remove_weak_pointer (G_OBJECT (action_widget->page_cache), - (gpointer)&action_widget->page_cache); - action_widget->page_cache = NULL; + if (action_widget->signal_id > 0) { + g_signal_handler_disconnect (action_widget->doc_model, + action_widget->signal_id); + action_widget->signal_id = 0; } - - action_widget->page_cache = page_cache; - g_object_add_weak_pointer (G_OBJECT (page_cache), - (gpointer)&action_widget->page_cache); action_widget->signal_id = - g_signal_connect_object (page_cache, "page-changed", + g_signal_connect_object (action_widget->doc_model, + "page-changed", G_CALLBACK (page_changed_cb), action_widget, 0); - page_changed_cb (page_cache, - ev_page_cache_get_current_page (page_cache), - action_widget); + + ev_page_action_widget_set_current_page (action_widget, + ev_document_model_get_page (model)); +} + +void +ev_page_action_widget_set_model (EvPageActionWidget *action_widget, + EvDocumentModel *model) +{ + if (action_widget->doc_model) { + g_object_remove_weak_pointer (G_OBJECT (action_widget->doc_model), + (gpointer)&action_widget->doc_model); + } + action_widget->doc_model = model; + g_object_add_weak_pointer (G_OBJECT (model), + (gpointer)&action_widget->doc_model); + + g_signal_connect (model, "notify::document", + G_CALLBACK (ev_page_action_widget_document_changed_cb), + action_widget); } static void @@ -226,15 +244,15 @@ ev_page_action_widget_finalize (GObject *object) { EvPageActionWidget *action_widget = EV_PAGE_ACTION_WIDGET (object); - if (action_widget->page_cache != NULL) { + if (action_widget->doc_model != NULL) { if (action_widget->signal_id > 0) { - g_signal_handler_disconnect (action_widget->page_cache, + g_signal_handler_disconnect (action_widget->doc_model, action_widget->signal_id); action_widget->signal_id = 0; } - g_object_remove_weak_pointer (G_OBJECT (action_widget->page_cache), - (gpointer)&action_widget->page_cache); - action_widget->page_cache = NULL; + g_object_remove_weak_pointer (G_OBJECT (action_widget->doc_model), + (gpointer)&action_widget->doc_model); + action_widget->doc_model = NULL; } if (action_widget->document) { @@ -432,7 +450,7 @@ get_filter_model_from_model (GtkTreeModel *model) void -ev_page_action_widget_update_model (EvPageActionWidget *proxy, GtkTreeModel *model) +ev_page_action_widget_update_links_model (EvPageActionWidget *proxy, GtkTreeModel *model) { GtkTreeModel *filter_model; GtkEntryCompletion *completion; @@ -470,7 +488,6 @@ ev_page_action_widget_update_model (EvPageActionWidget *proxy, GtkTreeModel *mod gtk_entry_set_completion (GTK_ENTRY (proxy->entry), completion); g_object_unref (completion); - g_object_unref (model); } void diff --git a/libmisc/ev-page-action-widget.h b/libmisc/ev-page-action-widget.h index 1c9ee35..52e09b6 100644 --- a/libmisc/ev-page-action-widget.h +++ b/libmisc/ev-page-action-widget.h @@ -36,11 +36,11 @@ struct _EvPageActionWidgetClass EvLink *link); }; -GType ev_page_action_widget_get_type (void) G_GNUC_CONST; +GType ev_page_action_widget_get_type (void) G_GNUC_CONST; -void ev_page_action_widget_update_model (EvPageActionWidget *proxy, - GtkTreeModel *model); +void ev_page_action_widget_update_links_model (EvPageActionWidget *proxy, + GtkTreeModel *model); -void ev_page_action_widget_set_document (EvPageActionWidget *action_widget, - EvDocument *document); -void ev_page_action_widget_grab_focus (EvPageActionWidget *proxy); +void ev_page_action_widget_set_model (EvPageActionWidget *action_widget, + EvDocumentModel *doc_model); +void ev_page_action_widget_grab_focus (EvPageActionWidget *proxy); diff --git a/libmisc/ev-page-action.c b/libmisc/ev-page-action.c index 090712e..6c36351 100644 --- a/libmisc/ev-page-action.c +++ b/libmisc/ev-page-action.c @@ -33,7 +33,7 @@ struct _EvPageActionPrivate { - EvDocument *document; + EvDocumentModel *doc_model; GtkTreeModel *model; }; @@ -55,8 +55,7 @@ G_DEFINE_TYPE (EvPageAction, ev_page_action, GTK_TYPE_ACTION) enum { PROP_0, - PROP_DOCUMENT, - PROP_MODEL, + PROP_MODEL }; static GtkWidget * @@ -70,22 +69,9 @@ create_tool_item (GtkAction *action) } static void -update_document (EvPageAction *page, GParamSpec *pspec, EvPageActionWidget *proxy) -{ - if (page->priv->document) - ev_page_action_widget_set_document (proxy, page->priv->document); -} - -static void update_model (EvPageAction *page, GParamSpec *pspec, EvPageActionWidget *proxy) { - GtkTreeModel *model; - - g_object_get (G_OBJECT (page), - "model", &model, - NULL); - - ev_page_action_widget_update_model (proxy, model); + ev_page_action_widget_update_links_model (proxy, page->priv->model); } static void @@ -97,10 +83,11 @@ activate_link_cb (EvPageActionWidget *proxy, EvLink *link, EvPageAction *action) static void connect_proxy (GtkAction *action, GtkWidget *proxy) { + EvPageAction *page = EV_PAGE_ACTION (action); + if (GTK_IS_TOOL_ITEM (proxy)) { - g_signal_connect_object (action, "notify::document", - G_CALLBACK (update_document), - proxy, 0); + ev_page_action_widget_set_model (EV_PAGE_ACTION_WIDGET (proxy), + page->priv->doc_model); g_signal_connect (proxy, "activate_link", G_CALLBACK (activate_link_cb), action); @@ -117,11 +104,13 @@ ev_page_action_dispose (GObject *object) { EvPageAction *page = EV_PAGE_ACTION (object); - if (page->priv->document) { - g_object_unref (page->priv->document); - page->priv->document = NULL; + if (page->priv->model) { + g_object_unref (page->priv->model); + page->priv->model = NULL; } + page->priv->doc_model = NULL; + G_OBJECT_CLASS (ev_page_action_parent_class)->dispose (object); } @@ -131,25 +120,13 @@ ev_page_action_set_property (GObject *object, const GValue *value, GParamSpec *pspec) { - EvPageAction *page; - EvDocument *document; + EvPageAction *page = EV_PAGE_ACTION (object); GtkTreeModel *model; - page = EV_PAGE_ACTION (object); - switch (prop_id) { - case PROP_DOCUMENT: - document = page->priv->document; - page->priv->document = EV_DOCUMENT (g_value_dup_object (value)); - if (document) - g_object_unref (document); - break; case PROP_MODEL: - model = page->priv->model; - page->priv->model = GTK_TREE_MODEL (g_value_dup_object (value)); - if (model) - g_object_unref (model); + ev_page_action_set_links_model (page, g_value_get_object (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -163,15 +140,10 @@ ev_page_action_get_property (GObject *object, GValue *value, GParamSpec *pspec) { - EvPageAction *page; - - page = EV_PAGE_ACTION (object); + EvPageAction *page = EV_PAGE_ACTION (object); switch (prop_id) { - case PROP_DOCUMENT: - g_value_set_object (value, page->priv->document); - break; case PROP_MODEL: g_value_set_object (value, page->priv->model); break; @@ -182,21 +154,33 @@ ev_page_action_get_property (GObject *object, } void -ev_page_action_set_document (EvPageAction *page, EvDocument *document) +ev_page_action_set_model (EvPageAction *page, + EvDocumentModel *model) { - g_object_set (page, - "document", document, - "model", NULL, - NULL); + g_return_if_fail (EV_IS_PAGE_ACTION (page)); + g_return_if_fail (EV_IS_DOCUMENT_MODEL (model)); + + if (page->priv->doc_model == model) + return; + + page->priv->doc_model = model; } void -ev_page_action_set_model (EvPageAction *page_action, - GtkTreeModel *model) +ev_page_action_set_links_model (EvPageAction *page, + GtkTreeModel *links_model) { - g_object_set (page_action, - "model", model, - NULL); + g_return_if_fail (EV_IS_PAGE_ACTION (page)); + g_return_if_fail (GTK_IS_TREE_MODEL (links_model)); + + if (page->priv->model == links_model) + return; + + if (page->priv->model) + g_object_unref (page->priv->model); + page->priv->model = g_object_ref (links_model); + + g_object_notify (G_OBJECT (page), "model"); } void @@ -245,18 +229,10 @@ ev_page_action_class_init (EvPageActionClass *class) G_TYPE_OBJECT); g_object_class_install_property (object_class, - PROP_DOCUMENT, - g_param_spec_object ("document", - "Document", - "Current document", - EV_TYPE_DOCUMENT, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_MODEL, g_param_spec_object ("model", "Model", - "Current Model", + "Current Links Model", GTK_TYPE_TREE_MODEL, G_PARAM_READWRITE)); diff --git a/libmisc/ev-page-action.h b/libmisc/ev-page-action.h index dc13bdd..1817089 100644 --- a/libmisc/ev-page-action.h +++ b/libmisc/ev-page-action.h @@ -24,6 +24,7 @@ #include #include +#include G_BEGIN_DECLS @@ -54,12 +55,13 @@ struct _EvPageActionClass EvLink *link); }; -GType ev_page_action_get_type (void); -void ev_page_action_set_document (EvPageAction *page_action, - EvDocument *document); -void ev_page_action_set_model (EvPageAction *page_action, - GtkTreeModel *model); -void ev_page_action_grab_focus (EvPageAction *page_action); +GType ev_page_action_get_type (void) G_GNUC_CONST; + +void ev_page_action_set_model (EvPageAction *page_action, + EvDocumentModel *model); +void ev_page_action_set_links_model (EvPageAction *page_action, + GtkTreeModel *links_model); +void ev_page_action_grab_focus (EvPageAction *page_action); G_END_DECLS -- cgit v0.9.1