implement highlighting of references

This commit is contained in:
wmayer
2017-04-17 14:18:42 +02:00
parent 884b8202ea
commit f87c6ff2db
2 changed files with 65 additions and 3 deletions

View File

@@ -25,6 +25,9 @@
#include <QAction>
#include <QMenu>
#include <QMessageBox>
#include <QTimer>
#include <TopExp.hxx>
#include <TopTools_IndexedMapOfShape.hxx>
#include <Gui/ViewProvider.h>
#include <Gui/Application.h>
@@ -34,6 +37,7 @@
#include <Base/Console.h>
#include <Gui/Control.h>
#include <Gui/BitmapFactory.h>
#include <Mod/Part/Gui/ViewProvider.h>
#include "SurfaceFilling.h"
#include "ui_SurfaceFilling.h"
@@ -124,6 +128,41 @@ QIcon ViewProviderGeomFillSurface::getIcon(void) const
return Gui::BitmapFactory().pixmap("BSplineSurf");
}
void ViewProviderGeomFillSurface::highlightReferences(bool on)
{
Surface::GeomFillSurface* surface = static_cast<Surface::GeomFillSurface*>(getObject());
auto bounds = surface->BoundaryList.getSubListValues();
for (auto it : bounds) {
Part::Feature* base = dynamic_cast<Part::Feature*>(it.first);
if (base) {
PartGui::ViewProviderPartExt* svp = dynamic_cast<PartGui::ViewProviderPartExt*>(
Gui::Application::Instance->getViewProvider(base));
if (svp) {
if (on) {
std::vector<App::Color> colors;
TopTools_IndexedMapOfShape eMap;
TopExp::MapShapes(base->Shape.getValue(), TopAbs_EDGE, eMap);
colors.resize(eMap.Extent(), svp->LineColor.getValue());
for (auto jt : it.second) {
std::size_t idx = static_cast<std::size_t>(std::stoi(jt.substr(4)) - 1);
assert (idx >= 0 && idx < colors.size());
colors[idx] = App::Color(1.0,0.0,1.0); // magenta
}
svp->setHighlightedEdges(colors);
}
else {
std::vector<App::Color> colors;
colors.push_back(svp->LineColor.getValue());
svp->setHighlightedEdges(colors);
//svp->unsetHighlightedEdges();
}
}
}
}
}
// ----------------------------------------------------------------------------
SurfaceFilling::SurfaceFilling(ViewProviderGeomFillSurface* vp, Surface::GeomFillSurface* obj)
@@ -207,6 +246,18 @@ void SurfaceFilling::changeEvent(QEvent *e)
}
void SurfaceFilling::open()
{
checkOpenCommand();
this->vp->highlightReferences(true);
Gui::Selection().clearSelection();
}
void SurfaceFilling::clearSelection()
{
Gui::Selection().clearSelection();
}
void SurfaceFilling::checkOpenCommand()
{
if (checkCommand && !Gui::Command::hasPendingCommand()) {
std::string Msg("Edit ");
@@ -228,6 +279,7 @@ void SurfaceFilling::slotRedoDocument(const Gui::Document&)
bool SurfaceFilling::accept()
{
this->vp->highlightReferences(false);
selectionMode = None;
Gui::Selection().rmvSelectionGate();
@@ -261,6 +313,7 @@ bool SurfaceFilling::accept()
bool SurfaceFilling::reject()
{
this->vp->highlightReferences(false);
selectionMode = None;
Gui::Selection().rmvSelectionGate();
@@ -289,7 +342,7 @@ void SurfaceFilling::changeFillType(GeomFill_FillingStyle fillType)
{
GeomFill_FillingStyle curtype = static_cast<GeomFill_FillingStyle>(editedObject->FillType.getValue());
if (curtype != fillType) {
open();
checkOpenCommand();
editedObject->FillType.setValue(static_cast<long>(fillType));
editedObject->recomputeFeature();
if (!editedObject->isValid()) {
@@ -316,7 +369,7 @@ void SurfaceFilling::onSelectionChanged(const Gui::SelectionChanges& msg)
return;
if (msg.Type == Gui::SelectionChanges::AddSelection) {
open();
checkOpenCommand();
if (selectionMode == Append) {
QListWidgetItem* item = new QListWidgetItem(ui->listWidget);
ui->listWidget->addItem(item);
@@ -338,6 +391,7 @@ void SurfaceFilling::onSelectionChanged(const Gui::SelectionChanges& msg)
auto element = editedObject->BoundaryList.getSubValues();
element.push_back(msg.pSubName);
editedObject->BoundaryList.setValues(objects, element);
this->vp->highlightReferences(true);
}
else {
Gui::SelectionObject sel(msg);
@@ -353,6 +407,7 @@ void SurfaceFilling::onSelectionChanged(const Gui::SelectionChanges& msg)
}
}
this->vp->highlightReferences(false);
App::DocumentObject* obj = sel.getObject();
std::string sub = msg.pSubName;
auto objects = editedObject->BoundaryList.getValues();
@@ -367,9 +422,11 @@ void SurfaceFilling::onSelectionChanged(const Gui::SelectionChanges& msg)
break;
}
}
this->vp->highlightReferences(true);
}
editedObject->recomputeFeature();
QTimer::singleShot(50, this, SLOT(clearSelection()));
}
}
@@ -378,7 +435,7 @@ void SurfaceFilling::onDeleteEdge()
int row = ui->listWidget->currentRow();
QListWidgetItem* item = ui->listWidget->item(row);
if (item) {
open();
checkOpenCommand();
QList<QVariant> data;
data = item->data(Qt::UserRole).toList();
ui->listWidget->takeItem(row);
@@ -391,6 +448,7 @@ void SurfaceFilling::onDeleteEdge()
auto element = editedObject->BoundaryList.getSubValues();
auto it = objects.begin();
auto jt = element.begin();
this->vp->highlightReferences(false);
for (; it != objects.end() && jt != element.end(); ++it, ++jt) {
if (*it == obj && *jt == sub) {
objects.erase(it);
@@ -399,6 +457,7 @@ void SurfaceFilling::onDeleteEdge()
break;
}
}
this->vp->highlightReferences(true);
}
}

View File

@@ -64,6 +64,7 @@ public:
virtual bool setEdit(int ModNum);
virtual void unsetEdit(int ModNum);
QIcon getIcon(void) const;
void highlightReferences(bool on);
};
class SurfaceFilling : public QWidget,
@@ -87,6 +88,7 @@ public:
~SurfaceFilling();
void open();
void checkOpenCommand();
bool accept();
bool reject();
void setEditedObject(Surface::GeomFillSurface* obj);
@@ -107,6 +109,7 @@ private Q_SLOTS:
void on_buttonEdgeAdd_clicked();
void on_buttonEdgeRemove_clicked();
void onDeleteEdge(void);
void clearSelection();
};
class TaskSurfaceFilling : public Gui::TaskView::TaskDialog