diff --git a/src/desktop.cpp b/src/desktop.cpp
index 6314621c14e146805075c28fae13c2d916a893df..f9d17b01ad6bbc5e938c8c9c5df0e2b8007427ab 100644 (file)
--- a/src/desktop.cpp
+++ b/src/desktop.cpp
* Johan Engelen <j.b.c.engelen@ewi.utwente.nl>
*
* Copyright (C) 2007 Jon A. Cruz
- * Copyright (C) 2006-2007 Johan Engelen
+ * Copyright (C) 2006-2008 Johan Engelen
* Copyright (C) 2006 John Bintz
* Copyright (C) 2004 MenTaLguY
* Copyright (C) 1999-2002 Lauris Kaplinski
#include "display/gnome-canvas-acetate.h"
#include "display/sodipodi-ctrlrect.h"
#include "display/sp-canvas-util.h"
+#include "display/canvas-temporary-item-list.h"
+#include "display/snap-indicator.h"
#include "libnr/nr-matrix-div.h"
#include "libnr/nr-rect-ops.h"
#include "ui/dialog/dialog-manager.h"
#include "layer-manager.h"
#include "event-log.h"
#include "display/canvas-grid.h"
+#include "widgets/desktop-widget.h"
+#include "box3d-context.h"
#include "display/sp-canvas.h"
event_context( 0 ),
layer_manager( 0 ),
event_log( 0 ),
+ temporary_item_list( 0 ),
+ snapindicator( 0 ),
acetate( 0 ),
main( 0 ),
gridgroup( 0 ),
drawing( 0 ),
sketch( 0 ),
controls( 0 ),
+ tempgroup ( 0 ),
table( 0 ),
page( 0 ),
page_border( 0 ),
window_state(0),
interaction_disabled_counter( 0 ),
waiting_cursor( false ),
- perspectives (NULL),
guides_active( false ),
gr_item( 0 ),
gr_point_type( 0 ),
_w2d(),
_d2w(),
_doc2dt( NR::Matrix(NR::scale(1, -1)) ),
- grids_visible( true )
+ grids_visible( false )
{
_d2w.set_identity();
_w2d.set_identity();
sp_document_ensure_up_to_date (document);
/* Setup Dialog Manager */
- _dlg_mgr = new Inkscape::UI::Dialog::DialogManager();
+ _dlg_mgr = &Inkscape::UI::Dialog::DialogManager::getInstance();
dkey = sp_item_display_key_new (1);
guides = (SPCanvasGroup *) sp_canvas_item_new (main, SP_TYPE_CANVAS_GROUP, NULL);
sketch = (SPCanvasGroup *) sp_canvas_item_new (main, SP_TYPE_CANVAS_GROUP, NULL);
controls = (SPCanvasGroup *) sp_canvas_item_new (main, SP_TYPE_CANVAS_GROUP, NULL);
+ tempgroup = (SPCanvasGroup *) sp_canvas_item_new (main, SP_TYPE_CANVAS_GROUP, NULL);
/* Push select tool to the bottom of stack */
/** \todo
// (Setting up after the connections are all in place, as it may use some of them)
layer_manager = new Inkscape::LayerManager( this );
- grids_visible = true;
+ showGrids(namedview->grids_visible, false);
- /* Create initial perspective, append it to the list of existing perspectives
- and make it the current perspective */
- Box3D::Perspective3D *initial_persp = new Box3D::Perspective3D (
- // VP in x-direction
- Box3D::VanishingPoint( NR::Point(-50.0, 600.0),
- NR::Point( -1.0, 0.0), Box3D::VP_FINITE),
- // VP in y-direction
- Box3D::VanishingPoint( NR::Point(500.0,1000.0),
- NR::Point( 0.0, 1.0), Box3D::VP_INFINITE),
- // VP in z-direction
- Box3D::VanishingPoint( NR::Point(700.0, 600.0),
- NR::Point(sqrt(3.0),1.0), Box3D::VP_FINITE));
- this->add_perspective (initial_persp);
- Box3D::Perspective3D::current_perspective = (Box3D::Perspective3D *) perspectives->data;
+ temporary_item_list = new Inkscape::Display::TemporaryItemList( this );
+ snapindicator = new Inkscape::Display::SnapIndicator ( this );
}
void SPDesktop::destroy()
{
+ if (snapindicator) {
+ delete snapindicator;
+ snapindicator = NULL;
+ }
+ if (temporary_item_list) {
+ delete temporary_item_list;
+ temporary_item_list = NULL;
+ }
+
+ namedview->hide(this);
+
_activate_connection.disconnect();
_deactivate_connection.disconnect();
_sel_modified_connection.disconnect();
if (_layer_hierarchy) {
delete _layer_hierarchy;
+// _layer_hierarchy = NULL; //this should be here, but commented to find other bug somewhere else.
+ }
+
+ if (layer_manager) {
+ delete layer_manager;
+ layer_manager = NULL;
}
if (_inkscape) {
g_list_free (zooms_past);
g_list_free (zooms_future);
-
- for (GSList *p = this->perspectives; p != NULL; p = p->next) {
- delete ((Box3D::Perspective3D *) p->data);
- }
- g_slist_free (perspectives);
}
SPDesktop::~SPDesktop() {}
//--------------------------------------------------------------------
/* Public methods */
+
+/** 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.
+*/
+Inkscape::Display::TemporaryItem *
+SPDesktop::add_temporary_canvasitem (SPCanvasItem *item, guint lifetime)
+{
+ return temporary_item_list->add_item(item, lifetime);
+}
+
+/** It is perfectly safe to call this function while the object has already been deleted due to a timeout.
+*/
+void
+SPDesktop::remove_temporary_canvasitem (Inkscape::Display::TemporaryItem * tempitem)
+{
+ // check for non-null temporary_item_list, because during destruction of desktop, some destructor might try to access this list!
+ if (tempitem && temporary_item_list) {
+ temporary_item_list->delete_item(tempitem);
+ }
+}
+
void SPDesktop::setDisplayModeNormal()
{
SP_CANVAS_ARENA (drawing)->arena->rendermode = RENDERMODE_NORMAL;
{
if (displayMode == RENDERMODE_OUTLINE)
setDisplayModeNormal();
- else
+ else
setDisplayModeOutline();
}
/**
* Sets the current layer of the desktop.
- *
+ *
* Make \a object the top layer.
*/
void SPDesktop::setCurrentLayer(SPObject *object) {
selection->clear();
setDocument (theDocument);
+
+ /* update the rulers, connect the desktop widget's signal to the new namedview etc.
+ (this can probably be done in a better way) */
+ Gtk::Window *parent = this->getToplevel();
+ g_assert(parent != NULL);
+ SPDesktopWidget *dtw = (SPDesktopWidget *) parent->get_data("desktopwidget");
+ if (dtw) dtw->desktop = this;
+ sp_desktop_widget_update_namedview(dtw);
+
_namedview_modified (namedview, SP_OBJECT_MODIFIED_FLAG, this);
_document_replaced_signal.emit (this, theDocument);
}
}
/**
- * Set viewbox.
+ * Set viewbox (x0, x1, y0 and y1 are in document pixels. Border is in screen pixels).
*/
void
SPDesktop::set_display_area (double x0, double y0, double x1, double y1, double border, bool log)
newscale = viewbox.dimensions()[NR::Y] / (y1 - y0);
}
- newscale = CLAMP(newscale, SP_DESKTOP_ZOOM_MIN, SP_DESKTOP_ZOOM_MAX);
+ newscale = CLAMP(newscale, SP_DESKTOP_ZOOM_MIN, SP_DESKTOP_ZOOM_MAX); // unit: 'screen pixels' per 'document pixels'
int clear = FALSE;
if (!NR_DF_TEST_CLOSE (newscale, scale, 1e-4 * scale)) {
@@ -697,13 +735,16 @@ SPDesktop::set_display_area (double x0, double y0, double x1, double y1, double
clear = TRUE;
}
- /* Calculate top left corner */
+ /* Calculate top left corner (in document pixels) */
x0 = cx - 0.5 * viewbox.dimensions()[NR::X] / newscale;
y1 = cy + 0.5 * viewbox.dimensions()[NR::Y] / newscale;
/* Scroll */
sp_canvas_scroll_to (canvas, x0 * newscale - border, y1 * -newscale - border, clear);
+ /* update perspective lines if we are in the 3D box tool (so that infinite ones are shown correctly) */
+ sp_box3d_context_update_lines(event_context);
+
_widget->updateRulers();
_widget->updateScrollbars(expansion(_d2w));
_widget->updateZoom();
set_display_area(a.min()[NR::X], a.min()[NR::Y], a.max()[NR::X], a.max()[NR::Y], b, log);
}
-/**
- * Add a perspective to the desktop if it doesn't exist yet
- */
-void
-SPDesktop::add_perspective (Box3D::Perspective3D * const persp)
-{
- // FIXME: Should we handle the case that the perspectives have equal VPs but are not identical?
- if (persp == NULL || g_slist_find (this->perspectives, persp)) return;
- this->perspectives = g_slist_prepend (this->perspectives, persp);
- persp->desktop = this;
-}
-
-void SPDesktop::remove_perspective (Box3D::Perspective3D * const persp)
-{
- if (persp == NULL) return;
-
- if (!g_slist_find (this->perspectives, persp)) {
- g_warning ("Could not find perspective in current desktop. Not removed.\n");
- return;
- }
-
- this->perspectives = g_slist_remove (this->perspectives, persp);
-}
-
/**
* Return viewbox dimensions.
*/
sp_canvas_scroll_to(canvas, viewbox.min()[NR::X] - dx, viewbox.min()[NR::Y] - dy, FALSE, is_scrolling);
+ /* update perspective lines if we are in the 3D box tool (so that infinite ones are shown correctly) */
+ sp_box3d_context_update_lines(event_context);
+
_widget->updateRulers();
_widget->updateScrollbars(expansion(_d2w));
}
bool SPDesktop::onDeleteUI (GdkEventAny*)
{
- if(shutdown()) return true;
- destroyWidget();
- return false;
+ if(shutdown())
+ return true;
+
+ destroyWidget();
+ return false;
}
/**
if (changed & (GDK_WINDOW_STATE_FULLSCREEN|GDK_WINDOW_STATE_MAXIMIZED)) {
layoutWidget();
}
-
+
return false;
}
_widget->setToolboxAdjustmentValue (id, val);
}
+void
+SPDesktop::setToolboxSelectOneValue (gchar const* id, gint val)
+{
+ _widget->setToolboxSelectOneValue (id, val);
+}
+
bool
SPDesktop::isToolboxButtonActive (gchar const *id)
{
sp_event_context_update_cursor(sp_desktop_event_context(this));
}
-void SPDesktop::toggleGrid()
+void SPDesktop::toggleColorProfAdjust()
+{
+ _widget->toggleColorProfAdjust();
+}
+
+void SPDesktop::toggleGrids()
{
if (namedview->grids) {
if(gridgroup) {
- grids_visible = !grids_visible;
- if (grids_visible) {
- sp_canvas_item_show(SP_CANVAS_ITEM(gridgroup));
- } else {
- sp_canvas_item_hide(SP_CANVAS_ITEM(gridgroup));
- }
+ showGrids(!grids_visible);
}
} else {
//there is no grid present at the moment. add a rectangular grid and make it visible
Inkscape::XML::Node *repr = SP_OBJECT_REPR(namedview);
Inkscape::CanvasGrid::writeNewGridToRepr(repr, sp_desktop_document(this), Inkscape::GRID_RECTANGULAR);
- grids_visible = true;
+ showGrids(true);
+ }
+}
+
+void SPDesktop::showGrids(bool show, bool dirty_document)
+{
+ grids_visible = show;
+ sp_namedview_show_grids(namedview, grids_visible, dirty_document);
+ if (show) {
sp_canvas_item_show(SP_CANVAS_ITEM(gridgroup));
+ } else {
+ sp_canvas_item_hide(SP_CANVAS_ITEM(gridgroup));
}
}
+void SPDesktop::toggleSnapping()
+{
+ bool v = namedview->snap_manager.getSnapEnabledGlobally();
+ Inkscape::XML::Node *repr = SP_OBJECT_REPR(namedview);
+ sp_repr_set_boolean(repr, "inkscape:snap-global", !v);
+}
//----------------------------------------------------------------------
// Callback implementations. The virtual ones are connected by the view.
}
void
-SPDesktop::onResized (double x, double y)
+SPDesktop::onResized (double /*x*/, double /*y*/)
{
// Nothing called here
}
void
SPDesktop::_onSelectionModified
-(Inkscape::Selection *selection, guint flags, SPDesktop *dt)
+(Inkscape::Selection */*selection*/, guint /*flags*/, SPDesktop *dt)
{
if (!dt->_widget) return;
dt->_widget->updateScrollbars (expansion(dt->_d2w));
* \todo fixme
*/
static gint
-_arena_handler (SPCanvasArena *arena, NRArenaItem *ai, GdkEvent *event, SPDesktop *desktop)
+_arena_handler (SPCanvasArena */*arena*/, NRArenaItem *ai, GdkEvent *event, SPDesktop *desktop)
{
if (ai) {
SPItem *spi = (SPItem*)NR_ARENA_ITEM_GET_DATA (ai);
/// Callback
static void
-_layer_hierarchy_changed(SPObject *top, SPObject *bottom,
+_layer_hierarchy_changed(SPObject */*top*/, SPObject *bottom,
SPDesktop *desktop)
{
desktop->_layer_changed_signal.emit (bottom);
((CtrlRect *) desktop->page)->setShadow(0, 0x00000000);
}
}
-
+
/* Show/hide page shadow */
if (nv->showpageshadow && nv->pageshadow) {
((CtrlRect *) desktop->page_border)->setShadow(nv->pageshadow, nv->bordercolor);
//tell all grid snappers
for ( GSList const *l = nv.grids; l != NULL; l = l->next) {
Inkscape::CanvasGrid *grid = (Inkscape::CanvasGrid*) l->data;
- grid->snapper->setDistance(sp_convert_distance_full(nv.gridtolerance,
+ grid->snapper->setSnapperTolerance(sp_convert_distance_full(nv.gridtolerance,
*nv.gridtoleranceunit,
px));
}
-
- nv.snap_manager.guide.setDistance(sp_convert_distance_full(nv.guidetolerance,
+
+ nv.snap_manager.guide.setSnapperTolerance(sp_convert_distance_full(nv.guidetolerance,
*nv.guidetoleranceunit,
px));
- nv.snap_manager.object.setDistance(sp_convert_distance_full(nv.objecttolerance,
+ nv.snap_manager.object.setSnapperTolerance(sp_convert_distance_full(nv.objecttolerance,
*nv.objecttoleranceunit,
px));
}