diff options
Diffstat (limited to 'src/knot.cpp')
| -rw-r--r-- | src/knot.cpp | 641 |
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: |
