summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gradient-drag.cpp60
-rw-r--r--src/gradient-drag.h8
-rw-r--r--src/knot-holder-entity.cpp9
-rw-r--r--src/knot.cpp637
-rw-r--r--src/knot.h235
-rw-r--r--src/knotholder.cpp4
-rw-r--r--src/knotholder.h2
-rw-r--r--src/seltrans.cpp64
-rw-r--r--src/ui/tools/connector-tool.cpp53
-rw-r--r--src/vanishing-point.cpp29
-rw-r--r--src/vanishing-point.h4
11 files changed, 465 insertions, 640 deletions
diff --git a/src/gradient-drag.cpp b/src/gradient-drag.cpp
index 8a0d7ee26..7b9daf57e 100644
--- a/src/gradient-drag.cpp
+++ b/src/gradient-drag.cpp
@@ -803,7 +803,7 @@ static void gr_knot_moved_handler(SPKnot *knot, Geom::Point const &ppointer, gui
m.unSetup();
if (s.getSnapped()) {
p = s.getPoint();
- sp_knot_moveto (knot, p);
+ knot->moveto(p);
}
} else if (state & GDK_CONTROL_MASK) {
IntermSnapResults isr;
@@ -888,7 +888,7 @@ static void gr_knot_moved_handler(SPKnot *knot, Geom::Point const &ppointer, gui
}
//p = isr.points.front().getPoint();
p = bsp.getPoint();
- sp_knot_moveto (knot, p);
+ knot->moveto(p);
}
drag->keep_selection = (bool) g_list_find(drag->selected, dragger);
@@ -989,8 +989,6 @@ static void gr_midpoint_limits(GrDragger *dragger, SPObject *server, Geom::Point
*high_lim = dragger->point - (highest_dragger->point - *end);
}
-
-
/**
* Called when a midpoint knot is dragged.
*/
@@ -1046,7 +1044,7 @@ static void gr_knot_moved_midpoint_handler(SPKnot */*knot*/, Geom::Point const &
}
}
drg->point += this_move;
- sp_knot_moveto (drgknot, drg->point);
+ drgknot->moveto(drg->point);
drg->fireDraggables (false);
drg->updateDependencies(false);
}
@@ -1388,7 +1386,7 @@ GrDragger::updateHandles ( Geom::Point pc_old, MeshNodeOperation op )
GrDragger *handle = drag->getDraggerFor( item, POINT_MG_HANDLE, i, fill_or_stroke );
SPKnot *knot = handle->knot;
Geom::Point pk = getGradientCoords( item, POINT_MG_HANDLE, i, fill_or_stroke );
- sp_knot_moveto( knot, pk );
+ knot->moveto(pk);
}
@@ -1397,7 +1395,7 @@ GrDragger::updateHandles ( Geom::Point pc_old, MeshNodeOperation op )
GrDragger *handle = drag->getDraggerFor( item, POINT_MG_TENSOR, i, fill_or_stroke );
SPKnot *knot = handle->knot;
Geom::Point pk = getGradientCoords( item, POINT_MG_TENSOR, i, fill_or_stroke );
- sp_knot_moveto( knot, pk );
+ knot->moveto(pk);
}
@@ -1483,7 +1481,7 @@ void GrDragger::moveThisToDraggable(SPItem *item, GrPointType point_type, gint p
this->point = getGradientCoords(dr_first->item, dr_first->point_type, dr_first->point_i, dr_first->fill_or_stroke);
this->point_original = this->point;
- sp_knot_moveto(this->knot, this->point);
+ this->knot->moveto(this->point);
for (GSList const* i = draggables; i != NULL; i = i->next) {
GrDraggable *da = (GrDraggable *) i->data;
@@ -1593,15 +1591,15 @@ GrDragger::GrDragger(GrDrag *parent, Geom::Point p, GrDraggable *draggable)
this->parent = parent;
// create the knot
- this->knot = sp_knot_new (parent->desktop, NULL);
+ this->knot = new SPKnot(parent->desktop, NULL);
this->knot->setMode(SP_KNOT_MODE_XOR);
this->knot->setFill(GR_KNOT_COLOR_NORMAL, GR_KNOT_COLOR_MOUSEOVER, GR_KNOT_COLOR_MOUSEOVER);
this->knot->setStroke(0x0000007f, 0x0000007f, 0x0000007f);
- sp_knot_update_ctrl(this->knot);
+ this->knot->update_ctrl();
// move knot to the given point
- sp_knot_set_position (this->knot, p, SP_KNOT_STATE_NORMAL);
- sp_knot_show (this->knot);
+ this->knot->set_position(p, SP_KNOT_STATE_NORMAL);
+ this->knot->show();
// connect knot's signals
if ( (draggable) // it can be NULL if a node in unsnapped (eg. focus point unsnapped from center)
@@ -1610,18 +1608,21 @@ GrDragger::GrDragger(GrDrag *parent, Geom::Point p, GrDraggable *draggable)
|| (draggable->point_type == POINT_RG_MID1)
|| (draggable->point_type == POINT_RG_MID2) ) )
{
- this->handler_id = g_signal_connect (G_OBJECT (this->knot), "moved", G_CALLBACK (gr_knot_moved_midpoint_handler), this);
+ this->_moved_connection = this->knot->_moved_signal.connect(sigc::bind(sigc::ptr_fun(gr_knot_moved_midpoint_handler), this));
} else {
- this->handler_id = g_signal_connect (G_OBJECT (this->knot), "moved", G_CALLBACK (gr_knot_moved_handler), this);
+ this->_moved_connection = this->knot->_moved_signal.connect(sigc::bind(sigc::ptr_fun(gr_knot_moved_handler), this));
}
- g_signal_connect (G_OBJECT (this->knot), "clicked", G_CALLBACK (gr_knot_clicked_handler), this);
- g_signal_connect (G_OBJECT (this->knot), "doubleclicked", G_CALLBACK (gr_knot_doubleclicked_handler), this);
- g_signal_connect (G_OBJECT (this->knot), "grabbed", G_CALLBACK (gr_knot_grabbed_handler), this);
- g_signal_connect (G_OBJECT (this->knot), "ungrabbed", G_CALLBACK (gr_knot_ungrabbed_handler), this);
+
+ this->_clicked_connection = this->knot->_click_signal.connect(sigc::bind(sigc::ptr_fun(gr_knot_clicked_handler), this));
+ this->_doubleclicked_connection = this->knot->_doubleclicked_signal.connect(sigc::bind(sigc::ptr_fun(gr_knot_doubleclicked_handler), this));
+ this->_grabbed_connection = this->knot->_grabbed_signal.connect(sigc::bind(sigc::ptr_fun(gr_knot_grabbed_handler), this));
+ this->_ungrabbed_connection = this->knot->_ungrabbed_signal.connect(sigc::bind(sigc::ptr_fun(gr_knot_ungrabbed_handler), this));
// add the initial draggable
- if (draggable)
+ if (draggable) {
this->addDraggable (draggable);
+ }
+
updateKnotShape();
}
@@ -1634,19 +1635,20 @@ GrDragger::~GrDragger()
//this->parent->setDeselected(this);
// disconnect signals
- g_signal_handlers_disconnect_by_func(G_OBJECT(this->knot), (gpointer) G_CALLBACK (gr_knot_moved_handler), this);
- g_signal_handlers_disconnect_by_func(G_OBJECT(this->knot), (gpointer) G_CALLBACK (gr_knot_clicked_handler), this);
- g_signal_handlers_disconnect_by_func(G_OBJECT(this->knot), (gpointer) G_CALLBACK (gr_knot_doubleclicked_handler), this);
- g_signal_handlers_disconnect_by_func(G_OBJECT(this->knot), (gpointer) G_CALLBACK (gr_knot_grabbed_handler), this);
- g_signal_handlers_disconnect_by_func(G_OBJECT(this->knot), (gpointer) G_CALLBACK (gr_knot_ungrabbed_handler), this);
+ this->_moved_connection.disconnect();
+ this->_clicked_connection.disconnect();
+ this->_doubleclicked_connection.disconnect();
+ this->_grabbed_connection.disconnect();
+ this->_ungrabbed_connection.disconnect();
/* unref should call destroy */
- g_object_unref (G_OBJECT (this->knot));
+ knot_unref(this->knot);
// delete all draggables
for (GSList const* i = this->draggables; i != NULL; i = i->next) {
delete ((GrDraggable *) i->data);
}
+
g_slist_free (this->draggables);
this->draggables = NULL;
}
@@ -2043,7 +2045,7 @@ void GrDrag::addDraggersMesh(SPMeshGradient *mg, SPItem *item, Inkscape::PaintTa
void GrDrag::grabKnot(GrDragger *dragger, gint x, gint y, guint32 etime)
{
if (dragger) {
- sp_knot_start_dragging (dragger->knot, dragger->point, x, y, etime);
+ dragger->knot->start_dragging(dragger->point, x, y, etime);
}
}
@@ -2055,7 +2057,7 @@ void GrDrag::grabKnot(SPItem *item, GrPointType point_type, gint point_i, Inksca
{
GrDragger *dragger = getDraggerFor(item, point_type, point_i, fill_or_stroke);
if (dragger) {
- sp_knot_start_dragging (dragger->knot, dragger->point, x, y, etime);
+ dragger->knot->start_dragging(dragger->point, x, y, etime);
}
}
@@ -2358,7 +2360,7 @@ void GrDrag::selected_move(double x, double y, bool write_repr, bool scale_radia
Geom::Point p_old = d->point;
d->point += Geom::Point (x, y);
d->point_original = d->point;
- sp_knot_moveto (d->knot, d->point);
+ d->knot->moveto(d->point);
d->fireDraggables (write_repr, scale_radial);
d->updateHandles( p_old, MG_NODE_NO_SCALE );
@@ -2394,7 +2396,7 @@ void GrDrag::selected_move(double x, double y, bool write_repr, bool scale_radia
GrDragger *drg = (GrDragger*) i->data;
SPKnot *drgknot = drg->knot;
drg->point += displacement;
- sp_knot_moveto (drgknot, drg->point);
+ drgknot->moveto(drg->point);
drg->fireDraggables (true);
drg->updateDependencies(true);
did = true;
diff --git a/src/gradient-drag.h b/src/gradient-drag.h
index 4ed13b9f7..e22b48e19 100644
--- a/src/gradient-drag.h
+++ b/src/gradient-drag.h
@@ -87,7 +87,13 @@ struct GrDragger {
Geom::Point point_original;
/** Connection to \a knot's "moved" signal, for blocking it (unused?). */
- guint handler_id;
+ //guint handler_id;
+
+ sigc::connection _moved_connection;
+ sigc::connection _clicked_connection;
+ sigc::connection _doubleclicked_connection;
+ sigc::connection _grabbed_connection;
+ sigc::connection _ungrabbed_connection;
GSList *draggables;
diff --git a/src/knot-holder-entity.cpp b/src/knot-holder-entity.cpp
index 043685460..48096489e 100644
--- a/src/knot-holder-entity.cpp
+++ b/src/knot-holder-entity.cpp
@@ -34,7 +34,7 @@ void KnotHolderEntity::create(SPDesktop *desktop, SPItem *item, KnotHolder *pare
const gchar *tip,
SPKnotShapeType shape, SPKnotModeType mode, guint32 color)
{
- knot = sp_knot_new(desktop, tip);
+ knot = new SPKnot(desktop, tip);
this->parent_holder = parent;
this->item = item; // TODO: remove the item either from here or from knotholder.cpp
@@ -52,7 +52,7 @@ void KnotHolderEntity::create(SPDesktop *desktop, SPItem *item, KnotHolder *pare
g_object_set (G_OBJECT(knot->item), "fill_color", color, NULL);
update_knot();
- sp_knot_show(knot);
+ knot->show();
_moved_connection = knot->_moved_signal.connect(sigc::mem_fun(*parent_holder, &KnotHolder::knot_moved_handler));
_click_connection = knot->_click_signal.connect(sigc::mem_fun(*parent_holder, &KnotHolder::knot_clicked_handler));
@@ -68,7 +68,8 @@ KnotHolderEntity::~KnotHolderEntity()
/* unref should call destroy */
if (knot) {
- g_object_unref(knot);
+ //g_object_unref(knot);
+ knot_unref(knot);
} else {
// FIXME: This shouldn't occur. Perhaps it is caused by LPE PointParams being knotholder entities, too
// If so, it will likely be fixed with upcoming refactoring efforts.
@@ -84,7 +85,7 @@ KnotHolderEntity::update_knot()
Geom::Point dp(knot_get() * i2dt);
_moved_connection.block();
- sp_knot_set_position(knot, dp, SP_KNOT_STATE_NORMAL);
+ knot->set_position(dp, SP_KNOT_STATE_NORMAL);
_moved_connection.unblock();
}
diff --git a/src/knot.cpp b/src/knot.cpp
index 2179bc3d5..59d048d8b 100644
--- a/src/knot.cpp
+++ b/src/knot.cpp
@@ -17,7 +17,6 @@
#endif
#include <gdk/gdkkeysyms.h>
#include <glibmm/i18n.h>
-#include "helper/sp-marshal.h"
#include "display/sodipodi-ctrl.h"
#include "desktop.h"
#include "desktop-handles.h"
@@ -36,10 +35,11 @@ using Inkscape::DocumentUndo;
GDK_POINTER_MOTION_HINT_MASK | \
GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK)
-static bool nograb = false;
+const gchar *nograbenv = getenv("INKSCAPE_NO_GRAB");
+static bool nograb = (nograbenv && *nograbenv && (*nograbenv != '0'));
-static bool grabbed = FALSE;
-static bool moved = FALSE;
+static bool grabbed = false;
+static bool moved = false;
static gint xp = 0, yp = 0; // where drag started
static gint tolerance = 0;
@@ -47,247 +47,136 @@ static bool within_tolerance = false;
static bool transform_escaped = false; // true iff resize or rotate was cancelled by esc.
-enum {
- EVENT,
- CLICKED,
- DOUBLECLICKED,
- GRABBED,
- UNGRABBED,
- MOVED,
- REQUEST,
- DISTANCE,
- LAST_SIGNAL
-};
-
-static void sp_knot_class_init(SPKnotClass *klass);
-static void sp_knot_init(SPKnot *knot);
-static void sp_knot_dispose(GObject *object);
+void knot_ref(SPKnot* knot) {
+ knot->ref_count++;
+}
+
+void knot_unref(SPKnot* knot) {
+ if (--knot->ref_count < 1) {
+ delete knot;
+ }
+}
+
static int sp_knot_handler(SPCanvasItem *item, GdkEvent *event, SPKnot *knot);
-static void sp_knot_set_ctrl_state(SPKnot *knot);
-static GObjectClass *parent_class;
-static guint knot_signals[LAST_SIGNAL] = { 0 };
+SPKnot::SPKnot(SPDesktop *desktop, const gchar *tip) : ref_count(1) {
+ this->desktop = NULL;
+ this->item = NULL;
+ this->owner = NULL;
+ this->flags = 0;
-GType sp_knot_get_type()
-{
- static GType type = 0;
- if (!type) {
- GTypeInfo info = {
- sizeof(SPKnotClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) sp_knot_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (SPKnot),
- 16, /* n_preallocs */
- (GInstanceInitFunc) sp_knot_init,
- NULL
- };
- type = g_type_register_static (G_TYPE_OBJECT, "SPKnot", &info, (GTypeFlags) 0);
+ this->size = 8;
+ this->pos = Geom::Point(0, 0);
+ this->grabbed_rel_pos = Geom::Point(0, 0);
+ this->anchor = SP_ANCHOR_CENTER;
+ this->shape = SP_KNOT_SHAPE_SQUARE;
+ this->mode = SP_KNOT_MODE_XOR;
+ this->tip = NULL;
+ this->_event_handler_id = 0;
+ this->pressure = 0;
+
+ this->fill[SP_KNOT_STATE_NORMAL] = 0xffffff00;
+ this->fill[SP_KNOT_STATE_MOUSEOVER] = 0xff0000ff;
+ this->fill[SP_KNOT_STATE_DRAGGING] = 0x0000ffff;
+
+ this->stroke[SP_KNOT_STATE_NORMAL] = 0x01000000;
+ this->stroke[SP_KNOT_STATE_MOUSEOVER] = 0x01000000;
+ this->stroke[SP_KNOT_STATE_DRAGGING] = 0x01000000;
+
+ this->image[SP_KNOT_STATE_NORMAL] = NULL;
+ this->image[SP_KNOT_STATE_MOUSEOVER] = NULL;
+ this->image[SP_KNOT_STATE_DRAGGING] = NULL;
+
+ this->cursor[SP_KNOT_STATE_NORMAL] = NULL;
+ this->cursor[SP_KNOT_STATE_MOUSEOVER] = NULL;
+ this->cursor[SP_KNOT_STATE_DRAGGING] = NULL;
+
+ this->saved_cursor = NULL;
+ this->pixbuf = NULL;
+
+
+ this->desktop = desktop;
+ this->flags = SP_KNOT_VISIBLE;
+
+ if (tip) {
+ this->tip = g_strdup (tip);
}
- return type;
-}
-/**
- * SPKnot vtable initialization.
- */
-static void sp_knot_class_init(SPKnotClass *klass)
-{
- GObjectClass *object_class = (GObjectClass*)klass;
-
- parent_class = (GObjectClass*) g_type_class_peek_parent(klass);
-
- object_class->dispose = sp_knot_dispose;
-
- knot_signals[EVENT] = g_signal_new("event",
- G_TYPE_FROM_CLASS(klass),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET(SPKnotClass, event),
- NULL, NULL,
- sp_marshal_BOOLEAN__POINTER,
- G_TYPE_BOOLEAN, 1,
- GDK_TYPE_EVENT);
-
- knot_signals[CLICKED] = g_signal_new("clicked",
- G_TYPE_FROM_CLASS(klass),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET(SPKnotClass, clicked),
- NULL, NULL,
- g_cclosure_marshal_VOID__UINT,
- G_TYPE_NONE, 1,
- G_TYPE_UINT);
-
- knot_signals[DOUBLECLICKED] = g_signal_new("doubleclicked",
- G_TYPE_FROM_CLASS(klass),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET(SPKnotClass, doubleclicked),
- NULL, NULL,
- g_cclosure_marshal_VOID__UINT,
- G_TYPE_NONE, 1,
- G_TYPE_UINT);
-
- knot_signals[GRABBED] = g_signal_new("grabbed",
- G_TYPE_FROM_CLASS(klass),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET(SPKnotClass, grabbed),
- NULL, NULL,
- g_cclosure_marshal_VOID__UINT,
- G_TYPE_NONE, 1,
- G_TYPE_UINT);
-
- knot_signals[UNGRABBED] = g_signal_new("ungrabbed",
- G_TYPE_FROM_CLASS(klass),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET(SPKnotClass, ungrabbed),
- NULL, NULL,
- g_cclosure_marshal_VOID__UINT,
- G_TYPE_NONE, 1,
- G_TYPE_UINT);
-
- knot_signals[MOVED] = g_signal_new("moved",
- G_TYPE_FROM_CLASS(klass),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET(SPKnotClass, moved),
- NULL, NULL,
- sp_marshal_NONE__POINTER_UINT,
- G_TYPE_NONE, 2,
- G_TYPE_POINTER, G_TYPE_UINT);
-
- knot_signals[REQUEST] = g_signal_new("request",
- G_TYPE_FROM_CLASS(klass),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET(SPKnotClass, request),
- NULL, NULL,
- sp_marshal_BOOLEAN__POINTER_UINT,
- G_TYPE_BOOLEAN, 2,
- G_TYPE_POINTER, G_TYPE_UINT);
-
- knot_signals[DISTANCE] = g_signal_new("distance",
- G_TYPE_FROM_CLASS(klass),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET(SPKnotClass, distance),
- NULL, NULL,
- sp_marshal_DOUBLE__POINTER_UINT,
- G_TYPE_DOUBLE, 2,
- G_TYPE_POINTER, G_TYPE_UINT);
-
- const gchar *nograbenv = getenv("INKSCAPE_NO_GRAB");
- nograb = (nograbenv && *nograbenv && (*nograbenv != '0'));
-}
+ this->item = sp_canvas_item_new(sp_desktop_controls (desktop),
+ SP_TYPE_CTRL,
+ "anchor", SP_ANCHOR_CENTER,
+ "size", 8.0,
+ "filled", TRUE,
+ "fill_color", 0xffffff00,
+ "stroked", TRUE,
+ "stroke_color", 0x01000000,
+ "mode", SP_KNOT_MODE_XOR,
+ NULL);
-/**
- * Callback for SPKnot initialization.
- */
-static void sp_knot_init(SPKnot *knot)
-{
- knot->desktop = NULL;
- knot->item = NULL;
- knot->owner = NULL;
- knot->flags = 0;
-
- knot->size = 8;
- knot->pos = Geom::Point(0, 0);
- knot->grabbed_rel_pos = Geom::Point(0, 0);
- knot->anchor = SP_ANCHOR_CENTER;
- knot->shape = SP_KNOT_SHAPE_SQUARE;
- knot->mode = SP_KNOT_MODE_XOR;
- knot->tip = NULL;
- knot->_event_handler_id = 0;
- knot->pressure = 0;
-
- knot->fill[SP_KNOT_STATE_NORMAL] = 0xffffff00;
- knot->fill[SP_KNOT_STATE_MOUSEOVER] = 0xff0000ff;
- knot->fill[SP_KNOT_STATE_DRAGGING] = 0x0000ffff;
-
- knot->stroke[SP_KNOT_STATE_NORMAL] = 0x01000000;
- knot->stroke[SP_KNOT_STATE_MOUSEOVER] = 0x01000000;
- knot->stroke[SP_KNOT_STATE_DRAGGING] = 0x01000000;
-
- knot->image[SP_KNOT_STATE_NORMAL] = NULL;
- knot->image[SP_KNOT_STATE_MOUSEOVER] = NULL;
- knot->image[SP_KNOT_STATE_DRAGGING] = NULL;
-
- knot->cursor[SP_KNOT_STATE_NORMAL] = NULL;
- knot->cursor[SP_KNOT_STATE_MOUSEOVER] = NULL;
- knot->cursor[SP_KNOT_STATE_DRAGGING] = NULL;
-
- knot->saved_cursor = NULL;
- knot->pixbuf = NULL;
+ this->_event_handler_id = g_signal_connect(G_OBJECT(this->item), "event",
+ G_CALLBACK(sp_knot_handler), this);
}
-/**
- * Called before SPKnot destruction.
- */
-static void sp_knot_dispose(GObject *object)
-{
- SPKnot *knot = static_cast<SPKnot *>(object);
-
+SPKnot::~SPKnot() {
#if GTK_CHECK_VERSION(3,0,0)
GdkDisplay *display = gdk_display_get_default();
GdkDeviceManager *dm = gdk_display_get_device_manager(display);
GdkDevice *device = gdk_device_manager_get_client_pointer(dm);
- if ((knot->flags & SP_KNOT_GRABBED) && gdk_display_device_is_grabbed(display, device)) {
+ if ((this->flags & SP_KNOT_GRABBED) && gdk_display_device_is_grabbed(display, device)) {
// This happens e.g. when deleting a node in node tool while dragging it
gdk_device_ungrab(device, GDK_CURRENT_TIME);
}
#else
- if ((knot->flags & SP_KNOT_GRABBED) && gdk_pointer_is_grabbed ()) {
+ if ((this->flags & SP_KNOT_GRABBED) && gdk_pointer_is_grabbed ()) {
// This happens e.g. when deleting a node in node tool while dragging it
gdk_pointer_ungrab (GDK_CURRENT_TIME);
}
#endif
- if (knot->_event_handler_id > 0)
- {
- g_signal_handler_disconnect(G_OBJECT (knot->item), knot->_event_handler_id);
- knot->_event_handler_id = 0;
- }
+ if (this->_event_handler_id > 0) {
+ g_signal_handler_disconnect(G_OBJECT (this->item), this->_event_handler_id);
+ this->_event_handler_id = 0;
+ }
- if (knot->item) {
- sp_canvas_item_destroy(knot->item);
- knot->item = NULL;
+ if (this->item) {
+ sp_canvas_item_destroy(this->item);
+ this->item = NULL;
}
for (gint i = 0; i < SP_KNOT_VISIBLE_STATES; i++) {
- if (knot->cursor[i]) {
+ if (this->cursor[i]) {
#if GTK_CHECK_VERSION(3,0,0)
- g_object_unref(knot->cursor[i]);
+ g_object_unref(this->cursor[i]);
#else
- gdk_cursor_unref(knot->cursor[i]);
+ gdk_cursor_unref(this->cursor[i]);
#endif
- knot->cursor[i] = NULL;
+ this->cursor[i] = NULL;
}
}
- if (knot->tip) {
- g_free(knot->tip);
- knot->tip = NULL;
- }
-
- if (parent_class->dispose) {
- (*parent_class->dispose) (object);
+ if (this->tip) {
+ g_free(this->tip);
+ this->tip = NULL;
}
}
-void sp_knot_start_dragging(SPKnot *knot, Geom::Point const &p, gint x, gint y, guint32 etime)
-{
+void SPKnot::start_dragging(Geom::Point const &p, gint x, gint y, guint32 etime) {
// save drag origin
xp = x;
yp = y;
within_tolerance = true;
- knot->grabbed_rel_pos = p - knot->pos;
- knot->drag_origin = knot->pos;
+ this->grabbed_rel_pos = p - this->pos;
+ this->drag_origin = this->pos;
+
if (!nograb) {
- sp_canvas_item_grab(knot->item,
- KNOT_EVENT_MASK,
- knot->cursor[SP_KNOT_STATE_DRAGGING],
- etime);
+ sp_canvas_item_grab(this->item, KNOT_EVENT_MASK, this->cursor[SP_KNOT_STATE_DRAGGING], etime);
}
- sp_knot_set_flag(knot, SP_KNOT_GRABBED, TRUE);
+
+ this->set_flag(SP_KNOT_GRABBED, TRUE);
+
grabbed = TRUE;
}
@@ -300,23 +189,21 @@ static int sp_knot_handler(SPCanvasItem */*item*/, GdkEvent *event, SPKnot *knot
g_assert(SP_IS_KNOT(knot));
/* Run client universal event handler, if present */
-
- gboolean consumed = FALSE;
-
- g_signal_emit(knot, knot_signals[EVENT], 0, event, &consumed);
+ bool consumed = knot->_event_signal.emit(knot, event);
if (consumed) {
- return TRUE;
+ return true;
}
- g_object_ref(knot);
+ knot_ref(knot);
+
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
tolerance = prefs->getIntLimited("/options/dragtolerance/value", 0, 0, 100);
switch (event->type) {
case GDK_2BUTTON_PRESS:
if (event->button.button == 1) {
- g_signal_emit(knot, knot_signals[DOUBLECLICKED], 0, event->button.state);
+ knot->_doubleclicked_signal.emit(knot, event->button.state);
grabbed = FALSE;
moved = FALSE;
@@ -326,7 +213,8 @@ static int sp_knot_handler(SPCanvasItem */*item*/, GdkEvent *event, SPKnot *knot
case GDK_BUTTON_PRESS:
if ((event->button.button == 1) && knot->desktop && knot->desktop->event_context && !knot->desktop->event_context->space_panning) {
Geom::Point const p = knot->desktop->w2d(Geom::Point(event->button.x, event->button.y));
- sp_knot_start_dragging(knot, p, (gint) event->button.x, (gint) event->button.y, event->button.time);
+ knot->start_dragging(p, (gint) event->button.x, (gint) event->button.y, event->button.time);
+
consumed = TRUE;
}
break;
@@ -340,28 +228,25 @@ static int sp_knot_handler(SPCanvasItem */*item*/, GdkEvent *event, SPKnot *knot
sp_event_context_discard_delayed_snap_event(knot->desktop->event_context);
knot->pressure = 0;
+
if (transform_escaped) {
transform_escaped = false;
consumed = TRUE;
} else {
- sp_knot_set_flag(knot, SP_KNOT_GRABBED, FALSE);
+ knot->set_flag(SP_KNOT_GRABBED, FALSE);
+
if (!nograb) {
sp_canvas_item_ungrab(knot->item, event->button.time);
}
+
if (moved) {
- sp_knot_set_flag(knot,
- SP_KNOT_DRAGGING,
- FALSE);
- g_signal_emit(knot,
- knot_signals[UNGRABBED], 0,
- event->button.state);
- knot->_ungrabbed_signal.emit(knot);
+ knot->set_flag(SP_KNOT_DRAGGING, FALSE);
+
+ knot->_ungrabbed_signal.emit(knot, event->button.state);
} else {
- g_signal_emit(knot,
- knot_signals[CLICKED], 0,
- event->button.state);
knot->_click_signal.emit(knot, event->button.state);
}
+
grabbed = FALSE;
moved = FALSE;
consumed = TRUE;
@@ -383,27 +268,26 @@ static int sp_knot_handler(SPCanvasItem */*item*/, GdkEvent *event, SPKnot *knot
// motion notify coordinates as given (no snapping back to origin)
within_tolerance = false;
- if (gdk_event_get_axis (event, GDK_AXIS_PRESSURE, &knot->pressure))
+ if (gdk_event_get_axis (event, GDK_AXIS_PRESSURE, &knot->pressure)) {
knot->pressure = CLAMP (knot->pressure, 0, 1);
- else
+ } else {
knot->pressure = 0.5;
+ }
if (!moved) {
- g_signal_emit(knot,
- knot_signals[GRABBED], 0,
- event->motion.state);
- sp_knot_set_flag(knot,
- SP_KNOT_DRAGGING,
- TRUE);
+ knot->_grabbed_signal.emit(knot, event->motion.state);
+
+ knot->set_flag(SP_KNOT_DRAGGING, TRUE);
}
+
sp_event_context_snap_delay_handler(knot->desktop->event_context, NULL, (gpointer) knot, (GdkEventMotion *)event, Inkscape::UI::Tools::DelayedSnapEvent::KNOT_HANDLER);
sp_knot_handler_request_position(event, knot);
moved = TRUE;
}
break;
case GDK_ENTER_NOTIFY:
- sp_knot_set_flag(knot, SP_KNOT_MOUSEOVER, TRUE);
- sp_knot_set_flag(knot, SP_KNOT_GRABBED, FALSE);
+ knot->set_flag(SP_KNOT_MOUSEOVER, TRUE);
+ knot->set_flag(SP_KNOT_GRABBED, FALSE);
if (knot->tip && knot->desktop && knot->desktop->event_context) {
knot->desktop->event_context->defaultMessageContext()->set(Inkscape::NORMAL_MESSAGE, knot->tip);
@@ -414,8 +298,8 @@ static int sp_knot_handler(SPCanvasItem */*item*/, GdkEvent *event, SPKnot *knot
consumed = TRUE;
break;
case GDK_LEAVE_NOTIFY:
- sp_knot_set_flag(knot, SP_KNOT_MOUSEOVER, FALSE);
- sp_knot_set_flag(knot, SP_KNOT_GRABBED, FALSE);
+ knot->set_flag(SP_KNOT_MOUSEOVER, FALSE);
+ knot->set_flag(SP_KNOT_GRABBED, FALSE);
if (knot->tip && knot->desktop && knot->desktop->event_context) {
knot->desktop->event_context->defaultMessageContext()->clear();
@@ -428,24 +312,26 @@ static int sp_knot_handler(SPCanvasItem */*item*/, GdkEvent *event, SPKnot *knot
case GDK_KEY_PRESS: // keybindings for knot
switch (Inkscape::UI::Tools::get_group0_keyval(&event->key)) {
case GDK_KEY_Escape:
- sp_knot_set_flag(knot, SP_KNOT_GRABBED, FALSE);
+ knot->set_flag(SP_KNOT_GRABBED, FALSE);
+
if (!nograb) {
sp_canvas_item_ungrab(knot->item, event->button.time);
}
+
if (moved) {
- sp_knot_set_flag(knot,
- SP_KNOT_DRAGGING,
- FALSE);
- g_signal_emit(knot,
- knot_signals[UNGRABBED], 0,
- event->button.state);
+ knot->set_flag(SP_KNOT_DRAGGING, FALSE);
+
+ knot->_ungrabbed_signal.emit(knot, event->button.state);
+
DocumentUndo::undo(sp_desktop_document(knot->desktop));
knot->desktop->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("Node or handle drag canceled."));
transform_escaped = true;
consumed = TRUE;
}
+
grabbed = FALSE;
moved = FALSE;
+
sp_event_context_discard_delayed_snap_event(knot->desktop->event_context);
break;
default:
@@ -457,164 +343,82 @@ static int sp_knot_handler(SPCanvasItem */*item*/, GdkEvent *event, SPKnot *knot
break;
}
- g_object_unref(knot);
+ knot_unref(knot);
return consumed || grabbed;
}
-void sp_knot_handler_request_position(GdkEvent *event, SPKnot *knot)
-{
+void sp_knot_handler_request_position(GdkEvent *event, SPKnot *knot) {
Geom::Point const motion_w(event->motion.x, event->motion.y);
Geom::Point const motion_dt = knot->desktop->w2d(motion_w);
Geom::Point p = motion_dt - knot->grabbed_rel_pos;
- sp_knot_request_position (knot, p, event->motion.state);
+
+ knot->request_position(p, event->motion.state);
knot->desktop->scroll_to_point (motion_dt);
knot->desktop->set_coordinate_status(knot->pos); // display the coordinate of knot, not cursor - they may be different!
- if (event->motion.state & GDK_BUTTON1_MASK)
- Inkscape::UI::Tools::gobble_motion_events(GDK_BUTTON1_MASK);
-}
-
-SPKnot *sp_knot_new(SPDesktop *desktop, const gchar *tip)
-{
- g_return_val_if_fail(desktop != NULL, NULL);
-
- SPKnot * knot = static_cast<SPKnot*>(g_object_new(SP_TYPE_KNOT, 0));
- knot->desktop = desktop;
- knot->flags = SP_KNOT_VISIBLE;
- if (tip) {
- knot->tip = g_strdup (tip);
+ if (event->motion.state & GDK_BUTTON1_MASK) {
+ Inkscape::UI::Tools::gobble_motion_events(GDK_BUTTON1_MASK);
}
-
- knot->item = sp_canvas_item_new(sp_desktop_controls (desktop),
- SP_TYPE_CTRL,
- "anchor", SP_ANCHOR_CENTER,
- "size", 8.0,
- "filled", TRUE,
- "fill_color", 0xffffff00,
- "stroked", TRUE,
- "stroke_color", 0x01000000,
- "mode", SP_KNOT_MODE_XOR,
- NULL);
-
- knot->_event_handler_id = g_signal_connect(G_OBJECT(knot->item), "event",
- G_CALLBACK(sp_knot_handler), knot);
-
- return knot;
}
-void sp_knot_show(SPKnot *knot)
-{
- g_return_if_fail(knot != NULL);
- g_return_if_fail(SP_IS_KNOT (knot));
-
- sp_knot_set_flag(knot, SP_KNOT_VISIBLE, TRUE);
+void SPKnot::show() {
+ this->set_flag(SP_KNOT_VISIBLE, TRUE);
}
-void sp_knot_hide(SPKnot *knot)
-{
- g_return_if_fail(knot != NULL);
- g_return_if_fail(SP_IS_KNOT(knot));
-
- sp_knot_set_flag(knot, SP_KNOT_VISIBLE, FALSE);
+void SPKnot::hide() {
+ this->set_flag(SP_KNOT_VISIBLE, FALSE);
}
-void sp_knot_request_position(SPKnot *knot, Geom::Point const &p, guint state)
-{
- g_return_if_fail(knot != NULL);
- g_return_if_fail(SP_IS_KNOT(knot));
-
- gboolean done = FALSE;
-
- g_signal_emit(knot,
- knot_signals[REQUEST], 0,
- &p,
- state,
- &done);
+void SPKnot::request_position(Geom::Point const &p, guint state) {
+ bool done = this->_request_signal.emit(this, &const_cast<Geom::Point&>(p), state);
/* If user did not complete, we simply move knot to new position */
-
if (!done) {
- sp_knot_set_position (knot, p, state);
+ this->set_position(p, state);
}
}
-gdouble sp_knot_distance(SPKnot * knot, Geom::Point const &p, guint state)
-{
- g_return_val_if_fail(knot != NULL, 1e18);
- g_return_val_if_fail(SP_IS_KNOT(knot), 1e18);
-
- gdouble distance = Geom::L2(p - knot->pos);
+void SPKnot::set_position(Geom::Point const &p, guint state) {
+ this->pos = p;
- g_signal_emit(knot,
- knot_signals[DISTANCE], 0,
- &p,
- state,
- &distance);
-
- return distance;
-}
-
-void sp_knot_set_position(SPKnot *knot, Geom::Point const &p, guint state)
-{
- g_return_if_fail(knot != NULL);
- g_return_if_fail(SP_IS_KNOT (knot));
-
- knot->pos = p;
-
- if (knot->item) {
- SP_CTRL(knot->item)->moveto (p);
+ if (this->item) {
+ SP_CTRL(this->item)->moveto(p);
}
- g_signal_emit(knot,
- knot_signals[MOVED], 0,
- &p,
- state);
- knot->_moved_signal.emit(knot, p, state);
+ this->_moved_signal.emit(this, p, state);
}
-void sp_knot_moveto(SPKnot *knot, Geom::Point const &p)
-{
- g_return_if_fail(knot != NULL);
- g_return_if_fail(SP_IS_KNOT(knot));
-
- knot->pos = p;
+void SPKnot::moveto(Geom::Point const &p) {
+ this->pos = p;
- if (knot->item) {
- SP_CTRL(knot->item)->moveto (p);
+ if (this->item) {
+ SP_CTRL(this->item)->moveto(p);
}
}
-Geom::Point sp_knot_position(SPKnot const *knot)
-{
- g_assert(knot != NULL);
- g_assert(SP_IS_KNOT (knot));
-
- return knot->pos;
+Geom::Point SPKnot::position() const {
+ return this->pos;
}
-void sp_knot_set_flag(SPKnot *knot, guint flag, bool set)
-{
- g_assert(knot != NULL);
- g_assert(SP_IS_KNOT(knot));
-
+void SPKnot::set_flag(guint flag, bool set) {
if (set) {
- knot->flags |= flag;
+ this->flags |= flag;
} else {
- knot->flags &= ~flag;
+ this->flags &= ~flag;
}
switch (flag) {
case SP_KNOT_VISIBLE:
if (set) {
- sp_canvas_item_show(knot->item);
+ sp_canvas_item_show(this->item);
} else {
- sp_canvas_item_hide(knot->item);
+ sp_canvas_item_hide(this->item);
}
break;
case SP_KNOT_MOUSEOVER:
case SP_KNOT_DRAGGING:
- sp_knot_set_ctrl_state(knot);
+ this->set_ctrl_state();
break;
case SP_KNOT_GRABBED:
break;
@@ -624,39 +428,130 @@ void sp_knot_set_flag(SPKnot *knot, guint flag, bool set)
}
}
-void sp_knot_update_ctrl(SPKnot *knot)
-{
- if (!knot->item) {
+void SPKnot::update_ctrl() {
+ if (!this->item) {
return;
}
- g_object_set(knot->item, "shape", knot->shape, NULL);
- g_object_set(knot->item, "mode", knot->mode, NULL);
- g_object_set(knot->item, "size", (gdouble) knot->size, NULL);
- g_object_set(knot->item, "anchor", knot->anchor, NULL);
- if (knot->pixbuf) {
- g_object_set(knot->item, "pixbuf", knot->pixbuf, NULL);
+ g_object_set(this->item, "shape", this->shape, NULL);
+ g_object_set(this->item, "mode", this->mode, NULL);
+ g_object_set(this->item, "size", (gdouble) this->size, NULL);
+ g_object_set(this->item, "anchor", this->anchor, NULL);
+
+ if (this->pixbuf) {
+ g_object_set(this->item, "pixbuf", this->pixbuf, NULL);
}
- sp_knot_set_ctrl_state(knot);
+ this->set_ctrl_state();
}
-/**
- * Set knot control state (dragging/mouseover/normal).
- */
-static void sp_knot_set_ctrl_state(SPKnot *knot)
-{
+void SPKnot::set_ctrl_state() {
int state = SP_KNOT_STATE_NORMAL;
- if (knot->flags & SP_KNOT_DRAGGING) {
+
+ if (this->flags & SP_KNOT_DRAGGING) {
state = SP_KNOT_STATE_DRAGGING;
- } else if (knot->flags & SP_KNOT_MOUSEOVER) {
+ } else if (this->flags & SP_KNOT_MOUSEOVER) {
state = SP_KNOT_STATE_MOUSEOVER;
}
- g_object_set(knot->item, "fill_color", knot->fill[state], NULL);
- g_object_set(knot->item, "stroke_color", knot->stroke[state], NULL);
+
+ g_object_set(this->item, "fill_color", this->fill[state], NULL);
+ g_object_set(this->item, "stroke_color", this->stroke[state], NULL);
+}
+
+
+void SPKnot::setSize(guint i) {
+ size = i;
+}
+
+void SPKnot::setShape(guint i) {
+ shape = (SPKnotShapeType) i;
+}
+
+void SPKnot::setAnchor(guint i) {
+ anchor = (SPAnchorType) i;
+}
+
+void SPKnot::setMode(guint i) {
+ mode = (SPKnotModeType) i;
+}
+
+void SPKnot::setPixbuf(gpointer p) {
+ pixbuf = p;
}
+void SPKnot::setFill(guint32 normal, guint32 mouseover, guint32 dragging) {
+ fill[SP_KNOT_STATE_NORMAL] = normal;
+ fill[SP_KNOT_STATE_MOUSEOVER] = mouseover;
+ fill[SP_KNOT_STATE_DRAGGING] = dragging;
+}
+
+void SPKnot::setStroke(guint32 normal, guint32 mouseover, guint32 dragging) {
+ stroke[SP_KNOT_STATE_NORMAL] = normal;
+ stroke[SP_KNOT_STATE_MOUSEOVER] = mouseover;
+ stroke[SP_KNOT_STATE_DRAGGING] = dragging;
+}
+void SPKnot::setImage(guchar* normal, guchar* mouseover, guchar* dragging) {
+ image[SP_KNOT_STATE_NORMAL] = normal;
+ image[SP_KNOT_STATE_MOUSEOVER] = mouseover;
+ image[SP_KNOT_STATE_DRAGGING] = dragging;
+}
+
+void SPKnot::setCursor(GdkCursor* normal, GdkCursor* mouseover, GdkCursor* dragging) {
+ if (cursor[SP_KNOT_STATE_NORMAL]) {
+#if GTK_CHECK_VERSION(3,0,0)
+ g_object_unref(cursor[SP_KNOT_STATE_NORMAL]);
+#else
+ gdk_cursor_unref(cursor[SP_KNOT_STATE_NORMAL]);
+#endif
+ }
+
+ cursor[SP_KNOT_STATE_NORMAL] = normal;
+
+ if (normal) {
+#if GTK_CHECK_VERSION(3,0,0)
+ g_object_ref(normal);
+#else
+ gdk_cursor_ref(normal);
+#endif
+ }
+
+ if (cursor[SP_KNOT_STATE_MOUSEOVER]) {
+#if GTK_CHECK_VERSION(3,0,0)
+ g_object_unref(cursor[SP_KNOT_STATE_MOUSEOVER]);
+#else
+ gdk_cursor_unref(cursor[SP_KNOT_STATE_MOUSEOVER]);
+#endif
+ }
+
+ cursor[SP_KNOT_STATE_MOUSEOVER] = mouseover;
+
+ if (mouseover) {
+#if GTK_CHECK_VERSION(3,0,0)
+ g_object_ref(mouseover);
+#else
+ gdk_cursor_ref(mouseover);
+#endif
+ }
+
+ if (cursor[SP_KNOT_STATE_DRAGGING]) {
+#if GTK_CHECK_VERSION(3,0,0)
+ g_object_unref(cursor[SP_KNOT_STATE_DRAGGING]);
+#else
+ gdk_cursor_unref(cursor[SP_KNOT_STATE_DRAGGING]);
+#endif
+ }
+
+ cursor[SP_KNOT_STATE_DRAGGING] = dragging;
+
+ if (dragging) {
+#if GTK_CHECK_VERSION(3,0,0)
+ g_object_ref(dragging);
+#else
+ gdk_cursor_ref(dragging);
+#endif
+ }
+}
/*
Local Variables:
diff --git a/src/knot.h b/src/knot.h
index 4d87d703f..c8812a466 100644
--- a/src/knot.h
+++ b/src/knot.h
@@ -26,11 +26,8 @@
class SPDesktop;
struct SPCanvasItem;
-#define SP_TYPE_KNOT (sp_knot_get_type())
-#define SP_KNOT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_KNOT, SPKnot))
-#define SP_KNOT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), SP_TYPE_KNOT, SPKnotClass))
-#define SP_IS_KNOT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_KNOT))
-#define SP_IS_KNOT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), SP_TYPE_KNOT))
+#define SP_KNOT(obj) (dynamic_cast<SPKnot*>(static_cast<SPKnot*>(obj)))
+#define SP_IS_KNOT(obj) (dynamic_cast<const SPKnot*>(static_cast<const SPKnot*>(obj)) != NULL)
/**
@@ -39,7 +36,15 @@ struct SPCanvasItem;
* A knot is a draggable object, with callbacks to change something by
* dragging it, visuably represented by a canvas item (mostly square).
*/
-struct SPKnot : GObject {
+class SPKnot {
+public:
+ SPKnot(SPDesktop *desktop, const gchar *tip);
+ virtual ~SPKnot();
+
+
+ int ref_count;
+
+
SPDesktop *desktop; /**< Desktop we are on. */
SPCanvasItem *item; /**< Our CanvasItem. */
SPItem *owner; /**< Optional Owner Item */
@@ -69,180 +74,94 @@ struct SPKnot : GObject {
double pressure; /**< The tablet pen pressure when the knot is being dragged. */
- // C++ signals
- /**
- sigc::signal<void, Geom::Point const &, Geom::Point const &, guint> _moved_signal;
- sigc::signal<void, guint> _click_signal;
- sigc::signal<Geom::Point> _ungrabbed_signal;
- **/
- sigc::signal<void, SPKnot *, Geom::Point const &, guint> _moved_signal;
sigc::signal<void, SPKnot *, guint> _click_signal;
- sigc::signal<void, SPKnot *> _ungrabbed_signal;
+ sigc::signal<void, SPKnot*, guint> _doubleclicked_signal;
+ sigc::signal<void, SPKnot*, guint> _grabbed_signal;
+ sigc::signal<void, SPKnot *, guint> _ungrabbed_signal;
+ sigc::signal<void, SPKnot *, Geom::Point const &, guint> _moved_signal;
+ sigc::signal<bool, SPKnot*, GdkEvent*> _event_signal;
- //TODO: all the members above should eventualle become private, accessible via setters/getters
- inline void setSize (guint i) {size = i;}
- inline void setShape (guint i) {shape = (SPKnotShapeType) i;}
- inline void setAnchor (guint i) {anchor = (SPAnchorType) i;}
- inline void setMode (guint i) {mode = (SPKnotModeType) i;}
- inline void setPixbuf (gpointer p) {pixbuf = p;}
- inline void setFill (guint32 normal, guint32 mouseover, guint32 dragging) {
- fill[SP_KNOT_STATE_NORMAL] = normal;
- fill[SP_KNOT_STATE_MOUSEOVER] = mouseover;
- fill[SP_KNOT_STATE_DRAGGING] = dragging;
- }
- inline void setStroke (guint32 normal, guint32 mouseover, guint32 dragging) {
- stroke[SP_KNOT_STATE_NORMAL] = normal;
- stroke[SP_KNOT_STATE_MOUSEOVER] = mouseover;
- stroke[SP_KNOT_STATE_DRAGGING] = dragging;
- }
- inline void setImage (guchar* normal, guchar* mouseover, guchar* dragging) {
- image[SP_KNOT_STATE_NORMAL] = normal;
- image[SP_KNOT_STATE_MOUSEOVER] = mouseover;
- image[SP_KNOT_STATE_DRAGGING] = dragging;
- }
- inline void setCursor (GdkCursor* normal, GdkCursor* mouseover, GdkCursor* dragging) {
- if (cursor[SP_KNOT_STATE_NORMAL]) {
-#if GTK_CHECK_VERSION(3,0,0)
- g_object_unref(cursor[SP_KNOT_STATE_NORMAL]);
-#else
- gdk_cursor_unref(cursor[SP_KNOT_STATE_NORMAL]);
-#endif
- }
- cursor[SP_KNOT_STATE_NORMAL] = normal;
- if (normal) {
-#if GTK_CHECK_VERSION(3,0,0)
- g_object_ref(normal);
-#else
- gdk_cursor_ref(normal);
-#endif
- }
-
- if (cursor[SP_KNOT_STATE_MOUSEOVER]) {
-#if GTK_CHECK_VERSION(3,0,0)
- g_object_unref(cursor[SP_KNOT_STATE_MOUSEOVER]);
-#else
- gdk_cursor_unref(cursor[SP_KNOT_STATE_MOUSEOVER]);
-#endif
- }
- cursor[SP_KNOT_STATE_MOUSEOVER] = mouseover;
- if (mouseover) {
-#if GTK_CHECK_VERSION(3,0,0)
- g_object_ref(mouseover);
-#else
- gdk_cursor_ref(mouseover);
-#endif
- }
-
- if (cursor[SP_KNOT_STATE_DRAGGING]) {
-#if GTK_CHECK_VERSION(3,0,0)
- g_object_unref(cursor[SP_KNOT_STATE_DRAGGING]);
-#else
- gdk_cursor_unref(cursor[SP_KNOT_STATE_DRAGGING]);
-#endif
- }
- cursor[SP_KNOT_STATE_DRAGGING] = dragging;
- if (dragging) {
-#if GTK_CHECK_VERSION(3,0,0)
- g_object_ref(dragging);
-#else
- gdk_cursor_ref(dragging);
-#endif
- }
- }
+ sigc::signal<bool, SPKnot*, Geom::Point*, guint> _request_signal;
-};
-/// The SPKnot vtable.
-struct SPKnotClass {
- GObjectClass parent_class;
- gint (* event) (SPKnot *knot, GdkEvent *event);
-
- /*
- * These are unconditional.
- */
+ //TODO: all the members above should eventualle become private, accessible via setters/getters
+ void setSize(guint i);
+ void setShape(guint i);
+ void setAnchor(guint i);
+ void setMode(guint i);
+ void setPixbuf(gpointer p);
- void (* clicked) (SPKnot *knot, guint state);
- void (* doubleclicked) (SPKnot *knot, guint state);
- void (* grabbed) (SPKnot *knot, guint state);
- void (* ungrabbed) (SPKnot *knot, guint state);
- void (* moved) (SPKnot *knot, Geom::Point const &position, guint state);
- void (* stamped) (SPKnot *know, guint state);
+ void setFill(guint32 normal, guint32 mouseover, guint32 dragging);
+ void setStroke(guint32 normal, guint32 mouseover, guint32 dragging);
+ void setImage(guchar* normal, guchar* mouseover, guchar* dragging);
- /** Request knot to move to absolute position. */
- bool (* request) (SPKnot *knot, Geom::Point const &pos, guint state);
+ void setCursor(GdkCursor* normal, GdkCursor* mouseover, GdkCursor* dragging);
- /** Find complex distance from knot to point. */
- gdouble (* distance) (SPKnot *knot, Geom::Point const &pos, guint state);
-};
+ /**
+ * Show knot on its canvas.
+ */
+ void show();
-/**
- * Registers SPKnot class and returns its type number.
- */
-GType sp_knot_get_type();
+ /**
+ * Hide knot on its canvas.
+ */
+ void hide();
-/**
- * Return new knot object.
- */
-SPKnot *sp_knot_new(SPDesktop *desktop, gchar const *tip = NULL);
+ /**
+ * Set flag in knot, with side effects.
+ */
+ void set_flag(guint flag, bool set);
-#define SP_KNOT_IS_VISIBLE(k) ((k->flags & SP_KNOT_VISIBLE) != 0)
-#define SP_KNOT_IS_MOUSEOVER(k) ((k->flags & SP_KNOT_MOUSEOVER) != 0)
-#define SP_KNOT_IS_DRAGGING(k) ((k->flags & SP_KNOT_DRAGGING) != 0)
-#define SP_KNOT_IS_GRABBED(k) ((k->flags & SP_KNOT_GRABBED) != 0)
+ /**
+ * Update knot's pixbuf and set its control state.
+ */
+ void update_ctrl();
-/**
- * Show knot on its canvas.
- */
-void sp_knot_show(SPKnot *knot);
+ /**
+ * Request or set new position for knot.
+ */
+ void request_position(Geom::Point const &pos, guint state);
-/**
- * Hide knot on its canvas.
- */
-void sp_knot_hide(SPKnot *knot);
+ /**
+ * Update knot for dragging and tell canvas an item was grabbed.
+ */
+ void start_dragging(Geom::Point const &p, gint x, gint y, guint32 etime);
-/**
- * Set flag in knot, with side effects.
- */
-void sp_knot_set_flag(SPKnot *knot, guint flag, bool set);
+ /**
+ * Move knot to new position and emits "moved" signal.
+ */
+ void set_position(Geom::Point const &p, guint state);
-/**
- * Update knot's pixbuf and set its control state.
- */
-void sp_knot_update_ctrl(SPKnot *knot);
+ /**
+ * Move knot to new position, without emitting a MOVED signal.
+ */
+ void moveto(Geom::Point const &p);
-/**
- * Request or set new position for knot.
- */
-void sp_knot_request_position(SPKnot *knot, Geom::Point const &pos, guint state);
+ /**
+ * Returns position of knot.
+ */
+ Geom::Point position() const;
-/**
- * Return distance of point to knot's position; unused.
- */
-gdouble sp_knot_distance(SPKnot *knot, Geom::Point const &p, guint state);
+private:
+ SPKnot(const SPKnot&);
+ SPKnot& operator=(const SPKnot&);
-/**
- * Update knot for dragging and tell canvas an item was grabbed.
- */
-void sp_knot_start_dragging(SPKnot *knot, Geom::Point const &p, gint x, gint y, guint32 etime);
+ /**
+ * Set knot control state (dragging/mouseover/normal).
+ */
+ void set_ctrl_state();
+};
-/**
- * Move knot to new position and emits "moved" signal.
- */
-void sp_knot_set_position(SPKnot *knot, Geom::Point const &p, guint state);
+void knot_ref(SPKnot* knot);
+void knot_unref(SPKnot* knot);
-/**
- * Move knot to new position, without emitting a MOVED signal.
- */
-void sp_knot_moveto(SPKnot *knot, Geom::Point const &p);
+#define SP_KNOT_IS_VISIBLE(k) ((k->flags & SP_KNOT_VISIBLE) != 0)
+#define SP_KNOT_IS_MOUSEOVER(k) ((k->flags & SP_KNOT_MOUSEOVER) != 0)
+#define SP_KNOT_IS_DRAGGING(k) ((k->flags & SP_KNOT_DRAGGING) != 0)
+#define SP_KNOT_IS_GRABBED(k) ((k->flags & SP_KNOT_GRABBED) != 0)
void sp_knot_handler_request_position(GdkEvent *event, SPKnot *knot);
-/**
- * Returns position of knot.
- */
-Geom::Point sp_knot_position(SPKnot const *knot);
-
-
#endif // SEEN_SP_KNOT_H
/*
diff --git a/src/knotholder.cpp b/src/knotholder.cpp
index bef89f3af..cf87423d4 100644
--- a/src/knotholder.cpp
+++ b/src/knotholder.cpp
@@ -63,14 +63,12 @@ KnotHolder::KnotHolder(SPDesktop *desktop, SPItem *item, SPKnotHolderReleasedFun
g_print ("Error! Throw an exception, please!\n");
}
- //g_object_ref(G_OBJECT(item)); // TODO: is this still needed after C++-ification?
sp_object_ref(item);
sizeUpdatedConn = ControlManager::getManager().connectCtrlSizeChanged(sigc::mem_fun(*this, &KnotHolder::updateControlSizes));
}
KnotHolder::~KnotHolder() {
- //g_object_unref(G_OBJECT(item));
sp_object_unref(item);
for (std::list<KnotHolderEntity *>::iterator i = entity.begin(); i != entity.end(); ++i)
@@ -187,7 +185,7 @@ KnotHolder::knot_moved_handler(SPKnot *knot, Geom::Point const &p, guint state)
}
void
-KnotHolder::knot_ungrabbed_handler(SPKnot */*knot*/)
+KnotHolder::knot_ungrabbed_handler(SPKnot */*knot*/, guint)
{
this->dragging = false;
diff --git a/src/knotholder.h b/src/knotholder.h
index fc91a56fc..d531ae288 100644
--- a/src/knotholder.h
+++ b/src/knotholder.h
@@ -48,7 +48,7 @@ public:
void knot_moved_handler(SPKnot *knot, Geom::Point const &p, guint state);
void knot_clicked_handler(SPKnot *knot, guint state);
- void knot_ungrabbed_handler(SPKnot *knot);
+ void knot_ungrabbed_handler(SPKnot *knot, guint);
void add(KnotHolderEntity *e);
diff --git a/src/seltrans.cpp b/src/seltrans.cpp
index a55bc3c0d..858985625 100644
--- a/src/seltrans.cpp
+++ b/src/seltrans.cpp
@@ -54,15 +54,15 @@
using Inkscape::ControlManager;
using Inkscape::DocumentUndo;
-static void sp_sel_trans_handle_grab(SPKnot *knot, guint state, gpointer data);
-static void sp_sel_trans_handle_ungrab(SPKnot *knot, guint state, gpointer data);
-static void sp_sel_trans_handle_click(SPKnot *knot, guint state, gpointer data);
-static void sp_sel_trans_handle_new_event(SPKnot *knot, Geom::Point *position, guint32 state, gpointer data);
-static gboolean sp_sel_trans_handle_request(SPKnot *knot, Geom::Point *p, guint state, gboolean *data);
+static void sp_sel_trans_handle_grab(SPKnot *knot, guint state, SPSelTransHandle const* data);
+static void sp_sel_trans_handle_ungrab(SPKnot *knot, guint state, SPSelTransHandle const* data);
+static void sp_sel_trans_handle_click(SPKnot *knot, guint state, SPSelTransHandle const* data);
+static void sp_sel_trans_handle_new_event(SPKnot *knot, Geom::Point const &position, guint32 state, SPSelTransHandle const* data);
+static gboolean sp_sel_trans_handle_request(SPKnot *knot, Geom::Point *p, guint state, SPSelTransHandle const *data);
extern GdkPixbuf *handles[];
-static gboolean sp_sel_trans_handle_event(SPKnot *knot, GdkEvent *event, gpointer)
+static gboolean sp_sel_trans_handle_event(SPKnot *knot, GdkEvent *event, SPSelTransHandle const*)
{
switch (event->type) {
case GDK_MOTION_NOTIFY:
@@ -186,7 +186,7 @@ Inkscape::SelTrans::~SelTrans()
_sel_modified_connection.disconnect();
for (int i = 0; i < NUMHANDS; i++) {
- g_object_unref(G_OBJECT(knots[i]));
+ knot_unref(knots[i]);
knots[i] = NULL;
}
@@ -574,7 +574,7 @@ void Inkscape::SelTrans::stamp()
void Inkscape::SelTrans::_updateHandles()
{
for (int i = 0; i < NUMHANDS; i++)
- sp_knot_hide(knots[i]);
+ knots[i]->hide();
if ( !_show_handles || _empty )
return;
@@ -627,13 +627,13 @@ void Inkscape::SelTrans::_showHandles(SPSelTransType type)
// Position knots to scale the selection bbox
Geom::Point const bpos(hands[i].x, hands[i].y);
Geom::Point p(_bbox->min() + (_bbox->dimensions() * Geom::Scale(bpos)));
- sp_knot_moveto(knots[i], p);
- sp_knot_show(knots[i]);
+ knots[i]->moveto(p);
+ knots[i]->show();
// This controls the center handle's position, because the default can
// be moved and needs to be remembered.
if( type == HANDLE_CENTER && _center )
- sp_knot_moveto(knots[i], *_center);
+ knots[i]->moveto(*_center);
}
}
@@ -641,7 +641,7 @@ void Inkscape::SelTrans::_makeHandles()
{
for (int i = 0; i < NUMHANDS; i++) {
SPSelTransTypeInfo info = handtypes[hands[i].type];
- knots[i] = sp_knot_new(_desktop, info.tip);
+ knots[i] = new SPKnot(_desktop, info.tip);
knots[i]->setShape(SP_CTRL_SHAPE_BITMAP);
knots[i]->setSize(13);
@@ -650,50 +650,46 @@ void Inkscape::SelTrans::_makeHandles()
knots[i]->setFill(info.color[0], info.color[1], info.color[2]);
knots[i]->setStroke(info.color[3], info.color[4], info.color[5]);
knots[i]->setPixbuf(handles[hands[i].control]);
- sp_knot_update_ctrl(knots[i]);
-
- g_signal_connect(G_OBJECT(knots[i]), "request",
- G_CALLBACK(sp_sel_trans_handle_request), (gpointer) &hands[i]);
- g_signal_connect(G_OBJECT(knots[i]), "moved",
- G_CALLBACK(sp_sel_trans_handle_new_event), (gpointer) &hands[i]);
- g_signal_connect(G_OBJECT(knots[i]), "grabbed",
- G_CALLBACK(sp_sel_trans_handle_grab), (gpointer) &hands[i]);
- g_signal_connect(G_OBJECT(knots[i]), "ungrabbed",
- G_CALLBACK(sp_sel_trans_handle_ungrab), (gpointer) &hands[i]);
- g_signal_connect(G_OBJECT(knots[i]), "clicked",
- G_CALLBACK(sp_sel_trans_handle_click), (gpointer) &hands[i]);
- g_signal_connect(G_OBJECT(knots[i]), "event",
- G_CALLBACK(sp_sel_trans_handle_event), (gpointer) &hands[i]);
+ knots[i]->update_ctrl();
+
+ knots[i]->_request_signal.connect(sigc::bind(sigc::ptr_fun(sp_sel_trans_handle_request), &hands[i]));
+ knots[i]->_moved_signal.connect(sigc::bind(sigc::ptr_fun(sp_sel_trans_handle_new_event), &hands[i]));
+ knots[i]->_grabbed_signal.connect(sigc::bind(sigc::ptr_fun(sp_sel_trans_handle_grab), &hands[i]));
+ knots[i]->_ungrabbed_signal.connect(sigc::bind(sigc::ptr_fun(sp_sel_trans_handle_ungrab), &hands[i]));
+ knots[i]->_click_signal.connect(sigc::bind(sigc::ptr_fun(sp_sel_trans_handle_click), &hands[i]));
+ knots[i]->_event_signal.connect(sigc::bind(sigc::ptr_fun(sp_sel_trans_handle_event), &hands[i]));
}
}
-static void sp_sel_trans_handle_grab(SPKnot *knot, guint state, gpointer data)
+static void sp_sel_trans_handle_grab(SPKnot *knot, guint state, SPSelTransHandle const* data)
{
SP_SELECT_CONTEXT(knot->desktop->event_context)->_seltrans->handleGrab(
knot, state, *(SPSelTransHandle const *) data
);
}
-static void sp_sel_trans_handle_ungrab(SPKnot *knot, guint /*state*/, gpointer /*data*/)
+static void sp_sel_trans_handle_ungrab(SPKnot *knot, guint /*state*/, SPSelTransHandle const* /*data*/)
{
SP_SELECT_CONTEXT(knot->desktop->event_context)->_seltrans->ungrab();
}
-static void sp_sel_trans_handle_new_event(SPKnot *knot, Geom::Point *position, guint state, gpointer data)
+static void sp_sel_trans_handle_new_event(SPKnot *knot, Geom::Point const& position, guint state, SPSelTransHandle const *data)
{
+ Geom::Point pos = position;
+
SP_SELECT_CONTEXT(knot->desktop->event_context)->_seltrans->handleNewEvent(
- knot, position, state, *(SPSelTransHandle const *) data
+ knot, &pos, state, *(SPSelTransHandle const *) data
);
}
-static gboolean sp_sel_trans_handle_request(SPKnot *knot, Geom::Point *position, guint state, gboolean *data)
+static gboolean sp_sel_trans_handle_request(SPKnot *knot, Geom::Point *position, guint state, SPSelTransHandle const *data)
{
return SP_SELECT_CONTEXT(knot->desktop->event_context)->_seltrans->handleRequest(
knot, position, state, *(SPSelTransHandle const *) data
);
}
-static void sp_sel_trans_handle_click(SPKnot *knot, guint state, gpointer data)
+static void sp_sel_trans_handle_click(SPKnot *knot, guint state, SPSelTransHandle const* data)
{
SP_SELECT_CONTEXT(knot->desktop->event_context)->_seltrans->handleClick(
knot, state, *(SPSelTransHandle const *) data
@@ -742,7 +738,7 @@ void Inkscape::SelTrans::handleGrab(SPKnot *knot, guint /*state*/, SPSelTransHan
break;
}
- grab(sp_knot_position(knot), handle.x, handle.y, FALSE, FALSE);
+ grab(knot->position(), handle.x, handle.y, FALSE, FALSE);
}
@@ -800,7 +796,7 @@ gboolean Inkscape::SelTrans::handleRequest(SPKnot *knot, Geom::Point *position,
return TRUE;
}
if (request(handle, *position, state)) {
- sp_knot_set_position(knot, *position, state);
+ knot->set_position(*position, state);
SP_CTRL(_grip)->moveto(*position);
if (handle.type == HANDLE_CENTER) {
SP_CTRL(_norm)->moveto(*position);
diff --git a/src/ui/tools/connector-tool.cpp b/src/ui/tools/connector-tool.cpp
index e19f35832..4f918b483 100644
--- a/src/ui/tools/connector-tool.cpp
+++ b/src/ui/tools/connector-tool.cpp
@@ -201,7 +201,8 @@ ConnectorTool::~ConnectorTool() {
for (int i = 0; i < 2; ++i) {
if (this->endpt_handle[1]) {
- g_object_unref(this->endpt_handle[i]);
+ //g_object_unref(this->endpt_handle[i]);
+ knot_unref(this->endpt_handle[i]);
this->endpt_handle[i] = NULL;
}
}
@@ -319,7 +320,7 @@ cc_clear_active_knots(SPKnotList k)
// Hide the connection points if they exist.
if (k.size()) {
for (SPKnotList::iterator it = k.begin(); it != k.end(); ++it) {
- sp_knot_hide(it->first);
+ it->first->hide();
}
}
}
@@ -341,7 +342,7 @@ void ConnectorTool::cc_clear_active_conn() {
// Hide the endpoint handles.
for (int i = 0; i < 2; ++i) {
if (this->endpt_handle[i]) {
- sp_knot_hide(this->endpt_handle[i]);
+ this->endpt_handle[i]->hide();
}
}
}
@@ -365,7 +366,7 @@ cc_select_handle(SPKnot* knot)
knot->setSize(10);
knot->setAnchor(SP_ANCHOR_CENTER);
knot->setFill(0x0000ffff, 0x0000ffff, 0x0000ffff);
- sp_knot_update_ctrl(knot);
+ knot->update_ctrl();
}
static void
@@ -375,7 +376,7 @@ cc_deselect_handle(SPKnot* knot)
knot->setSize(8);
knot->setAnchor(SP_ANCHOR_CENTER);
knot->setFill(0xffffff00, 0xff0000ff, 0xff0000ff);
- sp_knot_update_ctrl(knot);
+ knot->update_ctrl();
}
bool ConnectorTool::item_handler(SPItem* item, GdkEvent* event) {
@@ -969,7 +970,8 @@ cc_generic_knot_handler(SPCanvasItem *, GdkEvent *event, SPKnot *knot)
{
g_assert (knot != NULL);
- g_object_ref(knot);
+ //g_object_ref(knot);
+ knot_ref(knot);
ConnectorTool *cc = SP_CONNECTOR_CONTEXT(
knot->desktop->event_context);
@@ -979,7 +981,7 @@ cc_generic_knot_handler(SPCanvasItem *, GdkEvent *event, SPKnot *knot)
gchar const *knot_tip = "Click to join at this point";
switch (event->type) {
case GDK_ENTER_NOTIFY:
- sp_knot_set_flag(knot, SP_KNOT_MOUSEOVER, TRUE);
+ knot->set_flag(SP_KNOT_MOUSEOVER, TRUE);
cc->active_handle = knot;
if (knot_tip)
@@ -991,7 +993,7 @@ cc_generic_knot_handler(SPCanvasItem *, GdkEvent *event, SPKnot *knot)
consumed = TRUE;
break;
case GDK_LEAVE_NOTIFY:
- sp_knot_set_flag(knot, SP_KNOT_MOUSEOVER, FALSE);
+ knot->set_flag(SP_KNOT_MOUSEOVER, FALSE);
/* FIXME: the following test is a workaround for LP Bug #1273510.
* It seems that a signal is not correctly disconnected, maybe
@@ -1010,7 +1012,8 @@ cc_generic_knot_handler(SPCanvasItem *, GdkEvent *event, SPKnot *knot)
break;
}
- g_object_unref(knot);
+ //g_object_unref(knot);
+ knot_unref(knot);
return consumed;
}
@@ -1066,14 +1069,14 @@ endpt_handler(SPKnot */*knot*/, GdkEvent *event, ConnectorTool *cc)
}
void ConnectorTool::_activeShapeAddKnot(SPItem* item) {
- SPKnot *knot = sp_knot_new(desktop, 0);
+ SPKnot *knot = new SPKnot(desktop, 0);
knot->owner = item;
knot->setShape(SP_KNOT_SHAPE_SQUARE);
knot->setSize(8);
knot->setAnchor(SP_ANCHOR_CENTER);
knot->setFill(0xffffff00, 0xff0000ff, 0xff0000ff);
- sp_knot_update_ctrl(knot);
+ knot->update_ctrl();
// We don't want to use the standard knot handler.
g_signal_handler_disconnect(G_OBJECT(knot->item),
@@ -1084,8 +1087,8 @@ void ConnectorTool::_activeShapeAddKnot(SPItem* item) {
g_signal_connect(G_OBJECT(knot->item), "event",
G_CALLBACK(cc_generic_knot_handler), knot);
- sp_knot_set_position(knot, item->avoidRef->getConnectionPointPos() * desktop->doc2dt(), 0);
- sp_knot_show(knot);
+ knot->set_position(item->avoidRef->getConnectionPointPos() * desktop->doc2dt(), 0);
+ knot->show();
this->knots[knot] = 1;
}
@@ -1149,17 +1152,17 @@ void ConnectorTool::cc_set_active_conn(SPItem *item) {
{
// Connector is invisible because it is clipped to the boundary of
// two overlpapping shapes.
- sp_knot_hide(this->endpt_handle[0]);
- sp_knot_hide(this->endpt_handle[1]);
+ this->endpt_handle[0]->hide();
+ this->endpt_handle[1]->hide();
}
else
{
// Just adjust handle positions.
Geom::Point startpt = *(curve->first_point()) * i2dt;
- sp_knot_set_position(this->endpt_handle[0], startpt, 0);
+ this->endpt_handle[0]->set_position(startpt, 0);
Geom::Point endpt = *(curve->last_point()) * i2dt;
- sp_knot_set_position(this->endpt_handle[1], endpt, 0);
+ this->endpt_handle[1]->set_position(endpt, 0);
}
return;
@@ -1184,7 +1187,7 @@ void ConnectorTool::cc_set_active_conn(SPItem *item) {
for (int i = 0; i < 2; ++i) {
// Create the handle if it doesn't exist
if ( this->endpt_handle[i] == NULL ) {
- SPKnot *knot = sp_knot_new(this->desktop,
+ SPKnot *knot = new SPKnot(this->desktop,
_("<b>Connector endpoint</b>: drag to reroute or connect to new shapes"));
knot->setShape(SP_KNOT_SHAPE_SQUARE);
@@ -1192,7 +1195,7 @@ void ConnectorTool::cc_set_active_conn(SPItem *item) {
knot->setAnchor(SP_ANCHOR_CENTER);
knot->setFill(0xffffff00, 0xff0000ff, 0xff0000ff);
knot->setStroke(0x000000ff, 0x000000ff, 0x000000ff);
- sp_knot_update_ctrl(knot);
+ knot->update_ctrl();
// We don't want to use the standard knot handler,
// since we don't want this knot to be draggable.
@@ -1232,13 +1235,13 @@ void ConnectorTool::cc_set_active_conn(SPItem *item) {
}
Geom::Point startpt = *(curve->first_point()) * i2dt;
- sp_knot_set_position(this->endpt_handle[0], startpt, 0);
+ this->endpt_handle[0]->set_position(startpt, 0);
Geom::Point endpt = *(curve->last_point()) * i2dt;
- sp_knot_set_position(this->endpt_handle[1], endpt, 0);
+ this->endpt_handle[1]->set_position(endpt, 0);
- sp_knot_show(this->endpt_handle[0]);
- sp_knot_show(this->endpt_handle[1]);
+ this->endpt_handle[0]->show();
+ this->endpt_handle[1]->show();
}
void cc_create_connection_point(ConnectorTool* cc)
@@ -1250,7 +1253,7 @@ void cc_create_connection_point(ConnectorTool* cc)
cc_deselect_handle( cc->selected_handle );
}
- SPKnot *knot = sp_knot_new(cc->desktop, 0);
+ SPKnot *knot = new SPKnot(cc->desktop, 0);
// We do not process events on this knot.
g_signal_handler_disconnect(G_OBJECT(knot->item),
@@ -1260,7 +1263,7 @@ void cc_create_connection_point(ConnectorTool* cc)
cc_select_handle( knot );
cc->selected_handle = knot;
- sp_knot_show(cc->selected_handle);
+ cc->selected_handle->show();
cc->state = SP_CONNECTOR_CONTEXT_NEWCONNPOINT;
}
}
diff --git a/src/vanishing-point.cpp b/src/vanishing-point.cpp
index 361a7a0de..a0f3692a5 100644
--- a/src/vanishing-point.cpp
+++ b/src/vanishing-point.cpp
@@ -85,12 +85,12 @@ have_VPs_of_same_perspective (VPDragger *dr1, VPDragger *dr2)
}
static void
-vp_knot_moved_handler (SPKnot *knot, Geom::Point const *ppointer, guint state, gpointer data)
+vp_knot_moved_handler (SPKnot *knot, Geom::Point const &ppointer, guint state, gpointer data)
{
VPDragger *dragger = (VPDragger *) data;
VPDrag *drag = dragger->parent;
- Geom::Point p = *ppointer;
+ Geom::Point p = ppointer;
// FIXME: take from prefs
double snap_dist = SNAP_DIST / inkscape_active_desktop()->current_zoom();
@@ -188,7 +188,7 @@ vp_knot_moved_handler (SPKnot *knot, Geom::Point const *ppointer, guint state, g
m.unSetup();
if (s.getSnapped()) {
p = s.getPoint();
- sp_knot_moveto(knot, p);
+ knot->moveto(p);
}
}
@@ -277,22 +277,22 @@ VPDragger::VPDragger(VPDrag *parent, Geom::Point p, VanishingPoint &vp)
if (vp.is_finite()) {
// create the knot
- this->knot = sp_knot_new(inkscape_active_desktop(), NULL);
+ this->knot = new SPKnot(inkscape_active_desktop(), NULL);
this->knot->setMode(SP_KNOT_MODE_XOR);
this->knot->setFill(VP_KNOT_COLOR_NORMAL, VP_KNOT_COLOR_NORMAL, VP_KNOT_COLOR_NORMAL);
this->knot->setStroke(0x000000ff, 0x000000ff, 0x000000ff);
- sp_knot_update_ctrl(this->knot);
+ this->knot->update_ctrl();
knot->item->ctrlType = CTRL_TYPE_ANCHOR;
ControlManager::getManager().track(knot->item);
// move knot to the given point
- sp_knot_set_position (this->knot, this->point, SP_KNOT_STATE_NORMAL);
- sp_knot_show (this->knot);
+ this->knot->set_position(this->point, SP_KNOT_STATE_NORMAL);
+ this->knot->show();
// connect knot's signals
- g_signal_connect (G_OBJECT (this->knot), "moved", G_CALLBACK (vp_knot_moved_handler), this);
- g_signal_connect (G_OBJECT (this->knot), "grabbed", G_CALLBACK (vp_knot_grabbed_handler), this);
- g_signal_connect (G_OBJECT (this->knot), "ungrabbed", G_CALLBACK (vp_knot_ungrabbed_handler), this);
+ this->_moved_connection = this->knot->_moved_signal.connect(sigc::bind(sigc::ptr_fun(vp_knot_moved_handler), this));
+ this->_grabbed_connection = this->knot->_grabbed_signal.connect(sigc::bind(sigc::ptr_fun(vp_knot_grabbed_handler), this));
+ this->_ungrabbed_connection = this->knot->_ungrabbed_signal.connect(sigc::bind(sigc::ptr_fun(vp_knot_ungrabbed_handler), this));
// add the initial VP (which may be NULL!)
this->addVP (vp);
@@ -302,11 +302,12 @@ VPDragger::VPDragger(VPDrag *parent, Geom::Point p, VanishingPoint &vp)
VPDragger::~VPDragger()
{
// disconnect signals
- g_signal_handlers_disconnect_by_func(G_OBJECT(this->knot), (gpointer) G_CALLBACK (vp_knot_moved_handler), this);
- g_signal_handlers_disconnect_by_func(G_OBJECT(this->knot), (gpointer) G_CALLBACK (vp_knot_grabbed_handler), this);
- g_signal_handlers_disconnect_by_func(G_OBJECT(this->knot), (gpointer) G_CALLBACK (vp_knot_ungrabbed_handler), this);
+ this->_moved_connection.disconnect();
+ this->_grabbed_connection.disconnect();
+ this->_ungrabbed_connection.disconnect();
+
/* unref should call destroy */
- g_object_unref (G_OBJECT (this->knot));
+ knot_unref(this->knot);
}
/**
diff --git a/src/vanishing-point.h b/src/vanishing-point.h
index 53366fe66..ed66aab0a 100644
--- a/src/vanishing-point.h
+++ b/src/vanishing-point.h
@@ -133,6 +133,10 @@ public:
bool dragging_started;
+ sigc::connection _moved_connection;
+ sigc::connection _grabbed_connection;
+ sigc::connection _ungrabbed_connection;
+
std::list<VanishingPoint> vps;
void addVP(VanishingPoint &vp, bool update_pos = false);