box3d-context.cpp revision b28c4e3da388087b108e7a5749d75668afcd2d58
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * 3D box drawing context
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Lauris Kaplinski <lauris@kaplinski.com>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * bulia byak <buliabyak@users.sf.net>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Copyright (C) 2007 Maximilian Albert <Anhalter42@gmx.de>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Copyright (C) 2006 Johan Engelen <johan@shouraizou.nl>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Copyright (C) 2000-2005 authors
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Copyright (C) 2000-2001 Ximian, Inc.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Released under GNU GPL, read the file 'COPYING' for more information
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void sp_3dbox_context_class_init(SP3DBoxContextClass *klass);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void sp_3dbox_context_init(SP3DBoxContext *box3d_context);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void sp_3dbox_context_set(SPEventContext *ec, gchar const *key, gchar const *val);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic gint sp_3dbox_context_root_handler(SPEventContext *event_context, GdkEvent *event);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic gint sp_3dbox_context_item_handler(SPEventContext *event_context, SPItem *item, GdkEvent *event);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void sp_3dbox_drag(SP3DBoxContext &rc, guint state);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin type = g_type_register_static(SP_TYPE_EVENT_CONTEXT, "SP3DBoxContext", &info, (GTypeFlags) 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void sp_3dbox_context_class_init(SP3DBoxContextClass *klass)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SPEventContextClass *event_context_class = (SPEventContextClass *) klass;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin parent_class = (SPEventContextClass *) g_type_class_peek_parent(klass);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin event_context_class->root_handler = sp_3dbox_context_root_handler;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin event_context_class->item_handler = sp_3dbox_context_item_handler;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinBox3D::Perspective3D * SP3DBoxContext::current_perspective = NULL;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void sp_3dbox_context_init(SP3DBoxContext *box3d_context)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SPEventContext *event_context = SP_EVENT_CONTEXT(box3d_context);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* create an initial perspective */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SP3DBoxContext::current_perspective = new Box3D::Perspective3D (
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // VP in x-direction
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // VP in y-direction
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // VP in z-direction
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin new (&box3d_context->sel_changed_connection) sigc::connection();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* fixme: This is necessary because we do not grab */
if (item) {
if (shape_repr) {
if (item) {
if (shape_repr) {
static gint sp_3dbox_context_item_handler(SPEventContext *event_context, SPItem *item, GdkEvent *event)
case GDK_BUTTON_PRESS:
return ret;
static bool dragging;
event_context->tolerance = prefs_get_int_attribute_limited("options.dragtolerance", "value", 0, 0, 100);
case GDK_BUTTON_PRESS:
event_context->item_to_select = sp_event_context_find_item (desktop, button_w, event->button.state & GDK_MOD1_MASK, event->button.state & GDK_CONTROL_MASK);
dragging = true;
case GDK_MOTION_NOTIFY:
if ( dragging
motion_dt = m.freeSnap(Inkscape::Snapper::SNAPPOINT_BBOX | Inkscape::Snapper::SNAPPOINT_NODE, motion_dt, rc->item).getPoint();
rc->drag_ptC = m.freeSnap(Inkscape::Snapper::SNAPPOINT_BBOX | Inkscape::Snapper::SNAPPOINT_NODE, rc->drag_ptC, rc->item).getPoint();
case GDK_BUTTON_RELEASE:
dragging = false;
case GDK_KEY_PRESS:
case GDK_Alt_L:
case GDK_Alt_R:
case GDK_Control_L:
case GDK_Control_R:
case GDK_Shift_L:
case GDK_Shift_R:
case GDK_Meta_R:
case GDK_Up:
case GDK_Down:
case GDK_KP_Up:
case GDK_KP_Down:
if (!MOD__CTRL_ONLY)
case GDK_x:
case GDK_X:
if (MOD__ALT_ONLY) {
case GDK_Escape:
case GDK_space:
if (dragging) {
dragging = false;
case GDK_KEY_RELEASE:
case GDK_Alt_L:
case GDK_Alt_R:
case GDK_Control_L:
case GDK_Control_R:
case GDK_Shift_L:
case GDK_Shift_R:
case GDK_Meta_R:
if (!ret) {
return ret;
bc.item->transform = SP_ITEM(desktop->currentRoot())->getRelativeTransform(desktop->currentLayer());
bc._message_context->setF(Inkscape::NORMAL_MESSAGE, _("<b>3D Box</b>; with <b>Shift</b> to extrude along the Z axis"));