diff --git a/src/desktop.cpp b/src/desktop.cpp
index 4f832682d9586cc5ea8e59acf35549b8f87fa30e..1fdad010fb331493e16c679f42ac5c7affae8de7 100644 (file)
--- a/src/desktop.cpp
+++ b/src/desktop.cpp
#include "widgets/desktop-widget.h"
#include "box3d-context.h"
+// TODO those includes are only for node tool quick zoom. Remove them after fixing it.
+#include "ui/tool/node-tool.h"
+#include "ui/tool/control-point-selection.h"
+
#include "display/sp-canvas.h"
namespace Inkscape { namespace XML { class Node; }}
_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 ),
}
void
-SPDesktop::init (SPNamedView *nv, SPCanvas *aCanvas)
+SPDesktop::init (SPNamedView *nv, SPCanvas *aCanvas, Inkscape::UI::View::EditWidgetInterface *widget)
{
+ _widget = widget;
+
// Temporary workaround for link order issues:
Inkscape::DeviceManager::getManager().getDevices();
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
namedview = nv;
canvas = aCanvas;
- Document *document = SP_OBJECT_DOCUMENT (namedview);
+ SPDocument *document = SP_OBJECT_DOCUMENT (namedview);
/* Kill flicker */
sp_document_ensure_up_to_date (document);
setDisplayModeNormal();
}
+ // The order in which these canvas items are added determines the z-order. It's therefore
+ // important to add the tempgroup (which will contain the snapindicator) before adding the
+ // controls. Only this way one will be able to quickly (before the snap indicator has
+ // disappeared) reselect a node after snapping it. If the z-order is wrong however, this
+ // will not work (the snap indicator is on top of the node handler; is the snapindicator
+ // being selected? or does it intercept some of the events that should have gone to the
+ // node handler? see bug https://bugs.launchpad.net/inkscape/+bug/414142)
gridgroup = (SPCanvasGroup *) sp_canvas_item_new (main, SP_TYPE_CANVAS_GROUP, NULL);
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);
+ controls = (SPCanvasGroup *) sp_canvas_item_new (main, SP_TYPE_CANVAS_GROUP, NULL);
/* Push select tool to the bottom of stack */
/** \todo
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 (_display_mode == Inkscape::RENDERMODE_OUTLINE) {
- _setDisplayMode(_saved_display_mode);
- } else {
+ switch (_display_mode) {
+ case Inkscape::RENDERMODE_NORMAL:
+ _setDisplayMode(Inkscape::RENDERMODE_NO_FILTERS);
+ break;
+ case Inkscape::RENDERMODE_NO_FILTERS:
_setDisplayMode(Inkscape::RENDERMODE_OUTLINE);
+ break;
+ case Inkscape::RENDERMODE_OUTLINE:
+ _setDisplayMode(Inkscape::RENDERMODE_NORMAL);
+ break;
+// case Inkscape::RENDERMODE_PRINT_COLORS_PREVIEW:
+ default:
+ _setDisplayMode(Inkscape::RENDERMODE_NORMAL);
}
}
* Make desktop switch documents.
*/
void
-SPDesktop::change_document (Document *theDocument)
+SPDesktop::change_document (SPDocument *theDocument)
{
g_return_if_fail (theDocument != NULL);
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);
+ if (dtw) {
+ dtw->desktop = this;
+ }
+ dtw->updateNamedview();
_namedview_modified (namedview, SP_OBJECT_MODIFIED_FLAG, this);
_document_replaced_signal.emit (this, theDocument);
while (event_context) {
ec = event_context;
sp_event_context_deactivate (ec);
- event_context = ec->next;
+ // we have to keep event_context valid during destruction - otherwise writing
+ // destructors is next to impossible
+ SPEventContext *next = ec->next;
sp_event_context_finish (ec);
g_object_unref (G_OBJECT (ec));
+ event_context = next;
}
+ // The event_context will be null. This means that it will be impossible
+ // to process any event invoked by the lines below. See for example bug
+ // LP #622350. Cutting and undoing again in the node tool resets the event
+ // context to the node tool. In this bug the line bellow invokes GDK_LEAVE_NOTIFY
+ // events which cannot be handled and must be discarded.
ec = sp_event_context_new (type, this, config, SP_EVENT_CONTEXT_STATIC);
ec->next = event_context;
event_context = ec;
+ // Now the event_context has been set again and we can process all events again
sp_event_context_activate (ec);
_event_context_changed_signal.emit (this, ec);
}
@@ -769,11 +798,12 @@ SPDesktop::set_display_area (double x0, double y0, double x1, double y1, double
int clear = FALSE;
if (!NR_DF_TEST_CLOSE (newscale, scale, 1e-4 * scale)) {
- /* Set zoom factors */
+ // zoom changed - set new zoom factors
_d2w = Geom::Scale(newscale, -newscale);
_w2d = Geom::Scale(1/newscale, 1/-newscale);
sp_canvas_item_affine_absolute(SP_CANVAS_ITEM(main), _d2w);
clear = TRUE;
+ signal_zoom_changed.emit(_d2w.descrim());
}
/* Calculate top left corner (in document pixels) */
zooms_future = g_list_remove (zooms_future, ((NRRect *) zooms_future->data));
}
-#include "tools-switch.h"
-#include "node-context.h"
-#include "shape-editor.h"
-#include "nodepath.h"
-
/** \brief Performs a quick zoom into what the user is working on
\param enable Whether we're going in or out of quick zoom
_quick_zoom_stored_area = get_display_area();
bool zoomed = false;
- if (!zoomed) {
- SPItem * singleItem = selection->singleItem();
- if (singleItem != NULL && tools_isactive(this, TOOLS_NODES)) {
-
- Inkscape::NodePath::Path * nodepath = event_context->shape_editor->get_nodepath();
- // printf("I've got a nodepath, crazy\n");
-
- if (nodepath) {
- Geom::Rect nodes;
- bool firstnode = true;
-
- if (nodepath->selected) {
- for (GList *spl = nodepath->subpaths; spl != NULL; spl = spl->next) {
- Inkscape::NodePath::SubPath *subpath = (Inkscape::NodePath::SubPath *) spl->data;
- for (GList *nl = subpath->nodes; nl != NULL; nl = nl->next) {
- Inkscape::NodePath::Node *node = (Inkscape::NodePath::Node *) nl->data;
- if (node->selected) {
- // printf("\tSelected node\n");
- if (firstnode) {
- nodes = Geom::Rect(node->pos, node->pos);
- firstnode = false;
- } else {
- nodes.expandTo(node->pos);
- }
-
- if (node->p.other != NULL) {
- /* Include previous node pos */
- nodes.expandTo(node->p.other->pos);
-
- /* Include previous handle */
- if (!sp_node_side_is_line(node, &node->p)) {
- nodes.expandTo(node->p.pos);
- }
- }
-
- if (node->n.other != NULL) {
- /* Include previous node pos */
- nodes.expandTo(node->n.other->pos);
-
- /* Include previous handle */
- if (!sp_node_side_is_line(node, &node->n)) {
- nodes.expandTo(node->n.pos);
- }
- }
- }
- }
- }
-
- if (!firstnode && nodes.area() * 2.0 < _quick_zoom_stored_area.area()) {
- set_display_area(nodes, 10);
- zoomed = true;
- }
- }
- }
+ // TODO This needs to migrate into the node tool, but currently the design
+ // of this method is sufficiently wrong to prevent this.
+ if (!zoomed && INK_IS_NODE_TOOL(event_context)) {
+ InkNodeTool *nt = static_cast<InkNodeTool*>(event_context);
+ if (!nt->_selected_nodes->empty()) {
+ Geom::Rect nodes = *nt->_selected_nodes->bounds();
+ double area = nodes.area();
+ // do not zoom if a single cusp node is selected aand the bounds
+ // have zero area.
+ if (!Geom::are_near(area, 0) && area * 2.0 < _quick_zoom_stored_area.area()) {
+ set_display_area(nodes, true);
+ zoomed = true;
+ }
}
}
if (!zoomed) {
Geom::OptRect const d = selection->bounds();
if (d && d->area() * 2.0 < _quick_zoom_stored_area.area()) {
- set_display_area(*d, 10);
+ set_display_area(*d, true);
zoomed = true;
}
}
zoomed = true;
}
} else {
- set_display_area(_quick_zoom_stored_area, 0);
+ set_display_area(_quick_zoom_stored_area, false);
}
_quick_zoom_enabled = enable;
void
SPDesktop::updateNow()
{
- sp_canvas_update_now(canvas);
+ sp_canvas_update_now(canvas);
}
void
* Associate document with desktop.
*/
void
-SPDesktop::setDocument (Document *doc)
+SPDesktop::setDocument (SPDocument *doc)
{
if (this->doc() && doc) {
namedview->hide(this);
_reconstruction_start (SPDesktop * desktop)
{
// printf("Desktop, starting reconstruction\n");
- desktop->_reconstruction_old_layer_id = g_strdup(SP_OBJECT_ID(desktop->currentLayer()));
+ desktop->_reconstruction_old_layer_id = g_strdup(desktop->currentLayer()->getId());
desktop->_layer_hierarchy->setBottom(desktop->currentRoot());
/*
}
-/**
+/*
* Pop event context from desktop's context stack. Never used.
*/
// void
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :