From 553004ad9863f8874c6ffef7d8069f7b2b00e4e7 Mon Sep 17 00:00:00 2001 From: buliabyak Date: Mon, 9 Mar 2009 00:40:52 +0000 Subject: [PATCH] for selection modified signal, only update the coords of the selcue boxes, not delete and create them anew as before --- src/selcue.cpp | 73 +++++++++++++++++++++++++++++++++++++++++++------- src/selcue.h | 6 +++-- 2 files changed, 68 insertions(+), 11 deletions(-) diff --git a/src/selcue.cpp b/src/selcue.cpp index 67c9712d1..714daaa7e 100644 --- a/src/selcue.cpp +++ b/src/selcue.cpp @@ -32,7 +32,7 @@ Inkscape::SelCue::SelCue(SPDesktop *desktop) _selection = sp_desktop_selection(_desktop); _sel_changed_connection = _selection->connectChanged( - sigc::hide(sigc::mem_fun(*this, &Inkscape::SelCue::_updateItemBboxes)) + sigc::hide(sigc::mem_fun(*this, &Inkscape::SelCue::_newItemBboxes)) ); _sel_modified_connection = _selection->connectModified( @@ -47,12 +47,12 @@ Inkscape::SelCue::~SelCue() _sel_changed_connection.disconnect(); _sel_modified_connection.disconnect(); - for (std::list::iterator i = _item_bboxes.begin(); i != _item_bboxes.end(); i++) { + for (std::vector::iterator i = _item_bboxes.begin(); i != _item_bboxes.end(); i++) { gtk_object_destroy(*i); } _item_bboxes.clear(); - for (std::list::iterator i = _text_baselines.begin(); i != _text_baselines.end(); i++) { + for (std::vector::iterator i = _text_baselines.begin(); i != _text_baselines.end(); i++) { gtk_object_destroy(*i); } _text_baselines.clear(); @@ -60,15 +60,55 @@ Inkscape::SelCue::~SelCue() void Inkscape::SelCue::_updateItemBboxes() { - for (std::list::iterator i = _item_bboxes.begin(); i != _item_bboxes.end(); i++) { - gtk_object_destroy(*i); + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + gint mode = prefs->getInt("/options/selcue/value", MARK); + if (mode == NONE) { + return; + } + + g_return_if_fail(_selection != NULL); + + int prefs_bbox = prefs->getBool("/tools/bounding_box"); + SPItem::BBoxType bbox_type = !prefs_bbox ? + SPItem::APPROXIMATE_BBOX : SPItem::GEOMETRIC_BBOX; + + GSList const *items = _selection->itemList(); + if (_item_bboxes.size() != g_slist_length((GSList *) items)) { + _newItemBboxes(); + return; } - _item_bboxes.clear(); - for (std::list::iterator i = _text_baselines.begin(); i != _text_baselines.end(); i++) { + int bcount = 0; + for (GSList const *l = _selection->itemList(); l != NULL; l = l->next) { + SPItem *item = (SPItem *) l->data; + SPCanvasItem* box = _item_bboxes[bcount ++]; + + if (box) { + Geom::OptRect const b = sp_item_bbox_desktop(item, bbox_type); + + if (b) { + sp_canvas_item_show(box); + if (mode == MARK) { + SP_CTRL(box)->moveto(Geom::Point(b->min()[Geom::X], b->max()[Geom::Y])); + } else if (mode == BBOX) { + SP_CTRLRECT(box)->setRectangle(*b); + } + } else { // no bbox + sp_canvas_item_hide(box); + } + } + } + + _newTextBaselines(); +} + + +void Inkscape::SelCue::_newItemBboxes() +{ + for (std::vector::iterator i = _item_bboxes.begin(); i != _item_bboxes.end(); i++) { gtk_object_destroy(*i); } - _text_baselines.clear(); + _item_bboxes.clear(); Inkscape::Preferences *prefs = Inkscape::Preferences::get(); gint mode = prefs->getInt("/options/selcue/value", MARK); @@ -122,11 +162,25 @@ void Inkscape::SelCue::_updateItemBboxes() if (box) { _item_bboxes.push_back(box); } + } + + _newTextBaselines(); +} + +void Inkscape::SelCue::_newTextBaselines() +{ + for (std::vector::iterator i = _text_baselines.begin(); i != _text_baselines.end(); i++) { + gtk_object_destroy(*i); + } + _text_baselines.clear(); + + for (GSList const *l = _selection->itemList(); l != NULL; l = l->next) { + SPItem *item = (SPItem *) l->data; SPCanvasItem* baseline_point = NULL; if (SP_IS_TEXT(item) || SP_IS_FLOWTEXT(item)) { // visualize baseline Inkscape::Text::Layout const *layout = te_get_layout(item); - if (layout != NULL) { + if (layout != NULL && layout->outputExists()) { Geom::Point a = layout->characterAnchorPoint(layout->begin()) * sp_item_i2d_affine(item); baseline_point = sp_canvas_item_new(sp_desktop_controls(_desktop), SP_TYPE_CTRL, "mode", SP_CTRL_MODE_XOR, @@ -148,6 +202,7 @@ void Inkscape::SelCue::_updateItemBboxes() } } + /* Local Variables: mode:c++ diff --git a/src/selcue.h b/src/selcue.h index 42ebc9878..c9266ac9a 100644 --- a/src/selcue.h +++ b/src/selcue.h @@ -38,13 +38,15 @@ public: private: void _updateItemBboxes(); + void _newItemBboxes(); + void _newTextBaselines(); SPDesktop *_desktop; Selection *_selection; sigc::connection _sel_changed_connection; sigc::connection _sel_modified_connection; - std::list _item_bboxes; - std::list _text_baselines; + std::vector _item_bboxes; + std::vector _text_baselines; }; } -- 2.30.2