app: port sample point drawing to GimpCanvasItems

- Add GimpImage signal "sample-point-moved" and emit it when needed
- Let the shell connect to the sample point add, remove and move signals
  and update the canvas items accordingly
- Remove gimp_display_shell_draw_sample_points()
This commit is contained in:
Michael Natterer 2010-10-01 09:15:52 +02:00
parent 0f73269484
commit 0c613ba87d
8 changed files with 155 additions and 70 deletions

View File

@ -98,7 +98,8 @@ gimp_image_remove_sample_point (GimpImage *image,
gimp_image_update_sample_point (image, sample_point);
if (push_undo)
gimp_image_undo_push_sample_point (image, C_("undo-type", "Remove Sample Point"),
gimp_image_undo_push_sample_point (image,
C_("undo-type", "Remove Sample Point"),
sample_point);
list = g_list_find (private->sample_points, sample_point);
@ -135,13 +136,16 @@ gimp_image_move_sample_point (GimpImage *image,
g_return_if_fail (y < gimp_image_get_height (image));
if (push_undo)
gimp_image_undo_push_sample_point (image, C_("undo-type", "Move Sample Point"),
gimp_image_undo_push_sample_point (image,
C_("undo-type", "Move Sample Point"),
sample_point);
gimp_image_update_sample_point (image, sample_point);
sample_point->x = x;
sample_point->y = y;
gimp_image_update_sample_point (image, sample_point);
gimp_image_sample_point_moved (image, sample_point);
}
GList *

View File

@ -105,6 +105,7 @@ enum
UPDATE_VECTORS,
SAMPLE_POINT_ADDED,
SAMPLE_POINT_REMOVED,
SAMPLE_POINT_MOVED,
PARASITE_ATTACHED,
PARASITE_DETACHED,
COLORMAP_CHANGED,
@ -472,6 +473,16 @@ gimp_image_class_init (GimpImageClass *klass)
G_TYPE_NONE, 1,
G_TYPE_POINTER);
gimp_image_signals[SAMPLE_POINT_MOVED] =
g_signal_new ("sample-point-moved",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (GimpImageClass, sample_point_moved),
NULL, NULL,
gimp_marshal_VOID__POINTER,
G_TYPE_NONE, 1,
G_TYPE_POINTER);
gimp_image_signals[PARASITE_ATTACHED] =
g_signal_new ("parasite-attached",
G_TYPE_FROM_CLASS (klass),
@ -556,6 +567,7 @@ gimp_image_class_init (GimpImageClass *klass)
klass->update_vectors = NULL;
klass->sample_point_added = NULL;
klass->sample_point_removed = NULL;
klass->sample_point_moved = NULL;
klass->parasite_attached = NULL;
klass->parasite_detached = NULL;
klass->colormap_changed = gimp_image_real_colormap_changed;
@ -2143,6 +2155,17 @@ gimp_image_sample_point_removed (GimpImage *image,
sample_point);
}
void
gimp_image_sample_point_moved (GimpImage *image,
GimpSamplePoint *sample_point)
{
g_return_if_fail (GIMP_IS_IMAGE (image));
g_return_if_fail (sample_point != NULL);
g_signal_emit (image, gimp_image_signals[SAMPLE_POINT_MOVED], 0,
sample_point);
}
/**
* gimp_image_size_changed_detailed:
* @image:

View File

@ -141,6 +141,8 @@ struct _GimpImageClass
GimpSamplePoint *sample_point);
void (* sample_point_removed) (GimpImage *image,
GimpSamplePoint *sample_point);
void (* sample_point_moved) (GimpImage *image,
GimpSamplePoint *sample_point);
void (* parasite_attached) (GimpImage *image,
const gchar *name);
void (* parasite_detached) (GimpImage *image,
@ -260,6 +262,8 @@ void gimp_image_sample_point_added (GimpImage *image,
GimpSamplePoint *sample_point);
void gimp_image_sample_point_removed (GimpImage *image,
GimpSamplePoint *sample_point);
void gimp_image_sample_point_moved (GimpImage *image,
GimpSamplePoint *sample_point);
void gimp_image_colormap_changed (GimpImage *image,
gint col);
void gimp_image_selection_control (GimpImage *image,

View File

@ -177,6 +177,9 @@ gimp_sample_point_undo_pop (GimpUndo *undo,
sample_point_undo->sample_point->y = sample_point_undo->y;
gimp_image_update_sample_point (undo->image,
sample_point_undo->sample_point);
gimp_image_sample_point_moved (undo->image,
sample_point_undo->sample_point);
}
sample_point_undo->x = x;

View File

@ -2345,12 +2345,7 @@ gimp_display_shell_canvas_expose_image (GimpDisplayShell *shell,
gimp_display_shell_draw_guides (shell, cr);
cairo_restore (cr);
/* draw the sample points */
cairo_save (cr);
gimp_display_shell_draw_sample_points (shell, cr);
cairo_restore (cr);
/* draw tool items */
/* draw canvas items */
cairo_save (cr);
gimp_canvas_item_draw (shell->canvas_item, shell, cr);
cairo_restore (cr);

View File

@ -37,9 +37,7 @@
#include "core/gimpimage.h"
#include "core/gimpimage-grid.h"
#include "core/gimpimage-guides.h"
#include "core/gimpimage-sample-points.h"
#include "core/gimpprojection.h"
#include "core/gimpsamplepoint.h"
#include "vectors/gimpstroke.h"
#include "vectors/gimpvectors.h"
@ -49,7 +47,6 @@
#include "gimpcanvas.h"
#include "gimpcanvasguide.h"
#include "gimpcanvassamplepoint.h"
#include "gimpdisplay.h"
#include "gimpdisplayshell.h"
#include "gimpdisplayshell-appearance.h"
@ -391,53 +388,6 @@ gimp_display_shell_draw_pen (GimpDisplayShell *shell,
cairo_stroke (cr);
}
void
gimp_display_shell_draw_sample_points (GimpDisplayShell *shell,
cairo_t *cr)
{
GimpImage *image;
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
g_return_if_fail (cr != NULL);
image = gimp_display_get_image (shell->display);
if (image && gimp_display_shell_get_show_sample_points (shell))
{
GimpCanvasItem *item;
GList *list;
item = gimp_canvas_sample_point_new (0, 0, 0);
g_object_set (item, "sample-point-style", TRUE, NULL);
for (list = gimp_image_get_sample_points (image);
list;
list = g_list_next (list))
{
GimpSamplePoint *sample_point = list->data;
if (sample_point->x >= 0 &&
sample_point->y >= 0)
{
gint index;
index = g_list_index (gimp_image_get_sample_points (image),
sample_point) + 1;
g_object_set (item,
"x", sample_point->x,
"y", sample_point->y,
"index", index,
NULL);
gimp_canvas_item_draw (item, shell, cr);
}
}
g_object_unref (item);
}
}
void
gimp_display_shell_draw_layer_boundary (GimpDisplayShell *shell,
cairo_t *cr,

View File

@ -38,8 +38,6 @@ void gimp_display_shell_draw_pen (GimpDisplayShell *shell,
GimpContext *context,
GimpActiveColor color,
gint width);
void gimp_display_shell_draw_sample_points (GimpDisplayShell *shell,
cairo_t *cr);
void gimp_display_shell_draw_layer_boundary (GimpDisplayShell *shell,
cairo_t *cr,
GimpDrawable *drawable,

View File

@ -35,6 +35,7 @@
#include "core/gimpimage.h"
#include "core/gimpimage-grid.h"
#include "core/gimpimage-quick-mask.h"
#include "core/gimpimage-sample-points.h"
#include "core/gimpitem.h"
#include "core/gimpsamplepoint.h"
#include "core/gimptreehandler.h"
@ -44,6 +45,7 @@
#include "widgets/gimpwidgets-utils.h"
#include "gimpcanvasguide.h"
#include "gimpcanvasproxygroup.h"
#include "gimpcanvassamplepoint.h"
#include "gimpdisplay.h"
#include "gimpdisplayshell.h"
@ -94,7 +96,13 @@ static void gimp_display_shell_quick_mask_changed_handler (GimpImage *i
static void gimp_display_shell_update_guide_handler (GimpImage *image,
GimpGuide *guide,
GimpDisplayShell *shell);
static void gimp_display_shell_update_sample_point_handler(GimpImage *image,
static void gimp_display_shell_sample_point_add_handler (GimpImage *image,
GimpSamplePoint *sample_point,
GimpDisplayShell *shell);
static void gimp_display_shell_sample_point_remove_handler(GimpImage *image,
GimpSamplePoint *sample_point,
GimpDisplayShell *shell);
static void gimp_display_shell_sample_point_move_handler (GimpImage *image,
GimpSamplePoint *sample_point,
GimpDisplayShell *shell);
static void gimp_display_shell_update_vectors_handler (GimpImage *image,
@ -143,6 +151,7 @@ void
gimp_display_shell_connect (GimpDisplayShell *shell)
{
GimpImage *image;
GList *list;
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
g_return_if_fail (GIMP_IS_DISPLAY (shell->display));
@ -181,9 +190,23 @@ gimp_display_shell_connect (GimpDisplayShell *shell)
g_signal_connect (image, "update-guide",
G_CALLBACK (gimp_display_shell_update_guide_handler),
shell);
g_signal_connect (image, "update-sample-point",
G_CALLBACK (gimp_display_shell_update_sample_point_handler),
g_signal_connect (image, "sample-point-added",
G_CALLBACK (gimp_display_shell_sample_point_add_handler),
shell);
g_signal_connect (image, "sample-point-removed",
G_CALLBACK (gimp_display_shell_sample_point_remove_handler),
shell);
g_signal_connect (image, "sample-point-moved",
G_CALLBACK (gimp_display_shell_sample_point_move_handler),
shell);
for (list = gimp_image_get_sample_points (image);
list;
list = g_list_next (list))
{
gimp_display_shell_sample_point_add_handler (image, list->data, shell);
}
g_signal_connect (image, "update-vectors",
G_CALLBACK (gimp_display_shell_update_vectors_handler),
shell);
@ -273,6 +296,7 @@ void
gimp_display_shell_disconnect (GimpDisplayShell *shell)
{
GimpImage *image;
GList *list;
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
g_return_if_fail (GIMP_IS_DISPLAY (shell->display));
@ -327,9 +351,24 @@ gimp_display_shell_disconnect (GimpDisplayShell *shell)
g_signal_handlers_disconnect_by_func (image,
gimp_display_shell_update_guide_handler,
shell);
g_signal_handlers_disconnect_by_func (image,
gimp_display_shell_update_sample_point_handler,
gimp_display_shell_sample_point_add_handler,
shell);
g_signal_handlers_disconnect_by_func (image,
gimp_display_shell_sample_point_remove_handler,
shell);
g_signal_handlers_disconnect_by_func (image,
gimp_display_shell_sample_point_move_handler,
shell);
for (list = gimp_image_get_sample_points (image);
list;
list = g_list_next (list))
{
gimp_canvas_proxy_group_remove_item (GIMP_CANVAS_PROXY_GROUP (shell->sample_points),
list->data);
}
g_signal_handlers_disconnect_by_func (image,
gimp_display_shell_update_vectors_handler,
shell);
@ -479,20 +518,89 @@ gimp_display_shell_update_guide_handler (GimpImage *image,
}
static void
gimp_display_shell_update_sample_point_handler (GimpImage *image,
gimp_display_shell_sample_point_add_handler (GimpImage *image,
GimpSamplePoint *sample_point,
GimpDisplayShell *shell)
{
GimpCanvasProxyGroup *group = GIMP_CANVAS_PROXY_GROUP (shell->sample_points);
GimpCanvasItem *item;
GList *list;
gint i;
item = gimp_canvas_sample_point_new (sample_point->x,
sample_point->y,
0 /* eek */);
0);
g_object_set (item, "sample-point-style", TRUE, NULL);
gimp_canvas_proxy_group_add_item (group, sample_point, item);
g_object_unref (item);
for (list = gimp_image_get_sample_points (image), i = 1;
list;
list = g_list_next (list), i++)
{
GimpSamplePoint *sample_point = list->data;
item = gimp_canvas_proxy_group_get_item (group, sample_point);
g_object_set (item,
"index", i,
NULL);
gimp_display_shell_expose_item (shell, item);
}
}
static void
gimp_display_shell_sample_point_remove_handler (GimpImage *image,
GimpSamplePoint *sample_point,
GimpDisplayShell *shell)
{
GimpCanvasProxyGroup *group = GIMP_CANVAS_PROXY_GROUP (shell->sample_points);
GimpCanvasItem *item;
GList *list;
gint i;
item = gimp_canvas_proxy_group_get_item (group, sample_point);
gimp_display_shell_expose_item (shell, item);
g_object_unref (item);
gimp_canvas_proxy_group_remove_item (group, sample_point);
for (list = gimp_image_get_sample_points (image), i = 1;
list;
list = g_list_next (list), i++)
{
GimpSamplePoint *sample_point = list->data;
item = gimp_canvas_proxy_group_get_item (group, sample_point);
g_object_set (item,
"index", i,
NULL);
gimp_display_shell_expose_item (shell, item);
}
}
static void
gimp_display_shell_sample_point_move_handler (GimpImage *image,
GimpSamplePoint *sample_point,
GimpDisplayShell *shell)
{
GimpCanvasProxyGroup *group = GIMP_CANVAS_PROXY_GROUP (shell->sample_points);
GimpCanvasItem *item;
item = gimp_canvas_proxy_group_get_item (group, sample_point);
gimp_display_shell_expose_item (shell, item);
g_object_set (item,
"x", sample_point->x,
"y", sample_point->y,
NULL);
gimp_display_shell_expose_item (shell, item);
}
static void