diff --git a/src/Gui/ActionFunction.cpp b/src/Gui/ActionFunction.cpp index 6dec5689f..7f83f98a2 100644 --- a/src/Gui/ActionFunction.cpp +++ b/src/Gui/ActionFunction.cpp @@ -37,7 +37,9 @@ namespace Gui { class ActionFunctionPrivate { public: - QMap > actionFuncMap; + QMap > triggerMap; + QMap > toggleMap; + QMap > hoverMap; }; } @@ -50,21 +52,61 @@ ActionFunction::~ActionFunction() { } -void ActionFunction::mapSignal(QAction* action, boost::function func) +void ActionFunction::trigger(QAction* action, boost::function func) { Q_D(ActionFunction); - d->actionFuncMap[action] = func; - connect(action, SIGNAL(triggered()), this, SLOT(trigger())); + d->triggerMap[action] = func; + connect(action, SIGNAL(triggered()), this, SLOT(triggered())); } -void ActionFunction::trigger() +void ActionFunction::triggered() { Q_D(ActionFunction); QAction* a = qobject_cast(sender()); - QMap >::iterator it = d->actionFuncMap.find(a); - if (it != d->actionFuncMap.end()) { + QMap >::iterator it = d->triggerMap.find(a); + if (it != d->triggerMap.end()) { + // invoke the class function here + it.value()(); + } +} + +void ActionFunction::toggle(QAction* action, boost::function func) +{ + Q_D(ActionFunction); + + d->toggleMap[action] = func; + connect(action, SIGNAL(toggled(bool)), this, SLOT(toggled(bool))); +} + +void ActionFunction::toggled(bool on) +{ + Q_D(ActionFunction); + + QAction* a = qobject_cast(sender()); + QMap >::iterator it = d->toggleMap.find(a); + if (it != d->toggleMap.end()) { + // invoke the class function here + it.value()(on); + } +} + +void ActionFunction::hover(QAction* action, boost::function func) +{ + Q_D(ActionFunction); + + d->hoverMap[action] = func; + connect(action, SIGNAL(hovered()), this, SLOT(hovered())); +} + +void ActionFunction::hovered() +{ + Q_D(ActionFunction); + + QAction* a = qobject_cast(sender()); + QMap >::iterator it = d->hoverMap.find(a); + if (it != d->hoverMap.end()) { // invoke the class function here it.value()(); } diff --git a/src/Gui/ActionFunction.h b/src/Gui/ActionFunction.h index 21b0b811b..04484b5bd 100644 --- a/src/Gui/ActionFunction.h +++ b/src/Gui/ActionFunction.h @@ -45,13 +45,13 @@ class ActionFunctionPrivate; Gui::ActionFunction* func = new Gui::ActionFunction(menu); QAction* a1 = menu->addAction(QObject::tr("Menu item 1...")); - func->mapSignal(a1, boost::bind(&MyViewProvider::doItem1, this)); + func->triggered(a1, boost::bind(&MyViewProvider::doItem1, this)); QAction* a2 = menu->addAction(QObject::tr("Menu item 2...")); - func->mapSignal(a2, boost::bind(&MyViewProvider::doItem2, this)); + func->triggered(a2, boost::bind(&MyViewProvider::doItem2, this)); QAction* a3 = menu->addAction(QObject::tr("Menu item 3...")); - func->mapSignal(a3, boost::bind(&MyViewProvider::doItem3, this)); + func->triggered(a3, boost::bind(&MyViewProvider::doItem3, this)); } \endcode @@ -71,10 +71,14 @@ public: /*! Connects the QAction's triggered() signal with the function \a func */ - void mapSignal(QAction* a, boost::function func); + void trigger(QAction* a, boost::function func); + void toggle(QAction* a, boost::function func); + void hover(QAction* a, boost::function func); private Q_SLOTS: - void trigger(); + void triggered(); + void toggled(bool); + void hovered(); private: QScopedPointer d_ptr; diff --git a/src/Mod/Mesh/Gui/ViewProvider.cpp b/src/Mod/Mesh/Gui/ViewProvider.cpp index 8c2c6cf75..1312fdc80 100644 --- a/src/Mod/Mesh/Gui/ViewProvider.cpp +++ b/src/Mod/Mesh/Gui/ViewProvider.cpp @@ -79,6 +79,7 @@ #include #include #include +#include #include #include @@ -92,6 +93,7 @@ #include #include #include +#include #include "ViewProvider.h" #include "SoFCIndexedFaceSet.h" @@ -577,8 +579,13 @@ bool ViewProviderMesh::exportToVrml(const char* filename, const MeshCore::Materi void ViewProviderMesh::setupContextMenu(QMenu* menu, QObject* receiver, const char* member) { ViewProviderGeometryObject::setupContextMenu(menu, receiver, member); - QAction* act = menu->addAction(QObject::tr("Display components"), receiver, member); - act->setData(QVariant((int)ViewProvider::Color)); + + // toggle command to display components + Gui::ActionFunction* func = new Gui::ActionFunction(menu); + QAction* act = menu->addAction(QObject::tr("Display components")); + act->setCheckable(true); + act->setChecked(pcMatBinding->value.getValue() == SoMaterialBinding::PER_FACE); + func->toggle(act, boost::bind(&ViewProviderMesh::setHighlightedComponents, this, _1)); } bool ViewProviderMesh::setEdit(int ModNum) @@ -1680,6 +1687,16 @@ void ViewProviderMesh::unhighlightSelection() pcShapeMaterial->diffuseColor.setValue(c.r,c.g,c.b); } +void ViewProviderMesh::setHighlightedComponents(bool on) +{ + if (on) { + highlightComponents(); + } + else { + unhighlightSelection(); + } +} + void ViewProviderMesh::highlightComponents() { const Mesh::MeshObject& rMesh = static_cast(pcObject)->Mesh.getValue(); diff --git a/src/Mod/Mesh/Gui/ViewProvider.h b/src/Mod/Mesh/Gui/ViewProvider.h index 4bb7b6ccf..6936fdec7 100644 --- a/src/Mod/Mesh/Gui/ViewProvider.h +++ b/src/Mod/Mesh/Gui/ViewProvider.h @@ -171,6 +171,7 @@ protected: void highlightSelection(); void unhighlightSelection(); void highlightComponents(); + void setHighlightedComponents(bool); virtual SoShape* getShapeNode() const; virtual SoNode* getCoordNode() const;