X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fselcue.cpp;h=8756524dd6b37c01078f93f0c96ae3d82414057d;hb=a401603e1e2635fadeec3b7a3a48de442da93472;hp=5a831d831ce173e9e32fade63c1df0be1a06d1d8;hpb=46e885f84b3558a3d31e2db1f3559d688c132851;p=inkscape.git diff --git a/src/selcue.cpp b/src/selcue.cpp index 5a831d831..8756524dd 100644 --- a/src/selcue.cpp +++ b/src/selcue.cpp @@ -12,6 +12,8 @@ * Released under GNU GPL, read the file 'COPYING' for more information */ +#include + #include "desktop-handles.h" #include "selection.h" #include "display/sp-canvas-util.h" @@ -21,7 +23,7 @@ #include "text-editing.h" #include "sp-text.h" #include "sp-flowtext.h" -#include "prefs-utils.h" +#include "preferences.h" #include "selcue.h" Inkscape::SelCue::SelCue(SPDesktop *desktop) @@ -30,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( @@ -45,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(); @@ -58,30 +60,72 @@ 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; } - _item_bboxes.clear(); - for (std::list::iterator i = _text_baselines.begin(); i != _text_baselines.end(); i++) { + 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; + } + + 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(); - gint mode = prefs_get_int_attribute ("options.selcue", "value", MARK); + 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; + for (GSList const *l = _selection->itemList(); l != NULL; l = l->next) { SPItem *item = (SPItem *) l->data; - gchar const *prefs_bbox = prefs_get_string_attribute("tools.select", "bounding_box"); - SPItem::BBoxType bbox_type = (prefs_bbox != NULL && strcmp(prefs_bbox, "geometric")==0)? SPItem::GEOMETRIC_BBOX : SPItem::APPROXIMATE_BBOX; - - NR::Maybe const b = sp_item_bbox_desktop(item, bbox_type); + Geom::OptRect const b = sp_item_bbox_desktop(item, bbox_type); SPCanvasItem* box = NULL; @@ -98,7 +142,7 @@ void Inkscape::SelCue::_updateItemBboxes() "stroke_color", 0x000000ff, NULL); sp_canvas_item_show(box); - SP_CTRL(box)->moveto(NR::Point(b->min()[NR::X], b->max()[NR::Y])); + SP_CTRL(box)->moveto(Geom::Point(b->min()[Geom::X], b->max()[Geom::Y])); sp_canvas_item_move_to_z(box, 0); // just low enough to not get in the way of other draggable knots @@ -118,23 +162,39 @@ 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) { - NR::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, - "size", 4.0, - "filled", 0, - "stroked", 1, - "stroke_color", 0x000000ff, - NULL); - - sp_canvas_item_show(baseline_point); - SP_CTRL(baseline_point)->moveto(a); - sp_canvas_item_move_to_z(baseline_point, 0); + if (layout != NULL && layout->outputExists()) { + boost::optional pt = layout->baselineAnchorPoint(); + if (pt) { + baseline_point = sp_canvas_item_new(sp_desktop_controls(_desktop), SP_TYPE_CTRL, + "mode", SP_CTRL_MODE_XOR, + "size", 4.0, + "filled", 0, + "stroked", 1, + "stroke_color", 0x000000ff, + NULL); + + sp_canvas_item_show(baseline_point); + SP_CTRL(baseline_point)->moveto((*pt) * sp_item_i2d_affine(item)); + sp_canvas_item_move_to_z(baseline_point, 0); + } } } @@ -144,6 +204,7 @@ void Inkscape::SelCue::_updateItemBboxes() } } + /* Local Variables: mode:c++