diff options
author | Marco Pesenti Gritti <mpg@redhat.com> | 2005-06-13 18:45:06 (GMT) |
---|---|---|
committer | Marco Pesenti Gritti <marco@src.gnome.org> | 2005-06-13 18:45:06 (GMT) |
commit | 7fef38d9e59026334152230f1cd847e163e8457c (patch) | |
tree | 83fb7731c11b20f6447c6e50cd62b1253acb0360 /shell | |
parent | 2b426ab269babe95b051894c1484929543e19ce9 (diff) |
Separate scan and fill so that we can incrementally fill from the main
2005-06-13 Marco Pesenti Gritti <mpg@redhat.com>
* backend/ev-document-fonts.c: (ev_document_fonts_get_progress),
(ev_document_fonts_scan), (ev_document_fonts_fill_model):
* backend/ev-document-fonts.h:
Separate scan and fill so that we can incrementally fill from
the main thread. Add a progress api.
* data/evince-properties.glade:
* pdf/ev-poppler.cc:
* shell/ev-jobs.c: (ev_job_fonts_new), (ev_job_fonts_run):
* shell/ev-jobs.h:
* shell/ev-properties.c: (update_progress_label),
(job_fonts_finished_cb), (setup_fonts_view):
Incrementally feel the list and show the progress
percentage in a label like acrobat does.
Diffstat (limited to 'shell')
-rw-r--r-- | shell/ev-jobs.c | 6 | ||||
-rw-r--r-- | shell/ev-jobs.h | 4 | ||||
-rw-r--r-- | shell/ev-properties.c | 78 |
3 files changed, 47 insertions, 41 deletions
diff --git a/shell/ev-jobs.c b/shell/ev-jobs.c index 82f310f..20ebf85 100644 --- a/shell/ev-jobs.c +++ b/shell/ev-jobs.c @@ -347,15 +347,13 @@ static void ev_job_fonts_init (EvJobFonts *job) { /* Do Nothing */ } static void ev_job_fonts_class_init (EvJobFontsClass *class) { /* Do Nothing */ } EvJob * -ev_job_fonts_new (EvDocument *document, - GtkTreeModel *model) +ev_job_fonts_new (EvDocument *document) { EvJobFonts *job; job = g_object_new (EV_TYPE_JOB_FONTS, NULL); EV_JOB (job)->document = g_object_ref (document); - job->model = g_object_ref (model); return EV_JOB (job); } @@ -370,7 +368,7 @@ ev_job_fonts_run (EvJobFonts *job) ev_document_doc_mutex_lock (); fonts = EV_DOCUMENT_FONTS (EV_JOB (job)->document); - job->scan_completed = !ev_document_fonts_fill_model (fonts, job->model, 20); + job->scan_completed = !ev_document_fonts_scan (fonts, 20); EV_JOB (job)->finished = TRUE; diff --git a/shell/ev-jobs.h b/shell/ev-jobs.h index d585d86..900d040 100644 --- a/shell/ev-jobs.h +++ b/shell/ev-jobs.h @@ -152,7 +152,6 @@ struct _EvJobLoadClass struct _EvJobFonts { EvJob parent; - GtkTreeModel *model; gboolean scan_completed; }; @@ -195,8 +194,7 @@ void ev_job_load_run (EvJobLoad *load); /* EvJobFonts */ GType ev_job_fonts_get_type (void); -EvJob *ev_job_fonts_new (EvDocument *document, - GtkTreeModel *model); +EvJob *ev_job_fonts_new (EvDocument *document); void ev_job_fonts_run (EvJobFonts *fonts); G_END_DECLS diff --git a/shell/ev-properties.c b/shell/ev-properties.c index 6007f13..e8eca8f 100644 --- a/shell/ev-properties.c +++ b/shell/ev-properties.c @@ -106,61 +106,60 @@ set_property (GladeXML *xml, Property property, const char *text) } static void +update_progress_label (GtkWidget *label, double progress) +{ + if (progress > 0) { + char *progress_text; + progress_text = g_strdup_printf (_("Gathering font information... %3d%%"), + (int) (progress * 100)); + gtk_label_set_text (GTK_LABEL (label), progress_text); + g_free (progress_text); + } else { + gtk_label_set_text (GTK_LABEL (label), ""); + } +} + +static void job_fonts_finished_cb (EvJob *job, GtkTreeView *tree_view) { - GtkTreeModel *model = EV_JOB_FONTS (job)->model; + EvDocumentFonts *document_fonts = EV_DOCUMENT_FONTS (job->document); + GtkWidget *progress_label; + double progress; + + progress_label = g_object_get_data (G_OBJECT (tree_view), "progress_label"); + progress = ev_document_fonts_get_progress (document_fonts); + update_progress_label (progress_label, progress); if (EV_JOB_FONTS (job)->scan_completed) { g_signal_handlers_disconnect_by_func (job, job_fonts_finished_cb, tree_view); - gtk_tree_view_set_model (tree_view, model); } else { - EvJob *new_job = ev_job_fonts_new (job->document, model); + EvJob *new_job; + + ev_document_fonts_fill_model (document_fonts, + gtk_tree_view_get_model (tree_view)); + new_job = ev_job_fonts_new (job->document); ev_job_queue_add_job (job, EV_JOB_PRIORITY_LOW); g_object_unref (new_job); } } static void -fill_fonts_treeview (GtkTreeView *tree_view, - EvDocument *document) -{ - GtkListStore *list_store; - EvJob *job; - - list_store = gtk_list_store_new (NUM_COLS, G_TYPE_STRING); - g_object_set_data_full (G_OBJECT (tree_view), "list_store", - list_store, g_object_unref); - - job = ev_job_fonts_new (document, GTK_TREE_MODEL (list_store)); - g_signal_connect_object (job, "finished", - G_CALLBACK (job_fonts_finished_cb), - tree_view, 0); - ev_job_queue_add_job (job, EV_JOB_PRIORITY_LOW); - g_object_unref (job); -} - -static void setup_fonts_view (GladeXML *xml, EvDocument *document) { - GtkWidget *widget; GtkCellRenderer *renderer; GtkTreeViewColumn *column; GtkListStore *list_store; - GtkTreeIter iter; - - widget = glade_xml_get_widget (xml, "fonts_treeview"); - - list_store = gtk_list_store_new (NUM_COLS, G_TYPE_STRING); - gtk_list_store_append (list_store, &iter); - gtk_list_store_set (list_store, &iter, FONT_NAME_COL, _("Loading..."), -1); + EvJob *job; + GtkWidget *tree_view; + GtkWidget *progress_label; - gtk_tree_view_set_model (GTK_TREE_VIEW (widget), GTK_TREE_MODEL (list_store)); - g_object_unref (list_store); + tree_view = glade_xml_get_widget (xml, "fonts_treeview"); + progress_label = glade_xml_get_widget (xml, "font_progress_label"); column = gtk_tree_view_column_new (); gtk_tree_view_column_set_expand (GTK_TREE_VIEW_COLUMN (column), TRUE); - gtk_tree_view_append_column (GTK_TREE_VIEW (widget), column); + gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column); renderer = gtk_cell_renderer_text_new (); gtk_tree_view_column_pack_start (GTK_TREE_VIEW_COLUMN (column), renderer, FALSE); @@ -169,7 +168,18 @@ setup_fonts_view (GladeXML *xml, EvDocument *document) "text", EV_DOCUMENT_FONTS_COLUMN_NAME, NULL); - fill_fonts_treeview (GTK_TREE_VIEW (widget), document); + list_store = gtk_list_store_new (NUM_COLS, G_TYPE_STRING); + gtk_tree_view_set_model (GTK_TREE_VIEW (tree_view), + GTK_TREE_MODEL (list_store)); + + job = ev_job_fonts_new (document); + g_object_set_data (G_OBJECT (tree_view), "progress_label", + progress_label); + g_signal_connect_object (job, "finished", + G_CALLBACK (job_fonts_finished_cb), + tree_view, 0); + ev_job_queue_add_job (job, EV_JOB_PRIORITY_LOW); + g_object_unref (job); } GtkDialog * |