From 31bb8269c26a781036448ed8f8cd93cc84fb2118 Mon Sep 17 00:00:00 2001 From: Krzysztof Kosi??ski Date: Sun, 29 Nov 2009 16:33:18 +0100 Subject: First GSoC node tool commit to Bazaar (bzr r8846.1.1) --- src/ui/tool/selectable-control-point.cpp | 135 +++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 src/ui/tool/selectable-control-point.cpp (limited to 'src/ui/tool/selectable-control-point.cpp') diff --git a/src/ui/tool/selectable-control-point.cpp b/src/ui/tool/selectable-control-point.cpp new file mode 100644 index 000000000..b189a713f --- /dev/null +++ b/src/ui/tool/selectable-control-point.cpp @@ -0,0 +1,135 @@ +/** @file + * Desktop-bound selectable control object - implementation + */ +/* Authors: + * Krzysztof KosiƄski + * + * Copyright (C) 2009 Authors + * Released under GNU GPL, read the file 'COPYING' for more information + */ + +#include "ui/tool/control-point-selection.h" +#include "ui/tool/event-utils.h" +#include "ui/tool/selectable-control-point.h" + +namespace Inkscape { +namespace UI { + +static SelectableControlPoint::ColorSet default_scp_color_set = { + { + {0xffffff00, 0x01000000}, // normal fill, stroke + {0xff0000ff, 0x01000000}, // mouseover fill, stroke + {0x0000ffff, 0x01000000} // clicked fill, stroke + }, + {0x0000ffff, 0x000000ff}, // normal fill, stroke when selected + {0xff000000, 0x000000ff}, // mouseover fill, stroke when selected + {0xff000000, 0x000000ff} // clicked fill, stroke when selected +}; + +SelectableControlPoint::SelectableControlPoint(SPDesktop *d, Geom::Point const &initial_pos, + Gtk::AnchorType anchor, SPCtrlShapeType shape, unsigned int size, + ControlPointSelection &sel, ColorSet *cset, SPCanvasGroup *group) + : ControlPoint (d, initial_pos, anchor, shape, size, + cset ? reinterpret_cast(cset) + : reinterpret_cast(&default_scp_color_set), group) + , _selection (sel) +{ + _connectHandlers(); +} +SelectableControlPoint::SelectableControlPoint(SPDesktop *d, Geom::Point const &initial_pos, + Gtk::AnchorType anchor, Glib::RefPtr pixbuf, + ControlPointSelection &sel, ColorSet *cset, SPCanvasGroup *group) + : ControlPoint (d, initial_pos, anchor, pixbuf, + cset ? reinterpret_cast(cset) + : reinterpret_cast(&default_scp_color_set), group) + , _selection (sel) +{ + _connectHandlers(); +} + +SelectableControlPoint::~SelectableControlPoint() +{ + _selection.erase(this); +} + +void SelectableControlPoint::_connectHandlers() +{ + signal_clicked.connect( + sigc::mem_fun(*this, &SelectableControlPoint::_clickedHandler)); + signal_grabbed.connect( + sigc::bind_return( + sigc::mem_fun(*this, &SelectableControlPoint::_grabbedHandler), + false)); +} + +void SelectableControlPoint::_grabbedHandler(GdkEventMotion *event) +{ + // if a point is dragged while not selected, it should select itself + if (!selected()) { + _takeSelection(); + // HACK!!! invoke the last slot for signal_grabbed (it will be the callback registered + // by ControlPointSelection when adding to selection). + signal_grabbed.slots().back()(event); + } +} +bool SelectableControlPoint::_clickedHandler(GdkEventButton *event) +{ + if (event->button != 1) return false; + if (held_shift(*event)) { + if (selected()) { + _selection.erase(this); + } else { + _selection.insert(this); + } + } else { + _takeSelection(); + } + return true; +} + +void SelectableControlPoint::_takeSelection() +{ + _selection.clear(); + _selection.insert(this); +} + +bool SelectableControlPoint::selected() const +{ + SelectableControlPoint *p = const_cast(this); + return _selection.find(p) != _selection.end(); +} + +void SelectableControlPoint::_setState(State state) +{ + if (!selected()) { + ControlPoint::_setState(state); + return; + } + + ColorSet *cset = reinterpret_cast(_cset); + ColorEntry current = {0, 0}; + switch (state) { + case STATE_NORMAL: + current = cset->selected_normal; break; + case STATE_MOUSEOVER: + current = cset->selected_mouseover; break; + case STATE_CLICKED: + current = cset->selected_clicked; break; + } + _setColors(current); + _state = state; +} + +} // namespace UI +} // namespace Inkscape + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 : -- cgit v1.2.3 From b52865a71a9f83da9719a3ec5f50a4a2cd7cdace Mon Sep 17 00:00:00 2001 From: Krzysztof Kosi??ski Date: Sun, 10 Jan 2010 01:46:28 +0100 Subject: * Implement node snapping. * Fix minor bug in linear grow. * Add --fixes. * Move some node selection-related functions to ControlPointSelection. Fixed bugs: - https://launchpad.net/bugs/170561 - https://launchpad.net/bugs/171893 - https://launchpad.net/bugs/182585 - https://launchpad.net/bugs/446773 (bzr r8846.2.9) --- src/ui/tool/selectable-control-point.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/ui/tool/selectable-control-point.cpp') diff --git a/src/ui/tool/selectable-control-point.cpp b/src/ui/tool/selectable-control-point.cpp index b189a713f..5b9aa4fc8 100644 --- a/src/ui/tool/selectable-control-point.cpp +++ b/src/ui/tool/selectable-control-point.cpp @@ -50,10 +50,12 @@ SelectableControlPoint::SelectableControlPoint(SPDesktop *d, Geom::Point const & SelectableControlPoint::~SelectableControlPoint() { _selection.erase(this); + _selection.allPoints().erase(this); } void SelectableControlPoint::_connectHandlers() { + _selection.allPoints().insert(this); signal_clicked.connect( sigc::mem_fun(*this, &SelectableControlPoint::_clickedHandler)); signal_grabbed.connect( -- cgit v1.2.3 From 13b341b68636dbc621daf94f6efa229489b7fd70 Mon Sep 17 00:00:00 2001 From: Krzysztof Kosi??ski Date: Thu, 14 Jan 2010 18:45:20 +0100 Subject: * Add "show transform handles" toggle button. * Transform handle mode switching similar to selector tool, when node transform handles are visible. (bzr r8846.2.18) --- src/ui/tool/selectable-control-point.cpp | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) (limited to 'src/ui/tool/selectable-control-point.cpp') diff --git a/src/ui/tool/selectable-control-point.cpp b/src/ui/tool/selectable-control-point.cpp index 5b9aa4fc8..df2410dc2 100644 --- a/src/ui/tool/selectable-control-point.cpp +++ b/src/ui/tool/selectable-control-point.cpp @@ -56,26 +56,39 @@ SelectableControlPoint::~SelectableControlPoint() void SelectableControlPoint::_connectHandlers() { _selection.allPoints().insert(this); - signal_clicked.connect( - sigc::mem_fun(*this, &SelectableControlPoint::_clickedHandler)); signal_grabbed.connect( sigc::bind_return( - sigc::mem_fun(*this, &SelectableControlPoint::_grabbedHandler), + sigc::hide( + sigc::mem_fun(*this, &SelectableControlPoint::_grabbedHandler)), false)); + signal_dragged.connect( + sigc::mem_fun(*this, &SelectableControlPoint::_draggedHandler)); + signal_ungrabbed.connect( + sigc::hide( + sigc::mem_fun(*this, &SelectableControlPoint::_ungrabbedHandler))); + signal_clicked.connect( + sigc::mem_fun(*this, &SelectableControlPoint::_clickedHandler)); } -void SelectableControlPoint::_grabbedHandler(GdkEventMotion *event) +void SelectableControlPoint::_grabbedHandler() { // if a point is dragged while not selected, it should select itself if (!selected()) { _takeSelection(); - // HACK!!! invoke the last slot for signal_grabbed (it will be the callback registered - // by ControlPointSelection when adding to selection). - signal_grabbed.slots().back()(event); + _selection._pointGrabbed(); } } +void SelectableControlPoint::_draggedHandler(Geom::Point const &old_pos, Geom::Point &new_pos, GdkEventMotion *event) +{ + _selection._pointDragged(old_pos, new_pos, event); +} +void SelectableControlPoint::_ungrabbedHandler() +{ + _selection._pointUngrabbed(); +} bool SelectableControlPoint::_clickedHandler(GdkEventButton *event) { + if (selected() && _selection._pointClicked(this, event)) return true; if (event->button != 1) return false; if (held_shift(*event)) { if (selected()) { -- cgit v1.2.3 From e6b5fdce005681751c781326ec649f0882a4c13f Mon Sep 17 00:00:00 2001 From: Krzysztof Kosi??ski Date: Wed, 20 Jan 2010 15:14:37 +0100 Subject: Fix snapping in the node tool when more than one point is dragged. (bzr r9001) --- src/ui/tool/selectable-control-point.cpp | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) (limited to 'src/ui/tool/selectable-control-point.cpp') diff --git a/src/ui/tool/selectable-control-point.cpp b/src/ui/tool/selectable-control-point.cpp index df2410dc2..9039bd533 100644 --- a/src/ui/tool/selectable-control-point.cpp +++ b/src/ui/tool/selectable-control-point.cpp @@ -61,11 +61,6 @@ void SelectableControlPoint::_connectHandlers() sigc::hide( sigc::mem_fun(*this, &SelectableControlPoint::_grabbedHandler)), false)); - signal_dragged.connect( - sigc::mem_fun(*this, &SelectableControlPoint::_draggedHandler)); - signal_ungrabbed.connect( - sigc::hide( - sigc::mem_fun(*this, &SelectableControlPoint::_ungrabbedHandler))); signal_clicked.connect( sigc::mem_fun(*this, &SelectableControlPoint::_clickedHandler)); } @@ -75,20 +70,11 @@ void SelectableControlPoint::_grabbedHandler() // if a point is dragged while not selected, it should select itself if (!selected()) { _takeSelection(); - _selection._pointGrabbed(); } } -void SelectableControlPoint::_draggedHandler(Geom::Point const &old_pos, Geom::Point &new_pos, GdkEventMotion *event) -{ - _selection._pointDragged(old_pos, new_pos, event); -} -void SelectableControlPoint::_ungrabbedHandler() -{ - _selection._pointUngrabbed(); -} + bool SelectableControlPoint::_clickedHandler(GdkEventButton *event) { - if (selected() && _selection._pointClicked(this, event)) return true; if (event->button != 1) return false; if (held_shift(*event)) { if (selected()) { -- cgit v1.2.3 From 7ce8847f2410a24a6bce4ca8a43ad7ebdb4839eb Mon Sep 17 00:00:00 2001 From: Krzysztof Kosi??ski Date: Thu, 4 Feb 2010 03:14:09 +0100 Subject: Reduce libsigc++ usage to partially fix performance regressions in the new node tool. (bzr r9044) --- src/ui/tool/selectable-control-point.cpp | 35 +++++++++++++++++--------------- 1 file changed, 19 insertions(+), 16 deletions(-) (limited to 'src/ui/tool/selectable-control-point.cpp') diff --git a/src/ui/tool/selectable-control-point.cpp b/src/ui/tool/selectable-control-point.cpp index 9039bd533..1835f0008 100644 --- a/src/ui/tool/selectable-control-point.cpp +++ b/src/ui/tool/selectable-control-point.cpp @@ -34,7 +34,7 @@ SelectableControlPoint::SelectableControlPoint(SPDesktop *d, Geom::Point const & : reinterpret_cast(&default_scp_color_set), group) , _selection (sel) { - _connectHandlers(); + _selection.allPoints().insert(this); } SelectableControlPoint::SelectableControlPoint(SPDesktop *d, Geom::Point const &initial_pos, Gtk::AnchorType anchor, Glib::RefPtr pixbuf, @@ -44,7 +44,7 @@ SelectableControlPoint::SelectableControlPoint(SPDesktop *d, Geom::Point const & : reinterpret_cast(&default_scp_color_set), group) , _selection (sel) { - _connectHandlers(); + _selection.allPoints().insert(this); } SelectableControlPoint::~SelectableControlPoint() @@ -53,28 +53,31 @@ SelectableControlPoint::~SelectableControlPoint() _selection.allPoints().erase(this); } -void SelectableControlPoint::_connectHandlers() -{ - _selection.allPoints().insert(this); - signal_grabbed.connect( - sigc::bind_return( - sigc::hide( - sigc::mem_fun(*this, &SelectableControlPoint::_grabbedHandler)), - false)); - signal_clicked.connect( - sigc::mem_fun(*this, &SelectableControlPoint::_clickedHandler)); -} - -void SelectableControlPoint::_grabbedHandler() +bool SelectableControlPoint::grabbed(GdkEventMotion *) { // if a point is dragged while not selected, it should select itself if (!selected()) { _takeSelection(); } + _selection._pointGrabbed(); + return false; } -bool SelectableControlPoint::_clickedHandler(GdkEventButton *event) +void SelectableControlPoint::dragged(Geom::Point &new_pos, GdkEventMotion *event) { + _selection._pointDragged(position(), new_pos, event); +} + +void SelectableControlPoint::ungrabbed(GdkEventButton *) +{ + _selection._pointUngrabbed(); +} + +bool SelectableControlPoint::clicked(GdkEventButton *event) +{ + if (_selection._pointClicked(this, event)) + return true; + if (event->button != 1) return false; if (held_shift(*event)) { if (selected()) { -- cgit v1.2.3 From 7f5277e2c7722d2375fc7108f8d3b796f26aaccd Mon Sep 17 00:00:00 2001 From: Krzysztof Kosi??ski Date: Wed, 3 Mar 2010 01:10:54 +0100 Subject: Node tool: implement sculpting (bzr r9131) --- src/ui/tool/selectable-control-point.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/ui/tool/selectable-control-point.cpp') diff --git a/src/ui/tool/selectable-control-point.cpp b/src/ui/tool/selectable-control-point.cpp index 1835f0008..76028dd82 100644 --- a/src/ui/tool/selectable-control-point.cpp +++ b/src/ui/tool/selectable-control-point.cpp @@ -59,13 +59,13 @@ bool SelectableControlPoint::grabbed(GdkEventMotion *) if (!selected()) { _takeSelection(); } - _selection._pointGrabbed(); + _selection._pointGrabbed(this); return false; } void SelectableControlPoint::dragged(Geom::Point &new_pos, GdkEventMotion *event) { - _selection._pointDragged(position(), new_pos, event); + _selection._pointDragged(new_pos, event); } void SelectableControlPoint::ungrabbed(GdkEventButton *) -- cgit v1.2.3