Attacher: display modes that can be reached

Attachment mode list used to display only the modes that fit current
references. Now, modes that can be reached by adding more references are
listed too, but grayed out.
This commit is contained in:
DeepSOIC 2016-05-03 02:07:05 +03:00 committed by wmayer
parent 096d285de6
commit e6911adc50
3 changed files with 29 additions and 6 deletions

View File

@ -247,7 +247,8 @@ Base::Placement AttachEngine::placementFactory(const gp_Dir &ZAxis,
eMapMode AttachEngine::listMapModes(eSuggestResult& msg,
std::vector<eMapMode>* allApplicableModes,
std::set<eRefType>* nextRefTypeHint) const
std::set<eRefType>* nextRefTypeHint,
std::set<eMapMode>* reachableModes) const
{
//replace a pointer with a valid reference, to avoid checks for zero pointer everywhere
std::vector<eMapMode> buf;
@ -263,6 +264,12 @@ eMapMode AttachEngine::listMapModes(eSuggestResult& msg,
std::set<eRefType> &hints = *nextRefTypeHint;
hints.clear();
std::set<eMapMode> buf3;
if (reachableModes == 0)
reachableModes = &buf3;
std::set<eMapMode> &mlist_reachable = *reachableModes;
mlist_reachable.clear();
std::vector<App::GeoFeature*> parts;
std::vector<const TopoDS_Shape*> shapes;
@ -305,8 +312,10 @@ eMapMode AttachEngine::listMapModes(eSuggestResult& msg,
}
}
if (score > 0 && str.size() > typeStr.size())
if (score > 0 && str.size() > typeStr.size()){
hints.insert(str[typeStr.size()]);
reachableModes->insert(eMapMode(iMode));
}
//size check is last, because we needed to collect hints
if (str.size() != typeStr.size())

View File

@ -216,10 +216,13 @@ public: //methods
* right type.
*
* @param nextRefTypeHint (output). A hint of what can be added to references.
*
* @param reachableModes (output). List of modes that can be reached by selecing more references.
*/
virtual eMapMode listMapModes(eSuggestResult &msg,
std::vector<eMapMode>* allApplicableModes = 0,
std::set<eRefType>* nextRefTypeHint = 0) const;
std::set<eRefType>* nextRefTypeHint = 0,
std::set<eMapMode> *reachableModes = 0) const;
/**
* @brief getHint function returns a set of types that user can add to

View File

@ -675,9 +675,16 @@ void TaskDatumParameters::updateListOfModes(eMapMode curMode)
//obtain list of available modes:
Part::Datum* pcDatum = static_cast<Part::Datum*>(DatumView->getObject());
eMapMode suggMode = mmDeactivated;
std::set<eMapMode> reachableModes;
int lastValidModeItemIndex = mmDummy_NumberOfModes;
if (pcDatum->Support.getSize() > 0){
eSuggestResult msg;
suggMode = pcDatum->attacher().listMapModes(msg, &modesInList);
suggMode = pcDatum->attacher().listMapModes(msg, &modesInList, 0, &reachableModes);
//add reachable modes to the list, too, but gray them out (using lastValidModeItemIndex, later)
lastValidModeItemIndex = modesInList.size()-1;
for(eMapMode m: reachableModes){
modesInList.push_back(m);
}
} else {
//no references - display all modes
modesInList.clear();
@ -702,13 +709,17 @@ void TaskDatumParameters::updateListOfModes(eMapMode curMode)
AttacherGui::getRefListForMode(pcDatum->attacher(),mmode).join(QString::fromLatin1("\n")));
if (mmode == curMode)
iSelect = ui->listOfModes->item(i);
if (mmode == suggMode){
//make it bold
if (i > lastValidModeItemIndex){
//potential mode - can be reached by selecting more stuff
item->setFlags(item->flags() & ~(Qt::ItemFlag::ItemIsEnabled | Qt::ItemFlag::ItemIsSelectable));
} else if (mmode == suggMode){
//suggested mode - make bold
assert (item);
QFont fnt = item->font();
fnt.setBold(true);
item->setFont(fnt);
}
}
}
//restore selection