diff --git a/src/box3d-context.cpp b/src/box3d-context.cpp
index 88763e1835c5a7360395fcfb947575d0ac8ba6a0..f23e4d8836b182eac748e9fdfe972d7b23e5b1b3 100644 (file)
--- a/src/box3d-context.cpp
+++ b/src/box3d-context.cpp
-#define __SP_BOX3D_CONTEXT_C__
-
/*
* 3D box drawing context
*
* Author:
* Lauris Kaplinski <lauris@kaplinski.com>
* bulia byak <buliabyak@users.sf.net>
+ * Jon A. Cruz <jon@joncruz.org>
+ * Abhishek Sharma
*
* Copyright (C) 2007 Maximilian Albert <Anhalter42@gmx.de>
* Copyright (C) 2006 Johan Engelen <johan@shouraizou.nl>
#include "line-geometry.h"
#include "shape-editor.h"
+using Inkscape::DocumentUndo;
+
static void sp_box3d_context_class_init(Box3DContextClass *klass);
static void sp_box3d_context_init(Box3DContext *box3d_context);
static void sp_box3d_context_dispose(GObject *object);
@@ -188,10 +190,10 @@ static void sp_box3d_context_selection_changed(Inkscape::Selection *selection, g
* circumstances, after 'vacuum defs' or when a pre-0.46 file is opened).
*/
static void sp_box3d_context_ensure_persp_in_defs(SPDocument *document) {
- SPDefs *defs = (SPDefs *) SP_DOCUMENT_DEFS(document);
+ SPDefs *defs = reinterpret_cast<SPDefs *>(SP_DOCUMENT_DEFS(document));
bool has_persp = false;
- for (SPObject *child = sp_object_first_child(defs); child != NULL; child = SP_OBJECT_NEXT(child) ) {
+ for ( SPObject *child = defs->firstChild(); child; child = child->getNext() ) {
if (SP_IS_PERSP3D(child)) {
has_persp = true;
break;
@@ -283,6 +285,7 @@ static gint sp_box3d_context_root_handler(SPEventContext *event_context, GdkEven
if ( event->button.button == 1 && !event_context->space_panning) {
Geom::Point const button_w(event->button.x,
event->button.y);
+ Geom::Point button_dt(desktop->w2d(button_w));
// save drag origin
event_context->xp = (gint) button_w[Geom::X];
@@ -294,8 +297,12 @@ static gint sp_box3d_context_root_handler(SPEventContext *event_context, GdkEven
dragging = true;
- /* */
- Geom::Point button_dt(desktop->w2d(button_w));
+ SnapManager &m = desktop->namedview->snap_manager;
+ m.setup(desktop, true, bc->item);
+ m.freeSnapReturnByRef(button_dt, Inkscape::SNAPSOURCE_NODE_HANDLE);
+ m.unSetup();
+ bc->center = from_2geom(button_dt);
+
bc->drag_origin = from_2geom(button_dt);
bc->drag_ptB = from_2geom(button_dt);
bc->drag_ptC = from_2geom(button_dt);
@@ -313,12 +320,6 @@ static gint sp_box3d_context_root_handler(SPEventContext *event_context, GdkEven
bc->drag_ptC_proj.normalize();
bc->drag_ptC_proj[Proj::Z] = 0.25;
- /* Snap center */
- SnapManager &m = desktop->namedview->snap_manager;
- m.setup(desktop, true, bc->item);
- m.freeSnapReturnByRef(button_dt, Inkscape::SNAPSOURCE_NODE_HANDLE);
- bc->center = from_2geom(button_dt);
-
sp_canvas_item_grab(SP_CANVAS_ITEM(desktop->acetate),
( GDK_KEY_PRESS_MASK |
GDK_BUTTON_RELEASE_MASK |
@@ -349,7 +350,6 @@ static gint sp_box3d_context_root_handler(SPEventContext *event_context, GdkEven
SnapManager &m = desktop->namedview->snap_manager;
m.setup(desktop, true, bc->item);
m.freeSnapReturnByRef(motion_dt, Inkscape::SNAPSOURCE_NODE_HANDLE);
-
bc->ctrl_dragged = event->motion.state & GDK_CONTROL_MASK;
if (event->motion.state & GDK_SHIFT_MASK && !bc->extruded && bc->item) {
@@ -383,6 +383,7 @@ static gint sp_box3d_context_root_handler(SPEventContext *event_context, GdkEven
}
m.freeSnapReturnByRef(bc->drag_ptC, Inkscape::SNAPSOURCE_NODE_HANDLE);
}
+ m.unSetup();
sp_box3d_drag(*bc, event->motion.state);
@@ -394,6 +395,7 @@ static gint sp_box3d_context_root_handler(SPEventContext *event_context, GdkEven
Geom::Point const motion_w(event->motion.x, event->motion.y);
Geom::Point motion_dt(desktop->w2d(motion_w));
m.preSnap(Inkscape::SnapCandidatePoint(motion_dt, Inkscape::SNAPSOURCE_NODE_HANDLE));
+ m.unSetup();
}
break;
case GDK_BUTTON_RELEASE:
@@ -436,42 +438,42 @@ static gint sp_box3d_context_root_handler(SPEventContext *event_context, GdkEven
case GDK_bracketright:
persp3d_rotate_VP (document->getCurrentPersp3D(), Proj::X, -180/snaps, MOD__ALT);
- SPDocumentUndo::done(document, SP_VERB_CONTEXT_3DBOX,
+ DocumentUndo::done(document, SP_VERB_CONTEXT_3DBOX,
_("Change perspective (angle of PLs)"));
ret = true;
break;
case GDK_bracketleft:
persp3d_rotate_VP (document->getCurrentPersp3D(), Proj::X, 180/snaps, MOD__ALT);
- SPDocumentUndo::done(document, SP_VERB_CONTEXT_3DBOX,
+ DocumentUndo::done(document, SP_VERB_CONTEXT_3DBOX,
_("Change perspective (angle of PLs)"));
ret = true;
break;
case GDK_parenright:
persp3d_rotate_VP (document->getCurrentPersp3D(), Proj::Y, -180/snaps, MOD__ALT);
- SPDocumentUndo::done(document, SP_VERB_CONTEXT_3DBOX,
+ DocumentUndo::done(document, SP_VERB_CONTEXT_3DBOX,
_("Change perspective (angle of PLs)"));
ret = true;
break;
case GDK_parenleft:
persp3d_rotate_VP (document->getCurrentPersp3D(), Proj::Y, 180/snaps, MOD__ALT);
- SPDocumentUndo::done(document, SP_VERB_CONTEXT_3DBOX,
+ DocumentUndo::done(document, SP_VERB_CONTEXT_3DBOX,
_("Change perspective (angle of PLs)"));
ret = true;
break;
case GDK_braceright:
persp3d_rotate_VP (document->getCurrentPersp3D(), Proj::Z, -180/snaps, MOD__ALT);
- SPDocumentUndo::done(document, SP_VERB_CONTEXT_3DBOX,
+ DocumentUndo::done(document, SP_VERB_CONTEXT_3DBOX,
_("Change perspective (angle of PLs)"));
ret = true;
break;
case GDK_braceleft:
persp3d_rotate_VP (document->getCurrentPersp3D(), Proj::Z, 180/snaps, MOD__ALT);
- SPDocumentUndo::done(document, SP_VERB_CONTEXT_3DBOX,
+ DocumentUndo::done(document, SP_VERB_CONTEXT_3DBOX,
_("Change perspective (angle of PLs)"));
ret = true;
break;
@@ -573,7 +575,7 @@ static gint sp_box3d_context_root_handler(SPEventContext *event_context, GdkEven
static void sp_box3d_drag(Box3DContext &bc, guint /*state*/)
{
- SPDesktop *desktop = SP_EVENT_CONTEXT(&bc)->desktop;
+ SPDesktop *desktop = bc.desktop;
if (!bc.item) {
return;
}
- /* Create object */
- 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:box3d");
+ // Create object
+ SPBox3D *box3d = 0;
+ box3d = SPBox3D::createBox3D((SPItem *)desktop->currentLayer());
- /* Set style */
- sp_desktop_apply_style_tool (desktop, repr, "/tools/shapes/3dbox", false);
+ // Set style
+ desktop->applyCurrentOrToolStyle(box3d, "/tools/shapes/3dbox", false);
+
+ bc.item = box3d;
- bc.item = (SPItem *) desktop->currentLayer()->appendChildRepr(repr);
- Inkscape::GC::release(repr);
- Inkscape::XML::Node *repr_side;
// TODO: Incorporate this in box3d-side.cpp!
for (int i = 0; i < 6; ++i) {
- repr_side = xml_doc->createElement("svg:path");
- repr_side->setAttribute("sodipodi:type", "inkscape:box3dside");
- repr->addChild(repr_side, NULL);
-
- Box3DSide *side = SP_BOX3D_SIDE(inkscape_active_document()->getObjectByRepr (repr_side));
-
+ Box3DSide *side = Box3DSide::createBox3DSide(box3d);
+
guint desc = Box3D::int_to_face(i);
Box3D::Axis plane = (Box3D::Axis) (desc & 0x7);
side->dir2 = Box3D::extract_second_axis_direction(plane);
side->front_or_rear = (Box3D::FrontOrRear) (desc & 0x8);
- /* Set style */
- box3d_side_apply_style(side);
+ // Set style
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+
+ Glib::ustring descr = "/desktop/";
+ descr += box3d_side_axes_string(side);
+ descr += "/style";
+ Glib::ustring cur_style = prefs->getString(descr);
+
+ bool use_current = prefs->getBool("/tools/shapes/3dbox/usecurrent", false);
+ if (use_current && !cur_style.empty()) {
+ // use last used style
+ side->setAttribute("style", cur_style.data());
+
+ } else {
+ // use default style
+ GString *pstring = g_string_new("");
+ g_string_printf (pstring, "/tools/shapes/3dbox/%s", box3d_side_axes_string(side));
+ desktop->applyCurrentOrToolStyle (side, pstring->str, false);
+ }
- SP_OBJECT(side)->updateRepr(); // calls box3d_side_write() and updates, e.g., the axes string description
+ side->updateRepr(); // calls box3d_side_write() and updates, e.g., the axes string description
}
box3d_set_z_orders(SP_BOX3D(bc.item));
sp_canvas_end_forced_full_redraws(desktop->canvas);
sp_desktop_selection(desktop)->set(bc->item);
- SPDocumentUndo::done(sp_desktop_document(desktop), SP_VERB_CONTEXT_3DBOX,
+ DocumentUndo::done(sp_desktop_document(desktop), SP_VERB_CONTEXT_3DBOX,
_("Create 3D box"));
bc->item = NULL;
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :