~ubuntu-branches/ubuntu/oneiric/inkscape/oneiric-updates

« back to all changes in this revision

Viewing changes to src/box3d-context.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Alex Valavanis
  • Date: 2010-09-12 19:44:58 UTC
  • mfrom: (1.1.12 upstream) (45.1.3 maverick)
  • Revision ID: james.westby@ubuntu.com-20100912194458-4sjwmbl7dlsrk5dc
Tags: 0.48.0-1ubuntu1
* Merge with Debian unstable (LP: #628048, LP: #401567, LP: #456248, 
  LP: #463602, LP: #591986)
* debian/control: 
  - Ubuntu maintainers
  - Promote python-lxml, python-numpy, python-uniconvertor to Recommends.
  - Demote pstoedit to Suggests (universe package).
  - Suggests ttf-dejavu instead of ttf-bitstream-vera (LP: #513319)
* debian/rules:
  - Run intltool-update on build (Ubuntu-specific).
  - Add translation domain to .desktop files (Ubuntu-specific).
* debian/dirs:
  - Add usr/share/pixmaps.  Allow inkscape.xpm installation
* drop 50-poppler-API.dpatch (now upstream)
* drop 51-paste-in-unwritable-directory.dpatch (now upstream) 

Show diffs side-by-side

added added

removed removed

Lines of Context:
123
123
 
124
124
static void sp_box3d_context_finish(SPEventContext *ec)
125
125
{
126
 
        Box3DContext *bc = SP_BOX3D_CONTEXT(ec);
127
 
        SPDesktop *desktop = ec->desktop;
 
126
    Box3DContext *bc = SP_BOX3D_CONTEXT(ec);
 
127
    SPDesktop *desktop = ec->desktop;
128
128
 
129
 
        sp_canvas_item_ungrab(SP_CANVAS_ITEM(desktop->acetate), GDK_CURRENT_TIME);
130
 
        sp_box3d_finish(bc);
 
129
    sp_canvas_item_ungrab(SP_CANVAS_ITEM(desktop->acetate), GDK_CURRENT_TIME);
 
130
    sp_box3d_finish(bc);
131
131
    bc->sel_changed_connection.disconnect();
 
132
//    sp_repr_remove_listener_by_data(cc->active_shape_repr, cc);
132
133
 
133
134
    if (((SPEventContextClass *) parent_class)->finish) {
134
 
                ((SPEventContextClass *) parent_class)->finish(ec);
135
 
        }
 
135
        ((SPEventContextClass *) parent_class)->finish(ec);
 
136
    }
136
137
}
137
138
 
138
139
 
179
180
 
180
181
    if (selection->perspList().size() == 1) {
181
182
        // selecting a single box changes the current perspective
182
 
        ec->desktop->doc()->current_persp3d = selection->perspList().front();
 
183
        ec->desktop->doc()->setCurrentPersp3D(selection->perspList().front());
183
184
    }
184
185
}
185
186
 
186
 
/* create a default perspective in document defs if none is present
187
 
   (can happen after 'vacuum defs' or when a pre-0.46 file is opened) */
188
 
static void sp_box3d_context_check_for_persp_in_defs(SPDocument *document) {
 
187
/* Create a default perspective in document defs if none is present (which can happen, among other
 
188
 * circumstances, after 'vacuum defs' or when a pre-0.46 file is opened).
 
189
 */
 
190
static void sp_box3d_context_ensure_persp_in_defs(SPDocument *document) {
189
191
    SPDefs *defs = (SPDefs *) SP_DOCUMENT_DEFS(document);
190
192
 
191
193
    bool has_persp = false;
197
199
    }
198
200
 
199
201
    if (!has_persp) {
200
 
        document->current_persp3d = persp3d_create_xml_element (document);
 
202
        document->setCurrentPersp3D(persp3d_create_xml_element (document));
201
203
    }
202
204
}
203
205
 
209
211
        ((SPEventContextClass *) parent_class)->setup(ec);
210
212
    }
211
213
 
212
 
    sp_box3d_context_check_for_persp_in_defs(sp_desktop_document (ec->desktop));
213
 
 
214
214
    ec->shape_editor = new ShapeEditor(ec->desktop);
215
215
 
216
216
    SPItem *item = sp_desktop_selection(ec->desktop)->singleItem();
267
267
    static bool dragging;
268
268
 
269
269
    SPDesktop *desktop = event_context->desktop;
 
270
    SPDocument *document = sp_desktop_document (desktop);
270
271
    Inkscape::Selection *selection = sp_desktop_selection (desktop);
271
272
    Inkscape::Preferences *prefs = Inkscape::Preferences::get();
272
273
    int const snaps = prefs->getInt("/options/rotationsnapsperpi/value", 12);
273
274
 
274
275
    Box3DContext *bc = SP_BOX3D_CONTEXT(event_context);
275
 
    g_assert (SP_ACTIVE_DOCUMENT->current_persp3d);
276
 
    Persp3D *cur_persp = SP_ACTIVE_DOCUMENT->current_persp3d;
 
276
    Persp3D *cur_persp = document->getCurrentPersp3D();
277
277
 
278
278
    event_context->tolerance = prefs->getIntLimited("/options/dragtolerance/value", 0, 0, 100);
279
279
 
300
300
            bc->drag_ptB = from_2geom(button_dt);
301
301
            bc->drag_ptC = from_2geom(button_dt);
302
302
 
 
303
            // This can happen after saving when the last remaining perspective was purged and must be recreated.
 
304
            if (!cur_persp) {
 
305
                sp_box3d_context_ensure_persp_in_defs(document);
 
306
                cur_persp = document->getCurrentPersp3D();
 
307
            }
 
308
 
303
309
            /* Projective preimages of clicked point under current perspective */
304
 
            bc->drag_origin_proj = cur_persp->tmat.preimage (from_2geom(button_dt), 0, Proj::Z);
 
310
            bc->drag_origin_proj = cur_persp->perspective_impl->tmat.preimage (from_2geom(button_dt), 0, Proj::Z);
305
311
            bc->drag_ptB_proj = bc->drag_origin_proj;
306
312
            bc->drag_ptC_proj = bc->drag_origin_proj;
307
313
            bc->drag_ptC_proj.normalize();
310
316
            /* Snap center */
311
317
            SnapManager &m = desktop->namedview->snap_manager;
312
318
            m.setup(desktop, true, bc->item);
313
 
            m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, button_dt, Inkscape::SNAPSOURCE_HANDLE);
 
319
            m.freeSnapReturnByRef(button_dt, Inkscape::SNAPSOURCE_NODE_HANDLE);
314
320
            bc->center = from_2geom(button_dt);
315
321
 
316
322
            sp_canvas_item_grab(SP_CANVAS_ITEM(desktop->acetate),
342
348
 
343
349
            SnapManager &m = desktop->namedview->snap_manager;
344
350
            m.setup(desktop, true, bc->item);
345
 
            m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, motion_dt, Inkscape::SNAPSOURCE_HANDLE);
 
351
            m.freeSnapReturnByRef(motion_dt, Inkscape::SNAPSOURCE_NODE_HANDLE);
346
352
 
347
353
            bc->ctrl_dragged  = event->motion.state & GDK_CONTROL_MASK;
348
354
 
352
358
            }
353
359
 
354
360
            if (!bc->extruded) {
355
 
                bc->drag_ptB = from_2geom(motion_dt);
356
 
                bc->drag_ptC = from_2geom(motion_dt);
 
361
                bc->drag_ptB = from_2geom(motion_dt);
 
362
                bc->drag_ptC = from_2geom(motion_dt);
357
363
 
358
 
                bc->drag_ptB_proj = cur_persp->tmat.preimage (from_2geom(motion_dt), 0, Proj::Z);
 
364
                bc->drag_ptB_proj = cur_persp->perspective_impl->tmat.preimage (from_2geom(motion_dt), 0, Proj::Z);
359
365
                bc->drag_ptC_proj = bc->drag_ptB_proj;
360
366
                bc->drag_ptC_proj.normalize();
361
367
                bc->drag_ptC_proj[Proj::Z] = 0.25;
364
370
                // perspective line from drag_ptB to vanishing point Y.
365
371
                if (!bc->ctrl_dragged) {
366
372
                    /* snapping */
367
 
                    Box3D::PerspectiveLine pline (bc->drag_ptB, Proj::Z, SP_ACTIVE_DOCUMENT->current_persp3d);
 
373
                    Box3D::PerspectiveLine pline (bc->drag_ptB, Proj::Z, document->getCurrentPersp3D());
368
374
                    bc->drag_ptC = pline.closest_to (from_2geom(motion_dt));
369
375
 
370
376
                    bc->drag_ptB_proj.normalize();
371
 
                    bc->drag_ptC_proj = cur_persp->tmat.preimage (bc->drag_ptC, bc->drag_ptB_proj[Proj::X], Proj::X);
 
377
                    bc->drag_ptC_proj = cur_persp->perspective_impl->tmat.preimage (bc->drag_ptC, bc->drag_ptB_proj[Proj::X], Proj::X);
372
378
                } else {
373
379
                    bc->drag_ptC = from_2geom(motion_dt);
374
380
 
375
381
                    bc->drag_ptB_proj.normalize();
376
 
                    bc->drag_ptC_proj = cur_persp->tmat.preimage (from_2geom(motion_dt), bc->drag_ptB_proj[Proj::X], Proj::X);
 
382
                    bc->drag_ptC_proj = cur_persp->perspective_impl->tmat.preimage (from_2geom(motion_dt), bc->drag_ptB_proj[Proj::X], Proj::X);
377
383
                }
378
 
                Geom::Point pt2g = to_2geom(bc->drag_ptC);
379
 
                m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, pt2g, Inkscape::SNAPSOURCE_HANDLE);
380
 
                bc->drag_ptC = from_2geom(pt2g);
 
384
                m.freeSnapReturnByRef(bc->drag_ptC, Inkscape::SNAPSOURCE_NODE_HANDLE);
381
385
            }
382
386
 
383
387
            sp_box3d_drag(*bc, event->motion.state);
384
388
 
385
389
            ret = TRUE;
 
390
        } else if (!sp_event_context_knot_mouseover(bc)) {
 
391
            SnapManager &m = desktop->namedview->snap_manager;
 
392
            m.setup(desktop);
 
393
 
 
394
            Geom::Point const motion_w(event->motion.x, event->motion.y);
 
395
            Geom::Point motion_dt(desktop->w2d(motion_w));
 
396
            m.preSnap(Inkscape::SnapCandidatePoint(motion_dt, Inkscape::SNAPSOURCE_NODE_HANDLE));
386
397
        }
387
398
        break;
388
399
    case GDK_BUTTON_RELEASE:
424
435
            break;
425
436
 
426
437
        case GDK_bracketright:
427
 
            persp3d_rotate_VP (inkscape_active_document()->current_persp3d, Proj::X, -180/snaps, MOD__ALT);
428
 
            sp_document_done(sp_desktop_document(desktop), SP_VERB_CONTEXT_3DBOX,
 
438
            persp3d_rotate_VP (document->getCurrentPersp3D(), Proj::X, -180/snaps, MOD__ALT);
 
439
            sp_document_done(document, SP_VERB_CONTEXT_3DBOX,
429
440
                             _("Change perspective (angle of PLs)"));
430
441
            ret = true;
431
442
            break;
432
443
 
433
444
        case GDK_bracketleft:
434
 
            persp3d_rotate_VP (inkscape_active_document()->current_persp3d, Proj::X, 180/snaps, MOD__ALT);
435
 
            sp_document_done(sp_desktop_document(desktop), SP_VERB_CONTEXT_3DBOX,
 
445
            persp3d_rotate_VP (document->getCurrentPersp3D(), Proj::X, 180/snaps, MOD__ALT);
 
446
            sp_document_done(document, SP_VERB_CONTEXT_3DBOX,
436
447
                             _("Change perspective (angle of PLs)"));
437
448
            ret = true;
438
449
            break;
439
450
 
440
451
        case GDK_parenright:
441
 
            persp3d_rotate_VP (inkscape_active_document()->current_persp3d, Proj::Y, -180/snaps, MOD__ALT);
442
 
            sp_document_done(sp_desktop_document(desktop), SP_VERB_CONTEXT_3DBOX,
 
452
            persp3d_rotate_VP (document->getCurrentPersp3D(), Proj::Y, -180/snaps, MOD__ALT);
 
453
            sp_document_done(document, SP_VERB_CONTEXT_3DBOX,
443
454
                             _("Change perspective (angle of PLs)"));
444
455
            ret = true;
445
456
            break;
446
457
 
447
458
        case GDK_parenleft:
448
 
            persp3d_rotate_VP (inkscape_active_document()->current_persp3d, Proj::Y, 180/snaps, MOD__ALT);
449
 
            sp_document_done(sp_desktop_document(desktop), SP_VERB_CONTEXT_3DBOX,
 
459
            persp3d_rotate_VP (document->getCurrentPersp3D(), Proj::Y, 180/snaps, MOD__ALT);
 
460
            sp_document_done(document, SP_VERB_CONTEXT_3DBOX,
450
461
                             _("Change perspective (angle of PLs)"));
451
462
            ret = true;
452
463
            break;
453
464
 
454
465
        case GDK_braceright:
455
 
            persp3d_rotate_VP (inkscape_active_document()->current_persp3d, Proj::Z, -180/snaps, MOD__ALT);
456
 
            sp_document_done(sp_desktop_document(desktop), SP_VERB_CONTEXT_3DBOX,
 
466
            persp3d_rotate_VP (document->getCurrentPersp3D(), Proj::Z, -180/snaps, MOD__ALT);
 
467
            sp_document_done(document, SP_VERB_CONTEXT_3DBOX,
457
468
                             _("Change perspective (angle of PLs)"));
458
469
            ret = true;
459
470
            break;
460
471
 
461
472
        case GDK_braceleft:
462
 
            persp3d_rotate_VP (inkscape_active_document()->current_persp3d, Proj::Z, 180/snaps, MOD__ALT);
463
 
            sp_document_done(sp_desktop_document(desktop), SP_VERB_CONTEXT_3DBOX,
 
473
            persp3d_rotate_VP (document->getCurrentPersp3D(), Proj::Z, 180/snaps, MOD__ALT);
 
474
            sp_document_done(document, SP_VERB_CONTEXT_3DBOX,
464
475
                             _("Change perspective (angle of PLs)"));
465
476
            ret = true;
466
477
            break;
468
479
        /* TODO: what is this???
469
480
        case GDK_O:
470
481
            if (MOD__CTRL && MOD__SHIFT) {
471
 
                Box3D::create_canvas_point(persp3d_get_VP(inkscape_active_document()->current_persp3d, Proj::W).affine(),
 
482
                Box3D::create_canvas_point(persp3d_get_VP(document()->getCurrentPersp3D(), Proj::W).affine(),
472
483
                                           6, 0xff00ff00);
473
484
            }
474
485
            ret = true;
483
494
            }
484
495
            break;
485
496
 
 
497
        case GDK_p:
 
498
        case GDK_P:
 
499
            if (MOD__SHIFT_ONLY) {
 
500
                if (document->getCurrentPersp3D()) {
 
501
                    persp3d_print_debugging_info (document->getCurrentPersp3D());
 
502
                }
 
503
                ret = true;
 
504
            }
 
505
            break;
 
506
 
486
507
        case GDK_x:
487
508
        case GDK_X:
488
509
            if (MOD__ALT_ONLY) {
598
619
 
599
620
        // TODO: It would be nice to show the VPs during dragging, but since there is no selection
600
621
        //       at this point (only after finishing the box), we must do this "manually"
601
 
        /**** bc._vpdrag->updateDraggers(); ****/
 
622
        /* bc._vpdrag->updateDraggers(); */
602
623
 
603
624
        sp_canvas_force_full_redraw_after_interruptions(desktop->canvas, 5);
604
625
    }
631
652
    if ( bc->item != NULL ) {
632
653
        SPDesktop * desktop = SP_EVENT_CONTEXT_DESKTOP(bc);
633
654
        SPDocument *doc = sp_desktop_document(desktop);
634
 
        if (!doc || !doc->current_persp3d)
 
655
        if (!doc || !doc->getCurrentPersp3D())
635
656
            return;
636
657
 
637
658
        SPBox3D *box = SP_BOX3D(bc->item);