diff options
author | Marco Pesenti Gritti <marco@gnome.org> | 2005-02-28 10:53:52 (GMT) |
---|---|---|
committer | Marco Pesenti Gritti <marco@src.gnome.org> | 2005-02-28 10:53:52 (GMT) |
commit | a3c03bdad8e8894092ffd6613354c9f408d5a8aa (patch) | |
tree | 7c446caec77954f463daf39c06009920adeb1ab0 | |
parent | d20663b22a24039249b1d1bab4fb3d38bda5c9c7 (diff) |
Use an entry for the page control instead of spinbuttons
2005-02-28 Marco Pesenti Gritti <marco@gnome.org>
* shell/ev-page-action.c: (update_entry), (sync_entry),
(activate_cb), (entry_size_request_cb), (create_tool_item),
(connect_proxy):
Use an entry for the page control instead of spinbuttons
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | shell/ev-page-action.c | 101 |
2 files changed, 76 insertions, 33 deletions
@@ -1,5 +1,13 @@ 2005-02-28 Marco Pesenti Gritti <marco@gnome.org> + * shell/ev-page-action.c: (update_entry), (sync_entry), + (activate_cb), (entry_size_request_cb), (create_tool_item), + (connect_proxy): + + Use an entry for the page control instead of spinbuttons + +2005-02-28 Marco Pesenti Gritti <marco@gnome.org> + * data/evince.schemas.in: Correct confusing string diff --git a/shell/ev-page-action.c b/shell/ev-page-action.c index 9e32707..d6293c5 100644 --- a/shell/ev-page-action.c +++ b/shell/ev-page-action.c @@ -25,10 +25,11 @@ #include "ev-window.h" #include <glib/gi18n.h> -#include <gtk/gtkspinbutton.h> +#include <gtk/gtkentry.h> #include <gtk/gtktoolitem.h> #include <gtk/gtklabel.h> #include <gtk/gtkhbox.h> +#include <stdlib.h> struct _EvPageActionPrivate { @@ -72,45 +73,80 @@ update_label (GtkAction *action, gpointer dummy, GtkWidget *proxy) } static void -update_spin (GtkAction *action, gpointer dummy, GtkWidget *proxy) +update_entry (EvPageAction *page_action, GtkWidget *entry) { - EvPageAction *page = EV_PAGE_ACTION (action); - GtkWidget *spin; - int value; + char *text; - spin = GTK_WIDGET (g_object_get_data (G_OBJECT (proxy), "spin")); + text = g_strdup_printf ("%d", page_action->priv->current_page); + gtk_entry_set_text (GTK_ENTRY (entry), text); + g_free (text); +} - value = gtk_spin_button_get_value (GTK_SPIN_BUTTON (spin)); +static void +sync_entry (GtkAction *action, gpointer dummy, GtkWidget *proxy) +{ + EvPageAction *page_action = EV_PAGE_ACTION (action); + GtkWidget *entry; - if (value != page->priv->current_page ) - { - gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), - page->priv->current_page); - } + entry = GTK_WIDGET (g_object_get_data (G_OBJECT (proxy), "entry")); + update_entry (page_action, entry); } static void -value_changed_cb (GtkWidget *spin, GtkAction *action) +activate_cb (GtkWidget *entry, GtkAction *action) { - int value; - - value = gtk_spin_button_get_value (GTK_SPIN_BUTTON (spin)); + EvPageAction *page_action = EV_PAGE_ACTION (action); + const char *text; + char *endptr; + int page = -1; + + text = gtk_entry_get_text (GTK_ENTRY (entry)); + if (text) { + long value; + + value = strtol (text, &endptr, 10); + if (endptr[0] == '\0') { + /* Page number is an integer */ + page = MIN (G_MAXINT, value); + } + } - g_signal_emit (action, signals[GOTO_PAGE_SIGNAL], 0, value); + if (page > 0 && page <= page_action->priv->total_pages) { + g_signal_emit (action, signals[GOTO_PAGE_SIGNAL], 0, page); + } else { + update_entry (page_action, entry); + } } static void -total_pages_changed_cb (EvPageAction *action, GParamSpec *pspec, - GtkSpinButton *spin) +entry_size_request_cb (GtkWidget *entry, + GtkRequisition *requisition, + GtkAction *action) { - gtk_spin_button_set_range (GTK_SPIN_BUTTON (spin), 1, - action->priv->total_pages); + PangoContext *context; + PangoFontMetrics *metrics; + int digit_width; + + context = gtk_widget_get_pango_context (entry); + metrics = pango_context_get_metrics + (context, entry->style->font_desc, + pango_context_get_language (context)); + + digit_width = pango_font_metrics_get_approximate_digit_width (metrics); + digit_width = PANGO_SCALE * ((digit_width + PANGO_SCALE - 1) / PANGO_SCALE); + + pango_font_metrics_unref (metrics); + + /* Space for 4 digits. Probably 3 would be enough but it doesnt + seem to possible to calculate entry borders without using + gtk private info */ + requisition->width = PANGO_PIXELS (digit_width * 4); } static GtkWidget * create_tool_item (GtkAction *action) { - GtkWidget *hbox, *spin, *item, *label; + GtkWidget *hbox, *entry, *item, *label; hbox = gtk_hbox_new (FALSE, 6); gtk_container_set_border_width (GTK_CONTAINER (hbox), 6); @@ -119,16 +155,15 @@ create_tool_item (GtkAction *action) item = GTK_WIDGET (gtk_tool_item_new ()); gtk_widget_show (item); - spin = gtk_spin_button_new_with_range (1, 9999, 1); - gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spin), 0); - g_object_set_data (G_OBJECT (item), "spin", spin); - gtk_widget_show (spin); + entry = gtk_entry_new (); + g_signal_connect (entry, "size_request", + G_CALLBACK (entry_size_request_cb), + action); + g_object_set_data (G_OBJECT (item), "entry", entry); + gtk_widget_show (entry); - g_signal_connect (action, "notify::total-pages", - G_CALLBACK (total_pages_changed_cb), - spin); - g_signal_connect (spin, "value_changed", - G_CALLBACK (value_changed_cb), + g_signal_connect (entry, "activate", + G_CALLBACK (activate_cb), action); label = gtk_label_new (""); @@ -136,7 +171,7 @@ create_tool_item (GtkAction *action) update_label (action, NULL, item); gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (hbox), spin, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); gtk_container_add (GTK_CONTAINER (item), hbox); @@ -152,7 +187,7 @@ connect_proxy (GtkAction *action, GtkWidget *proxy) G_CALLBACK (update_label), proxy, 0); g_signal_connect_object (action, "notify::current-page", - G_CALLBACK (update_spin), + G_CALLBACK (sync_entry), proxy, 0); } |