VPDragger::VPDragger(VPDrag *parent, Geom::Point p, VanishingPoint &vp) { this->parent = parent; this->point = p; this->point_original = p; this->dragging_started = false; if (vp.is_finite()) { // create the knot this->knot = sp_knot_new (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); // move knot to the given point sp_knot_set_position (this->knot, this->point, SP_KNOT_STATE_NORMAL); sp_knot_show (this->knot); // 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); // add the initial VP (which may be NULL!) this->addVP (vp); } }
static void sp_sel_trans_update_handles (SPSelTrans * seltrans) { NRPointF p; g_return_if_fail (seltrans != NULL); if ((!seltrans->show_handles) || (seltrans->empty)) { sp_remove_handles (seltrans->shandle, 8); sp_remove_handles (seltrans->rhandle, 8); sp_remove_handles (&seltrans->chandle, 1); return; } if (seltrans->state == SP_SELTRANS_STATE_SCALE) { sp_remove_handles (seltrans->rhandle, 8); sp_remove_handles (&seltrans->chandle, 1); sp_show_handles (seltrans, seltrans->shandle, handles_scale, 8); } else { sp_remove_handles (seltrans->shandle, 8); sp_remove_handles (&seltrans->chandle, 1); sp_show_handles (seltrans, seltrans->rhandle, handles_rotate, 8); } // center handle if (seltrans->chandle == NULL) { seltrans->chandle = sp_knot_new (seltrans->desktop); g_object_set (G_OBJECT (seltrans->chandle), "anchor", handle_center.anchor, "shape", SP_CTRL_SHAPE_BITMAP, "size", 13, "mode", SP_CTRL_MODE_COLOR, "fill", 0x00000000, "fill_mouseover", 0x0000007f, "stroke", 0x000000ff, "stroke_mouseover", 0x000000ff, //"fill", 0xff40ffa0, //"fill_mouseover", 0x40ffffa0, //"stroke", 0xFFb0b0ff, //"stroke_mouseover", 0xffffffFF, "pixbuf", handles[handle_center.control], #if 0 "cursor_mouseover", CursorSelectMouseover, "cursor_dragging", CursorSelectDragging, #endif NULL); g_signal_connect (G_OBJECT (seltrans->chandle), "request", G_CALLBACK (sp_sel_trans_handle_request), (gpointer) &handle_center); g_signal_connect (G_OBJECT (seltrans->chandle), "moved", G_CALLBACK (sp_sel_trans_handle_new_event), (gpointer) &handle_center); g_signal_connect (G_OBJECT (seltrans->chandle), "grabbed", G_CALLBACK (sp_sel_trans_handle_grab), (gpointer) &handle_center); g_signal_connect (G_OBJECT (seltrans->chandle), "ungrabbed", G_CALLBACK (sp_sel_trans_handle_ungrab), (gpointer) &handle_center); } sp_knot_show (seltrans->chandle); p.x = seltrans->center.x; p.y = seltrans->center.y; sp_knot_set_position (seltrans->chandle, &p, 0); }
void sp_knot_holder_add_full (SPKnotHolder *knot_holder, SPKnotHolderSetFunc knot_set, SPKnotHolderGetFunc knot_get, SPKnotShapeType shape, SPKnotModeType mode) { SPKnotHolderEntity *e; SPItem *item; NRPointF sp, dp; NRMatrixF i2d; g_return_if_fail (knot_holder != NULL); g_return_if_fail (knot_set != NULL); g_return_if_fail (knot_get != NULL); item = SP_ITEM (knot_holder->item); #if 0 #define KH_EPSILON 1e-6 /* Precondition for knot_set and knot_get */ { NRPointF p1, p2; knot_get (item, &p1); knot_set (item, &p1, 0); knot_get (item, &p2); g_assert (fabs(p1.x - p2.x) < KH_EPSILON && fabs(p1.y - p2.y) < KH_EPSILON); } #endif /* create new SPKnotHolderEntry */ e = g_new (SPKnotHolderEntity, 1); e->knot = sp_knot_new (knot_holder->desktop); e->knot_set = knot_set; e->knot_get = knot_get; g_object_set (G_OBJECT (e->knot->item), "shape", shape, NULL); g_object_set (G_OBJECT (e->knot->item), "mode", mode, NULL); knot_holder->entity = g_slist_append (knot_holder->entity, e); /* move to current point */ e->knot_get (item, &sp); sp_item_i2d_affine(item, &i2d); dp.x = NR_MATRIX_DF_TRANSFORM_X (&i2d, sp.x, sp.y); dp.y = NR_MATRIX_DF_TRANSFORM_Y (&i2d, sp.x, sp.y); sp_knot_set_position (e->knot, &dp, SP_KNOT_STATE_NORMAL); e->handler_id = g_signal_connect (G_OBJECT (e->knot), "moved", G_CALLBACK (knot_moved_handler), knot_holder); g_signal_connect (G_OBJECT (e->knot), "ungrabbed", G_CALLBACK (knot_ungrabbed_handler), knot_holder); #ifdef KNOT_HOLDER_DEBUG g_signal_connect (ob, "destroy", sp_knot_holder_debug, "SPKnotHolder::knot"); #endif sp_knot_show (e->knot); }
void KnotHolderEntity::update_knot() { Geom::Affine const i2dt(item->i2dt_affine()); Geom::Point dp(knot_get() * i2dt); _moved_connection.block(); sp_knot_set_position(knot, dp, SP_KNOT_STATE_NORMAL); _moved_connection.unblock(); }
static void sp_show_handles (SPSelTrans * seltrans, SPKnot * knot[], const SPSelTransHandle handle[], gint num) { NRPointF p; gint i; for (i = 0; i < num; i++) { if (knot[i] == NULL) { knot[i] = sp_knot_new (seltrans->desktop); g_object_set (G_OBJECT (knot[i]), "anchor", handle[i].anchor, "shape", SP_CTRL_SHAPE_BITMAP, "size", 13, "mode", SP_KNOT_MODE_COLOR, "fill", 0x4040ffa0, "fill_mouseover", 0xff4040f0, "stroke", 0x000000a0, "stroke_mouseover", 0x000000FF, //"fill", 0xffff0080, //"fill_mouseover", 0x00ffff80, //"stroke", 0xFFFFFFff, //"stroke_mouseover", 0xb0b0b0FF, "pixbuf", handles[handle[i].control], #if 0 "cursor_mouseover", CursorSelectMouseover, "cursor_dragging", CursorSelectDragging, #endif NULL); g_signal_connect (G_OBJECT (knot[i]), "request", G_CALLBACK (sp_sel_trans_handle_request), (gpointer) &handle[i]); g_signal_connect (G_OBJECT (knot[i]), "moved", G_CALLBACK (sp_sel_trans_handle_new_event), (gpointer) &handle[i]); g_signal_connect (G_OBJECT (knot[i]), "grabbed", G_CALLBACK (sp_sel_trans_handle_grab), (gpointer) &handle[i]); g_signal_connect (G_OBJECT (knot[i]), "ungrabbed", G_CALLBACK (sp_sel_trans_handle_ungrab), (gpointer) &handle[i]); g_signal_connect (G_OBJECT (knot[i]), "event", G_CALLBACK (sp_seltrans_handle_event), (gpointer) &handle[i]); } sp_knot_show (knot[i]); p.x = seltrans->box.x0 + handle[i].x * fabs (seltrans->box.x1 - seltrans->box.x0); p.y = seltrans->box.y0 + handle[i].y * fabs (seltrans->box.y1 - seltrans->box.y0); //gtk_signal_handler_block_by_func (GTK_OBJECT (knot[i]), // GTK_SIGNAL_FUNC (sp_sel_trans_handle_new_event), &handle[i]); sp_knot_set_position (knot[i], &p, 0); //gtk_signal_handler_unblock_by_func (GTK_OBJECT (knot[i]), // GTK_SIGNAL_FUNC (sp_sel_trans_handle_new_event), &handle[i]); } }
static void knot_moved_handler (SPKnot *knot, NRPointF *p, guint state, gpointer data) { SPKnotHolder *knot_holder; SPItem *item; SPObject *object; NRMatrixF i2d; GSList *el; knot_holder = (SPKnotHolder *) data; item = SP_ITEM (knot_holder->item); object = SP_OBJECT (item); for (el = knot_holder->entity; el; el = el->next) { SPKnotHolderEntity *e = (SPKnotHolderEntity *)el->data; if (e->knot == knot) { NRMatrixF d2i; NRPointF q; sp_item_i2d_affine(item, &i2d); nr_matrix_f_invert (&d2i, &i2d); q.x = NR_MATRIX_DF_TRANSFORM_X (&d2i, p->x, p->y); q.y = NR_MATRIX_DF_TRANSFORM_Y (&d2i, p->x, p->y); e->knot_set (item, &q, state); break; } } sp_shape_set_shape (SP_SHAPE (item)); sp_item_i2d_affine(item, &i2d); for (el = knot_holder->entity; el; el = el->next) { SPKnotHolderEntity *e = (SPKnotHolderEntity *)el->data; NRPointF sp, dp; GObject *kob; kob = G_OBJECT (e->knot); e->knot_get (item, &sp); dp.x = NR_MATRIX_DF_TRANSFORM_X (&i2d, sp.x, sp.y); dp.y = NR_MATRIX_DF_TRANSFORM_Y (&i2d, sp.x, sp.y); g_signal_handler_block (kob, e->handler_id); sp_knot_set_position (e->knot, &dp, SP_KNOT_STATE_NORMAL); g_signal_handler_unblock (kob, e->handler_id); } }
/** * Request or set new position for knot. */ 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); /* If user did not complete, we simply move knot to new position */ if (!done) { sp_knot_set_position (knot, p, state); } }
static gboolean sp_sel_trans_handle_request (SPKnot * knot, NRPointF *position, guint state, gboolean * data) { SPDesktop * desktop; SPSelTrans * seltrans; SPSelTransHandle * handle; NRPointF point; if (!SP_KNOT_IS_GRABBED (knot)) return TRUE; desktop = knot->desktop; seltrans = &SP_SELECT_CONTEXT (desktop->event_context)->seltrans; handle = (SPSelTransHandle *) data; sp_desktop_set_coordinate_status (desktop, position->x, position->y, 0); sp_view_set_position (SP_VIEW (desktop), position->x, position->y); if (state & GDK_MOD1_MASK) { sp_sel_trans_point_desktop (seltrans, &point); position->x = point.x + (position->x - point.x) / 10; position->y = point.y + (position->y - point.y) / 10; } if (!(state & GDK_SHIFT_MASK) == !(seltrans->state == SP_SELTRANS_STATE_ROTATE)) { seltrans->origin = seltrans->opposit; } else { seltrans->origin = seltrans->center; } if (handle->request (seltrans, handle, position, state)) { sp_knot_set_position (knot, position, state); sp_ctrl_moveto (SP_CTRL (seltrans->grip), position->x, position->y); sp_ctrl_moveto (SP_CTRL (seltrans->norm), seltrans->origin.x, seltrans->origin.y); } return TRUE; }