X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fdesktop.cpp;h=932d79ff2e7dadfe24d1c6e3cee85e5db55c0d79;hb=9e973c4fb2183b877bb600a7e9c75e93b3e7d6d1;hp=f9d17b01ad6bbc5e938c8c9c5df0e2b8007427ab;hpb=3d70339a90b4e30cd065dc91f7334fcba9cf7df6;p=inkscape.git diff --git a/src/desktop.cpp b/src/desktop.cpp index f9d17b01a..932d79ff2 100644 --- a/src/desktop.cpp +++ b/src/desktop.cpp @@ -84,6 +84,8 @@ #include "ui/dialog/dialog-manager.h" #include "xml/repr.h" #include "message-context.h" +#include "device-manager.h" +#include "layer-fns.h" #include "layer-manager.h" #include "event-log.h" #include "display/canvas-grid.h" @@ -146,6 +148,8 @@ SPDesktop::SPDesktop() : gr_fill_or_stroke( true ), _layer_hierarchy( 0 ), _reconstruction_old_layer_id( 0 ), + _display_mode(Inkscape::RENDERMODE_NORMAL), + _saved_display_mode(Inkscape::RENDERMODE_NORMAL), _widget( 0 ), _inkscape( 0 ), _guides_message_context( 0 ), @@ -164,6 +168,9 @@ SPDesktop::SPDesktop() : void SPDesktop::init (SPNamedView *nv, SPCanvas *aCanvas) { + // Temporary workaround for link order issues: + Inkscape::DeviceManager::getManager().getDevices(); + _guides_message_context = new Inkscape::MessageContext(const_cast(messageStack())); current = sp_repr_css_attr_inherited (inkscape_get_repr (INKSCAPE, "desktop"), "style"); @@ -388,13 +395,26 @@ SPDesktop::~SPDesktop() {} /* Public methods */ +/* These methods help for temporarily showing things on-canvas. + * The *only* valid use of the TemporaryItem* that you get from add_temporary_canvasitem + * is when you want to prematurely remove the item from the canvas, by calling + * desktop->remove_temporary_canvasitem(tempitem). + */ /** Note that lifetime is measured in milliseconds -* it is perfectly safe to ignore the returned pointer: the object is deleted by itself, so don't delete it elsewhere! -* The return value should only be used as argument for SPDesktop::remove_temporary_canvasitem, because the object might be deleted already. -*/ + * One should *not* keep a reference to the SPCanvasItem, the temporary item code will + * delete the object for you and the reference will become invalid without you knowing it. + * It is perfectly safe to ignore the returned pointer: the object is deleted by itself, so don't delete it elsewhere! + * The *only* valid use of the returned TemporaryItem* is as argument for SPDesktop::remove_temporary_canvasitem, + * because the object might be deleted already without you knowing it. + * move_to_bottom = true by default so the item does not interfere with handling of other items on the canvas like nodes. + */ Inkscape::Display::TemporaryItem * -SPDesktop::add_temporary_canvasitem (SPCanvasItem *item, guint lifetime) +SPDesktop::add_temporary_canvasitem (SPCanvasItem *item, guint lifetime, bool move_to_bottom) { + if (move_to_bottom) { + sp_canvas_item_move_to_z(item, 0); + } + return temporary_item_list->add_item(item, lifetime); } @@ -409,30 +429,23 @@ SPDesktop::remove_temporary_canvasitem (Inkscape::Display::TemporaryItem * tempi } } -void SPDesktop::setDisplayModeNormal() -{ - SP_CANVAS_ARENA (drawing)->arena->rendermode = RENDERMODE_NORMAL; - canvas->rendermode = RENDERMODE_NORMAL; // canvas needs that for choosing the best buffer size - displayMode = RENDERMODE_NORMAL; - sp_canvas_item_affine_absolute (SP_CANVAS_ITEM (main), _d2w); // redraw - _widget->setTitle(SP_DOCUMENT_NAME(sp_desktop_document(this))); -} - -void SPDesktop::setDisplayModeOutline() -{ - SP_CANVAS_ARENA (drawing)->arena->rendermode = RENDERMODE_OUTLINE; - canvas->rendermode = RENDERMODE_OUTLINE; // canvas needs that for choosing the best buffer size - displayMode = RENDERMODE_OUTLINE; +void SPDesktop::_setDisplayMode(Inkscape::RenderMode mode) { + SP_CANVAS_ARENA (drawing)->arena->rendermode = mode; + canvas->rendermode = mode; + _display_mode = mode; + if (mode != Inkscape::RENDERMODE_OUTLINE) { + _saved_display_mode = _display_mode; + } sp_canvas_item_affine_absolute (SP_CANVAS_ITEM (main), _d2w); // redraw _widget->setTitle(SP_DOCUMENT_NAME(sp_desktop_document(this))); } -void SPDesktop::displayModeToggle() -{ - if (displayMode == RENDERMODE_OUTLINE) - setDisplayModeNormal(); - else - setDisplayModeOutline(); +void SPDesktop::displayModeToggle() { + if (_display_mode == Inkscape::RENDERMODE_OUTLINE) { + _setDisplayMode(_saved_display_mode); + } else { + _setDisplayMode(Inkscape::RENDERMODE_OUTLINE); + } } /** @@ -463,6 +476,31 @@ void SPDesktop::setCurrentLayer(SPObject *object) { _layer_hierarchy->setBottom(object); } +void SPDesktop::toggleLayerSolo(SPObject *object) { + g_return_if_fail(SP_IS_GROUP(object)); + g_return_if_fail( currentRoot() == object || (currentRoot() && currentRoot()->isAncestorOf(object)) ); + + bool othersShowing = false; + std::vector layers; + for ( SPObject* obj = Inkscape::next_layer(currentRoot(), object); obj; obj = Inkscape::next_layer(currentRoot(), obj) ) { + layers.push_back(obj); + othersShowing |= !SP_ITEM(obj)->isHidden(); + } + for ( SPObject* obj = Inkscape::previous_layer(currentRoot(), object); obj; obj = Inkscape::previous_layer(currentRoot(), obj) ) { + layers.push_back(obj); + othersShowing |= !SP_ITEM(obj)->isHidden(); + } + + + if ( SP_ITEM(object)->isHidden() ) { + SP_ITEM(object)->setHidden(false); + } + + for ( std::vector::iterator it = layers.begin(); it != layers.end(); ++it ) { + SP_ITEM(*it)->setHidden(othersShowing); + } +} + /** * Return layer that contains \a object. */ @@ -971,6 +1009,16 @@ SPDesktop::zoom_drawing() set_display_area(*d, 10); } +/** + * Scroll canvas by specific coordinate amount in svg coordinates. + */ +void +SPDesktop::scroll_world_in_svg_coords (double dx, double dy, bool is_scrolling) +{ + double scale = expansion(_d2w); + scroll_world(dx*scale, dy*scale, is_scrolling); +} + /** * Scroll canvas by specific coordinate amount. */