From 5a071521a51578639a6ce7c92786eb9bd7afede6 Mon Sep 17 00:00:00 2001 From: vsv Date: Wed, 6 Dec 2017 14:04:09 +0300 Subject: [PATCH] Provide icons for groups with different shape types --- src/CollectionPlugin/plugin-Collection.xml | 5 +++-- src/Config/Config_FeatureMessage.cpp | 13 +++++++++++++ src/Config/Config_FeatureMessage.h | 7 +++++++ src/Config/Config_FeatureReader.cpp | 2 ++ src/Config/Config_Keywords.h | 1 + src/GeomAPI/GeomAPI_Shape.cpp | 17 +++++++++++++++++ src/GeomAPI/GeomAPI_Shape.h | 6 +++++- src/PartSet/CMakeLists.txt | 1 + src/PartSet/PartSet_IconFactory.cpp | 15 +++++++++++++++ src/PartSet/PartSet_icons.qrc | 5 +++++ src/PartSet/icons/group_edge.png | Bin 0 -> 360 bytes src/PartSet/icons/group_face.png | Bin 0 -> 471 bytes src/PartSet/icons/group_solid.png | Bin 0 -> 431 bytes src/PartSet/icons/group_vertex.png | Bin 0 -> 529 bytes src/XGUI/XGUI_ActionsMgr.cpp | 5 +++++ src/XGUI/XGUI_ActionsMgr.h | 9 +++++---- src/XGUI/XGUI_ErrorMgr.cpp | 3 +++ src/XGUI/XGUI_PropertyPanel.cpp | 16 ++++++++++------ src/XGUI/XGUI_PropertyPanel.h | 3 +++ src/XGUI/XGUI_Workshop.cpp | 18 ++++++++++++++++++ src/XGUI/XGUI_Workshop.h | 4 ++++ src/XGUI/XGUI_pictures.qrc | 1 + src/XGUI/pictures/button_ok-plus.png | Bin 0 -> 603 bytes 23 files changed, 118 insertions(+), 13 deletions(-) create mode 100644 src/PartSet/icons/group_edge.png create mode 100644 src/PartSet/icons/group_face.png create mode 100644 src/PartSet/icons/group_solid.png create mode 100644 src/PartSet/icons/group_vertex.png create mode 100644 src/XGUI/pictures/button_ok-plus.png diff --git a/src/CollectionPlugin/plugin-Collection.xml b/src/CollectionPlugin/plugin-Collection.xml index 215a6b60c..156c1bbd4 100644 --- a/src/CollectionPlugin/plugin-Collection.xml +++ b/src/CollectionPlugin/plugin-Collection.xml @@ -25,13 +25,14 @@ email : webmaster.salome@opencascade.com + icon="icons/Collection/shape_group.png" + apply_continue="true"> diff --git a/src/Config/Config_FeatureMessage.cpp b/src/Config/Config_FeatureMessage.cpp index ae86d8b94..c944bc6d4 100644 --- a/src/Config/Config_FeatureMessage.cpp +++ b/src/Config/Config_FeatureMessage.cpp @@ -36,6 +36,8 @@ Config_FeatureMessage::Config_FeatureMessage(const Events_ID theId, const void* myInternal = false; myUseInput = false; myNestedFeatures = ""; + myModal = false; + myIsApplyContinue = false; } Config_FeatureMessage::~Config_FeatureMessage() @@ -153,6 +155,12 @@ bool Config_FeatureMessage::isModal() const return myModal; } +bool Config_FeatureMessage::isApplyContinue() const +{ + return myIsApplyContinue; +} + + void Config_FeatureMessage::setUseInput(bool isUseInput) { myUseInput = isUseInput; @@ -192,3 +200,8 @@ void Config_FeatureMessage::setAutoPreview(bool isAutoPreview) { myIsAutoPreview = isAutoPreview; } + +void Config_FeatureMessage::setApplyContinue(bool isModal) +{ + myIsApplyContinue = isModal; +} \ No newline at end of file diff --git a/src/Config/Config_FeatureMessage.h b/src/Config/Config_FeatureMessage.h index a4c610551..3bbe0a5fa 100644 --- a/src/Config/Config_FeatureMessage.h +++ b/src/Config/Config_FeatureMessage.h @@ -52,6 +52,7 @@ class Config_FeatureMessage : public Events_Message bool myInternal; ///setModal(getBooleanAttribute(theFeatureNode, FEATURE_MODAL, false)); bool isAutoPreview = getBooleanAttribute(theFeatureNode, FEATURE_AUTO_PREVIEW, true); outFeatureMessage->setAutoPreview(isAutoPreview); + outFeatureMessage->setApplyContinue( + getBooleanAttribute(theFeatureNode, FEATURE_APPLY_CONTINUE, false)); bool isInternal = getBooleanAttribute(theFeatureNode, ATTR_INTERNAL, false); outFeatureMessage->setInternal(isInternal); diff --git a/src/Config/Config_Keywords.h b/src/Config/Config_Keywords.h index cd2253bfe..2e8261fef 100644 --- a/src/Config/Config_Keywords.h +++ b/src/Config/Config_Keywords.h @@ -77,6 +77,7 @@ const static char* FEATURE_WHEN_NESTED_ACCEPT = "accept"; const static char* FEATURE_WHEN_NESTED_ABORT = "abort"; const static char* FEATURE_DOC = WORKBENCH_DOC; const static char* FEATURE_MODAL = "modal"; +const static char* FEATURE_APPLY_CONTINUE = "apply_continue"; const static char* FEATURE_AUTO_PREVIEW = "auto_preview"; // NODE_VALIDATOR properties const static char* _PARAMETERS = "parameters"; diff --git a/src/GeomAPI/GeomAPI_Shape.cpp b/src/GeomAPI/GeomAPI_Shape.cpp index f66a6a1e6..f9b01ceb6 100644 --- a/src/GeomAPI/GeomAPI_Shape.cpp +++ b/src/GeomAPI/GeomAPI_Shape.cpp @@ -129,6 +129,23 @@ bool GeomAPI_Shape::isCompoundOfSolids() const return isAtLeastOne; } +GeomAPI_Shape::ShapeType GeomAPI_Shape::typeOfCompoundShapes() const +{ + const TopoDS_Shape& aShape = const_cast(this)->impl(); + if (aShape.IsNull() || aShape.ShapeType() != TopAbs_COMPOUND) + return SHAPE; + int aType = -1; + for(TopoDS_Iterator aSubs(aShape); aSubs.More(); aSubs.Next()) { + if (!aSubs.Value().IsNull()) { + if (aType == -1) + aType = aSubs.Value().ShapeType(); + else if (aSubs.Value().ShapeType() != aType) + return SHAPE; + } + } + return (GeomAPI_Shape::ShapeType) aType; +} + // adds the nopt-compound elements recursively to the list static void addSimpleToList(const TopoDS_Shape& theShape, NCollection_List& theList) { diff --git a/src/GeomAPI/GeomAPI_Shape.h b/src/GeomAPI/GeomAPI_Shape.h index 242a85bc7..7a1f99997 100644 --- a/src/GeomAPI/GeomAPI_Shape.h +++ b/src/GeomAPI/GeomAPI_Shape.h @@ -147,9 +147,13 @@ public: GEOMAPI_EXPORT bool isIntersect(const std::shared_ptr theShape) const; - // Translates the shape along the direction for the given offset + /// Translates the shape along the direction for the given offset GEOMAPI_EXPORT void translate(const std::shared_ptr theDir, const double theOffset); + + /// Returns type of shapes in the compound. + // If shapes are of different type then it will return SHAPE type + GEOMAPI_EXPORT ShapeType typeOfCompoundShapes() const; }; //! Pointer on list of shapes diff --git a/src/PartSet/CMakeLists.txt b/src/PartSet/CMakeLists.txt index 8bb95e123..389f4904f 100644 --- a/src/PartSet/CMakeLists.txt +++ b/src/PartSet/CMakeLists.txt @@ -159,6 +159,7 @@ INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/src/XGUI ${PROJECT_SOURCE_DIR}/src/FeaturesPlugin ${PROJECT_SOURCE_DIR}/src/PartSetPlugin ${PROJECT_SOURCE_DIR}/src/GeomAPI + ${PROJECT_SOURCE_DIR}/src/CollectionPlugin ${CAS_INCLUDE_DIRS} ${SUIT_INCLUDE} ) diff --git a/src/PartSet/PartSet_IconFactory.cpp b/src/PartSet/PartSet_IconFactory.cpp index 5543d6902..42b3d4d62 100644 --- a/src/PartSet/PartSet_IconFactory.cpp +++ b/src/PartSet/PartSet_IconFactory.cpp @@ -29,6 +29,8 @@ #include #include +#include + QMap PartSet_IconFactory::myIcons; PartSet_IconFactory::PartSet_IconFactory():ModuleBase_IconFactory() @@ -94,6 +96,19 @@ QIcon PartSet_IconFactory::getIcon(ObjectPtr theObj) if(aShape.get()) { switch(aShape->shapeType()) { case GeomAPI_Shape::COMPOUND: { + FeaturePtr aFeature = ModelAPI_Feature::feature(theObj); + if (aFeature.get() && aFeature->getKind() == CollectionPlugin_Group::ID()) { + switch (aShape->typeOfCompoundShapes()) { + case GeomAPI_Shape::VERTEX: + return QIcon(":icons/group_vertex.png"); + case GeomAPI_Shape::EDGE: + return QIcon(":icons/group_edge.png"); + case GeomAPI_Shape::FACE: + return QIcon(":icons/group_face.png"); + case GeomAPI_Shape::SOLID: + return QIcon(":icons/group_solid.png"); + } + } ResultBodyPtr aBody = std::dynamic_pointer_cast(aResult); if (aBody.get() && aBody->isConnectedTopology()) return QIcon(":pictures/compoundofsolids.png"); diff --git a/src/PartSet/PartSet_icons.qrc b/src/PartSet/PartSet_icons.qrc index ae23920e5..9b19b30a5 100644 --- a/src/PartSet/PartSet_icons.qrc +++ b/src/PartSet/PartSet_icons.qrc @@ -14,5 +14,10 @@ icons/sketch_shape.png icons/expression.png icons/paper_roll.png + + icons/group_edge.png + icons/group_face.png + icons/group_solid.png + icons/group_vertex.png diff --git a/src/PartSet/icons/group_edge.png b/src/PartSet/icons/group_edge.png new file mode 100644 index 0000000000000000000000000000000000000000..b670cd45f633b14c1a261d494d26f2647ea3923b GIT binary patch literal 360 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b zK=oHan9=rH#7Cf@WQl7;NpOBzNqJ&XDnmhHW?qS2UTTSgiJpO;q2-lpn^J&^o_e}C zhFJLbPV(hCWFXRVRVzwB@Q?P6j|Pu+RS15ccR;v;ZN0*d;-}~4iWfdT^keUYDJpiV z%<-ACXTHpyeXS;TcFQ8s6B5D`fBo&%n-b8W84@KRB-ZnQBYH*5H81We6=}Z>&Ej(s z9(>BW(0pF**1IH5@ruKuZJ7>>E4w--)U->V2#Hh;JIkqL(&(PospS-!cXIk4r##Ok zC4t(7VX>J9`zP(&{Mw7#r6sL^{pV5k8BX$Ekv(xo+JhcWzN;l{lgO{VK{-vd<3pZ9 z*(=GE^G8@8-k9~_TLNS9iyLcXoc@V+B-Q8IWtEmheCnNb3Fu)4Pgg&ebxsLQ0N=EX AcK`qY literal 0 HcmV?d00001 diff --git a/src/PartSet/icons/group_face.png b/src/PartSet/icons/group_face.png new file mode 100644 index 0000000000000000000000000000000000000000..68d152e37a4439d244575a82dd3270713c61e9c9 GIT binary patch literal 471 zcmV;|0Vw{7P)N2bZe?^J zG%heMF*(%MvSa`N0aQsuK~y+TV-Rx*_>YVkkN}X+2*OY<7$Br_C)ogW3^o9p1SuHK0Gh@n?-RLRIUr^~5FY^IL((2$k7c~V?kfkx z9#IL5JqpCffcQ8RpOp8B*abI0!8dBDUq#!Gt_}PDcW*d=f_pa|g5$o;hyV9)Is8Am zdD1^QpNQLF&5~|Gp*j(%Up8HN`hWY)R|N6mW7q!!ZT}2(wI;~vazK+l&N*-aL*bU| z&;M_|{sK+x#ed`YoKKSO!Ra8&K~6tcI%oCYZ8u(m6@wIPzWNM|Hv(O>@$!@Z>n}b2 zzy9K*|LZP1{2$*w?FTTdw!ys40CdV}plQE=_@|Ud$Pa0cknhr-q2FXYL%#w8@UyH} z*e6-<@DFm{5$}O6eG9}lfUXvV8vtXFiz!b?gTnx1jIIbBqpA=14*)y-VHL^H$20%{ N002ovPDHLkV1gnX#18-f literal 0 HcmV?d00001 diff --git a/src/PartSet/icons/group_solid.png b/src/PartSet/icons/group_solid.png new file mode 100644 index 0000000000000000000000000000000000000000..bb5f6ac93d6c8e73bc655aaadf62b346ba563123 GIT binary patch literal 431 zcmV;g0Z{&lP)N2bZe?^J zG%heMF*(%MvSa`N0W3*GK~y+TV-Rx*_>YW%fB_#yR}U5dNstO)hM^cB?-RkK91tUI z7@K8cnwV=0#tE1hsLlYx06Cus7LCwEGq-}emGK?ZekJ$J{0YY0m{>hH;XT{{5Ceo& z0%QGxYrA*$ZanyP^VMg6x88X9cN-Gke)AO^16}bQrVnm_l7I9y_oDhA2_4h_CUwn( z;u#RSd*~vu|>%*+7)g9EFl3C$JdmeSwB;{p%}zQ!s;Oje_Zlw z76Q|Yk*s$(Ge{3=O7spl0R|2f=Rt5H0xS4NnkxE5Ndh%9;mix902Bj|F-QU*MpYm1 Z9{{|4M|%NLa~%Kx002ovPDHLkV1ma^q^JM@ literal 0 HcmV?d00001 diff --git a/src/PartSet/icons/group_vertex.png b/src/PartSet/icons/group_vertex.png new file mode 100644 index 0000000000000000000000000000000000000000..63d9ef1ca6daabdb4848e8257bd244d463ac2205 GIT binary patch literal 529 zcmV+s0`C2ZP)N2bZe?^J zG%heMF*(%MvSa`N0gg#TK~y+Tg;8Bg0znitBIv`2)R{F&((<8qAA3<}w}&8SHpz%S zs27m}-+~^5mNE*0Nb3LExp!xE{U{F{?(V(koVh!jkggfT2_*gk%_jBSph3iWh-;?; z;t*~x1W3J`PzkNvzvURr~_PS8VXiv*Vdg zX!f7dhrXa^$JM*mHiDzHWTDa}oVbGLM|uy<=102zCO#vJyXZ>K-?O$65Rk^Ohg&aU z?Ic3@WE=2;ZPrkE0|e|_+X(atG|W^R1(=)G`~`OD837#xtYV9Msr;g~jRS&H2tKU& z0c+DH>)7m$LtNdbYULqj|3(PCqqOw&Htr;sQpXvXziC#e+$@2tWiK_SL-d6`vBy=J zHq}JAwI~j5SwkM~MFEo`IGO%R5zOOabKESqxJ3G?0OCBvwZnio{|kvsBbvc4rZfqA T!LW)C00000NkvXXu0mjfb!_JT literal 0 HcmV?d00001 diff --git a/src/XGUI/XGUI_ActionsMgr.cpp b/src/XGUI/XGUI_ActionsMgr.cpp index 050b3cef2..0d7a57d33 100644 --- a/src/XGUI/XGUI_ActionsMgr.cpp +++ b/src/XGUI/XGUI_ActionsMgr.cpp @@ -255,6 +255,11 @@ QAction* XGUI_ActionsMgr::operationStateAction(OperationStateActionId theId) "Apply" /*empty to show error*/, aParent); } break; + case AcceptPlus: { + aResult = ModuleBase_Tools::createAction(QIcon(":pictures/button_ok-plus.png"), + "Apply and continue" /*empty to show error*/, aParent); + } + break; case Abort: case AbortAll: { aResult = ModuleBase_Tools::createAction(QIcon(":pictures/button_cancel.png"), "Cancel", diff --git a/src/XGUI/XGUI_ActionsMgr.h b/src/XGUI/XGUI_ActionsMgr.h index 66e00d784..deeb75433 100644 --- a/src/XGUI/XGUI_ActionsMgr.h +++ b/src/XGUI/XGUI_ActionsMgr.h @@ -61,10 +61,11 @@ class XGUI_EXPORT XGUI_ActionsMgr : public QObject, public Events_Listener enum OperationStateActionId { Abort = 0, Accept = 1, - Help = 2, - AbortAll = 3, - AcceptAll = 4, - Preview = 5 + AcceptPlus = 2, + Help = 3, + AbortAll = 4, + AcceptAll = 5, + Preview = 6 }; //! Add a command in the manager. diff --git a/src/XGUI/XGUI_ErrorMgr.cpp b/src/XGUI/XGUI_ErrorMgr.cpp index 5ead6a91d..19c1135b9 100644 --- a/src/XGUI/XGUI_ErrorMgr.cpp +++ b/src/XGUI/XGUI_ErrorMgr.cpp @@ -160,12 +160,15 @@ void XGUI_ErrorMgr::updateAcceptActionState(const QString& theError) { XGUI_ActionsMgr* anActionsMgr = workshop()->actionsMgr(); QAction* anAcceptAction = anActionsMgr->operationStateAction(XGUI_ActionsMgr::Accept); + QAction* anAcceptPlusAction = + anActionsMgr->operationStateAction(XGUI_ActionsMgr::AcceptPlus); if (myAcceptAllToolTip.isEmpty() && myAcceptToolTip.isEmpty()) storeInitialActionValues(); bool anEnabled = theError.isEmpty(); anAcceptAction->setEnabled(anEnabled); + anAcceptPlusAction->setEnabled(anEnabled); anAcceptAction->setToolTip(anEnabled ? myAcceptToolTip : theError); anAcceptAction->setStatusTip(anEnabled ? myAcceptStatusTip : theError); // some operations have no property panel, so it is important to check that it is not null diff --git a/src/XGUI/XGUI_PropertyPanel.cpp b/src/XGUI/XGUI_PropertyPanel.cpp index bdc479259..e8735b730 100755 --- a/src/XGUI/XGUI_PropertyPanel.cpp +++ b/src/XGUI/XGUI_PropertyPanel.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include @@ -44,7 +45,6 @@ #include #include #include -#include #include #ifdef _DEBUG @@ -86,6 +86,7 @@ XGUI_PropertyPanel::XGUI_PropertyPanel(QWidget* theParent, XGUI_OperationMgr* th QStringList aBtnNames; aBtnNames << QString(PROP_PANEL_HELP) << QString(PROP_PANEL_OK) + << QString(PROP_PANEL_OK_PLUS) << QString(PROP_PANEL_CANCEL); foreach(QString eachBtnName, aBtnNames) { QToolButton* aBtn = new QToolButton(aFrm); @@ -209,6 +210,9 @@ void XGUI_PropertyPanel::createContentPanel(FeaturePtr theFeature) /// Apply button should be update if the feature was modified by the panel myOperationMgr->onValidateOperation(); } + std::shared_ptr aFeatureInfo = + myOperationMgr->workshop()->featureInfo(theFeature->getKind().c_str()); + findButton(PROP_PANEL_OK_PLUS)->setVisible(aFeatureInfo->isApplyContinue()); } void XGUI_PropertyPanel::activateNextWidget(ModuleBase_ModelWidget* theWidget) @@ -382,11 +386,11 @@ bool XGUI_PropertyPanel::focusNextPrevChild(bool theIsNext) findDirectChildren(this, aChildren, true); int aChildrenCount = aChildren.count(); int aFocusWidgetIndex = aChildren.indexOf(aFocusWidget); + QToolButton* anOkBtn = findButton(PROP_PANEL_OK); if (aFocusWidgetIndex >= 0) { if (theIsNext) { if (aFocusWidgetIndex == aChildrenCount-1) { // after the last widget focus should be set to "Apply" - QToolButton* anOkBtn = findButton(PROP_PANEL_OK); if (anOkBtn->isEnabled()) aNewFocusWidget = anOkBtn; else { @@ -406,7 +410,6 @@ bool XGUI_PropertyPanel::focusNextPrevChild(bool theIsNext) } else { // before the "Apply" button, the last should accept focus for consistency with "Next" - QToolButton* anOkBtn = findButton(PROP_PANEL_OK); if (aFocusWidget == anOkBtn) { aNewFocusWidget = aChildren[aChildrenCount - 1]; } @@ -515,10 +518,11 @@ void XGUI_PropertyPanel::setEditingMode(bool isEditing) void XGUI_PropertyPanel::setupActions(XGUI_ActionsMgr* theMgr) { QStringList aButtonNames; - aButtonNames << PROP_PANEL_OK << PROP_PANEL_CANCEL << PROP_PANEL_HELP << PROP_PANEL_PREVIEW; + aButtonNames << PROP_PANEL_OK<< PROP_PANEL_OK_PLUS << PROP_PANEL_CANCEL + << PROP_PANEL_HELP << PROP_PANEL_PREVIEW; QList aActionIds; - aActionIds << XGUI_ActionsMgr::Accept << XGUI_ActionsMgr::Abort << XGUI_ActionsMgr::Help - << XGUI_ActionsMgr::Preview; + aActionIds << XGUI_ActionsMgr::Accept << XGUI_ActionsMgr::AcceptPlus << XGUI_ActionsMgr::Abort + << XGUI_ActionsMgr::Help << XGUI_ActionsMgr::Preview; for (int i = 0; i < aButtonNames.size(); ++i) { QToolButton* aBtn = findButton(aButtonNames.at(i).toStdString().c_str()); QAction* anAct = theMgr->operationStateAction(aActionIds.at(i)); diff --git a/src/XGUI/XGUI_PropertyPanel.h b/src/XGUI/XGUI_PropertyPanel.h index 06dfda814..7f1f0b325 100644 --- a/src/XGUI/XGUI_PropertyPanel.h +++ b/src/XGUI/XGUI_PropertyPanel.h @@ -42,6 +42,9 @@ const static char* PROP_PANEL = "property_panel_dock"; /// Internal name of Ok button const static char* PROP_PANEL_OK = "property_panel_ok"; +/// Internal name of Ok button +const static char* PROP_PANEL_OK_PLUS = "property_panel_ok_plus"; + /// Internal name of Cancel button const static char* PROP_PANEL_CANCEL = "property_panel_cancel"; diff --git a/src/XGUI/XGUI_Workshop.cpp b/src/XGUI/XGUI_Workshop.cpp index e3e1468c2..5ab4e495c 100755 --- a/src/XGUI/XGUI_Workshop.cpp +++ b/src/XGUI/XGUI_Workshop.cpp @@ -531,6 +531,21 @@ void XGUI_Workshop::onAcceptActionClicked() } } +//****************************************************** +void XGUI_Workshop::onAcceptPlusActionClicked() +{ + QAction* anAction = dynamic_cast(sender()); + XGUI_OperationMgr* anOperationMgr = operationMgr(); + if (anOperationMgr) { + ModuleBase_OperationFeature* aFOperation = dynamic_cast + (anOperationMgr->currentOperation()); + if (aFOperation) { + myOperationMgr->commitOperation(); + module()->launchOperation(aFOperation->id(), false); + } + } +} + //****************************************************** void XGUI_Workshop::onPreviewActionClicked() { @@ -1327,6 +1342,9 @@ void XGUI_Workshop::createDockWidgets() QAction* aOkAct = myActionsMgr->operationStateAction(XGUI_ActionsMgr::Accept); connect(aOkAct, SIGNAL(triggered()), this, SLOT(onAcceptActionClicked())); + QAction* aOkContAct = myActionsMgr->operationStateAction(XGUI_ActionsMgr::AcceptPlus); + connect(aOkContAct, SIGNAL(triggered()), this, SLOT(onAcceptPlusActionClicked())); + QAction* aCancelAct = myActionsMgr->operationStateAction(XGUI_ActionsMgr::Abort); connect(aCancelAct, SIGNAL(triggered()), myOperationMgr, SLOT(onAbortOperation())); diff --git a/src/XGUI/XGUI_Workshop.h b/src/XGUI/XGUI_Workshop.h index 871e2df12..de4266d84 100755 --- a/src/XGUI/XGUI_Workshop.h +++ b/src/XGUI/XGUI_Workshop.h @@ -484,6 +484,10 @@ private: /// the operation can be committed and do it if it returns true. void onAcceptActionClicked(); + /// Called by OkPlus button clicked in the property panel. Asks the error manager whether + /// the operation can be committed and do it if it returns true. + void onAcceptPlusActionClicked(); + /// Called by Preview button clicked in the property panel. Sends signal to model to /// compute preview. void onPreviewActionClicked(); diff --git a/src/XGUI/XGUI_pictures.qrc b/src/XGUI/XGUI_pictures.qrc index 02d5d716b..879fa4416 100644 --- a/src/XGUI/XGUI_pictures.qrc +++ b/src/XGUI/XGUI_pictures.qrc @@ -30,6 +30,7 @@ pictures/button_help.png pictures/button_ok.png pictures/button_ok_error.png + pictures/button_ok-plus.png pictures/button_plus.png pictures/assembly.png diff --git a/src/XGUI/pictures/button_ok-plus.png b/src/XGUI/pictures/button_ok-plus.png new file mode 100644 index 0000000000000000000000000000000000000000..e8df2e62408cbf084fe33ff854a35fdd10b1b219 GIT binary patch literal 603 zcmV-h0;K(kP)N2bZe?^J zG%heMF*(%MvSa`N0oX}IK~y+TW4L|$Hc41Ko`FfZl)YG~m^BZ`X2YroA6Bd2Y%Dqw z|FimB#$TO!p{-aI;le;0CEaG|-J5>9y7j)}{w!-8Xtou}M!c6v=XL?^g zpUDtevveARlK%pW$1pXZKm-LQ+yJ9y@x2poH-IIl-ERJG-=}&Ns6Y&+z@SkSE?;pf z?H4E-VRB#tBvTlq94Ba8gW1r3yY|0fi^OrDAsj$2#pfP~`T{fDxJBYLP@EaX01%;2 zz-$V1=6#qUt=EhH>(mNvb?8^S3KNT5?eYrfJsV`ra05VCwVX3NeuL*rn1;%88NXU? zmV(*sH_QKP*9a_wsRerbKa34G0EB^|U0rxM?la5~7`B_Bego)qewaF(27oZorg^m& zbAQ7$0}cGDQp}MJk^^Z(#~20xZDP`G5Z=*vIsaeVt@8i+4Wb9p)qpg@*eDV(3^asY pqk^|etD1i@kS&5Pk1*gi0{|pLL5FK!D9Qi;002ovPDHLkV1mHu1t0(b literal 0 HcmV?d00001 -- 2.39.2