chain up.

2006-08-09  Sven Neumann  <sven@gimp.org>

	* app/plug-in/gimppluginmanager.c (gimp_plug_in_manager_dispose):
	chain up.

	* libgimp/gimpzoompreview.[ch]: added API to get a pointer to the
	GimpZoomModel used by the preview and added a constructor that
	allows to pass a model.

	* libgimp/gimpui.def: updated.
This commit is contained in:
Sven Neumann 2006-08-09 10:30:01 +00:00 committed by Sven Neumann
parent fc47eb5cbd
commit 20b4f56b83
5 changed files with 184 additions and 47 deletions

View File

@ -1,3 +1,14 @@
2006-08-09 Sven Neumann <sven@gimp.org>
* app/plug-in/gimppluginmanager.c (gimp_plug_in_manager_dispose):
chain up.
* libgimp/gimpzoompreview.[ch]: added API to get a pointer to the
GimpZoomModel used by the preview and added a constructor that
allows to pass a model.
* libgimp/gimpui.def: updated.
2006-08-09 Sven Neumann <sven@gimp.org> 2006-08-09 Sven Neumann <sven@gimp.org>
* app/tools/gimpfreeselecttool.c (gimp_free_select_tool_draw): * app/tools/gimpfreeselecttool.c (gimp_free_select_tool_draw):

View File

@ -180,6 +180,8 @@ gimp_plug_in_manager_dispose (GObject *object)
GimpPlugInManager *manager = GIMP_PLUG_IN_MANAGER (object); GimpPlugInManager *manager = GIMP_PLUG_IN_MANAGER (object);
gimp_plug_in_manager_history_clear (manager); gimp_plug_in_manager_history_clear (manager);
G_OBJECT_CLASS (parent_class)->dispose (object);
} }
static void static void

View File

@ -71,6 +71,8 @@ EXPORTS
gimp_window_set_transient_for_display gimp_window_set_transient_for_display
gimp_zoom_preview_get_drawable gimp_zoom_preview_get_drawable
gimp_zoom_preview_get_factor gimp_zoom_preview_get_factor
gimp_zoom_preview_get_model
gimp_zoom_preview_get_source gimp_zoom_preview_get_source
gimp_zoom_preview_get_type gimp_zoom_preview_get_type
gimp_zoom_preview_new gimp_zoom_preview_new
gimp_zoom_preview_new_with_model

View File

@ -37,7 +37,8 @@
enum enum
{ {
PROP_0, PROP_0,
PROP_DRAWABLE PROP_DRAWABLE,
PROP_MODEL
}; };
typedef struct GimpZoomPreviewPrivate typedef struct GimpZoomPreviewPrivate
@ -63,6 +64,8 @@ static void gimp_zoom_preview_set_property (GObject *object,
guint property_id, guint property_id,
const GValue *value, const GValue *value,
GParamSpec *pspec); GParamSpec *pspec);
static void gimp_zoom_preview_finalize (GObject *object);
static void gimp_zoom_preview_set_adjustments (GimpZoomPreview *preview, static void gimp_zoom_preview_set_adjustments (GimpZoomPreview *preview,
gdouble old_factor, gdouble old_factor,
gdouble new_factor); gdouble new_factor);
@ -86,6 +89,8 @@ static void gimp_zoom_preview_set_cursor (GimpPreview *preview);
static void gimp_zoom_preview_set_drawable (GimpZoomPreview *preview, static void gimp_zoom_preview_set_drawable (GimpZoomPreview *preview,
GimpDrawable *drawable); GimpDrawable *drawable);
static void gimp_zoom_preview_set_model (GimpZoomPreview *preview,
GimpZoomModel *model);
G_DEFINE_TYPE (GimpZoomPreview, gimp_zoom_preview, GIMP_TYPE_SCROLLED_PREVIEW) G_DEFINE_TYPE (GimpZoomPreview, gimp_zoom_preview, GIMP_TYPE_SCROLLED_PREVIEW)
@ -103,6 +108,7 @@ gimp_zoom_preview_class_init (GimpZoomPreviewClass *klass)
object_class->constructor = gimp_zoom_preview_constructor; object_class->constructor = gimp_zoom_preview_constructor;
object_class->get_property = gimp_zoom_preview_get_property; object_class->get_property = gimp_zoom_preview_get_property;
object_class->set_property = gimp_zoom_preview_set_property; object_class->set_property = gimp_zoom_preview_set_property;
object_class->finalize = gimp_zoom_preview_finalize;
widget_class->style_set = gimp_zoom_preview_style_set; widget_class->style_set = gimp_zoom_preview_style_set;
@ -116,7 +122,7 @@ gimp_zoom_preview_class_init (GimpZoomPreviewClass *klass)
/** /**
* GimpZoomPreview:drawable: * GimpZoomPreview:drawable:
* *
* The drawable the #GimpZoomPreview is currently attached to. * The drawable the #GimpZoomPreview is attached to.
* *
* Since: GIMP 2.4 * Since: GIMP 2.4
*/ */
@ -124,47 +130,28 @@ gimp_zoom_preview_class_init (GimpZoomPreviewClass *klass)
g_param_spec_pointer ("drawable", NULL, NULL, g_param_spec_pointer ("drawable", NULL, NULL,
GIMP_PARAM_READWRITE | GIMP_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY)); G_PARAM_CONSTRUCT_ONLY));
/**
* GimpZoomPreview:model:
*
* The #GimpZoomModel used by this #GimpZoomPreview.
*
* Since: GIMP 2.4
*/
g_object_class_install_property (object_class, PROP_MODEL,
g_param_spec_object ("model", NULL, NULL,
GIMP_TYPE_ZOOM_MODEL,
GIMP_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
} }
static void static void
gimp_zoom_preview_init (GimpZoomPreview *preview) gimp_zoom_preview_init (GimpZoomPreview *preview)
{ {
GimpZoomPreviewPrivate *priv;
GtkWidget *button_bar;
GtkWidget *button;
GtkWidget *box;
preview->priv = G_TYPE_INSTANCE_GET_PRIVATE (preview, preview->priv = G_TYPE_INSTANCE_GET_PRIVATE (preview,
GIMP_TYPE_ZOOM_PREVIEW, GIMP_TYPE_ZOOM_PREVIEW,
GimpZoomPreviewPrivate); GimpZoomPreviewPrivate);
priv = GIMP_ZOOM_PREVIEW_GET_PRIVATE (preview);
priv->model = gimp_zoom_model_new ();
gimp_zoom_model_set_range (GIMP_ZOOM_MODEL (priv->model), 1.0, 256.0);
g_signal_connect_swapped (priv->model, "zoomed",
G_CALLBACK (gimp_zoom_preview_set_adjustments),
preview);
box = gimp_preview_get_controls (GIMP_PREVIEW (preview));
g_return_if_fail (GTK_IS_BOX (box));
button_bar = gtk_hbox_new (FALSE, 2);
gtk_box_pack_end (GTK_BOX (box), button_bar, FALSE, FALSE, 0);
gtk_widget_show (button_bar);
/* zoom out */
button = gimp_zoom_button_new (priv->model,
GIMP_ZOOM_OUT, GTK_ICON_SIZE_SMALL_TOOLBAR);
gtk_box_pack_start (GTK_BOX (button_bar), button, FALSE, FALSE, 0);
gtk_widget_show (button);
/* zoom in */
button = gimp_zoom_button_new (priv->model,
GIMP_ZOOM_IN, GTK_ICON_SIZE_SMALL_TOOLBAR);
gtk_box_pack_start (GTK_BOX (button_bar), button, FALSE, FALSE, 0);
gtk_widget_show (button);
g_signal_connect (GIMP_PREVIEW (preview)->area, "size-allocate", g_signal_connect (GIMP_PREVIEW (preview)->area, "size-allocate",
G_CALLBACK (gimp_zoom_preview_size_allocate), G_CALLBACK (gimp_zoom_preview_size_allocate),
preview); preview);
@ -186,10 +173,23 @@ gimp_zoom_preview_constructor (GType type,
guint n_params, guint n_params,
GObjectConstructParam *params) GObjectConstructParam *params)
{ {
GObject *object; GimpZoomPreviewPrivate *priv;
GObject *object;
object = G_OBJECT_CLASS (parent_class)->constructor (type, n_params, params); object = G_OBJECT_CLASS (parent_class)->constructor (type, n_params, params);
priv = GIMP_ZOOM_PREVIEW_GET_PRIVATE (object);
if (! priv->model)
{
GimpZoomModel *model = gimp_zoom_model_new ();
gimp_zoom_model_set_range (model, 1.0, 256.0);
gimp_zoom_preview_set_model (GIMP_ZOOM_PREVIEW (object), model);
g_object_unref (model);
}
gimp_zoom_preview_set_adjustments (GIMP_ZOOM_PREVIEW (object), 1.0, 1.0); gimp_zoom_preview_set_adjustments (GIMP_ZOOM_PREVIEW (object), 1.0, 1.0);
return object; return object;
@ -209,6 +209,10 @@ gimp_zoom_preview_get_property (GObject *object,
g_value_set_pointer (value, gimp_zoom_preview_get_drawable (preview)); g_value_set_pointer (value, gimp_zoom_preview_get_drawable (preview));
break; break;
case PROP_MODEL:
g_value_set_object (value, gimp_zoom_preview_get_model (preview));
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break; break;
@ -226,8 +230,11 @@ gimp_zoom_preview_set_property (GObject *object,
switch (property_id) switch (property_id)
{ {
case PROP_DRAWABLE: case PROP_DRAWABLE:
gimp_zoom_preview_set_drawable (preview, gimp_zoom_preview_set_drawable (preview, g_value_get_pointer (value));
g_value_get_pointer (value)); break;
case PROP_MODEL:
gimp_zoom_preview_set_model (preview, g_value_get_object (value));
break; break;
default: default:
@ -236,6 +243,20 @@ gimp_zoom_preview_set_property (GObject *object,
} }
} }
static void
gimp_zoom_preview_finalize (GObject *object)
{
GimpZoomPreviewPrivate *priv = GIMP_ZOOM_PREVIEW_GET_PRIVATE (object);
if (priv->model)
{
g_object_unref (priv->model);
priv->model = NULL;
}
G_OBJECT_CLASS (parent_class)->finalize (object);
}
static void static void
gimp_zoom_preview_set_adjustments (GimpZoomPreview *preview, gimp_zoom_preview_set_adjustments (GimpZoomPreview *preview,
gdouble old_factor, gdouble old_factor,
@ -390,8 +411,11 @@ gimp_zoom_preview_draw (GimpPreview *preview)
g_return_if_fail (GIMP_IS_ZOOM_PREVIEW (preview)); g_return_if_fail (GIMP_IS_ZOOM_PREVIEW (preview));
if (! priv->model)
return;
drawable = priv->drawable; drawable = priv->drawable;
if (!drawable) if (! drawable)
return; return;
zoom_factor = gimp_zoom_model_get_factor (priv->model); zoom_factor = gimp_zoom_model_get_factor (priv->model);
@ -526,6 +550,8 @@ gimp_zoom_preview_set_drawable (GimpZoomPreview *preview,
gint x1, y1; gint x1, y1;
gint x2, y2; gint x2, y2;
g_return_if_fail (priv->drawable == NULL);
priv->drawable = drawable; priv->drawable = drawable;
if (_gimp_drawable_preview_get_bounds (drawable, &x1, &y1, &x2, &y2)) if (_gimp_drawable_preview_get_bounds (drawable, &x1, &y1, &x2, &y2))
@ -567,6 +593,47 @@ gimp_zoom_preview_set_drawable (GimpZoomPreview *preview,
NULL); NULL);
} }
static void
gimp_zoom_preview_set_model (GimpZoomPreview *preview,
GimpZoomModel *model)
{
GimpZoomPreviewPrivate *priv = GIMP_ZOOM_PREVIEW_GET_PRIVATE (preview);
GtkWidget *button_bar;
GtkWidget *button;
GtkWidget *box;
g_return_if_fail (priv->model == NULL);
if (! model)
return;
priv->model = g_object_ref (model);
g_signal_connect_swapped (priv->model, "zoomed",
G_CALLBACK (gimp_zoom_preview_set_adjustments),
preview);
box = gimp_preview_get_controls (GIMP_PREVIEW (preview));
g_return_if_fail (GTK_IS_BOX (box));
button_bar = gtk_hbox_new (FALSE, 2);
gtk_box_pack_end (GTK_BOX (box), button_bar, FALSE, FALSE, 0);
gtk_widget_show (button_bar);
/* zoom out */
button = gimp_zoom_button_new (priv->model,
GIMP_ZOOM_OUT, GTK_ICON_SIZE_SMALL_TOOLBAR);
gtk_box_pack_start (GTK_BOX (button_bar), button, FALSE, FALSE, 0);
gtk_widget_show (button);
/* zoom in */
button = gimp_zoom_button_new (priv->model,
GIMP_ZOOM_IN, GTK_ICON_SIZE_SMALL_TOOLBAR);
gtk_box_pack_start (GTK_BOX (button_bar), button, FALSE, FALSE, 0);
gtk_widget_show (button);
}
/** /**
* gimp_zoom_preview_new: * gimp_zoom_preview_new:
* @drawable: a #GimpDrawable * @drawable: a #GimpDrawable
@ -578,11 +645,43 @@ gimp_zoom_preview_set_drawable (GimpZoomPreview *preview,
GtkWidget * GtkWidget *
gimp_zoom_preview_new (GimpDrawable *drawable) gimp_zoom_preview_new (GimpDrawable *drawable)
{ {
g_return_val_if_fail (drawable != NULL, NULL);
return g_object_new (GIMP_TYPE_ZOOM_PREVIEW, return g_object_new (GIMP_TYPE_ZOOM_PREVIEW,
"drawable", drawable, "drawable", drawable,
NULL); NULL);
} }
/**
* gimp_zoom_preview_new_with_model:
* @drawable: a #GimpDrawable
* @model: a #GimpZoomModel
*
* Creates a new #GimpZoomPreview widget for @drawable using the
* given @model.
*
* This variant of gimp_zoom_preview_new() allows you to create a
* preview using an existing zoom model. This may be useful if for
* example you want to have two zoom previews that keep their zoom
* factor in sync.
*
* Since: GIMP 2.4
**/
GtkWidget *
gimp_zoom_preview_new_with_model (GimpDrawable *drawable,
GimpZoomModel *model)
{
g_return_val_if_fail (drawable != NULL, NULL);
g_return_val_if_fail (GIMP_IS_ZOOM_MODEL (model), NULL);
return g_object_new (GIMP_TYPE_ZOOM_PREVIEW,
"drawable", drawable,
"model", model,
NULL);
}
/** /**
* gimp_zoom_preview_get_drawable: * gimp_zoom_preview_get_drawable:
* @preview: a #GimpZoomPreview widget * @preview: a #GimpZoomPreview widget
@ -601,6 +700,24 @@ gimp_zoom_preview_get_drawable (GimpZoomPreview *preview)
return priv->drawable; return priv->drawable;
} }
/**
* gimp_zoom_preview_get_model:
* @preview: a #GimpZoomPreview widget
*
* Returns the #GimpZoomModel the preview is using.
*
* Return Value: a pointer to the #GimpZoomModel owned by the @preview
*
* Since: GIMP 2.4
**/
GimpZoomModel *
gimp_zoom_preview_get_model (GimpZoomPreview *preview)
{
GimpZoomPreviewPrivate *priv = GIMP_ZOOM_PREVIEW_GET_PRIVATE (preview);
return priv->model;
}
/** /**
* gimp_zoom_preview_get_factor: * gimp_zoom_preview_get_factor:
* @preview: a #GimpZoomPreview widget * @preview: a #GimpZoomPreview widget
@ -616,7 +733,7 @@ gimp_zoom_preview_get_factor (GimpZoomPreview *preview)
{ {
GimpZoomPreviewPrivate *priv = GIMP_ZOOM_PREVIEW_GET_PRIVATE (preview); GimpZoomPreviewPrivate *priv = GIMP_ZOOM_PREVIEW_GET_PRIVATE (preview);
return gimp_zoom_model_get_factor (priv->model); return priv->model ? gimp_zoom_model_get_factor (priv->model) : 1.0;
} }
/** /**

View File

@ -61,15 +61,20 @@ struct _GimpZoomPreviewClass
}; };
GType gimp_zoom_preview_get_type (void) G_GNUC_CONST; GType gimp_zoom_preview_get_type (void) G_GNUC_CONST;
GtkWidget * gimp_zoom_preview_new (GimpDrawable *drawable); GtkWidget * gimp_zoom_preview_new (GimpDrawable *drawable);
guchar * gimp_zoom_preview_get_source (GimpZoomPreview *preview, GtkWidget * gimp_zoom_preview_new_with_model (GimpDrawable *drawable,
gint *width, GimpZoomModel *model);
gint *height,
gint *bpp); guchar * gimp_zoom_preview_get_source (GimpZoomPreview *preview,
GimpDrawable * gimp_zoom_preview_get_drawable (GimpZoomPreview *preview); gint *width,
gdouble gimp_zoom_preview_get_factor (GimpZoomPreview *preview); gint *height,
gint *bpp);
GimpDrawable * gimp_zoom_preview_get_drawable (GimpZoomPreview *preview);
GimpZoomModel * gimp_zoom_preview_get_model (GimpZoomPreview *preview);
gdouble gimp_zoom_preview_get_factor (GimpZoomPreview *preview);
G_END_DECLS G_END_DECLS