X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=cut-n-paste%2Fzoom-control%2Fephy-zoom-control.c;h=6c86b4a46e52cf8206b7bfadfc7e6ea0a27fe89a;hb=661c24bf2d3898825b081434c74807e6a7c4822b;hp=dcbe8a668c36025d33d3da773658ba1dfd123603;hpb=fecc75d11b8905c61a0ccc9490a1a6c2c54567bc;p=evince.git diff --git a/cut-n-paste/zoom-control/ephy-zoom-control.c b/cut-n-paste/zoom-control/ephy-zoom-control.c index dcbe8a66..6c86b4a4 100644 --- a/cut-n-paste/zoom-control/ephy-zoom-control.c +++ b/cut-n-paste/zoom-control/ephy-zoom-control.c @@ -15,7 +15,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * $Id$ */ @@ -24,19 +24,19 @@ #include "ephy-zoom-control.h" #include "ephy-zoom.h" -#include "ev-debug.h" #include -#include -#include #include -#define EPHY_ZOOM_CONTROL_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), EPHY_TYPE_ZOOM_CONTROL, EphyZoomControlPrivate)) +#define EPHY_ZOOM_CONTROL_GET_PRIVATE(object)\ + (G_TYPE_INSTANCE_GET_PRIVATE ((object), EPHY_TYPE_ZOOM_CONTROL, EphyZoomControlPrivate)) struct _EphyZoomControlPrivate { GtkComboBox *combo; float zoom; + float min_zoom; + float max_zoom; guint handler_id; }; @@ -49,7 +49,9 @@ enum enum { PROP_0, - PROP_ZOOM + PROP_ZOOM, + PROP_MIN_ZOOM, + PROP_MAX_ZOOM }; enum @@ -60,39 +62,7 @@ enum static guint signals[LAST_SIGNAL]; -static GObjectClass *parent_class = NULL; - -static void ephy_zoom_control_class_init (EphyZoomControlClass *klass); -static void ephy_zoom_control_init (EphyZoomControl *control); -static void ephy_zoom_control_finalize (GObject *o); - -GType -ephy_zoom_control_get_type (void) -{ - static GType type = 0; - - if (G_UNLIKELY (type == 0)) - { - static const GTypeInfo our_info = - { - sizeof (EphyZoomControlClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) ephy_zoom_control_class_init, - NULL, - NULL, /* class_data */ - sizeof (EphyZoomControl), - 0, /* n_preallocs */ - (GInstanceInitFunc) ephy_zoom_control_init, - }; - - type = g_type_register_static (GTK_TYPE_TOOL_ITEM, - "EphyZoomControl", - &our_info, 0); - } - - return type; -} +G_DEFINE_TYPE (EphyZoomControl, ephy_zoom_control, GTK_TYPE_TOOL_ITEM) static void combo_changed_cb (GtkComboBox *combo, EphyZoomControl *control) @@ -122,6 +92,44 @@ sync_zoom_cb (EphyZoomControl *control, GParamSpec *pspec, gpointer data) g_signal_handler_unblock (p->combo, p->handler_id); } +static void +sync_zoom_max_min_cb (EphyZoomControl *control, GParamSpec *pspec, gpointer data) +{ + EphyZoomControlPrivate *p = control->priv; + GtkListStore *model = (GtkListStore *)gtk_combo_box_get_model (p->combo); + GtkTreeIter iter; + gint i; + + g_signal_handler_block (p->combo, p->handler_id); + gtk_list_store_clear (model); + + for (i = 0; i < n_zoom_levels; i++) + { + if (zoom_levels[i].level > 0) { + if (zoom_levels[i].level < p->min_zoom) + continue; + + if (zoom_levels[i].level > p->max_zoom) + break; + } + + gtk_list_store_append (model, &iter); + + if (zoom_levels[i].name != NULL) { + gtk_list_store_set (model, &iter, + COL_TEXT, _(zoom_levels[i].name), + -1); + } else { + gtk_list_store_set (model, &iter, + COL_IS_SEP, zoom_levels[i].name == NULL, + -1); + } + } + + gtk_combo_box_set_active (p->combo, ephy_zoom_get_zoom_level_index (p->zoom)); + g_signal_handler_unblock (p->combo, p->handler_id); +} + static gboolean row_is_separator (GtkTreeModel *model, GtkTreeIter *iter, @@ -132,6 +140,16 @@ row_is_separator (GtkTreeModel *model, return is_sep; } +static void +ephy_zoom_control_finalize (GObject *o) +{ + EphyZoomControl *control = EPHY_ZOOM_CONTROL (o); + + g_object_unref (control->priv->combo); + + G_OBJECT_CLASS (ephy_zoom_control_parent_class)->finalize (o); +} + static void ephy_zoom_control_init (EphyZoomControl *control) { @@ -176,8 +194,7 @@ ephy_zoom_control_init (EphyZoomControl *control) NULL, NULL); gtk_combo_box_set_focus_on_click (p->combo, FALSE); - g_object_ref (p->combo); - gtk_object_sink (GTK_OBJECT (p->combo)); + g_object_ref_sink (G_OBJECT (p->combo)); gtk_widget_show (GTK_WIDGET (p->combo)); i = ephy_zoom_get_zoom_level_index (p->zoom); @@ -194,6 +211,10 @@ ephy_zoom_control_init (EphyZoomControl *control) g_signal_connect_object (control, "notify::zoom", G_CALLBACK (sync_zoom_cb), NULL, 0); + g_signal_connect_object (control, "notify::min-zoom", + G_CALLBACK (sync_zoom_max_min_cb), NULL, 0); + g_signal_connect_object (control, "notify::max-zoom", + G_CALLBACK (sync_zoom_max_min_cb), NULL, 0); } static void @@ -213,6 +234,12 @@ ephy_zoom_control_set_property (GObject *object, case PROP_ZOOM: p->zoom = g_value_get_float (value); break; + case PROP_MIN_ZOOM: + p->min_zoom = g_value_get_float (value); + break; + case PROP_MAX_ZOOM: + p->max_zoom = g_value_get_float (value); + break; } } @@ -233,69 +260,21 @@ ephy_zoom_control_get_property (GObject *object, case PROP_ZOOM: g_value_set_float (value, p->zoom); break; + case PROP_MIN_ZOOM: + g_value_set_float (value, p->min_zoom); + break; + case PROP_MAX_ZOOM: + g_value_set_float (value, p->max_zoom); + break; } } -static void -set_combo_tooltip (GtkWidget *widget, - GtkTooltipsData *data) -{ - if (GTK_IS_BUTTON (widget)) - { - gtk_tooltips_set_tip (data->tooltips, widget, - data->tip_text, data->tip_private); - } -} - -static void -combo_realized (GtkWidget *combo, - GtkWidget *control) -{ - GtkTooltipsData *data; - - data = gtk_tooltips_data_get (control); - g_return_if_fail (data != NULL); - - gtk_container_forall (GTK_CONTAINER (combo), - (GtkCallback) set_combo_tooltip, data); -} - -static gboolean -ephy_zoom_control_set_tooltip (GtkToolItem *tool_item, - GtkTooltips *tooltips, - const char *tip_text, - const char *tip_private) -{ - EphyZoomControl *control = EPHY_ZOOM_CONTROL (tool_item); - GtkWidget *widget = GTK_WIDGET (tool_item); - - /* hack to make tooltips work also on Ctrl-F1 */ - gtk_tooltips_set_tip (tooltips, widget, tip_text, tip_private); - - g_signal_handlers_disconnect_by_func - (control->priv->combo, G_CALLBACK (combo_realized), widget); - - if (GTK_WIDGET_REALIZED (tool_item)) - { - combo_realized (GTK_WIDGET (control->priv->combo), widget); - } - else - { - g_signal_connect_after (control->priv->combo, "realize", - G_CALLBACK (combo_realized), widget); - } - - return TRUE; -} - static void ephy_zoom_control_class_init (EphyZoomControlClass *klass) { GObjectClass *object_class; GtkToolItemClass *tool_item_class; - parent_class = g_type_class_peek_parent (klass); - object_class = (GObjectClass *)klass; tool_item_class = (GtkToolItemClass *)klass; @@ -303,8 +282,6 @@ ephy_zoom_control_class_init (EphyZoomControlClass *klass) object_class->get_property = ephy_zoom_control_get_property; object_class->finalize = ephy_zoom_control_finalize; - tool_item_class->set_tooltip = ephy_zoom_control_set_tooltip; - g_object_class_install_property (object_class, PROP_ZOOM, g_param_spec_float ("zoom", @@ -314,6 +291,24 @@ ephy_zoom_control_class_init (EphyZoomControlClass *klass) ZOOM_MAXIMAL, 1.0, G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_MIN_ZOOM, + g_param_spec_float ("min-zoom", + "MinZoom", + "The minimum zoom", + ZOOM_MINIMAL, + ZOOM_MAXIMAL, + ZOOM_MINIMAL, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_MAX_ZOOM, + g_param_spec_float ("max-zoom", + "MaxZoom", + "The maximum zoom", + ZOOM_MINIMAL, + ZOOM_MAXIMAL, + ZOOM_MAXIMAL, + G_PARAM_READWRITE)); signals[ZOOM_TO_LEVEL_SIGNAL] = g_signal_new ("zoom_to_level", @@ -330,16 +325,6 @@ ephy_zoom_control_class_init (EphyZoomControlClass *klass) g_type_class_add_private (object_class, sizeof (EphyZoomControlPrivate)); } -static void -ephy_zoom_control_finalize (GObject *o) -{ - EphyZoomControl *control = EPHY_ZOOM_CONTROL (o); - - g_object_unref (control->priv->combo); - - G_OBJECT_CLASS (parent_class)->finalize (o); -} - void ephy_zoom_control_set_zoom_level (EphyZoomControl *control, float zoom) {