TP #4177: Context Toggle commands now toggles children if one parent is selected.

THe command names are renamed as well, to make it more clear what is going on.
p4#: 22360
This commit is contained in:
Jacob Støren 2013-09-09 11:16:36 +02:00
parent 4f70139dd4
commit dbeabc3240
2 changed files with 51 additions and 93 deletions

View File

@ -1002,9 +1002,6 @@ RimCase* RimUiTreeModelPdm::caseFromItemIndex(const QModelIndex& itemIndex)
//--------------------------------------------------------------------------------------------------
/// Set toggle state for list of model indices.
///
/// NOTE: Set toggle state directly on object, does not use setValueFromUi()
/// The caller must make sure the relevant dependencies are updated
//--------------------------------------------------------------------------------------------------
void RimUiTreeModelPdm::setObjectToggleStateForSelection(QModelIndexList selectedIndexes, int state)
{
@ -1025,36 +1022,44 @@ void RimUiTreeModelPdm::setObjectToggleStateForSelection(QModelIndexList selecte
caf::PdmObject* obj = treeItem->dataObject();
assert(obj);
if (obj && obj->objectToggleField())
if (selectedIndexes.size() != 1)
{
caf::PdmField<bool>* field = dynamic_cast<caf::PdmField<bool>* >(obj->objectToggleField());
if (field)
if (obj && obj->objectToggleField())
{
// Does not use setValueFromUi(), so the caller must make sure dependencies are updated
if (state == RimUiTreeView::TOGGLE_ON) field->setValueFromUi(true);
if (state == RimUiTreeView::TOGGLE_OFF) field->setValueFromUi(false);
if (state == RimUiTreeView::TOGGLE) field->setValueFromUi(!(field->v()));
//emitDataChanged(index);
//field->updateConnectedEditors();
/* caf::PdmObject* ownerObj = field->ownerObject();
RimReservoirView* resView = dynamic_cast<RimReservoirView*>(ownerObj);
if(resView) resViewsToUpdate.insert(resView);
else if (ownerObj)
caf::PdmField<bool>* field = dynamic_cast<caf::PdmField<bool>* >(obj->objectToggleField());
if (field)
{
ownerObj->firstAncestorOfType(resView);
if (resView) resViewsToUpdate.insert(resView);
}*/
if (state == RimUiTreeView::TOGGLE_ON) field->setValueFromUi(true);
if (state == RimUiTreeView::TOGGLE_OFF) field->setValueFromUi(false);
if (state == RimUiTreeView::TOGGLE) field->setValueFromUi(!(field->v()));
}
}
}
else
{
// If only one item is selected, loop over its children, and toggle them instead of the
// selected item directly
for (int cIdx = 0; cIdx < treeItem->childCount(); ++ cIdx)
{
caf::PdmUiTreeItem* child = treeItem->child(cIdx);
if (!child) continue;
caf::PdmObject* childObj = child->dataObject();
if (childObj && childObj->objectToggleField())
{
caf::PdmField<bool>* field = dynamic_cast<caf::PdmField<bool>* >(childObj->objectToggleField());
if (field)
{
if (state == RimUiTreeView::TOGGLE_ON) field->setValueFromUi(true);
if (state == RimUiTreeView::TOGGLE_OFF) field->setValueFromUi(false);
if (state == RimUiTreeView::TOGGLE) field->setValueFromUi(!(field->v()));
}
}
}
}
}
/* for (std::set<RimReservoirView*>::iterator it = resViewsToUpdate.begin(); it != resViewsToUpdate.end(); ++it)
{
(*it)->createDisplayModelAndRedraw();
}*/
}
//--------------------------------------------------------------------------------------------------

View File

@ -1480,9 +1480,23 @@ void RimUiTreeView::appendToggleItemActions(QMenu& contextMenu)
contextMenu.addSeparator();
}
contextMenu.addAction(QString("Toggle"), this, SLOT(slotToggleItems()));
contextMenu.addAction(QString("Toggle All On"), this, SLOT(slotToggleItemsOn()));
contextMenu.addAction(QString("Toggle All Off"), this, SLOT(slotToggleItemsOff()));
if (selectionModel()->selectedIndexes().size() > 1)
{
contextMenu.addAction(QString("On"), this, SLOT(slotToggleItemsOn()));
contextMenu.addAction(QString("Off"), this, SLOT(slotToggleItemsOff()));
contextMenu.addAction(QString("Toggle"), this, SLOT(slotToggleItems()));
}
else
{
QModelIndex mIdx = selectionModel()->selectedIndexes()[0];
caf::PdmUiTreeItem* treeItem = caf::UiTreeModelPdm::getTreeItemFromIndex(mIdx);
if (treeItem && treeItem->childCount())
{
contextMenu.addAction(QString("Sub Items On"), this, SLOT(slotToggleItemsOn()));
contextMenu.addAction(QString("Sub Items Off"), this, SLOT(slotToggleItemsOff()));
contextMenu.addAction(QString("Toggle Sub items"), this, SLOT(slotToggleItems()));
}
}
}
}
@ -1499,72 +1513,11 @@ void RimUiTreeView::slotToggleItems()
//--------------------------------------------------------------------------------------------------
void RimUiTreeView::executeSelectionToggleOperation(SelectionToggleType toggleState)
{
/*
int nextCheckBoxState = 0;
if (toggleState == TOGGLE_ON)
{
nextCheckBoxState = Qt::Checked;
}
else if (toggleState == TOGGLE_OFF)
{
nextCheckBoxState = Qt::Unchecked;
}
else if (toggleState == TOGGLE)
{
QModelIndex curr = currentIndex();
// Check if the current model index supports checkable items
if (model()->flags(curr) & Qt::ItemIsUserCheckable)
{
QModelIndexList selectedIndexes = selectionModel()->selectedIndexes();
if (selectedIndexes.contains(curr))
{
QVariant currentState = model()->data(curr, Qt::CheckStateRole);
int state = currentState.toInt();
if (state == Qt::Checked)
{
nextCheckBoxState = Qt::Unchecked;
}
else
{
nextCheckBoxState = Qt::Checked;
}
}
}
}
*/
RimUiTreeModelPdm* myModel = dynamic_cast<RimUiTreeModelPdm*>(model());
// caf::PdmUiTreeItem* uiItem = myModel->getTreeItemFromIndex(currentIndex());
// Special handling for wells
// Set toggle state for all wells without triggering model update,
// and perform a single display model update at last
//RimWell* well = dynamic_cast<RimWell*>(uiItem->dataObject().p());
//if (well)
{
myModel->setObjectToggleStateForSelection(selectionModel()->selectedIndexes(), toggleState);
myModel->setObjectToggleStateForSelection(selectionModel()->selectedIndexes(), toggleState);
//RimReservoirView* reservoirView = NULL;
//well->firstAncestorOfType(reservoirView);
//if (reservoirView)
//{
// reservoirView->createDisplayModelAndRedraw();
//}
return;
}
/*
foreach (QModelIndex index, selectionModel()->selectedIndexes())
{
if (!index.isValid())
{
continue;
}
myModel->setData(index, nextCheckBoxState, Qt::CheckStateRole);
}
*/
return;
}
//--------------------------------------------------------------------------------------------------