Sketcher: Element widget: Improve filter widget.

This commit is contained in:
Paddle
2022-11-19 18:51:58 +01:00
committed by 0penBrain
parent ab7644441f
commit 15dd77512e
3 changed files with 135 additions and 189 deletions

View File

@@ -57,6 +57,8 @@
#include <Gui/Command.h>
#include <QWidgetAction> //to be put in _PreComp_ once grid PR merge.
using namespace SketcherGui;
using namespace Gui::TaskView;
@@ -371,7 +373,7 @@ ElementItem* ElementView::itemFromIndex(const QModelIndex& index) {
return static_cast<ElementItem*>(QListWidget::itemFromIndex(index));
}
// ----------------------------------------------------------------------------
/* ElementItem delegate ---------------------------------------------------- */
ElementItemDelegate::ElementItemDelegate(ElementView* parent) : QStyledItemDelegate(parent)
{ // This class relies on the parent being an ElementView, see getElementtItem
@@ -486,7 +488,37 @@ ElementItem* ElementItemDelegate::getElementtItem(const QModelIndex& index) cons
ElementView* elementView = static_cast<ElementView*>(parent());
return elementView->itemFromIndex(index);
}
// ----------------------------------------------------------------------------
/* Filter element list widget ------------------------------------------------------ */
ElementFilterList::ElementFilterList(QWidget* parent) : QListWidget(parent)
{
addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", "Normal"), this));
addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", "Construction"), this));
addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", "Internal"), this));
addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", "External"), this));
addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", "All types"), this));
addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", " - Point"), this));
addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", " - Line"), this));
addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", " - Circle"), this));
addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", " - Ellipse"), this));
addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", " - Arc"), this));
addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", " - Arc of ellipse"), this));
addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", " - Arc of hyperbola"), this));
addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", " - Arc of parabola"), this));
addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", " - B-Spline"), this));
for (int i = 0; i < count(); i++) {
QListWidgetItem* it = item(i);
it->setFlags(it->flags() | Qt::ItemIsUserCheckable);
it->setCheckState(Qt::Checked);
}
}
ElementFilterList::~ElementFilterList()
{
}
/* TRANSLATOR SketcherGui::TaskSketcherElements */
@@ -499,7 +531,6 @@ TaskSketcherElements::TaskSketcherElements(ViewProviderSketch *sketchView)
, previouslyHoveredItemIndex(-1)
, previouslyHoveredType(SubElementType::none)
, isNamingBoxChecked(false)
, collapseFilter(true)
{
// we need a separate container widget to add all controls to
proxy = new QWidget(this);
@@ -518,6 +549,7 @@ TaskSketcherElements::TaskSketcherElements(ViewProviderSketch *sketchView)
ui->listWidgetElements->setEditTriggers(QListWidget::NoEditTriggers);
ui->listWidgetElements->setMouseTracking(true);
createFilterButtonActions();
createSettingsButtonActions();
connectSignals();
@@ -526,23 +558,6 @@ TaskSketcherElements::TaskSketcherElements(ViewProviderSketch *sketchView)
slotElementsChanged();
// make filter items checkable
{
QSignalBlocker sigblk(ui->listMultiFilter);
for (int i = 0; i < ui->listMultiFilter->count(); i++) {
QListWidgetItem* item = ui->listMultiFilter->item(i);
item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
item->setCheckState(Qt::Checked);
}
ui->listMultiFilter->setVisible(false);
}
this->installEventFilter(this);
ui->filterBox->installEventFilter(this);
ui->listMultiFilter->installEventFilter(this);
}
TaskSketcherElements::~TaskSketcherElements()
@@ -566,7 +581,7 @@ void TaskSketcherElements::connectSignals()
this, &TaskSketcherElements::onListWidgetElementsMouseMoveOnItem
);
QObject::connect(
ui->listMultiFilter, &QListWidget::itemChanged,
filterList, &QListWidget::itemChanged,
this, &TaskSketcherElements::onListMultiFilterItemChanged
);
QObject::connect(
@@ -575,15 +590,15 @@ void TaskSketcherElements::connectSignals()
);
QObject::connect(
ui->settingsButton, &QToolButton::clicked,
this, &TaskSketcherElements::onSettingsButtonClicked
ui->settingsButton, &QToolButton::showMenu
);
QObject::connect(
qAsConst(ui->settingsButton)->actions()[0], &QAction::changed,
this, &TaskSketcherElements::onSettingsExtendedInformationChanged
);
QObject::connect(
qAsConst(ui->settingsButton)->actions()[1], &QAction::changed,
this, &TaskSketcherElements::onSettingsAutoCollapseFilterChanged
ui->filterButton, &QToolButton::clicked,
ui->filterButton, &QToolButton::showMenu
);
connectionElementsChanged = sketchView->signalElementsChanged.connect(
@@ -592,29 +607,19 @@ void TaskSketcherElements::connectSignals()
/* filter functions --------------------------------------------------- */
void TaskSketcherElements::onFilterBoxStateChanged(int val)
void TaskSketcherElements::createFilterButtonActions()
{
Q_UNUSED(val)
ui->listMultiFilter->setVisible(ui->filterBox->checkState() == Qt::Checked);
slotElementsChanged();
auto* action = new QWidgetAction(this);
filterList = new ElementFilterList(this);
action->setDefaultWidget(filterList);
qAsConst(ui->filterButton)->addAction(action);
}
bool TaskSketcherElements::eventFilter(QObject* obj, QEvent* event)
void TaskSketcherElements::onFilterBoxStateChanged(int val)
{
if (collapseFilter) {
if (obj == qobject_cast<QObject*>(ui->filterBox) && event->type() == QEvent::Enter && ui->filterBox->checkState() == Qt::Checked) {
ui->listMultiFilter->show();
}
else if (obj == qobject_cast<QObject*>(ui->listMultiFilter) && event->type() == QEvent::Leave) {
ui->listMultiFilter->hide();
}
else if (obj == this && event->type() == QEvent::Leave) {
ui->listMultiFilter->hide();
}
}
return TaskBox::eventFilter(obj, event);
Q_UNUSED(val);
ui->filterButton->setEnabled(ui->filterBox->checkState() == Qt::Checked);
slotElementsChanged();
}
enum class GeoFilterType { NormalGeos,
@@ -636,13 +641,33 @@ enum class GeoFilterType { NormalGeos,
void TaskSketcherElements::onListMultiFilterItemChanged(QListWidgetItem* item)
{
{
int start = 4; //From 4 to the end, it's the geometry types (line, circle, arc...)
QSignalBlocker sigblk(ui->listMultiFilter);
if (item == ui->listMultiFilter->item(static_cast<int>(GeoFilterType::AllGeosTypes))) {
for (int i = start; i < ui->listMultiFilter->count(); i++) {
ui->listMultiFilter->item(i)->setCheckState(item->checkState());
QSignalBlocker sigblk(filterList);
int index = filterList->row(item);
int indexOfAllTypes = static_cast<int>(GeoFilterType::AllGeosTypes);
if (index == indexOfAllTypes) {
for (int i = indexOfAllTypes + 1; i < filterList->count(); i++) {
filterList->item(i)->setCheckState(item->checkState());
}
}
else if (index > indexOfAllTypes) {
bool atLeastOneUnchecked = false;
bool atLeastOneChecked = false;
for (int i = indexOfAllTypes + 1; i < filterList->count(); i++) {
if (filterList->item(i)->checkState() == Qt::Checked)
atLeastOneChecked = true;
if (filterList->item(i)->checkState() == Qt::Unchecked)
atLeastOneUnchecked = true;
}
if (atLeastOneChecked && atLeastOneUnchecked)
filterList->item(indexOfAllTypes)->setCheckState(Qt::PartiallyChecked);
else if(atLeastOneUnchecked)
filterList->item(indexOfAllTypes)->setCheckState(Qt::Unchecked);
else if(atLeastOneChecked)
filterList->item(indexOfAllTypes)->setCheckState(Qt::Checked);
}
}
updateVisibility();
@@ -656,19 +681,19 @@ void TaskSketcherElements::setItemVisibility(QListWidgetItem* it)
using GeometryState = ElementItem::GeometryState;
if ((ui->listMultiFilter->item(static_cast<int>(GeoFilterType::NormalGeos))->checkState() == Qt::Unchecked && item->State == GeometryState::Normal) ||
(ui->listMultiFilter->item(static_cast<int>(GeoFilterType::ConstructionGeos))->checkState() == Qt::Unchecked && item->State == GeometryState::Construction) ||
(ui->listMultiFilter->item(static_cast<int>(GeoFilterType::InternalGeos))->checkState() == Qt::Unchecked && item->State == GeometryState::InternalAlignment) ||
(ui->listMultiFilter->item(static_cast<int>(GeoFilterType::ExternalGeos))->checkState() == Qt::Unchecked && item->State == GeometryState::External) ||
(ui->listMultiFilter->item(static_cast<int>(GeoFilterType::PointGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomPoint::getClassTypeId()) ||
(ui->listMultiFilter->item(static_cast<int>(GeoFilterType::LineGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomLineSegment::getClassTypeId()) ||
(ui->listMultiFilter->item(static_cast<int>(GeoFilterType::CircleGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomCircle::getClassTypeId()) ||
(ui->listMultiFilter->item(static_cast<int>(GeoFilterType::EllipseGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomEllipse::getClassTypeId()) ||
(ui->listMultiFilter->item(static_cast<int>(GeoFilterType::ArcGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomArcOfCircle::getClassTypeId()) ||
(ui->listMultiFilter->item(static_cast<int>(GeoFilterType::ArcOfEllipseGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomArcOfEllipse::getClassTypeId()) ||
(ui->listMultiFilter->item(static_cast<int>(GeoFilterType::HyperbolaGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomArcOfHyperbola::getClassTypeId()) ||
(ui->listMultiFilter->item(static_cast<int>(GeoFilterType::ParabolaGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomArcOfParabola::getClassTypeId()) ||
(ui->listMultiFilter->item(static_cast<int>(GeoFilterType::BSplineGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomBSplineCurve::getClassTypeId()) )
if ((filterList->item(static_cast<int>(GeoFilterType::NormalGeos))->checkState() == Qt::Unchecked && item->State == GeometryState::Normal) ||
(filterList->item(static_cast<int>(GeoFilterType::ConstructionGeos))->checkState() == Qt::Unchecked && item->State == GeometryState::Construction) ||
(filterList->item(static_cast<int>(GeoFilterType::InternalGeos))->checkState() == Qt::Unchecked && item->State == GeometryState::InternalAlignment) ||
(filterList->item(static_cast<int>(GeoFilterType::ExternalGeos))->checkState() == Qt::Unchecked && item->State == GeometryState::External) ||
(filterList->item(static_cast<int>(GeoFilterType::PointGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomPoint::getClassTypeId()) ||
(filterList->item(static_cast<int>(GeoFilterType::LineGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomLineSegment::getClassTypeId()) ||
(filterList->item(static_cast<int>(GeoFilterType::CircleGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomCircle::getClassTypeId()) ||
(filterList->item(static_cast<int>(GeoFilterType::EllipseGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomEllipse::getClassTypeId()) ||
(filterList->item(static_cast<int>(GeoFilterType::ArcGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomArcOfCircle::getClassTypeId()) ||
(filterList->item(static_cast<int>(GeoFilterType::ArcOfEllipseGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomArcOfEllipse::getClassTypeId()) ||
(filterList->item(static_cast<int>(GeoFilterType::HyperbolaGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomArcOfHyperbola::getClassTypeId()) ||
(filterList->item(static_cast<int>(GeoFilterType::ParabolaGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomArcOfParabola::getClassTypeId()) ||
(filterList->item(static_cast<int>(GeoFilterType::BSplineGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomBSplineCurve::getClassTypeId()) )
{
item->setHidden(true);
return;
@@ -1180,23 +1205,18 @@ void TaskSketcherElements::changeEvent(QEvent *e)
void TaskSketcherElements::createSettingsButtonActions()
{
QAction* action = new QAction(tr("Extended information"), this);
QAction* action2 = new QAction(tr("Auto collapse filter"), this);
action->setCheckable(true);
action2->setCheckable(true);
ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/Preferences/Mod/Sketcher/Elements");
{
QSignalBlocker block(this);
action->setChecked(hGrp->GetBool("ExtendedNaming", false));
action2->setChecked(hGrp->GetBool("AutoCollapseFilter", false));
}
ui->settingsButton->addAction(action);
ui->settingsButton->addAction(action2);
isNamingBoxChecked = hGrp->GetBool("ExtendedNaming", false);
collapseFilter = hGrp->GetBool("AutoCollapseFilter", true);
}
void TaskSketcherElements::onSettingsExtendedInformationChanged()
@@ -1210,25 +1230,4 @@ void TaskSketcherElements::onSettingsExtendedInformationChanged()
slotElementsChanged();
}
void TaskSketcherElements::onSettingsAutoCollapseFilterChanged()
{
QList<QAction*> acts = ui->settingsButton->actions();
collapseFilter = acts[1]->isChecked();
ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/Preferences/Mod/Sketcher/Elements");
hGrp->SetBool("AutoCollapseFilter", collapseFilter);
if (collapseFilter) {
ui->listMultiFilter->setVisible(false);
}
else {
ui->listMultiFilter->setVisible(ui->filterBox->checkState() == Qt::Checked);
}
}
void TaskSketcherElements::onSettingsButtonClicked(bool)
{
ui->settingsButton->showMenu();
}
#include "moc_TaskSketcherElements.cpp"

View File

@@ -69,7 +69,7 @@ class ElementItem : public QListWidgetItem
, StartingVertex(startingVertex)
, MidVertex(midVertex)
, EndVertex(endVertex)
, GeometryType(geometryType)
, GeometryType(std::move(geometryType))
, State(state)
, isLineSelected(false)
, isStartingPointSelected(false)
@@ -177,6 +177,16 @@ Q_SIGNALS:
void onItemHovered(QListWidgetItem *);
};
class ElementFilterList : public QListWidget
{
Q_OBJECT
public:
explicit ElementFilterList(QWidget* parent = nullptr);
~ElementFilterList() override;
};
class TaskSketcherElements : public Gui::TaskView::TaskBox, public Gui::SelectionObserver
{
Q_OBJECT
@@ -188,13 +198,12 @@ public:
/// Observer message from the Selection
void onSelectionChanged(const Gui::SelectionChanges& msg) override;
bool eventFilter(QObject* obj, QEvent* event) override;
private:
void slotElementsChanged();
void updateVisibility();
void setItemVisibility(QListWidgetItem* item);
void clearWidget();
void createFilterButtonActions();
void createSettingsButtonActions();
void connectSignals();
@@ -203,8 +212,6 @@ public Q_SLOTS:
void onListWidgetElementsItemEntered(QListWidgetItem *item);
void onListWidgetElementsMouseMoveOnItem(QListWidgetItem* item);
void onSettingsExtendedInformationChanged();
void onSettingsAutoCollapseFilterChanged();
void onSettingsButtonClicked(bool);
void onFilterBoxStateChanged(int val);
void onListMultiFilterItemChanged(QListWidgetItem* item);
@@ -224,8 +231,9 @@ private:
int previouslyHoveredItemIndex;
SubElementType previouslyHoveredType;
ElementFilterList* filterList;
bool isNamingBoxChecked;
bool collapseFilter;
};
} //namespace SketcherGui

View File

@@ -30,17 +30,48 @@
<layout class="QHBoxLayout" name="horizontalLayout1">
<item>
<widget class="QCheckBox" name="filterBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Check to activate filters</string>
<string>Check to toggle filters</string>
</property>
<property name="styleSheet">
<string notr="true">padding-bottom: 0px; margin-bottom: 0px</string>
<string notr="true">padding-right: 0px; margin-right: 0px</string>
</property>
<property name="text">
<string></string>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="filterButton">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Click to show filters</string>
</property>
<property name="styleSheet">
<string notr="true">padding-left: 0px; margin-left: 0px</string>
</property>
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Filters</string>
</property>
<property name="checked">
<bool>false</bool>
<property name="popupMode">
<enum>QToolButton::MenuButtonPopup</enum>
</property>
</widget>
</item>
@@ -69,98 +100,6 @@
</item>
</layout>
</item>
<item>
<widget class="QListWidget" name="listMultiFilter">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="styleSheet">
<string notr="true">padding-top: 0px; margin-top: 0px</string>
</property>
<property name="sizeAdjustPolicy">
<enum>QAbstractScrollArea::AdjustToContents</enum>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::NoSelection</enum>
</property>
<property name="modelColumn">
<number>0</number>
</property>
<item>
<property name="text">
<string>Normal</string>
</property>
</item>
<item>
<property name="text">
<string>Construction</string>
</property>
</item>
<item>
<property name="text">
<string>Internal</string>
</property>
</item>
<item>
<property name="text">
<string>External</string>
</property>
</item>
<item>
<property name="text">
<string>All types</string>
</property>
</item>
<item>
<property name="text">
<string> - Point</string>
</property>
</item>
<item>
<property name="text">
<string> - Line</string>
</property>
</item>
<item>
<property name="text">
<string> - Circle</string>
</property>
</item>
<item>
<property name="text">
<string> - Ellipse </string>
</property>
</item>
<item>
<property name="text">
<string> - Arc</string>
</property>
</item>
<item>
<property name="text">
<string> - Arc of ellipse</string>
</property>
</item>
<item>
<property name="text">
<string> - Arc of hyperbola</string>
</property>
</item>
<item>
<property name="text">
<string> - Arc of parabola</string>
</property>
</item>
<item>
<property name="text">
<string> - B-Spline</string>
</property>
</item>
</widget>
</item>
<item>
<widget class="ElementView" name="listWidgetElements">
<property name="sizePolicy">