#include <string.h>
#include <gtk/gtk.h>
+#include <glib/gi18n.h>
+#include "ev-sidebar-page.h"
#include "ev-sidebar-thumbnails.h"
#include "ev-document-thumbnails.h"
#include "ev-document-misc.h"
NUM_COLUMNS
};
-G_DEFINE_TYPE (EvSidebarThumbnails, ev_sidebar_thumbnails, GTK_TYPE_VBOX);
+static void ev_sidebar_thumbnails_clear_model (EvSidebarThumbnails *sidebar);
+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);
+
+G_DEFINE_TYPE_EXTENDED (EvSidebarThumbnails,
+ ev_sidebar_thumbnails,
+ GTK_TYPE_VBOX,
+ 0,
+ G_IMPLEMENT_INTERFACE (EV_TYPE_SIDEBAR_PAGE,
+ ev_sidebar_thumbnails_page_iface_init))
#define EV_SIDEBAR_THUMBNAILS_GET_PRIVATE(object) \
(G_TYPE_INSTANCE_GET_PRIVATE ((object), EV_TYPE_SIDEBAR_THUMBNAILS, EvSidebarThumbnailsPrivate));
+
+static void
+ev_sidebar_thumbnails_dispose (GObject *object)
+{
+ EvSidebarThumbnails *sidebar_thumbnails = EV_SIDEBAR_THUMBNAILS (object);
+
+ ev_sidebar_thumbnails_clear_model (sidebar_thumbnails);
+
+ G_OBJECT_CLASS (ev_sidebar_thumbnails_parent_class)->dispose (object);
+}
+
static void
ev_sidebar_thumbnails_class_init (EvSidebarThumbnailsClass *ev_sidebar_thumbnails_class)
{
g_object_class = G_OBJECT_CLASS (ev_sidebar_thumbnails_class);
gtk_object_class = GTK_OBJECT_CLASS (ev_sidebar_thumbnails_class);
+ g_object_class->dispose = ev_sidebar_thumbnails_dispose;
+
g_type_class_add_private (g_object_class, sizeof (EvSidebarThumbnailsPrivate));
}
+GtkWidget *
+ev_sidebar_thumbnails_new (void)
+{
+ GtkWidget *ev_sidebar_thumbnails;
+
+ ev_sidebar_thumbnails = g_object_new (EV_TYPE_SIDEBAR_THUMBNAILS, NULL);
+
+ return ev_sidebar_thumbnails;
+}
+
static void
adjustment_changed_cb (GtkAdjustment *adjustment,
EvSidebarThumbnails *ev_sidebar_thumbnails)
path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->list_store),
&iter);
- page = gtk_tree_path_get_indices (path)[0] + 1;
+ page = gtk_tree_path_get_indices (path)[0];
gtk_tree_path_free (path);
page_cache = ev_document_get_page_cache (priv->document);
ev_page_cache_set_current_page (page_cache, page);
}
+GtkWidget *
+ev_sidebar_thumbnails_get_treeview (EvSidebarThumbnails *sidebar)
+{
+ return sidebar->priv->tree_view;
+}
+
static void
ev_sidebar_thumbnails_init (EvSidebarThumbnails *ev_sidebar_thumbnails)
{
gtk_widget_show_all (swindow);
}
-GtkWidget *
-ev_sidebar_thumbnails_new (void)
-{
- GtkWidget *ev_sidebar_thumbnails;
-
- ev_sidebar_thumbnails = g_object_new (EV_TYPE_SIDEBAR_THUMBNAILS, NULL);
-
- return ev_sidebar_thumbnails;
-}
-
static void
page_changed_cb (EvPageCache *page_cache,
int page,
EvSidebarThumbnails *sidebar)
{
+ GtkTreeView *tree_view = GTK_TREE_VIEW (sidebar->priv->tree_view);
GtkTreePath *path;
- GtkTreeSelection *selection;
- path = gtk_tree_path_new_from_indices (page - 1, -1);
- selection = gtk_tree_view_get_selection
- (GTK_TREE_VIEW (sidebar->priv->tree_view));
-
- gtk_tree_selection_select_path (selection, path);
- gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (sidebar->priv->tree_view),
- path, NULL, FALSE, 0.0, 0.0);
+ path = gtk_tree_path_new_from_indices (page, -1);
+ gtk_tree_view_set_cursor (tree_view, path, NULL, FALSE);
+ gtk_tree_view_scroll_to_cell (tree_view, path, NULL, FALSE, 0.0, 0.0);
gtk_tree_path_free (path);
}
-1);
}
-void
-ev_sidebar_thumbnails_set_document (EvSidebarThumbnails *sidebar_thumbnails,
+static void
+ev_sidebar_thumbnails_set_document (EvSidebarPage *sidebar_page,
EvDocument *document)
{
+ EvSidebarThumbnails *sidebar_thumbnails = EV_SIDEBAR_THUMBNAILS (sidebar_page);
GdkPixbuf *loading_icon;
gint i, n_pages;
GtkTreeIter iter;
- gchar *page;
gint width = THUMBNAIL_WIDTH;
gint height = THUMBNAIL_WIDTH;
EvPageCache *page_cache;
/* We get the dimensions of the first doc so that we can make a blank
* icon. */
- g_mutex_lock (EV_DOC_MUTEX);
+ ev_document_doc_mutex_lock ();
ev_document_thumbnails_get_dimensions (EV_DOCUMENT_THUMBNAILS (priv->document),
- 1, THUMBNAIL_WIDTH, &width, &height);
- g_mutex_unlock (EV_DOC_MUTEX);
+ 0, THUMBNAIL_WIDTH, &width, &height);
+ ev_document_doc_mutex_unlock ();
loading_icon = ev_document_misc_get_thumbnail_frame (width, height, NULL);
- gtk_list_store_clear (priv->list_store);
- for (i = 1; i <= n_pages; i++) {
+ ev_sidebar_thumbnails_clear_model (sidebar_thumbnails);
+ for (i = 0; i < n_pages; i++) {
EvJob *job;
+ gchar *page_label;
+ gchar *page_string;
+
+ job = ev_job_thumbnail_new (priv->document, i, THUMBNAIL_WIDTH);
+ page_label = ev_page_cache_get_page_label (page_cache, i);
+ page_string = g_markup_printf_escaped ("<i>%s</i>", page_label);
- /* FIXME: Bah. This is still -1 for some reason. Need to track it down.. */
- job = ev_job_thumbnail_new (priv->document, i - 1, THUMBNAIL_WIDTH);
- page = g_strdup_printf ("<i>%d</i>", i);
gtk_list_store_append (priv->list_store, &iter);
gtk_list_store_set (priv->list_store, &iter,
- COLUMN_PAGE_STRING, page,
+ COLUMN_PAGE_STRING, page_string,
COLUMN_PIXBUF, loading_icon,
COLUMN_THUMBNAIL_SET, FALSE,
COLUMN_JOB, job,
-1);
- g_free (page);
+ g_free (page_label);
+ g_free (page_string);
ev_job_queue_add_job (job, EV_JOB_PRIORITY_LOW);
g_object_set_data_full (G_OBJECT (job), "tree_iter",
gtk_tree_iter_copy (&iter),
}
+static gboolean
+ev_sidebar_thumbnails_clear_job (GtkTreeModel *model,
+ GtkTreePath *path,
+ GtkTreeIter *iter,
+ gpointer data)
+{
+ EvJob *job;
+
+ gtk_tree_model_get (model, iter, COLUMN_JOB, &job, -1);
+
+ if (job != NULL) {
+ ev_job_queue_remove_job (job);
+ g_signal_handlers_disconnect_by_func (job, thumbnail_job_completed_callback, data);
+ g_object_unref (job);
+ }
+
+ return FALSE;
+}
+
+static void
+ev_sidebar_thumbnails_clear_model (EvSidebarThumbnails *sidebar_thumbnails)
+{
+ EvSidebarThumbnailsPrivate *priv = sidebar_thumbnails->priv;
+
+ gtk_tree_model_foreach (GTK_TREE_MODEL (priv->list_store), ev_sidebar_thumbnails_clear_job, sidebar_thumbnails);
+ gtk_list_store_clear (priv->list_store);
+}
+
+static gboolean
+ev_sidebar_thumbnails_support_document (EvSidebarPage *sidebar_page,
+ EvDocument *document)
+{
+ return (EV_IS_DOCUMENT_THUMBNAILS (document) &&
+ (ev_document_get_n_pages (document) > 1));
+}
+
+static const gchar*
+ev_sidebar_thumbnails_get_label (EvSidebarPage *sidebar_page)
+{
+ return _("Thumbnails");
+}
+
+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->get_label = ev_sidebar_thumbnails_get_label;
+}
+