summaryrefslogtreecommitdiffstats
path: root/src/knot.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/knot.cpp')
-rw-r--r--src/knot.cpp641
1 files changed, 269 insertions, 372 deletions
diff --git a/src/knot.cpp b/src/knot.cpp
index 2179bc3d5..61d0dff39 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,138 @@ 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 };
+static int sp_knot_handler(SPCanvasItem *item, GdkEvent *event, SPKnot *knot);
-GType sp_knot_get_type()
+SPKnot::SPKnot(SPDesktop *desktop, gchar const *tip)
+ : ref_count(1)
{
- 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->desktop = NULL;
+ this->item = NULL;
+ this->owner = NULL;
+ this->flags = 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::startDragging(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->setFlag(SP_KNOT_GRABBED, TRUE);
+
grabbed = TRUE;
}
@@ -300,23 +191,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 +215,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->startDragging(p, (gint) event->button.x, (gint) event->button.y, event->button.time);
+
consumed = TRUE;
}
break;
@@ -340,28 +230,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->setFlag(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->setFlag(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);
+ knot->click_signal.emit(knot, event->button.state);
}
+
grabbed = FALSE;
moved = FALSE;
consumed = TRUE;
@@ -383,27 +270,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->setFlag(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->setFlag(SP_KNOT_MOUSEOVER, TRUE);
+ knot->setFlag(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 +300,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->setFlag(SP_KNOT_MOUSEOVER, FALSE);
+ knot->setFlag(SP_KNOT_GRABBED, FALSE);
if (knot->tip && knot->desktop && knot->desktop->event_context) {
knot->desktop->event_context->defaultMessageContext()->clear();
@@ -428,24 +314,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->setFlag(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->setFlag(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 +345,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->requestPosition(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->setFlag(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->setFlag(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::requestPosition(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->setPosition(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);
+void SPKnot::setPosition(Geom::Point const &p, guint state) {
+ this->pos = p;
- gdouble distance = Geom::L2(p - knot->pos);
-
- 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));
+void SPKnot::moveto(Geom::Point const &p) {
+ this->pos = p;
- knot->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::setFlag(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->_setCtrlState();
break;
case SP_KNOT_GRABBED:
break;
@@ -624,39 +430,130 @@ void sp_knot_set_flag(SPKnot *knot, guint flag, bool set)
}
}
-void sp_knot_update_ctrl(SPKnot *knot)
-{
- if (!knot->item) {
+void SPKnot::updateCtrl() {
+ 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->_setCtrlState();
}
-/**
- * Set knot control state (dragging/mouseover/normal).
- */
-static void sp_knot_set_ctrl_state(SPKnot *knot)
-{
+void SPKnot::_setCtrlState() {
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: