diff --git a/src/Mod/Sketcher/Gui/TaskSketcherElements.cpp b/src/Mod/Sketcher/Gui/TaskSketcherElements.cpp index 3c1c714c68..0c330447f5 100644 --- a/src/Mod/Sketcher/Gui/TaskSketcherElements.cpp +++ b/src/Mod/Sketcher/Gui/TaskSketcherElements.cpp @@ -436,21 +436,22 @@ void ElementItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& o bool ElementItemDelegate::editorEvent(QEvent* event, QAbstractItemModel* model, const QStyleOptionViewItem& option, const QModelIndex& index) { + using SubElementType = ElementItem::SubElementType; - auto getElementType = [&](ElementItem* item, int xPos, int width) { + auto getSubElementType = [&](ElementItem* item, int xPos, int width) { bool label = (xPos > option.rect.x() + leftMargin + width * 4 + border); if((xPos < option.rect.x() + leftMargin + width + border) || ( item->GeometryType != Part::GeomPoint::getClassTypeId() && label)) - return ElementType::edge; + return SubElementType::edge; if(xPos < option.rect.x() + leftMargin + width * 2 + border || ( item->GeometryType == Part::GeomPoint::getClassTypeId() && label)) - return ElementType::start; + return SubElementType::start; if(xPos < option.rect.x() + leftMargin + width * 3 + border) - return ElementType::end; + return SubElementType::end; else if (xPos < option.rect.x() + leftMargin + width * 4 + border) - return ElementType::mid; + return SubElementType::mid; else - return ElementType::none; + return SubElementType::none; }; if (event->type() == QEvent::MouseButtonPress || event->type() == QEvent::MouseButtonDblClick) { @@ -460,20 +461,20 @@ bool ElementItemDelegate::editorEvent(QEvent* event, QAbstractItemModel* model, int xPos = mEvent->pos().x(); int width = option.rect.height(); //icons are square - item->clickedOn = getElementType(item, xPos, width); + item->clickedOn = getSubElementType(item, xPos, width); if (mEvent->button() == Qt::RightButton) item->rightClicked = true; } else if (event->type() == QEvent::MouseMove) { - ElementType typeUnderMouse; + SubElementType typeUnderMouse; QMouseEvent* mEvent = static_cast(event); int xPos = mEvent->pos().x(); int width = option.rect.height(); //icons are square ElementItem* item = getElementtItem(index); - typeUnderMouse = getElementType(item, xPos, width); + typeUnderMouse = getSubElementType(item, xPos, width); item->hovered = typeUnderMouse; Q_EMIT itemHovered(index); @@ -496,7 +497,7 @@ TaskSketcherElements::TaskSketcherElements(ViewProviderSketch *sketchView) , focusItemIndex(-1) , previouslySelectedItemIndex(-1) , previouslyHoveredItemIndex(-1) - , previouslyHoveredType(ElementType::none) + , previouslyHoveredType(SubElementType::none) , isNamingBoxChecked(false) { // we need a separate container widget to add all controls to @@ -788,7 +789,7 @@ void TaskSketcherElements::on_listWidgetElements_itemPressed(QListWidgetItem* it if (item == itf) { - if (item->clickedOn == ElementType::mid + if (item->clickedOn == SubElementType::mid && (item->GeometryType == Part::GeomArcOfCircle::getClassTypeId() || item->GeometryType == Part::GeomArcOfEllipse::getClassTypeId() || item->GeometryType == Part::GeomArcOfHyperbola::getClassTypeId() @@ -797,7 +798,7 @@ void TaskSketcherElements::on_listWidgetElements_itemPressed(QListWidgetItem* it || item->GeometryType == Part::GeomEllipse::getClassTypeId())) { item->isMidPointSelected = !item->isMidPointSelected; } - else if (item->clickedOn == ElementType::start && + else if (item->clickedOn == SubElementType::start && (item->GeometryType == Part::GeomPoint::getClassTypeId() || item->GeometryType == Part::GeomArcOfCircle::getClassTypeId() || item->GeometryType == Part::GeomArcOfEllipse::getClassTypeId() @@ -807,7 +808,7 @@ void TaskSketcherElements::on_listWidgetElements_itemPressed(QListWidgetItem* it || item->GeometryType == Part::GeomBSplineCurve::getClassTypeId())) { item->isStartingPointSelected = !item->isStartingPointSelected; } - else if (item->clickedOn == ElementType::end && + else if (item->clickedOn == SubElementType::end && (item->GeometryType == Part::GeomArcOfCircle::getClassTypeId() || item->GeometryType == Part::GeomArcOfEllipse::getClassTypeId() || item->GeometryType == Part::GeomArcOfHyperbola::getClassTypeId() @@ -816,11 +817,11 @@ void TaskSketcherElements::on_listWidgetElements_itemPressed(QListWidgetItem* it || item->GeometryType == Part::GeomBSplineCurve::getClassTypeId())) { item->isEndPointSelected = !item->isEndPointSelected; } - else if (item->clickedOn == ElementType::edge && + else if (item->clickedOn == SubElementType::edge && item->GeometryType != Part::GeomPoint::getClassTypeId()){ item->isLineSelected = !item->isLineSelected; } - item->clickedOn = ElementType::none; + item->clickedOn = SubElementType::none; } else if (multipleconsecutiveselection && previouslySelectedItemIndex >= 0 && !rightClickOnSelected && ((i > focusItemIndex && i < previouslySelectedItemIndex) || (ipreviouslySelectedItemIndex))) { @@ -890,7 +891,7 @@ void TaskSketcherElements::on_listWidgetElements_mouseMoveOnItem(QListWidgetItem Gui::Selection().rmvPreselect(); - bool validmid = item->hovered == ElementType::mid + bool validmid = item->hovered == SubElementType::mid && (item->GeometryType == Part::GeomArcOfCircle::getClassTypeId() || item->GeometryType == Part::GeomArcOfEllipse::getClassTypeId() || item->GeometryType == Part::GeomArcOfHyperbola::getClassTypeId() @@ -898,7 +899,7 @@ void TaskSketcherElements::on_listWidgetElements_mouseMoveOnItem(QListWidgetItem || item->GeometryType == Part::GeomCircle::getClassTypeId() || item->GeometryType == Part::GeomEllipse::getClassTypeId()); - bool validstartpoint = item->hovered == ElementType::start && + bool validstartpoint = item->hovered == SubElementType::start && (item->GeometryType == Part::GeomPoint::getClassTypeId() || item->GeometryType == Part::GeomArcOfCircle::getClassTypeId() || item->GeometryType == Part::GeomArcOfEllipse::getClassTypeId() @@ -907,7 +908,7 @@ void TaskSketcherElements::on_listWidgetElements_mouseMoveOnItem(QListWidgetItem || item->GeometryType == Part::GeomLineSegment::getClassTypeId() || item->GeometryType == Part::GeomBSplineCurve::getClassTypeId()); - bool validendpoint = item->hovered == ElementType::end && + bool validendpoint = item->hovered == SubElementType::end && (item->GeometryType == Part::GeomArcOfCircle::getClassTypeId() || item->GeometryType == Part::GeomArcOfEllipse::getClassTypeId() || item->GeometryType == Part::GeomArcOfHyperbola::getClassTypeId() @@ -915,7 +916,7 @@ void TaskSketcherElements::on_listWidgetElements_mouseMoveOnItem(QListWidgetItem || item->GeometryType == Part::GeomLineSegment::getClassTypeId() || item->GeometryType == Part::GeomBSplineCurve::getClassTypeId()); - bool validedge = item->hovered == ElementType::edge && + bool validedge = item->hovered == SubElementType::edge && item->GeometryType != Part::GeomPoint::getClassTypeId(); if (validmid || validstartpoint || validendpoint || validedge) { @@ -932,13 +933,13 @@ void TaskSketcherElements::on_listWidgetElements_mouseMoveOnItem(QListWidgetItem } }; - if (item->hovered == ElementType::start) + if (item->hovered == SubElementType::start) preselectvertex(item->ElementNbr, Sketcher::PointPos::start); - else if (item->hovered == ElementType::end) + else if (item->hovered == SubElementType::end) preselectvertex(item->ElementNbr, Sketcher::PointPos::end); - else if (item->hovered == ElementType::mid) + else if (item->hovered == SubElementType::mid) preselectvertex(item->ElementNbr, Sketcher::PointPos::mid); - else if (item->hovered == ElementType::edge) { + else if (item->hovered == SubElementType::edge) { ss << "Edge" << item->ElementNbr + 1; Gui::Selection().setPreselect(doc_name.c_str(), obj_name.c_str(), ss.str().c_str()); } diff --git a/src/Mod/Sketcher/Gui/TaskSketcherElements.h b/src/Mod/Sketcher/Gui/TaskSketcherElements.h index a1a8a998c2..8cfa9c0e82 100644 --- a/src/Mod/Sketcher/Gui/TaskSketcherElements.h +++ b/src/Mod/Sketcher/Gui/TaskSketcherElements.h @@ -40,7 +40,7 @@ namespace SketcherGui { class ViewProviderSketch; class Ui_TaskSketcherElements; -enum class ElementType { edge, start, end, mid, none }; //This is to identify the type of element selected + // helper class to store additional information about the listWidget entry. class ElementItem : public QListWidgetItem @@ -54,6 +54,15 @@ class ElementItem : public QListWidgetItem External }; + // Struct to identify the selection/preselection of a subelement of the item + enum class SubElementType { + edge, + start, + end, + mid, + none + }; + ElementItem(int elementnr, int startingVertex, int midVertex, int endVertex, Base::Type geometryType, GeometryState state, const QString & lab) : ElementNbr(elementnr) @@ -66,8 +75,8 @@ class ElementItem : public QListWidgetItem , isStartingPointSelected(false) , isEndPointSelected(false) , isMidPointSelected(false) - , clickedOn(ElementType::none) - , hovered(ElementType::none) + , clickedOn(SubElementType::none) + , hovered(SubElementType::none) , rightClicked(false) , label(lab) {} @@ -89,8 +98,8 @@ class ElementItem : public QListWidgetItem bool isMidPointSelected; - ElementType clickedOn; - ElementType hovered; + SubElementType clickedOn; + SubElementType hovered; bool rightClicked; QString label; @@ -205,12 +214,13 @@ protected: Connection connectionElementsChanged; private: + using SubElementType = ElementItem::SubElementType; QWidget* proxy; std::unique_ptr ui; int focusItemIndex; int previouslySelectedItemIndex; int previouslyHoveredItemIndex; - ElementType previouslyHoveredType; + SubElementType previouslyHoveredType; bool isNamingBoxChecked; };