From 2ec09ca1c5f8ad3ee445b0257ff52e07ba403d0d Mon Sep 17 00:00:00 2001 From: vsv Date: Mon, 4 Dec 2017 19:15:48 +0300 Subject: [PATCH] Use choice control for groups --- src/ModuleBase/ModuleBase_ChoiceCtrl.cpp | 11 +++ src/ModuleBase/ModuleBase_ChoiceCtrl.h | 41 +++++++++ .../ModuleBase_WidgetMultiSelector.cpp | 88 ++++++++++++------- .../ModuleBase_WidgetMultiSelector.h | 9 +- src/XGUI/XGUI_pictures.qrc | 4 + 5 files changed, 120 insertions(+), 33 deletions(-) diff --git a/src/ModuleBase/ModuleBase_ChoiceCtrl.cpp b/src/ModuleBase/ModuleBase_ChoiceCtrl.cpp index 4d915b801..38afff3ca 100644 --- a/src/ModuleBase/ModuleBase_ChoiceCtrl.cpp +++ b/src/ModuleBase/ModuleBase_ChoiceCtrl.cpp @@ -173,3 +173,14 @@ void ModuleBase_ChoiceCtrl::setChoiceList(const QStringList& theChoiceList) myCombo->addItems(theChoiceList); } } + +QString ModuleBase_ChoiceCtrl::textValue() const +{ + switch (myType) { + case RadioButtons: + return myButtons->checkedButton()->toolTip(); + case ComboBox: + return myCombo->currentText(); + } + return ""; +} diff --git a/src/ModuleBase/ModuleBase_ChoiceCtrl.h b/src/ModuleBase/ModuleBase_ChoiceCtrl.h index 3f9c5de9b..09530b929 100644 --- a/src/ModuleBase/ModuleBase_ChoiceCtrl.h +++ b/src/ModuleBase/ModuleBase_ChoiceCtrl.h @@ -32,6 +32,13 @@ class QComboBox; class QGroupBox; class QButtonGroup; +/** +* \ingroup GUI +* A Choice control. It provides a choice in several strings. +* It can be represented by several radiobuttons or by combo box. +* Radio buttons can be represented as by radiou buttons with text +* or by icons in toggle buttons. +*/ class MODULEBASE_EXPORT ModuleBase_ChoiceCtrl: public QWidget { Q_OBJECT @@ -41,36 +48,70 @@ public: ComboBox }; + /** + * Constructor + * \param theParent a parent widget + * \param theChoiceList a list of choice strings + * \param theIconsList a list of icon names for radiou buttons + * \param theType a type of choice representation + * \param theButtonsDir direction of radio buttons placement + */ ModuleBase_ChoiceCtrl(QWidget* theParent, const QStringList& theChoiceList, const QStringList& theIconsList, ControlType theType = RadioButtons, Qt::Orientation theButtonsDir = Qt::Horizontal); + /// Set label for the controls. + /// It is a label for combo box and title for group of radio buttons. + /// \param theText a text of the label void setLabel(const QString& theText); + /// Set Icon for the label. Used only for combo box. + /// \param theIcon a name of icon void setLabelIcon(const QString& theIcon); + /// Set value: Id of button or item of combo box. + /// \param theVal a value (from 0 to number of items) void setValue(int theVal); + /// Set tool tip for label. Used only for combo box. void setTooltip(QString theTip); + /// Returns currently selected value int value() const; + /// Returns text of currently selected value + QString textValue() const; + + /// Transfer focus on itself bool focusTo(); + /// Returns controls for activation QList getControls() const; + /// Set list of choice + /// \param theChoiceList a string list of items void setChoiceList(const QStringList& theChoiceList); signals: + /// A signal raised on change of current value void valueChanged(int theVal); private: + /// Control type ControlType myType; + + /// A label for cmbo box QLabel* myLabel; + + /// A combo box represerntation of control QComboBox* myCombo; + + /// A group box for radio buttons QGroupBox* myGroupBox; + + /// A group of buttons QButtonGroup* myButtons; }; diff --git a/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp b/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp index 973b9b6ec..fd4fd7bcb 100755 --- a/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp +++ b/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -117,34 +118,56 @@ void printHistoryInfo(const QString& theMethodName, int theCurrentHistoryIndex, } #endif + +QStringList getIconsList(const QStringList& theNames) +{ + QStringList aIcons; + foreach (QString aName, theNames) { + QString aUName = aName.toUpper(); + if ((aUName == "VERTICES") || (aUName == "VERTEX")) + aIcons << ":pictures/vertex32.png"; + else if ((aUName == "EDGES") || (aUName == "EDGE")) + aIcons << ":pictures/edge32.png"; + else if ((aUName == "FACES") || (aUName == "FACE")) + aIcons << ":pictures/face32.png"; + else if ((aUName == "SOLIDS") || (aUName == "SOLID")) + aIcons << ":pictures/solid32.png"; + } + return aIcons; +} + + + ModuleBase_WidgetMultiSelector::ModuleBase_WidgetMultiSelector(QWidget* theParent, ModuleBase_IWorkshop* theWorkshop, const Config_WidgetAPI* theData) : ModuleBase_WidgetSelector(theParent, theWorkshop, theData), myIsSetSelectionBlocked(false), myCurrentHistoryIndex(-1) { + std::string aPropertyTypes = theData->getProperty("type_choice"); + QString aTypesStr = aPropertyTypes.c_str(); + myShapeTypes = aTypesStr.split(' ', QString::SkipEmptyParts); + myIsUseChoice = theData->getBooleanAttribute("use_choice", false); + QGridLayout* aMainLay = new QGridLayout(this); ModuleBase_Tools::adjustMargins(aMainLay); - QLabel* aTypeLabel = new QLabel(tr("Type"), this); - aMainLay->addWidget(aTypeLabel, 0, 0); - - myTypeCombo = new QComboBox(this); - // There is no sense to parameterize list of types while we can not parameterize selection mode + //QLabel* aTypeLabel = new QLabel(tr("Type"), this); + //aMainLay->addWidget(aTypeLabel, 0, 0); - std::string aPropertyTypes = theData->getProperty("type_choice"); - QString aTypesStr = aPropertyTypes.c_str(); - QStringList aShapeTypes = aTypesStr.split(' ', QString::SkipEmptyParts); + //myTypeCombo = new QComboBox(this); + QStringList aIconsList = getIconsList(myShapeTypes); + myTypeCtrl = new ModuleBase_ChoiceCtrl(this, myShapeTypes, aIconsList); + myTypeCtrl->setLabel(tr("Type")); + myTypeCtrl->setValue(0); - myIsUseChoice = theData->getBooleanAttribute("use_choice", false); - - if (!aShapeTypes.empty()) - myTypeCombo->addItems(aShapeTypes); - aMainLay->addWidget(myTypeCombo, 0, 1); + // There is no sense to parameterize list of types while we can not parameterize selection mode + //if (!aShapeTypes.empty()) + // myTypeCombo->addItems(aShapeTypes); + aMainLay->addWidget(myTypeCtrl, 0, 0, 1, 2); // if the xml definition contains one type, the controls to select a type should not be shown - if (aShapeTypes.size() <= 1 || !myIsUseChoice) { - aTypeLabel->setVisible(false); - myTypeCombo->setVisible(false); + if (myShapeTypes.size() <= 1 || !myIsUseChoice) { + myTypeCtrl->setVisible(false); } QString aLabelText = translate(theData->getProperty("label")); @@ -152,7 +175,7 @@ ModuleBase_WidgetMultiSelector::ModuleBase_WidgetMultiSelector(QWidget* theParen aMainLay->addWidget(aListLabel, 1, 0); // if the xml definition contains one type, an information label // should be shown near to the latest - if (aShapeTypes.size() <= 1) { + if (myShapeTypes.size() <= 1) { QString aLabelIcon = QString::fromStdString(theData->widgetIcon()); if (!aLabelIcon.isEmpty()) { QLabel* aSelectedLabel = new QLabel("", this); @@ -174,7 +197,7 @@ ModuleBase_WidgetMultiSelector::ModuleBase_WidgetMultiSelector(QWidget* theParen //aMainLay->addWidget(new QLabel(this)); //FIXME(sbh)??? //aMainLay->setRowMinimumHeight(3, 20); //this->setLayout(aMainLay); - connect(myTypeCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(onSelectionTypeChanged())); + connect(myTypeCtrl, SIGNAL(valueChanged(int)), this, SLOT(onSelectionTypeChanged())); myCopyAction = ModuleBase_Tools::createAction(QIcon(":pictures/copy.png"), tr("Copy"), myWorkshop->desktop(), this, SLOT(onCopyItem())); @@ -230,7 +253,8 @@ bool ModuleBase_WidgetMultiSelector::storeValueCustom() std::string aType = anAttribute->attributeType(); if (aType == ModelAPI_AttributeSelectionList::typeId()) { AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID()); - aSelectionListAttr->setSelectionType(myTypeCombo->currentText().toStdString()); + //aSelectionListAttr->setSelectionType(myTypeCombo->currentText().toStdString()); + aSelectionListAttr->setSelectionType(myTypeCtrl->textValue().toStdString()); } return true; } @@ -498,7 +522,7 @@ void ModuleBase_WidgetMultiSelector::onSelectionTypeChanged() std::string aType = anAttribute->attributeType(); if (aType == ModelAPI_AttributeSelectionList::typeId()) { AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID()); - aSelectionListAttr->setSelectionType(myTypeCombo->currentText().toStdString()); + aSelectionListAttr->setSelectionType(myTypeCtrl->textValue().toStdString()); } // clear attribute values @@ -630,12 +654,13 @@ QIntList ModuleBase_WidgetMultiSelector::shapeTypes() const { QIntList aShapeTypes; - if (myTypeCombo->count() > 1 && myIsUseChoice) { - aShapeTypes.append(ModuleBase_Tools::shapeType(myTypeCombo->currentText())); + if (myShapeTypes.length() > 1 && myIsUseChoice) { + aShapeTypes.append(ModuleBase_Tools::shapeType(myTypeCtrl->textValue())); } else { - for (int i = 0, aCount = myTypeCombo->count(); i < aCount; i++) - aShapeTypes.append(ModuleBase_Tools::shapeType(myTypeCombo->itemText(i))); + foreach (QString aType, myShapeTypes) { + aShapeTypes.append(ModuleBase_Tools::shapeType(aType)); + } } return aShapeTypes; } @@ -645,18 +670,21 @@ void ModuleBase_WidgetMultiSelector::setCurrentShapeType(const int theShapeType) { QString aShapeTypeName; - for (int idx = 0; idx < myTypeCombo->count(); ++idx) { - aShapeTypeName = myTypeCombo->itemText(idx); + //for (int idx = 0; idx < myTypeCombo->count(); ++idx) { + // aShapeTypeName = myTypeCombo->itemText(idx); + int idx = 0; + foreach (QString aShapeTypeName, myShapeTypes) { int aRefType = ModuleBase_Tools::shapeType(aShapeTypeName); - if(aRefType == theShapeType && idx != myTypeCombo->currentIndex()) { + if(aRefType == theShapeType && idx != myTypeCtrl->value()) { bool aWasActivated = activateSelectionAndFilters(false); - bool isBlocked = myTypeCombo->blockSignals(true); - myTypeCombo->setCurrentIndex(idx); - myTypeCombo->blockSignals(isBlocked); + bool isBlocked = myTypeCtrl->blockSignals(true); + myTypeCtrl->setValue(idx); + myTypeCtrl->blockSignals(isBlocked); if (aWasActivated) activateSelectionAndFilters(true); break; } + idx++; } } diff --git a/src/ModuleBase/ModuleBase_WidgetMultiSelector.h b/src/ModuleBase/ModuleBase_WidgetMultiSelector.h index 74b0ff510..ca4830e67 100755 --- a/src/ModuleBase/ModuleBase_WidgetMultiSelector.h +++ b/src/ModuleBase/ModuleBase_WidgetMultiSelector.h @@ -38,9 +38,10 @@ class QWidget; class QListWidget; -class QComboBox; +//class QComboBox; class ModuleBase_IWorkshop; class QAction; +class ModuleBase_ChoiceCtrl; /** @@ -218,8 +219,10 @@ protected: /// List control QListWidget* myListControl; - /// Combobox of types - QComboBox* myTypeCombo; + QStringList myShapeTypes; + + /// Control for types + ModuleBase_ChoiceCtrl* myTypeCtrl; /// Provides correspondance between Result object and its shape typedef QPair GeomSelection; diff --git a/src/XGUI/XGUI_pictures.qrc b/src/XGUI/XGUI_pictures.qrc index d2f9f767e..02d5d716b 100644 --- a/src/XGUI/XGUI_pictures.qrc +++ b/src/XGUI/XGUI_pictures.qrc @@ -62,5 +62,9 @@ pictures/eyeopen.png pictures/transparency.png + pictures/solid32.png + pictures/face32.png + pictures/edge32.png + pictures/vertex32.png -- 2.30.2