Attacher: rework UI

* Remove hint system on buttons. Buttons show currently selected
reference type, instead.
* Change button's caption to "Selecting..." when selecting.
* internal logic rearrangements
This commit is contained in:
DeepSOIC 2016-05-04 19:59:43 +03:00 committed by wmayer
parent f947101938
commit a392927750
2 changed files with 78 additions and 71 deletions

View File

@ -211,6 +211,14 @@ TaskDatumParameters::TaskDatumParameters(ViewProviderDatum *DatumView,QWidget *p
ui->buttonRef4->blockSignals(false); ui->buttonRef4->blockSignals(false);
ui->lineRef4->blockSignals(false); ui->lineRef4->blockSignals(false);
ui->listOfModes->blockSignals(false); ui->listOfModes->blockSignals(false);
if (pcDatum->Support.getSize() == 0){
autoNext = true;
this->iActiveRef = 0;
} else {
autoNext = false;
}
updateUI(); updateUI();
updateListOfModes(eMapMode(pcDatum->MapMode.getValue())); updateListOfModes(eMapMode(pcDatum->MapMode.getValue()));
@ -227,11 +235,6 @@ TaskDatumParameters::TaskDatumParameters(ViewProviderDatum *DatumView,QWidget *p
} }
} }
if (pcDatum->Support.getSize() == 0)
autoNext = true;
else
autoNext = false;
DatumView->setPickable(false); DatumView->setPickable(false);
// connect object deletion with slot // connect object deletion with slot
@ -314,13 +317,16 @@ void TaskDatumParameters::updateUI(std::string message, bool error)
std::vector<App::DocumentObject*> refs = pcDatum->Support.getValues(); std::vector<App::DocumentObject*> refs = pcDatum->Support.getValues();
completed = false; completed = false;
// Get hints for further required references // Get hints for further required references...
SuggestResult sugr; // DeepSOIC: hint system became useless since inertial system attachment
// modes have been introduced, becuase they accept any number of references
// of any type, so the hint will always be 'Any'. I keep the logic
// nevertheless, in case it is decided to resurrect hint system.
pcDatum->attacher().suggestMapModes(sugr); pcDatum->attacher().suggestMapModes(this->lastSuggestResult);
if (sugr.message != SuggestResult::srOK) { if (this->lastSuggestResult.message != SuggestResult::srOK) {
if(sugr.nextRefTypeHint.size() > 0) if(this->lastSuggestResult.nextRefTypeHint.size() > 0)
message = "Need more references"; message = "Need more references";
} else { } else {
completed = true; completed = true;
@ -330,53 +336,13 @@ void TaskDatumParameters::updateUI(std::string message, bool error)
Base::Vector3d val; Base::Vector3d val;
pcDatum->superPlacement.getValue().getRotation().getValue(val, angle); pcDatum->superPlacement.getValue().getRotation().getValue(val, angle);
// Enable the next reference button
int numrefs = refs.size();
ui->buttonRef2->setEnabled(numrefs >= 1);
ui->lineRef2->setEnabled(numrefs >= 1);
ui->buttonRef3->setEnabled(numrefs >= 2);
ui->lineRef3->setEnabled(numrefs >= 2);
ui->buttonRef4->setEnabled(numrefs >= 3);
ui->lineRef4->setEnabled(numrefs >= 3);
ui->labelAngle->setEnabled(true); ui->labelAngle->setEnabled(true);
ui->spinAngle->setEnabled(true); ui->spinAngle->setEnabled(true);
QString hintText = makeHintText(sugr.nextRefTypeHint); updateRefButton(0);
updateRefButton(1);
// Check if we have all required references updateRefButton(2);
if (sugr.nextRefTypeHint.size() == 0) { updateRefButton(3);
ui->buttonRef2->setEnabled(numrefs >= 2);
ui->lineRef2->setEnabled(numrefs >= 2);
ui->buttonRef3->setEnabled(numrefs >= 3);
ui->lineRef3->setEnabled(numrefs >= 3);
ui->buttonRef4->setEnabled(numrefs >= 4);
ui->lineRef4->setEnabled(numrefs >= 4);
completed = true;
}
if (hintText.size() != 0 && autoNext) {
if (numrefs == 0) {
onButtonRef1(true);
autoNext = true;
} else if (numrefs == 1) {
ui->buttonRef2->setText(hintText);
onButtonRef2(true);//will reset autonext, so...
autoNext = true;
} else if (numrefs == 2) {
ui->buttonRef3->setText(hintText);
onButtonRef3(true);//will reset autonext, so...
autoNext = true;
} else if (numrefs == 3) {
ui->buttonRef4->setText(hintText);
onButtonRef4(true);
autoNext = true;
} else if (numrefs == 4) {
onButtonRef4(false);
autoNext = false;
}
}
} }
QLineEdit* TaskDatumParameters::getLine(unsigned idx) QLineEdit* TaskDatumParameters::getLine(unsigned idx)
@ -460,6 +426,16 @@ void TaskDatumParameters::onSelectionChanged(const Gui::SelectionChanges& msg)
line->blockSignals(false); line->blockSignals(false);
} }
if (autoNext) {
if (iActiveRef == -1){
//nothing to do
} else if (iActiveRef == 4 || this->lastSuggestResult.nextRefTypeHint.size() == 0){
iActiveRef = -1;
} else {
iActiveRef++;
}
}
updateUI(message, error); updateUI(message, error);
} }
} }
@ -532,10 +508,10 @@ void TaskDatumParameters::onButtonRef(const bool checked, unsigned idx)
} else { } else {
iActiveRef = -1; iActiveRef = -1;
} }
ui->buttonRef1->setChecked(iActiveRef==0); updateRefButton(0);
ui->buttonRef2->setChecked(iActiveRef==1); updateRefButton(1);
ui->buttonRef3->setChecked(iActiveRef==2); updateRefButton(2);
ui->buttonRef4->setChecked(iActiveRef==3); updateRefButton(3);
} }
void TaskDatumParameters::onButtonRef1(const bool checked) { void TaskDatumParameters::onButtonRef1(const bool checked) {
@ -662,6 +638,39 @@ void TaskDatumParameters::onRefName(const QString& text, unsigned idx)
updateUI(); updateUI();
} }
void TaskDatumParameters::updateRefButton(int idx)
{
QAbstractButton* b;
switch(idx){
case 0: b = ui->buttonRef1; break;
case 1: b = ui->buttonRef2; break;
case 2: b = ui->buttonRef3; break;
case 3: b = ui->buttonRef4; break;
default: throw Base::Exception("button index out of range");
}
Part::Datum* pcDatum = static_cast<Part::Datum*>(DatumView->getObject());
std::vector<App::DocumentObject*> refs = pcDatum->Support.getValues();
int numrefs = refs.size();
bool enable = true;
if (idx > numrefs)
enable = false;
if (idx == numrefs && this->lastSuggestResult.nextRefTypeHint.size() == 0)
enable = false;
b->setEnabled(enable);
b->setChecked(iActiveRef == idx);
if (iActiveRef == idx) {
b->setText(tr("Selecting..."));
} else if (idx < this->lastSuggestResult.references_Types.size()){
b->setText(AttacherGui::getShapeTypeText(this->lastSuggestResult.references_Types[idx]));
} else {
b->setText(tr("Reference%1").arg(idx+1));
}
}
void TaskDatumParameters::updateListOfModes(eMapMode curMode) void TaskDatumParameters::updateListOfModes(eMapMode curMode)
{ {
//first up, remember currently selected mode. //first up, remember currently selected mode.
@ -673,15 +682,14 @@ void TaskDatumParameters::updateListOfModes(eMapMode curMode)
//obtain list of available modes: //obtain list of available modes:
Part::Datum* pcDatum = static_cast<Part::Datum*>(DatumView->getObject()); Part::Datum* pcDatum = static_cast<Part::Datum*>(DatumView->getObject());
SuggestResult sugr; this->lastSuggestResult.bestFitMode = mmDeactivated;
sugr.bestFitMode = mmDeactivated;
int lastValidModeItemIndex = mmDummy_NumberOfModes; int lastValidModeItemIndex = mmDummy_NumberOfModes;
if (pcDatum->Support.getSize() > 0){ if (pcDatum->Support.getSize() > 0){
pcDatum->attacher().suggestMapModes(sugr); pcDatum->attacher().suggestMapModes(this->lastSuggestResult);
modesInList = sugr.allApplicableModes; modesInList = this->lastSuggestResult.allApplicableModes;
//add reachable modes to the list, too, but gray them out (using lastValidModeItemIndex, later) //add reachable modes to the list, too, but gray them out (using lastValidModeItemIndex, later)
lastValidModeItemIndex = modesInList.size()-1; lastValidModeItemIndex = modesInList.size()-1;
for(std::pair<const eMapMode, refTypeStringList> &rm: sugr.reachableModes){ for(std::pair<const eMapMode, refTypeStringList> &rm: this->lastSuggestResult.reachableModes){
modesInList.push_back(rm.first); modesInList.push_back(rm.first);
} }
} else { } else {
@ -712,7 +720,7 @@ void TaskDatumParameters::updateListOfModes(eMapMode curMode)
//potential mode - can be reached by selecting more stuff //potential mode - can be reached by selecting more stuff
item->setFlags(item->flags() & ~(Qt::ItemFlag::ItemIsEnabled | Qt::ItemFlag::ItemIsSelectable)); item->setFlags(item->flags() & ~(Qt::ItemFlag::ItemIsEnabled | Qt::ItemFlag::ItemIsSelectable));
refTypeStringList &extraRefs = sugr.reachableModes[mmode]; refTypeStringList &extraRefs = this->lastSuggestResult.reachableModes[mmode];
if (extraRefs.size() == 1){ if (extraRefs.size() == 1){
QStringList buf; QStringList buf;
for(eRefType rt : extraRefs[0]){ for(eRefType rt : extraRefs[0]){
@ -725,7 +733,7 @@ void TaskDatumParameters::updateListOfModes(eMapMode curMode)
} else { } else {
item->setText(tr("%1 (add more references)").arg(item->text())); item->setText(tr("%1 (add more references)").arg(item->text()));
} }
} else if (mmode == sugr.bestFitMode){ } else if (mmode == this->lastSuggestResult.bestFitMode){
//suggested mode - make bold //suggested mode - make bold
assert (item); assert (item);
QFont fnt = item->font(); QFont fnt = item->font();
@ -748,11 +756,8 @@ Attacher::eMapMode TaskDatumParameters::getActiveMapMode()
if (sel.count() > 0) if (sel.count() > 0)
return modesInList[ui->listOfModes->row(sel[0])]; return modesInList[ui->listOfModes->row(sel[0])];
else { else {
Part::Datum* pcDatum = static_cast<Part::Datum*>(DatumView->getObject()); if (this->lastSuggestResult.message == SuggestResult::srOK)
SuggestResult sugr; return this->lastSuggestResult.bestFitMode;
pcDatum->attacher().suggestMapModes(sugr);
if (sugr.message == SuggestResult::srOK)
return sugr.bestFitMode;
else else
return mmDeactivated; return mmDeactivated;
}; };

View File

@ -98,6 +98,7 @@ private:
QLineEdit* getLine(unsigned idx); QLineEdit* getLine(unsigned idx);
void onButtonRef(const bool checked, unsigned idx); void onButtonRef(const bool checked, unsigned idx);
void onRefName(const QString& text, unsigned idx); void onRefName(const QString& text, unsigned idx);
void updateRefButton(int idx);
/** /**
* @brief updateListOfModes Fills the mode list with modes that apply to * @brief updateListOfModes Fills the mode list with modes that apply to
@ -114,9 +115,10 @@ private:
ViewProviderDatum *DatumView; ViewProviderDatum *DatumView;
// TODO fix documentation here (2015-11-10, Fat-Zer) // TODO fix documentation here (2015-11-10, Fat-Zer)
int iActiveRef; //what reference is being picked in 3d view now? -1 means no one, 0-2 means a reference is being picked. int iActiveRef; //what reference is being picked in 3d view now? -1 means no one, 0-3 means a reference is being picked.
bool autoNext;//if we should automatically switch to next reference (true after dialog launch, false afterwards) bool autoNext;//if we should automatically switch to next reference (true after dialog launch, false afterwards)
std::vector<Attacher::eMapMode> modesInList; //this list is synchronous to what is populated into listOfModes widget. std::vector<Attacher::eMapMode> modesInList; //this list is synchronous to what is populated into listOfModes widget.
Attacher::SuggestResult lastSuggestResult;
bool completed; bool completed;
typedef boost::BOOST_SIGNALS_NAMESPACE::connection Connection; typedef boost::BOOST_SIGNALS_NAMESPACE::connection Connection;