diff --git a/src/box3d-context.cpp b/src/box3d-context.cpp
index a6a4319056549efbd6c5e0fe16626dd54415f31b..ada272acd2f88157d70d0758a84b55f5e36f74cc 100644 (file)
--- a/src/box3d-context.cpp
+++ b/src/box3d-context.cpp
@@ -311,7 +311,7 @@ static gint sp_3dbox_context_root_handler(SPEventContext *event_context, GdkEven
event_context->within_tolerance = true;
// remember clicked item, disregarding groups, honoring Alt
- event_context->item_to_select = sp_event_context_find_item (desktop, button_w, event->button.state & GDK_MOD1_MASK, TRUE);
+ 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;
@@ -359,20 +359,14 @@ static gint sp_3dbox_context_root_handler(SPEventContext *event_context, GdkEven
rc->ctrl_dragged = event->motion.state & GDK_CONTROL_MASK;
if (event->motion.state & GDK_SHIFT_MASK && !rc->extruded) {
- /* once shift is pressed, set rc->extruded and create the remaining faces */
+ /* once shift is pressed, set rc->extruded (no need to create further faces;
+ all of them are already created in sp_3dbox_init) */
rc->extruded = true;
-
- /* The separate faces */
- SP3DBox *box3d = SP_3DBOX(rc->item);
- for (int i = 0; i < 6; ++i) {
- if (i == 4 || box3d->faces[i]) continue;
- box3d->faces[i] = new Box3DFace (box3d);
- box3d->faces[i]->hook_path_to_3dbox();
- }
}
if (!rc->extruded) {
rc->drag_ptB = motion_dt;
+ rc->drag_ptC = motion_dt;
} else {
// Without Ctrl, motion of the extruded corner is constrained to the
// perspective line from drag_ptB to vanishing point Y.
@@ -398,7 +392,6 @@ static gint sp_3dbox_context_root_handler(SPEventContext *event_context, GdkEven
ret = TRUE;
}
- ret = TRUE;
break;
case GDK_BUTTON_RELEASE:
event_context->xp = event_context->yp = 0;
@@ -406,7 +399,7 @@ static gint sp_3dbox_context_root_handler(SPEventContext *event_context, GdkEven
dragging = false;
if (!event_context->within_tolerance) {
- // we've been dragging, finish the rect
+ // we've been dragging, finish the box
sp_3dbox_finish(rc);
} else if (event_context->item_to_select) {
// no dragging, select clicked item if any
@@ -436,12 +429,14 @@ static gint sp_3dbox_context_root_handler(SPEventContext *event_context, GdkEven
case GDK_Shift_R:
case GDK_Meta_L: // Meta is when you press Shift+Alt (at least on my machine)
case GDK_Meta_R:
+ /***
if (!dragging){
sp_event_show_modifier_tip (event_context->defaultMessageContext(), event,
_("<b>Ctrl</b>: make square or integer-ratio rect, lock a rounded corner circular"),
_("<b>Shift</b>: draw around the starting point"),
NULL);
}
+ ***/
break;
case GDK_Up:
case GDK_Down:
@@ -455,7 +450,7 @@ static gint sp_3dbox_context_root_handler(SPEventContext *event_context, GdkEven
case GDK_x:
case GDK_X:
if (MOD__ALT_ONLY) {
- desktop->setToolboxFocusTo ("altx-rect");
+ // desktop->setToolboxFocusTo ("altx-rect");
ret = TRUE;
}
break;
@@ -471,7 +466,7 @@ static gint sp_3dbox_context_root_handler(SPEventContext *event_context, GdkEven
event->button.time);
dragging = false;
if (!event_context->within_tolerance) {
- // we've been dragging, finish the rect
+ // we've been dragging, finish the box
sp_3dbox_finish(rc);
}
// do not return true, so that space would work switching to selector
@@ -511,70 +506,60 @@ static gint sp_3dbox_context_root_handler(SPEventContext *event_context, GdkEven
return ret;
}
-static void sp_3dbox_drag(SP3DBoxContext &rc, guint state)
+static void sp_3dbox_drag(SP3DBoxContext &bc, guint state)
{
- SPDesktop *desktop = SP_EVENT_CONTEXT(&rc)->desktop;
+ SPDesktop *desktop = SP_EVENT_CONTEXT(&bc)->desktop;
- if (!rc.item) {
+ if (!bc.item) {
- if (Inkscape::have_viable_layer(desktop, rc._message_context) == false) {
+ if (Inkscape::have_viable_layer(desktop, bc._message_context) == false) {
return;
}
/* Create object */
- Inkscape::XML::Document *xml_doc = sp_document_repr_doc(SP_EVENT_CONTEXT_DOCUMENT(&rc));
+ Inkscape::XML::Document *xml_doc = sp_document_repr_doc(SP_EVENT_CONTEXT_DOCUMENT(&bc));
Inkscape::XML::Node *repr = xml_doc->createElement("svg:g");
repr->setAttribute("sodipodi:type", "inkscape:3dbox");
/* Set style */
- //sp_desktop_apply_style_tool (desktop, repr, "tools.shapes.3dbox", false);
+ sp_desktop_apply_style_tool (desktop, repr, "tools.shapes.3dbox", false);
- rc.item = (SPItem *) desktop->currentLayer()->appendChildRepr(repr);
+ bc.item = (SPItem *) desktop->currentLayer()->appendChildRepr(repr);
Inkscape::GC::release(repr);
- rc.item->transform = SP_ITEM(desktop->currentRoot())->getRelativeTransform(desktop->currentLayer());
+ bc.item->transform = SP_ITEM(desktop->currentRoot())->getRelativeTransform(desktop->currentLayer());
- /* Hook path to the only currenctly existing face */
- SP_3DBOX(rc.item)->faces[4]->hook_path_to_3dbox();
+ /* Hook paths to the faces of the box */
+ for (int i = 0; i < 6; ++i) {
+ SP_3DBOX(bc.item)->faces[i]->hook_path_to_3dbox();
+ }
- rc.item->updateRepr();
+ bc.item->updateRepr();
sp_canvas_force_full_redraw_after_interruptions(desktop->canvas, 5);
}
// FIXME: remove these extra points
- NR::Point pt = rc.drag_ptB;
- NR::Point shift_pt = rc.drag_ptC;
+ NR::Point pt = bc.drag_ptB;
+ NR::Point shift_pt = bc.drag_ptC;
NR::Rect r;
if (!(state & GDK_SHIFT_MASK)) {
- r = Inkscape::snap_rectangular_box(desktop, rc.item, pt, rc.center, state);
+ r = Inkscape::snap_rectangular_box(desktop, bc.item, pt, bc.center, state);
} else {
- r = Inkscape::snap_rectangular_box(desktop, rc.item, shift_pt, rc.center, state);
- }
-
- /*** artefacts of rect ***
- if ( rc.rx != 0.0 ) {
- sp_3dbox_set_rx (SP_3DBOX(rc.item), TRUE, rc.rx);
- }
- if ( rc.ry != 0.0 ) {
- if (rc.rx == 0.0)
- sp_3dbox_set_ry (SP_3DBOX(rc.item), TRUE, CLAMP(rc.ry, 0, MIN(r.dimensions()[NR::X], r.dimensions()[NR::Y])/2));
- else
- sp_3dbox_set_ry (SP_3DBOX(rc.item), TRUE, CLAMP(rc.ry, 0, r.dimensions()[NR::Y]));
+ r = Inkscape::snap_rectangular_box(desktop, bc.item, shift_pt, bc.center, state);
}
- ***/
- SPEventContext *ec = SP_EVENT_CONTEXT(&rc);
+ SPEventContext *ec = SP_EVENT_CONTEXT(&bc);
NR::Point origin_w(ec->xp, ec->yp);
NR::Point origin(desktop->w2d(origin_w));
- sp_3dbox_position_set(rc);
+ sp_3dbox_position_set(bc);
// status text
- GString *xs = SP_PX_TO_METRIC_STRING(r.dimensions()[NR::X], desktop->namedview->getDefaultMetric());
- GString *ys = SP_PX_TO_METRIC_STRING(r.dimensions()[NR::Y], desktop->namedview->getDefaultMetric());
- rc._message_context->setF(Inkscape::NORMAL_MESSAGE, _("<b>Rectangle</b>: %s × %s; with <b>Ctrl</b> to make square or integer-ratio rectangle; with <b>Shift</b> to draw around the starting point"), xs->str, ys->str);
- g_string_free(xs, FALSE);
- g_string_free(ys, FALSE);
+ //GString *Ax = SP_PX_TO_METRIC_STRING(origin[NR::X], desktop->namedview->getDefaultMetric());
+ //GString *Ay = SP_PX_TO_METRIC_STRING(origin[NR::Y], desktop->namedview->getDefaultMetric());
+ bc._message_context->setF(Inkscape::NORMAL_MESSAGE, _("<b>3D Box</b>; with <b>Shift</b> to extrude along the Z axis"));
+ //g_string_free(Ax, FALSE);
+ //g_string_free(Ay, FALSE);
}
static void sp_3dbox_finish(SP3DBoxContext *rc)
sp_desktop_selection(desktop)->set(rc->item);
sp_document_done(sp_desktop_document(desktop), SP_VERB_CONTEXT_3DBOX,
- _("Create 3d box"));
+ _("Create 3D box"));
rc->item = NULL;
}