diff --git a/ChangeLog b/ChangeLog index 7cf9678546..188f2e5c17 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2005-09-20 DindinX + + * libgimpwidgets/gimpzoommodel.[ch]: use private data instead of + struct members. Added min-factor and max-factor properties so we can + set the zoom range. These can be set by a new utility function: + gimp_zoom_model_set_range. + + * libgimpwidgets/gimpwidgets.def: added gimp_zoom_model_set_range. + + * libgimp/gimpzoompreview.c: use gimp_zoom_model_set_range so we can + only zoom in. + 2005-09-20 Sven Neumann * app/paint-funcs/paint-funcs.c (erode_region, dilate_region): diff --git a/libgimp/gimpzoompreview.c b/libgimp/gimpzoompreview.c index 2d59ec5ccb..99dd46ecc1 100644 --- a/libgimp/gimpzoompreview.c +++ b/libgimp/gimpzoompreview.c @@ -83,6 +83,7 @@ gimp_zoom_preview_init (GimpZoomPreview *preview) GtkWidget *label; preview->zoom = gimp_zoom_model_new (1.1); + gimp_zoom_model_set_range (GIMP_ZOOM_MODEL (preview->zoom), 1.0, 256.0); g_signal_connect_swapped (preview->zoom, "notify::zoom-factor", G_CALLBACK (gimp_zoom_preview_set_adjustments), preview); diff --git a/libgimpwidgets/gimpwidgets.def b/libgimpwidgets/gimpwidgets.def index e2fa05221c..6229f95245 100644 --- a/libgimpwidgets/gimpwidgets.def +++ b/libgimpwidgets/gimpwidgets.def @@ -332,4 +332,5 @@ EXPORTS gimp_zoom_model_get_fraction gimp_zoom_model_get_type gimp_zoom_model_new + gimp_zoom_model_set_range gimp_zoom_widget_new diff --git a/libgimpwidgets/gimpzoommodel.c b/libgimpwidgets/gimpzoommodel.c index 394647bc9c..dd039a38eb 100644 --- a/libgimpwidgets/gimpzoommodel.c +++ b/libgimpwidgets/gimpzoommodel.c @@ -38,9 +38,23 @@ enum { PROP_0, PROP_ZOOM_FACTOR, - PROP_STEP_SIZE + PROP_STEP_SIZE, + PROP_MIN_FACTOR, + PROP_MAX_FACTOR }; +typedef struct _GimpZoomModelPrivate GimpZoomModelPrivate; + +struct _GimpZoomModelPrivate +{ + gdouble zoom_factor; + gdouble step_size; + gdouble min_factor; + gdouble max_factor; +}; + +#define GIMP_ZOOM_MODEL_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GIMP_TYPE_ZOOM_MODEL, GimpZoomModelPrivate)) + static void gimp_zoom_model_set_property (GObject *object, guint property_id, const GValue *value, @@ -75,11 +89,30 @@ gimp_zoom_model_class_init (GimpZoomModelClass *klass) 1.01, 10.0, 1.1, G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); + + g_object_class_install_property (object_class, PROP_MIN_FACTOR, + g_param_spec_double ("min-factor", + _("Min factor"), NULL, + 1.0 / 256.0, 256.0, + 1.0 / 256.0, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, PROP_MAX_FACTOR, + g_param_spec_double ("max-factor", + _("Max factor"), NULL, + 1.0 / 256.0, 256.0, + 256.0, + G_PARAM_READWRITE)); + + g_type_class_add_private (object_class, sizeof (GimpZoomModelPrivate)); } static void gimp_zoom_model_init (GimpZoomModel *zoom_model) { + GimpZoomModelPrivate *priv = GIMP_ZOOM_MODEL_GET_PRIVATE (zoom_model); + + priv->min_factor = 1.0 / 256.0; + priv->max_factor = 256.0; } static void @@ -88,22 +121,40 @@ gimp_zoom_model_set_property (GObject *object, const GValue *value, GParamSpec *pspec) { - GimpZoomModel *model = GIMP_ZOOM_MODEL (object); + GimpZoomModelPrivate *priv = GIMP_ZOOM_MODEL_GET_PRIVATE (object); switch (property_id) { case PROP_ZOOM_FACTOR: - model->zoom_factor = g_value_get_double (value); + priv->zoom_factor = g_value_get_double (value); + g_object_notify (object, "zoom-factor"); break; case PROP_STEP_SIZE: - model->step_size = g_value_get_double (value); + priv->step_size = g_value_get_double (value); + break; + + case PROP_MIN_FACTOR: + priv->min_factor = MIN (g_value_get_double (value), priv->max_factor); + break; + + case PROP_MAX_FACTOR: + priv->max_factor = MAX (g_value_get_double (value), priv->min_factor); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } + + if (priv->zoom_factor > priv->max_factor || + priv->zoom_factor < priv->min_factor) + { + priv->zoom_factor = CLAMP (priv->zoom_factor, + priv->min_factor, + priv->max_factor); + g_object_notify (object, "zoom-factor"); + } } static void @@ -112,16 +163,24 @@ gimp_zoom_model_get_property (GObject *object, GValue *value, GParamSpec *pspec) { - GimpZoomModel *model = GIMP_ZOOM_MODEL (object); + GimpZoomModelPrivate *priv = GIMP_ZOOM_MODEL_GET_PRIVATE (object); switch (property_id) { case PROP_ZOOM_FACTOR: - g_value_set_double (value, model->zoom_factor); + g_value_set_double (value, priv->zoom_factor); break; case PROP_STEP_SIZE: - g_value_set_double (value, model->step_size); + g_value_set_double (value, priv->step_size); + break; + + case PROP_MIN_FACTOR: + g_value_set_double (value, priv->min_factor); + break; + + case PROP_MAX_FACTOR: + g_value_set_double (value, priv->max_factor); break; default: @@ -133,17 +192,29 @@ gimp_zoom_model_get_property (GObject *object, static void gimp_zoom_model_zoom_in (GimpZoomModel *zoom_model) { + GimpZoomModelPrivate *priv = GIMP_ZOOM_MODEL_GET_PRIVATE (zoom_model); + g_return_if_fail (GIMP_IS_ZOOM_MODEL (zoom_model)); - zoom_model->zoom_factor *= zoom_model->step_size; - g_object_notify (G_OBJECT (zoom_model), "zoom-factor"); + + if (priv->zoom_factor < priv->max_factor); + { + priv->zoom_factor *= priv->step_size; + g_object_notify (G_OBJECT (zoom_model), "zoom-factor"); + } } static void gimp_zoom_model_zoom_out (GimpZoomModel *zoom_model) { + GimpZoomModelPrivate *priv = GIMP_ZOOM_MODEL_GET_PRIVATE (zoom_model); + g_return_if_fail (GIMP_IS_ZOOM_MODEL (zoom_model)); - zoom_model->zoom_factor /= zoom_model->step_size; - g_object_notify (G_OBJECT (zoom_model), "zoom-factor"); + + if (priv->zoom_factor > priv->min_factor) + { + priv->zoom_factor /= priv->step_size; + g_object_notify (G_OBJECT (zoom_model), "zoom-factor"); + } } static void @@ -151,14 +222,15 @@ gimp_zoom_model_update_label (GimpZoomModel *zoom_model, GParamSpec *pspec, GtkLabel *label) { - gint numerator; - gint denominator; - gchar *txt; + gint numerator; + gint denominator; + gchar *txt; + GimpZoomModelPrivate *priv = GIMP_ZOOM_MODEL_GET_PRIVATE (zoom_model); g_return_if_fail (GIMP_IS_ZOOM_MODEL (zoom_model)); g_return_if_fail (GTK_IS_LABEL (label)); - gimp_zoom_model_get_fraction (zoom_model->zoom_factor, + gimp_zoom_model_get_fraction (priv->zoom_factor, &numerator, &denominator); txt = g_strdup_printf (_("zoom factor %d:%d"), numerator, denominator); @@ -281,12 +353,13 @@ GtkWidget * gimp_zoom_widget_new (GimpZoomModel *zoom_model, GimpZoomWidgetType widget) { - GtkWidget *button; - GtkWidget *image; - GtkWidget *label; - gint numerator; - gint denominator; - gchar *txt; + GtkWidget *button; + GtkWidget *image; + GtkWidget *label; + gint numerator; + gint denominator; + gchar *txt; + GimpZoomModelPrivate *priv = GIMP_ZOOM_MODEL_GET_PRIVATE (zoom_model); g_return_val_if_fail (GIMP_IS_ZOOM_MODEL (zoom_model), NULL); @@ -315,7 +388,7 @@ gimp_zoom_widget_new (GimpZoomModel *zoom_model, return button; case GIMP_ZOOM_LABEL: - gimp_zoom_model_get_fraction (zoom_model->zoom_factor, + gimp_zoom_model_get_fraction (priv->zoom_factor, &numerator, &denominator); txt = g_strdup_printf (_("zoom factor %d:%d"), numerator, denominator); @@ -333,9 +406,34 @@ gimp_zoom_widget_new (GimpZoomModel *zoom_model, gdouble gimp_zoom_model_get_factor (GimpZoomModel *zoom_model) { + GimpZoomModelPrivate *priv = GIMP_ZOOM_MODEL_GET_PRIVATE (zoom_model); + g_return_val_if_fail (GIMP_IS_ZOOM_MODEL (zoom_model), 1.0); - return zoom_model->zoom_factor; + return priv->zoom_factor; } +void +gimp_zoom_model_set_range (GimpZoomModel *zoom_model, + gdouble min, + gdouble max) +{ + GimpZoomModelPrivate *priv = GIMP_ZOOM_MODEL_GET_PRIVATE (zoom_model); + + g_return_if_fail (min < max); + g_return_if_fail (min >= 1.0 / 256.0); + g_return_if_fail (max <= 256.0); + + priv->min_factor = min; + priv->max_factor = max; + + if (priv->zoom_factor > priv->max_factor || + priv->zoom_factor < priv->min_factor) + { + priv->zoom_factor = CLAMP (priv->zoom_factor, + priv->min_factor, + priv->max_factor); + g_object_notify (G_OBJECT (zoom_model), "zoom-factor"); + } +} diff --git a/libgimpwidgets/gimpzoommodel.h b/libgimpwidgets/gimpzoommodel.h index 2da888f53e..b2f5b260e5 100644 --- a/libgimpwidgets/gimpzoommodel.h +++ b/libgimpwidgets/gimpzoommodel.h @@ -39,9 +39,6 @@ typedef struct _GimpZoomModelClass GimpZoomModelClass; struct _GimpZoomModel { GObject parent_instance; - - gdouble zoom_factor; - gdouble step_size; }; struct _GimpZoomModelClass @@ -67,6 +64,9 @@ gdouble gimp_zoom_model_get_factor (GimpZoomModel *zoom_model); void gimp_zoom_model_get_fraction (gdouble zoom_factor, gint *numerator, gint *denominator); +void gimp_zoom_model_set_range (GimpZoomModel *zoom_model, + gdouble min, + gdouble max); G_END_DECLS