diff --git a/src/Gui/Stylesheets/Behave-dark.qss b/src/Gui/Stylesheets/Behave-dark.qss index 5c4e3e4da0..e18c46c2ee 100644 --- a/src/Gui/Stylesheets/Behave-dark.qss +++ b/src/Gui/Stylesheets/Behave-dark.qss @@ -1530,7 +1530,8 @@ Gui--ColorButton:pressed { } /* Pushbutton style for "..." inside Placement cell which launches Placement tool */ -Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QPushButton { +Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QPushButton, +Gui--PropertyEditor--PropertyEditor > QWidget > PushButton { background-color: #232932; border: 1px solid #232932; min-width: 16px; /* reset it due to larger value on regular QPushButton, same or bigger value as regular QPushButton min-height */ @@ -1539,6 +1540,11 @@ Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QPushButton { padding: 0px; /* reset */ } +Gui--PropertyEditor--PropertyEditor > QWidget > QPushButton { + text-align:left; + padding-left: 2px; +} + /* Fix for Expressions description QFrame that is "broken" with initial reset */ Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QWidget > QWidget > QFrame { background-color: #232932; /* main background color */ diff --git a/src/Gui/Stylesheets/Dark-blue.qss b/src/Gui/Stylesheets/Dark-blue.qss index 22e24d6864..af6b3bf5cd 100644 --- a/src/Gui/Stylesheets/Dark-blue.qss +++ b/src/Gui/Stylesheets/Dark-blue.qss @@ -1497,7 +1497,8 @@ Gui--ColorButton:pressed { } /* Pushbutton style for "..." inside Placement cell which launches Placement tool */ -Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QPushButton { +Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QPushButton, +Gui--PropertyEditor--PropertyEditor > QWidget > QPushButton { background-color: #6e6e6e; border: 1px solid #5a5a5a; min-width: 16px; /* reset it due to larger value on regular QPushButton, same or bigger value as regular QPushButton min-height */ @@ -1506,6 +1507,11 @@ Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QPushButton { padding: 0px; /* reset */ } +Gui--PropertyEditor--PropertyEditor > QWidget > QPushButton { + text-align:left; + padding-left: 2px; +} + /* Fix for Expressions description QFrame that is "broken" with initial reset */ Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QWidget > QWidget > QFrame { background-color: #6e6e6e; /* main background color */ @@ -2279,3 +2285,4 @@ Gui--UrlLabel { color : rgba(0,91,255,255); /* Deep sky blue */ text-decoration : underline; } + diff --git a/src/Gui/Stylesheets/Dark-contrast.qss b/src/Gui/Stylesheets/Dark-contrast.qss index bbb69eca74..fa5aab5121 100644 --- a/src/Gui/Stylesheets/Dark-contrast.qss +++ b/src/Gui/Stylesheets/Dark-contrast.qss @@ -1497,7 +1497,8 @@ Gui--ColorButton:pressed { } /* Pushbutton style for "..." inside Placement cell which launches Placement tool */ -Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QPushButton { +Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QPushButton, +Gui--PropertyEditor--PropertyEditor > QWidget > QPushButton { background-color: black; border: 1px solid #1e1e1e; min-width: 16px; /* reset it due to larger value on regular QPushButton, same or bigger value as regular QPushButton min-height */ @@ -1506,6 +1507,11 @@ Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QPushButton { padding: 0px; /* reset */ } +Gui--PropertyEditor--PropertyEditor > QWidget > QPushButton { + text-align:left; + padding-left: 2px; +} + /* Fix for Expressions description QFrame that is "broken" with initial reset */ Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QWidget > QWidget > QFrame { background-color: #444444; /* main background color */ diff --git a/src/Gui/Stylesheets/Dark-green.qss b/src/Gui/Stylesheets/Dark-green.qss index 82e972b618..b79e8538c8 100644 --- a/src/Gui/Stylesheets/Dark-green.qss +++ b/src/Gui/Stylesheets/Dark-green.qss @@ -1497,7 +1497,8 @@ Gui--ColorButton:pressed { } /* Pushbutton style for "..." inside Placement cell which launches Placement tool */ -Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QPushButton { +Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QPushButton, +Gui--PropertyEditor--PropertyEditor > QWidget > QPushButton { background-color: #6e6e6e; border: 1px solid #5a5a5a; min-width: 16px; /* reset it due to larger value on regular QPushButton, same or bigger value as regular QPushButton min-height */ @@ -1506,6 +1507,11 @@ Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QPushButton { padding: 0px; /* reset */ } +Gui--PropertyEditor--PropertyEditor > QWidget > QPushButton { + text-align:left; + padding-left: 2px; +} + /* Fix for Expressions description QFrame that is "broken" with initial reset */ Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QWidget > QWidget > QFrame { background-color: #6e6e6e; /* main background color */ diff --git a/src/Gui/Stylesheets/Dark-orange.qss b/src/Gui/Stylesheets/Dark-orange.qss index 99da5bfaa9..f21b7acd6b 100644 --- a/src/Gui/Stylesheets/Dark-orange.qss +++ b/src/Gui/Stylesheets/Dark-orange.qss @@ -1497,7 +1497,8 @@ Gui--ColorButton:pressed { } /* Pushbutton style for "..." inside Placement cell which launches Placement tool */ -Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QPushButton { +Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QPushButton, +Gui--PropertyEditor--PropertyEditor > QWidget > QPushButton { background-color: #6e6e6e; border: 1px solid #5a5a5a; min-width: 16px; /* reset it due to larger value on regular QPushButton, same or bigger value as regular QPushButton min-height */ @@ -1506,6 +1507,11 @@ Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QPushButton { padding: 0px; /* reset */ } +Gui--PropertyEditor--PropertyEditor > QWidget > QPushButton { + text-align:left; + padding-left: 2px; +} + /* Fix for Expressions description QFrame that is "broken" with initial reset */ Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QWidget > QWidget > QFrame { background-color: #6e6e6e; /* main background color */ diff --git a/src/Gui/Stylesheets/Darker-blue.qss b/src/Gui/Stylesheets/Darker-blue.qss index 2f08c5139f..a16c69401d 100644 --- a/src/Gui/Stylesheets/Darker-blue.qss +++ b/src/Gui/Stylesheets/Darker-blue.qss @@ -1497,7 +1497,8 @@ Gui--ColorButton:pressed { } /* Pushbutton style for "..." inside Placement cell which launches Placement tool */ -Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QPushButton { +Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QPushButton, +Gui--PropertyEditor--PropertyEditor > QWidget > QPushButton { background-color: #2a2a2a; border: 1px solid #1e1e1e; min-width: 16px; /* reset it due to larger value on regular QPushButton, same or bigger value as regular QPushButton min-height */ @@ -1506,6 +1507,11 @@ Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QPushButton { padding: 0px; /* reset */ } +Gui--PropertyEditor--PropertyEditor > QWidget > QPushButton { + text-align:left; + padding-left: 2px; +} + /* Fix for Expressions description QFrame that is "broken" with initial reset */ Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QWidget > QWidget > QFrame { background-color: #444444; /* main background color */ diff --git a/src/Gui/Stylesheets/Darker-green.qss b/src/Gui/Stylesheets/Darker-green.qss index 529fc276c7..fe57dfd86a 100644 --- a/src/Gui/Stylesheets/Darker-green.qss +++ b/src/Gui/Stylesheets/Darker-green.qss @@ -1497,7 +1497,8 @@ Gui--ColorButton:pressed { } /* Pushbutton style for "..." inside Placement cell which launches Placement tool */ -Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QPushButton { +Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QPushButton, +Gui--PropertyEditor--PropertyEditor > QWidget > QPushButton { background-color: #2a2a2a; border: 1px solid #1e1e1e; min-width: 16px; /* reset it due to larger value on regular QPushButton, same or bigger value as regular QPushButton min-height */ @@ -1506,6 +1507,11 @@ Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QPushButton { padding: 0px; /* reset */ } +Gui--PropertyEditor--PropertyEditor > QWidget > QPushButton { + text-align:left; + padding-left: 2px; +} + /* Fix for Expressions description QFrame that is "broken" with initial reset */ Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QWidget > QWidget > QFrame { background-color: #444444; /* main background color */ diff --git a/src/Gui/Stylesheets/Light-blue.qss b/src/Gui/Stylesheets/Light-blue.qss index e009d5826c..42179f870e 100644 --- a/src/Gui/Stylesheets/Light-blue.qss +++ b/src/Gui/Stylesheets/Light-blue.qss @@ -1494,7 +1494,8 @@ Gui--ColorButton:pressed { } /* Pushbutton style for "..." inside Placement cell which launches Placement tool */ -Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QPushButton { +Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QPushButton, +Gui--PropertyEditor--PropertyEditor > QWidget > QPushButton { background-color: #b6b6b6; border: 1px solid #828282; min-width: 16px; /* reset it due to larger value on regular QPushButton, same or bigger value as regular QPushButton min-height */ @@ -1503,6 +1504,11 @@ Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QPushButton { padding: 0px; /* reset */ } +Gui--PropertyEditor--PropertyEditor > QWidget > QPushButton { + text-align:left; + padding-left: 2px; +} + /* Fix for Expressions description QFrame that is "broken" with initial reset */ Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QWidget > QWidget > QFrame { background-color: #f5f5f5; /* main background color */ diff --git a/src/Gui/Stylesheets/Light-green.qss b/src/Gui/Stylesheets/Light-green.qss index e2e3c3b1cd..d573d279d9 100644 --- a/src/Gui/Stylesheets/Light-green.qss +++ b/src/Gui/Stylesheets/Light-green.qss @@ -1494,7 +1494,8 @@ Gui--ColorButton:pressed { } /* Pushbutton style for "..." inside Placement cell which launches Placement tool */ -Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QPushButton { +Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QPushButton, +Gui--PropertyEditor--PropertyEditor > QWidget > QPushButton { background-color: #b6b6b6; border: 1px solid #828282; min-width: 16px; /* reset it due to larger value on regular QPushButton, same or bigger value as regular QPushButton min-height */ @@ -1503,6 +1504,11 @@ Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QPushButton { padding: 0px; /* reset */ } +Gui--PropertyEditor--PropertyEditor > QWidget > QPushButton { + text-align:left; + padding-left: 2px; +} + /* Fix for Expressions description QFrame that is "broken" with initial reset */ Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QWidget > QWidget > QFrame { background-color: #f5f5f5; /* main background color */ diff --git a/src/Gui/Stylesheets/Light-orange.qss b/src/Gui/Stylesheets/Light-orange.qss index 00f410f979..475f45bfcc 100644 --- a/src/Gui/Stylesheets/Light-orange.qss +++ b/src/Gui/Stylesheets/Light-orange.qss @@ -1494,7 +1494,8 @@ Gui--ColorButton:pressed { } /* Pushbutton style for "..." inside Placement cell which launches Placement tool */ -Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QPushButton { +Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QPushButton, +Gui--PropertyEditor--PropertyEditor > QWidget > QPushButton { background-color: #b6b6b6; border: 1px solid #828282; min-width: 16px; /* reset it due to larger value on regular QPushButton, same or bigger value as regular QPushButton min-height */ @@ -1503,6 +1504,11 @@ Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QPushButton { padding: 0px; /* reset */ } +Gui--PropertyEditor--PropertyEditor > QWidget > QPushButton { + text-align:left; + padding-left: 2px; +} + /* Fix for Expressions description QFrame that is "broken" with initial reset */ Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QWidget > QWidget > QFrame { background-color: #f5f5f5; /* main background color */ diff --git a/src/Gui/Stylesheets/ProDark.qss b/src/Gui/Stylesheets/ProDark.qss index 0024af9d0c..3a44f4998b 100644 --- a/src/Gui/Stylesheets/ProDark.qss +++ b/src/Gui/Stylesheets/ProDark.qss @@ -1692,7 +1692,8 @@ Gui--ColorButton:pressed { } /* Pushbutton style for "..." inside Placement cell which launches Placement tool */ -Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QPushButton { +Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QPushButton, +Gui--PropertyEditor--PropertyEditor > QWidget > QPushButton { background-color: #2a2a2a; border: 1px solid #1e1e1e; min-width: 16px; /* reset it due to larger value on regular QPushButton, same or bigger value as regular QPushButton min-height */ @@ -1701,6 +1702,11 @@ Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QPushButton { padding: 0px; /* reset */ } +Gui--PropertyEditor--PropertyEditor > QWidget > QPushButton { + text-align:left; + padding-left: 2px; +} + /* Fix for Expressions description QFrame that is "broken" with initial reset */ Gui--PropertyEditor--PropertyEditor > QWidget > QWidget > QWidget > QWidget > QFrame { background-color: #333333; /* main background color */ diff --git a/src/Gui/propertyeditor/PropertyItem.cpp b/src/Gui/propertyeditor/PropertyItem.cpp index 0abc1f1c07..21c2543d7f 100644 --- a/src/Gui/propertyeditor/PropertyItem.cpp +++ b/src/Gui/propertyeditor/PropertyItem.cpp @@ -24,7 +24,7 @@ #include "PreCompiled.h" #ifndef _PreComp_ -# include +# include # include # include # include @@ -32,6 +32,10 @@ # include # include # include +# include +# include +# include +# include #endif #include "PropertyItem.h" @@ -2844,16 +2848,35 @@ void PropertyEnumItem::setValue(const QVariant& value) setPropertyValue(data); } -QWidget* PropertyEnumItem::createEditor(QWidget* parent, const QObject* receiver, const char* method) const +class EnumItems; + +struct EnumItem { + QString text; + QString fullText; + std::shared_ptr children; + EnumItem(const QString &t = QString(), const QString &f = QString()) + :text(t), fullText(f) + {} + void populate(QMenu *menu); +}; + +class EnumItems : public std::vector { - QComboBox *cb = new QComboBox(parent); - cb->setFrame(false); - cb->setDisabled(isReadOnly()); - QObject::connect(cb, SIGNAL(activated(int)), receiver, method); - return cb; +}; + +void EnumItem::populate(QMenu *menu) +{ + if (!children || children->empty()) { + auto action = menu->addAction(text); + action->setData(fullText); + return; + } + auto subMenu = menu->addMenu(text); + for (auto &item : *children) + item.populate(subMenu); } -void PropertyEnumItem::setEditorData(QWidget *editor, const QVariant& data) const +QWidget* PropertyEnumItem::createEditor(QWidget* parent, const QObject* receiver, const char* method) const { const std::vector& items = getPropertyData(); @@ -2863,7 +2886,7 @@ void PropertyEnumItem::setEditorData(QWidget *editor, const QVariant& data) cons App::PropertyEnumeration* prop = static_cast(*it); if (prop->getEnums() == nullptr) { commonModes.clear(); - break; + return nullptr; } const std::vector& value = prop->getEnumVector(); if (it == items.begin()) { @@ -2882,18 +2905,90 @@ void PropertyEnumItem::setEditorData(QWidget *editor, const QVariant& data) cons } } - QComboBox *cb = qobject_cast(editor); - if (!commonModes.isEmpty()) { - cb->clear(); - cb->addItems(commonModes); + if (commonModes.isEmpty()) + return nullptr; + + int index = -1; + std::shared_ptr enumItems; + for (auto &mode : commonModes) { + ++index; + auto fields = mode.split(QStringLiteral("|")); + if (!enumItems && fields.size() <= 1) + continue; + if (!enumItems) { + enumItems = std::make_shared(); + for (int i=0; iemplace_back(commonModes[i], mode); + } + auto children = enumItems; + int j = -1; + for (auto &field : fields) { + ++j; + field = field.trimmed(); + auto it = children->end(); + if (field.isEmpty()) { + if (children->size()) + --it; + else + continue; + } else { + it = std::find_if(children->begin(), children->end(), + [&field](const EnumItem &item) { + return item.text == field; + }); + if (it == children->end()) + it = children->emplace(children->end(), field, mode); + } + if (j + 1 == (int)fields.size()) + break; + if (!it->children) + it->children = std::make_shared(); + children = it->children; + } + } + + if (!enumItems) { + QComboBox *cb = new QComboBox(parent); + cb->setFrame(false); + cb->setDisabled(isReadOnly()); + QObject::connect(cb, SIGNAL(activated(int)), receiver, method); + return cb; + } + + auto button = new PropertyEnumButton(parent); + button->setDisabled(isReadOnly()); + QMenu *menu = new QMenu(button); + for (auto &item : *enumItems) + item.populate(menu); + button->setMenu(menu); + QObject::connect(menu, &QMenu::aboutToShow, this, [=]() { + menu->setMinimumWidth(button->width()); + }); + QObject::connect(menu, &QMenu::triggered, this, [=](QAction *action) { + button->setText(action->data().toString()); + button->picked(); + }); + QObject::connect(button, SIGNAL(picked()), receiver, method); + return button; +} + +void PropertyEnumItem::setEditorData(QWidget *editor, const QVariant& data) const +{ + if (auto cb = qobject_cast(editor)) { + cb->setEditable(false); cb->setCurrentIndex(cb->findText(data.toString())); } + else if (auto btn = qobject_cast(editor)) + btn->setText(data.toString()); } QVariant PropertyEnumItem::editorData(QWidget *editor) const { - QComboBox *cb = qobject_cast(editor); - return QVariant(cb->currentText()); + if (auto cb = qobject_cast(editor)) + return QVariant(cb->currentText()); + else if (auto btn = qobject_cast(editor)) + return btn->text(); + return QVariant(); } // --------------------------------------------------------------- diff --git a/src/Gui/propertyeditor/PropertyItem.h b/src/Gui/propertyeditor/PropertyItem.h index 6655efe23b..480d2e6a67 100644 --- a/src/Gui/propertyeditor/PropertyItem.h +++ b/src/Gui/propertyeditor/PropertyItem.h @@ -27,6 +27,8 @@ #include #include #include +#include +#include #include #include @@ -847,6 +849,18 @@ private: PropertyStringListItem* m_enum; }; +class PropertyEnumButton : public QPushButton +{ + Q_OBJECT +public: + PropertyEnumButton(QWidget *parent = nullptr) + :QPushButton(parent) + {} + +Q_SIGNALS: + void picked(); +}; + /** * Edit properties of string list type. * \author Werner Mayer