I have decided that I want to extend the
GtkImageView widget to make it extensible. Right now, it handles showing images that you can
zoom in on and drag around. It will be extended so that you can do the
following things:
-
Drag a selection on the widget. Very similar to how
gThumbs Image->Crop dialog works.
-
Various kinds of drawing operations.
I thought about implementing this as "tools":
+------------+
| | 1 1 +-------------+
|GtkImageView| ------> |GtkIImageTool|
| | +-------------+
+------------+ |_____________________
/ |
+-------------------+ +--------------------+
|GtkImageToolDragger| |GtkImageToolSelector|
+-------------------+ +--------------------+
In this diagram,
GtkImageView
has a reference to a
GtkIImageTool
which is an interface that abstracts out certain behaviour of
GtkImageView.
GtkImageToolDragger
and
GtkImageToolSelector
are two
concrete implementations of the GtkIImageTool interface. When
GtkImageView references a GtkImageToolDragger, it behaves like
normal. You have a hand cursor and can drag the image. When
GtkImageView references a GtkImageToolSelector, it instead displays a
selection cursor and you can make a rectangular selection on the
image.
Using this arrangement, it is now possible to dynamically alter the
behaviour of GtkImageView.
GtkImageView *view = GTK_IMAGE_VIEW (gtk_image_view_new ());
GtkImageToolSelector *selector = gtk_image_tool_selector_new ();
gtk_image_view_set_tool (view, selector);
/* The user can now make some selections on the image. We can
query which area of the image that is selected. */
GdkRectangle rect;
if (!gtk_image_tool_selector_get_selection (selector, &rect))
printf ("Nothing is selected!\n");
else
printf ("You selected (%d, %d)-(%d, %d)\n",
rect.x, rect.y, rect.width, rect.height);
It should be possible to achieve this, but the interface that
GtkIImageTool will specify, might become to fat.
/* These are needed because the tool needs to be able to decide
what happens when mouse events occur. */
gtk_iimage_tool_button_press ()
gtk_iimage_tool_button_release ()
gtk_iimage_tool_motion_notify ()
/* The tool needs to decide what the default cursor is. */
gtk_iimage_tool_get_default_cursor ()
/* The tool may need to do something when the pixbuf of the view
is changed. */
gtk_iimage_tool_set_pixbuf ()
/* The tool will want to draw the image in a special way. */
gtk_iimage_tool_draw_pixbuf_data ()
/* The tool will want to tell GtkImageNav how the image data
should be drawn as a thumbnail. */
gtk_iimage_tool_get_display_pixbuf ()