add include intersection option in selection tool
This commit is contained in:
parent
22ad3653a8
commit
f9b677d27d
2 changed files with 38 additions and 22 deletions
|
@ -39,6 +39,8 @@ namespace {
|
|||
VectorSelectionTool l_vectorSelectionTool(TTool::Vectors);
|
||||
TEnv::IntVar l_strokeSelectConstantThickness("SelectionToolConstantThickness",
|
||||
0);
|
||||
TEnv::IntVar l_strokeSelectIncludeIntersection(
|
||||
"SelectionToolIncludeIntersection", 0);
|
||||
|
||||
const int l_dragThreshold = 10; //!< Distance, in pixels, the user has to
|
||||
//! move from a button press to trigger a
|
||||
|
@ -63,7 +65,7 @@ FourPoints getFourPointsFromVectorImage(const TVectorImageP &img,
|
|||
TStroke *s = img->getStroke(i);
|
||||
|
||||
for (int j = 0; j < s->getControlPointCount(); j++) {
|
||||
double thick = s->getControlPoint(j).thick;
|
||||
double thick = s->getControlPoint(j).thick;
|
||||
if (maxThickness < thick) maxThickness = thick;
|
||||
}
|
||||
}
|
||||
|
@ -80,7 +82,7 @@ FourPoints getFourPointsFromVectorImage(const TVectorImageP &img,
|
|||
bbox += s->getBBox();
|
||||
|
||||
for (int j = 0; j < s->getControlPointCount(); j++) {
|
||||
double thick = s->getControlPoint(j).thick;
|
||||
double thick = s->getControlPoint(j).thick;
|
||||
if (maxThickness < thick) maxThickness = thick;
|
||||
}
|
||||
}
|
||||
|
@ -933,8 +935,8 @@ struct Data {
|
|||
VectorChangeThicknessTool &m_tool;
|
||||
const TVectorImage &m_vi;
|
||||
};
|
||||
}
|
||||
} // setStrokeThickness
|
||||
} // namespace SetStrokeThickness
|
||||
} // namespace
|
||||
|
||||
void DragSelectionTool::VectorChangeThicknessTool::setStrokesThickness(
|
||||
TVectorImage &vi) {
|
||||
|
@ -987,8 +989,8 @@ struct Data {
|
|||
TVectorImage &m_vi;
|
||||
double m_newThickness;
|
||||
};
|
||||
}
|
||||
}
|
||||
} // namespace ChangeImageThickness
|
||||
} // namespace
|
||||
|
||||
void DragSelectionTool::VectorChangeThicknessTool::changeImageThickness(
|
||||
TVectorImage &vi, double newThickness) {
|
||||
|
@ -1204,6 +1206,7 @@ public:
|
|||
VectorSelectionTool::VectorSelectionTool(int targetType)
|
||||
: SelectionTool(targetType)
|
||||
, m_selectionTarget("Mode:")
|
||||
, m_includeIntersection("Include Intersection", false)
|
||||
, m_constantThickness("Preserve Thickness", false)
|
||||
, m_levelSelection(m_strokeSelection)
|
||||
, m_capStyle("Cap")
|
||||
|
@ -1214,6 +1217,7 @@ VectorSelectionTool::VectorSelectionTool(int targetType)
|
|||
, m_resetCenter(true) {
|
||||
assert(targetType == TTool::Vectors);
|
||||
m_prop.bind(m_selectionTarget);
|
||||
m_prop.bind(m_includeIntersection);
|
||||
m_prop.bind(m_constantThickness);
|
||||
|
||||
m_selectionTarget.addValue(NORMAL_TYPE);
|
||||
|
@ -1228,6 +1232,7 @@ VectorSelectionTool::VectorSelectionTool(int targetType)
|
|||
|
||||
m_strokeSelection.setView(this);
|
||||
|
||||
m_includeIntersection.setId("IncludeIntersection");
|
||||
m_constantThickness.setId("PreserveThickness");
|
||||
m_selectionTarget.setId("SelectionMode");
|
||||
|
||||
|
@ -1334,6 +1339,7 @@ void VectorSelectionTool::updateTranslation() {
|
|||
m_selectionTarget.setItemUIName(BOUNDARY_LEVEL_TYPE,
|
||||
tr("Boundaries on Whole Level"));
|
||||
|
||||
m_includeIntersection.setQStringName(tr("Include Intersection"));
|
||||
m_constantThickness.setQStringName(tr("Preserve Thickness"));
|
||||
|
||||
m_capStyle.setQStringName(tr("Cap"));
|
||||
|
@ -1359,9 +1365,8 @@ void VectorSelectionTool::updateSelectionTarget() {
|
|||
selectedStrokes.swap(
|
||||
m_strokeSelection.getSelection()); // current selection change
|
||||
|
||||
m_strokeSelection
|
||||
.makeCurrent(); // Empties any (different) previously current
|
||||
// selection on its own
|
||||
m_strokeSelection.makeCurrent(); // Empties any (different) previously
|
||||
// current selection on its own
|
||||
selectedStrokes.swap(m_strokeSelection.getSelection());
|
||||
return;
|
||||
}
|
||||
|
@ -1478,8 +1483,8 @@ void VectorSelectionTool::modifySelectionOnClick(TImageP image,
|
|||
bool modifiableSel = isModifiableSelectionType(),
|
||||
strokeAtPos = getStrokeIndexFromPos(index, vi, pos, getPixelSize(),
|
||||
getViewer()->getViewMatrix()),
|
||||
addStroke = strokeAtPos && !m_strokeSelection.isSelected(index),
|
||||
toggleStroke = strokeAtPos && e.isShiftPressed();
|
||||
addStroke = strokeAtPos && !m_strokeSelection.isSelected(index),
|
||||
toggleStroke = strokeAtPos && e.isShiftPressed();
|
||||
|
||||
m_selecting =
|
||||
(modifiableSel && !strokeAtPos // There must be no stroke under cursor
|
||||
|
@ -1488,9 +1493,8 @@ void VectorSelectionTool::modifySelectionOnClick(TImageP image,
|
|||
|| (m_strokeSelectionType.getIndex() !=
|
||||
POLYLINE_SELECTION_IDX) // or the tool support immediate
|
||||
// selection on clear
|
||||
||
|
||||
m_strokeSelection
|
||||
.isEmpty())); // or the strokes list was already cleared
|
||||
|| m_strokeSelection
|
||||
.isEmpty())); // or the strokes list was already cleared
|
||||
|
||||
bool clearTargets = !(strokeAtPos || e.isShiftPressed() || m_selecting),
|
||||
clearSelection = (addStroke || !strokeAtPos) && !e.isShiftPressed(),
|
||||
|
@ -1528,7 +1532,7 @@ void VectorSelectionTool::leftButtonDoubleClick(const TPointD &pos,
|
|||
if (m_strokeSelectionType.getIndex() == POLYLINE_SELECTION_IDX &&
|
||||
!m_polyline.empty()) {
|
||||
closePolyline(pos);
|
||||
selectRegionVectorImage();
|
||||
selectRegionVectorImage(m_includeIntersection.getValue());
|
||||
|
||||
m_selecting = false;
|
||||
invalidate();
|
||||
|
@ -1661,7 +1665,8 @@ void VectorSelectionTool::leftButtonUp(const TPointD &pos,
|
|||
|
||||
closeFreehand(pos);
|
||||
|
||||
if (m_stroke->getControlPointCount() > 3) selectRegionVectorImage();
|
||||
if (m_stroke->getControlPointCount() > 3)
|
||||
selectRegionVectorImage(m_includeIntersection.getValue());
|
||||
|
||||
delete m_stroke; // >:(
|
||||
m_stroke = 0;
|
||||
|
@ -1927,6 +1932,7 @@ bool VectorSelectionTool::selectStroke(int index, bool toggle) {
|
|||
|
||||
void VectorSelectionTool::onActivate() {
|
||||
if (m_firstTime) {
|
||||
m_includeIntersection.setValue(l_strokeSelectIncludeIntersection ? 1 : 0);
|
||||
m_constantThickness.setValue(l_strokeSelectConstantThickness ? 1 : 0);
|
||||
m_strokeSelection.setSceneHandle(
|
||||
TTool::getApplication()->getCurrentScene());
|
||||
|
@ -1966,9 +1972,8 @@ void VectorSelectionTool::onImageChanged() {
|
|||
m_strokeSelection.setImage(vi);
|
||||
|
||||
if (!(vi && selectedImg) // Retain the styles selection ONLY
|
||||
||
|
||||
vi->getPalette() !=
|
||||
selectedImg->getPalette()) // if palettes still match
|
||||
|| vi->getPalette() !=
|
||||
selectedImg->getPalette()) // if palettes still match
|
||||
selectedStyles().clear();
|
||||
} else {
|
||||
// Remove any eventual stroke index outside the valid range
|
||||
|
@ -2028,6 +2033,8 @@ bool VectorSelectionTool::onPropertyChanged(std::string propertyName) {
|
|||
|
||||
if (SelectionTool::onPropertyChanged(propertyName)) return true;
|
||||
|
||||
if (propertyName == m_includeIntersection.getName())
|
||||
l_strokeSelectIncludeIntersection = (int)(m_includeIntersection.getValue());
|
||||
if (propertyName == m_constantThickness.getName())
|
||||
l_strokeSelectConstantThickness = (int)(m_constantThickness.getValue());
|
||||
else if (propertyName == m_selectionTarget.getName())
|
||||
|
@ -2155,7 +2162,7 @@ void VectorSelectionTool::selectionOutlineStyle(int &capStyle, int &joinStyle) {
|
|||
const TStroke::OutlineOptions &options =
|
||||
vi->getStroke(*it)->outlineOptions();
|
||||
|
||||
if (capStyle != options.m_capStyle) capStyle = -1;
|
||||
if (capStyle != options.m_capStyle) capStyle = -1;
|
||||
if (joinStyle != options.m_joinStyle) joinStyle = -1;
|
||||
if (capStyle < 0 && joinStyle < 0) return;
|
||||
}
|
||||
|
@ -2163,7 +2170,7 @@ void VectorSelectionTool::selectionOutlineStyle(int &capStyle, int &joinStyle) {
|
|||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
void VectorSelectionTool::selectRegionVectorImage() {
|
||||
void VectorSelectionTool::selectRegionVectorImage(bool includeIntersect) {
|
||||
if (!m_stroke) return;
|
||||
|
||||
TVectorImageP vi(getImage(false));
|
||||
|
@ -2189,6 +2196,14 @@ void VectorSelectionTool::selectRegionVectorImage() {
|
|||
if (region->contains(*currentStroke, true))
|
||||
selectionChanged = selectStroke(s, false) || selectionChanged;
|
||||
}
|
||||
|
||||
if (includeIntersect) {
|
||||
std::vector<DoublePair> intersections;
|
||||
intersect(m_stroke, currentStroke, intersections, false);
|
||||
if (intersections.size() > 0) {
|
||||
selectionChanged = selectStroke(s, false) || selectionChanged;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (selectionChanged) {
|
||||
|
|
|
@ -358,6 +358,7 @@ private:
|
|||
private:
|
||||
TEnumProperty m_selectionTarget; //!< Selected target content (strokes, whole
|
||||
//! image, styles...).
|
||||
TBoolProperty m_includeIntersection;
|
||||
TBoolProperty m_constantThickness;
|
||||
|
||||
StrokeSelection m_strokeSelection; //!< Standard selection of a set of
|
||||
|
@ -384,7 +385,7 @@ private:
|
|||
void doOnActivate() override;
|
||||
void doOnDeactivate() override;
|
||||
|
||||
void selectRegionVectorImage();
|
||||
void selectRegionVectorImage(bool includeIntersect);
|
||||
|
||||
void updateTranslation() override;
|
||||
|
||||
|
|
Loading…
Reference in a new issue