diff options
| author | Matthew Petroff <matthew@mpetroff.net> | 2013-09-20 17:05:24 +0000 |
|---|---|---|
| committer | Matthew Petroff <matthew@mpetroff.net> | 2013-09-20 17:05:24 +0000 |
| commit | 48b4ee48e518d65c3c5e49369a747c2aa4b0081b (patch) | |
| tree | 7159f8bc67d3f96ae43c42c32cacec6f7813f6fa /src/desktop.cpp | |
| parent | Fix bug in rectangle toolbar. (diff) | |
| parent | Fix grids after C++ification. Patch from Markus Engel (diff) | |
| download | inkscape-48b4ee48e518d65c3c5e49369a747c2aa4b0081b.tar.gz inkscape-48b4ee48e518d65c3c5e49369a747c2aa4b0081b.zip | |
Merge from trunk.
(bzr r12475.1.29)
Diffstat (limited to 'src/desktop.cpp')
| -rw-r--r-- | src/desktop.cpp | 224 |
1 files changed, 163 insertions, 61 deletions
diff --git a/src/desktop.cpp b/src/desktop.cpp index ea53b9cf7..d19a99da6 100644 --- a/src/desktop.cpp +++ b/src/desktop.cpp @@ -235,7 +235,9 @@ SPDesktop::init (SPNamedView *nv, SPCanvas *aCanvas, Inkscape::UI::View::EditWid * call "set" instead of "push". Can we assume that there is only one * context ever? */ - push_event_context (SP_TYPE_SELECT_CONTEXT, "/tools/select", SP_EVENT_CONTEXT_STATIC); + //push_event_context (SP_TYPE_SELECT_CONTEXT, "/tools/select", SP_EVENT_CONTEXT_STATIC); + //set_event_context(SP_TYPE_SELECT_CONTEXT, "/tools/select"); + set_event_context2("/tools/select"); // display rect and zoom are now handled in sp_desktop_widget_realize() @@ -359,11 +361,18 @@ void SPDesktop::destroy() g_signal_handlers_disconnect_by_func(G_OBJECT (main), (gpointer) G_CALLBACK(sp_desktop_root_handler), this); g_signal_handlers_disconnect_by_func(G_OBJECT (drawing), (gpointer) G_CALLBACK(_arena_handler), this); - while (event_context) { - SPEventContext *ec = event_context; - event_context = ec->next; - sp_event_context_finish (ec); - g_object_unref (G_OBJECT (ec)); +// while (event_context) { +// SPEventContext *ec = event_context; +// event_context = ec->next; +// sp_event_context_finish (ec); +// g_object_unref (G_OBJECT (ec)); +// } + //sp_event_context_finish(event_context); + event_context->finish(); + //g_object_unref(G_OBJECT(event_context)); + if (event_context) { + delete event_context; + event_context = 0; } delete layers; @@ -391,6 +400,65 @@ SPDesktop::~SPDesktop() { } + +SPEventContext* SPDesktop::getEventContext() const { + return event_context; +} + +Inkscape::Selection* SPDesktop::getSelection() const { + return selection; +} + +SPDocument* SPDesktop::getDocument() const { + return doc(); +} + +SPCanvas* SPDesktop::getCanvas() const { + return SP_CANVAS_ITEM(main)->canvas; +} + +SPCanvasItem* SPDesktop::getAcetate() const { + return acetate; +} + +SPCanvasGroup* SPDesktop::getMain() const { + return main; +} + +SPCanvasGroup* SPDesktop::getGridGroup() const { + return gridgroup; +} + +SPCanvasGroup* SPDesktop::getGuides() const { + return guides; +} + +SPCanvasItem* SPDesktop::getDrawing() const { + return drawing; +} + +SPCanvasGroup* SPDesktop::getSketch() const { + return sketch; +} + +SPCanvasGroup* SPDesktop::getControls() const { + return controls; +} + +SPCanvasGroup* SPDesktop::getTempGroup() const { + return tempgroup; +} + +Inkscape::MessageStack* SPDesktop::getMessageStack() const { + return messageStack(); +} + +SPNamedView* SPDesktop::getNamedView() const { + return namedview; +} + + + //-------------------------------------------------------------------- /* Public methods */ @@ -600,62 +668,89 @@ SPDesktop::change_document (SPDocument *theDocument) _document_replaced_signal.emit (this, theDocument); } + +#include "tool-factory.h" + +void SPDesktop::set_event_context2(const std::string& toolName) { + SPEventContext* ec_old = event_context; + + if (ec_old) { + ec_old->deactivate(); + } + + SPEventContext* ec_new = ToolFactory::instance().createObject(toolName); + ec_new->desktop = this; + ec_new->message_context = new Inkscape::MessageContext(this->messageStack()); + ec_new->setup(); + + event_context = ec_new; + + if (ec_old) { + ec_old->finish(); + delete ec_old; + } + + sp_event_context_activate(event_context); + + _event_context_changed_signal.emit(this, event_context); +} + /** * Make desktop switch event contexts. */ -void -SPDesktop::set_event_context (GType type, const gchar *config) -{ - SPEventContext *ec; - while (event_context) { - ec = event_context; - sp_event_context_deactivate (ec); - // 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); -} +//void +//SPDesktop::set_event_context (GType type, const gchar *config) +//{ +// //SPEventContext *ec; +// //while (event_context) { +// //ec = event_context; +// sp_event_context_deactivate (event_context); +// // we have to keep event_context valid during destruction - otherwise writing +// // destructors is next to impossible +// // SPEventContext *next = ec->next; +// sp_event_context_finish (event_context); +// g_object_unref (G_OBJECT (event_context)); +// // 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. +// event_context = 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 (event_context); +// _event_context_changed_signal.emit (this, event_context); +//} /** * Push event context onto desktop's context stack. */ -void -SPDesktop::push_event_context (GType type, const gchar *config, unsigned int key) -{ - SPEventContext *ref, *ec; - - if (event_context && event_context->key == key) return; - ref = event_context; - while (ref && ref->next && ref->next->key != key) ref = ref->next; - if (ref && ref->next) { - ec = ref->next; - ref->next = ec->next; - sp_event_context_finish (ec); - g_object_unref (G_OBJECT (ec)); - } - - if (event_context) sp_event_context_deactivate (event_context); - ec = sp_event_context_new (type, this, config, key); - ec->next = event_context; - event_context = ec; - sp_event_context_activate (ec); - _event_context_changed_signal.emit (this, ec); -} +//void +//SPDesktop::push_event_context (GType type, const gchar *config, unsigned int key) +//{ +// SPEventContext *ref, *ec; +// +// if (event_context && event_context->key == key) return; +// ref = event_context; +// while (ref && ref->next && ref->next->key != key) ref = ref->next; +// if (ref && ref->next) { +// ec = ref->next; +// ref->next = ec->next; +// sp_event_context_finish (ec); +// g_object_unref (G_OBJECT (ec)); +// } +// +// if (event_context) sp_event_context_deactivate (event_context); +// ec = sp_event_context_new (type, this, config, key); +// ec->next = event_context; +// event_context = ec; +// sp_event_context_activate (ec); +// _event_context_changed_signal.emit (this, ec); +//} /** * Sets the coordinate status to a given point @@ -786,7 +881,10 @@ SPDesktop::set_display_area (double x0, double y0, double x1, double y1, double canvas->scrollTo(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); + //sp_box3d_context_update_lines(event_context); + if (SP_IS_BOX3D_CONTEXT(event_context)) { + SP_BOX3D_CONTEXT(event_context)->_vpdrag->updateLines(); + } _widget->updateRulers(); _widget->updateScrollbars(_d2w.descrim()); @@ -1107,7 +1205,10 @@ SPDesktop::scroll_world (double dx, double dy, bool is_scrolling) canvas->scrollTo(viewbox.min()[Geom::X] - dx, viewbox.min()[Geom::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); + //sp_box3d_context_update_lines(event_context); + if (SP_IS_BOX3D_CONTEXT(event_context)) { + SP_BOX3D_CONTEXT(event_context)->_vpdrag->updateLines(); + } _widget->updateRulers(); _widget->updateScrollbars(_d2w.descrim()); @@ -1407,10 +1508,10 @@ void SPDesktop::setWaitingCursor() waiting_cursor = true; } -void SPDesktop::clearWaitingCursor() -{ - if (waiting_cursor) - sp_event_context_update_cursor(sp_desktop_event_context(this)); +void SPDesktop::clearWaitingCursor() { + if (waiting_cursor) { + this->event_context->sp_event_context_update_cursor(); + } } void SPDesktop::toggleColorProfAdjust() @@ -1822,6 +1923,7 @@ SPDesktop::show_dialogs() mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_DISPLAY, "/dialogs/preferences") ); mapVerbPreference.insert(std::make_pair ((int)SP_VERB_SELECTION_GRIDTILE, "/dialogs/gridtiler") ); mapVerbPreference.insert(std::make_pair ((int)SP_VERB_SELECTION_TRACE, "/dialogs/trace") ); + mapVerbPreference.insert(std::make_pair ((int)SP_VERB_SELECTION_PIXEL_ART, "/dialogs/pixelart") ); mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_TEXT, "/dialogs/textandfont") ); mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_EXPORT, "/dialogs/export") ); mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_XML_EDITOR, "/dialogs/xml") ); |
