#3285 Make context menu on table views work correctly with multiple contexts.

This commit is contained in:
Gaute Lindkvist
2018-08-30 08:23:14 +02:00
parent 417ef314b4
commit 8e73f132cf
4 changed files with 57 additions and 22 deletions

View File

@@ -153,9 +153,17 @@ void PdmUiTableView::enableHeaderText(bool enable)
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void PdmUiTableView::setSelectionLevel(int selectionLevel) void PdmUiTableView::setTableSelectionLevel(int selectionLevel)
{ {
m_listViewEditor->setSelectionLevel(selectionLevel); m_listViewEditor->setTableSelectionLevel(selectionLevel);
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void PdmUiTableView::setRowSelectionLevel(int selectionLevel)
{
m_listViewEditor->setRowSelectionLevel(selectionLevel);
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@@ -68,7 +68,8 @@ public:
void setChildArrayField(PdmChildArrayFieldHandle* childArrayField); void setChildArrayField(PdmChildArrayFieldHandle* childArrayField);
void setUiConfigurationName(QString uiConfigName); void setUiConfigurationName(QString uiConfigName);
void enableHeaderText(bool enable); void enableHeaderText(bool enable);
void setSelectionLevel(int selectionLevel); void setTableSelectionLevel(int selectionLevel);
void setRowSelectionLevel(int selectionLevel);
PdmObjectHandle* pdmObjectFromModelIndex(const QModelIndex& mi); PdmObjectHandle* pdmObjectFromModelIndex(const QModelIndex& mi);

View File

@@ -73,7 +73,8 @@ PdmUiTableViewEditor::PdmUiTableViewEditor()
m_checkboxDelegate = new PdmUiCheckBoxDelegate(this); m_checkboxDelegate = new PdmUiCheckBoxDelegate(this);
m_selectionLevel = SelectionManager::FIRST_LEVEL; m_tableSelectionLevel = SelectionManager::BASE_LEVEL;
m_rowSelectionLevel = SelectionManager::FIRST_LEVEL;
m_isBlockingSelectionManagerChanged = false; m_isBlockingSelectionManagerChanged = false;
} }
@@ -96,6 +97,7 @@ QWidget* PdmUiTableViewEditor::createEditorWidget(QWidget* parent)
m_tableView = new QTableView(parent); m_tableView = new QTableView(parent);
m_tableView->setShowGrid(true); m_tableView->setShowGrid(true);
m_tableView->setModel(m_tableModelPdm); m_tableView->setModel(m_tableModelPdm);
m_tableView->installEventFilter(this);
connect(m_tableView->selectionModel(), SIGNAL(selectionChanged( const QItemSelection & , const QItemSelection & )), SLOT(slotSelectionChanged( const QItemSelection & , const QItemSelection & ))); connect(m_tableView->selectionModel(), SIGNAL(selectionChanged( const QItemSelection & , const QItemSelection & )), SLOT(slotSelectionChanged( const QItemSelection & , const QItemSelection & )));
@@ -147,7 +149,8 @@ void PdmUiTableViewEditor::configureAndUpdateUi(const QString& uiConfigName)
childArrayFH->ownerObject()->uiCapability()->editorAttribute(childArrayFH, uiConfigName, &editorAttrib); childArrayFH->ownerObject()->uiCapability()->editorAttribute(childArrayFH, uiConfigName, &editorAttrib);
editorAttribLoaded = true; editorAttribLoaded = true;
this->setSelectionLevel(editorAttrib.selectionLevel); this->setTableSelectionLevel(editorAttrib.tableSelectionLevel);
this->setRowSelectionLevel(editorAttrib.rowSelectionLevel);
this->enableHeaderText(editorAttrib.enableHeaderText); this->enableHeaderText(editorAttrib.enableHeaderText);
QPalette myPalette(m_tableView->palette()); QPalette myPalette(m_tableView->palette());
@@ -263,9 +266,17 @@ void PdmUiTableViewEditor::enableHeaderText(bool enable)
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void PdmUiTableViewEditor::setSelectionLevel(int selectionLevel) void PdmUiTableViewEditor::setTableSelectionLevel(int selectionLevel)
{ {
m_selectionLevel = selectionLevel; m_tableSelectionLevel = selectionLevel;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void PdmUiTableViewEditor::setRowSelectionLevel(int selectionLevel)
{
m_rowSelectionLevel = selectionLevel;
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -275,10 +286,10 @@ void PdmUiTableViewEditor::onSelectionManagerSelectionChanged(int selectionLevel
{ {
if (m_isBlockingSelectionManagerChanged) return; if (m_isBlockingSelectionManagerChanged) return;
if (isSelectionRoleDefined() && (m_selectionLevel == selectionLevel)) if (isSelectionRoleDefined() && (m_rowSelectionLevel == selectionLevel))
{ {
std::vector<PdmUiItem*> items; std::vector<PdmUiItem*> items;
SelectionManager::instance()->selectedItems(items, m_selectionLevel); SelectionManager::instance()->selectedItems(items, m_rowSelectionLevel);
QItemSelection totalSelection; QItemSelection totalSelection;
for (auto item: items) for (auto item: items)
@@ -307,7 +318,7 @@ void PdmUiTableViewEditor::slotSelectionChanged(const QItemSelection & selected,
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
bool PdmUiTableViewEditor::isSelectionRoleDefined() const bool PdmUiTableViewEditor::isSelectionRoleDefined() const
{ {
return m_selectionLevel != SelectionManager::UNDEFINED; return m_rowSelectionLevel != SelectionManager::UNDEFINED;
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -344,20 +355,29 @@ void PdmUiTableViewEditor::updateSelectionManagerFromTableSelection()
std::vector<PdmUiItem*> items { selectedRowObjects.begin(), selectedRowObjects.end() }; std::vector<PdmUiItem*> items { selectedRowObjects.begin(), selectedRowObjects.end() };
if (items.empty() && childArrayFieldHandle() && childArrayFieldHandle()->ownerObject())
{
// If no rows are selected, add the owner object to the selection.
// This enables features to retrieve the owner object to add of new objects into
// an empty table or table without selection
items.push_back(childArrayFieldHandle()->ownerObject()->uiCapability());
}
m_isBlockingSelectionManagerChanged = true; m_isBlockingSelectionManagerChanged = true;
SelectionManager::instance()->setSelectedItems(items, m_selectionLevel); if (childArrayFieldHandle() && childArrayFieldHandle()->ownerObject())
{
SelectionManager::instance()->setSelectedItem(childArrayFieldHandle()->ownerObject()->uiCapability(), m_tableSelectionLevel);
}
SelectionManager::instance()->setSelectedItems(items, m_rowSelectionLevel);
m_isBlockingSelectionManagerChanged = false; m_isBlockingSelectionManagerChanged = false;
} }
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool PdmUiTableViewEditor::eventFilter(QObject* obj, QEvent* event)
{
if (event->type() == QEvent::FocusIn)
{
this->updateSelectionManagerFromTableSelection();
}
// standard event processing
return QObject::eventFilter(obj, event);
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@@ -82,7 +82,8 @@ class PdmUiTableViewEditorAttribute : public PdmUiEditorAttribute
{ {
public: public:
PdmUiTableViewEditorAttribute() PdmUiTableViewEditorAttribute()
: selectionLevel(1) : tableSelectionLevel(0)
, rowSelectionLevel(1)
, enableHeaderText(true) , enableHeaderText(true)
, minimumHeight(-1) , minimumHeight(-1)
, forceColumnWidthResize(false) , forceColumnWidthResize(false)
@@ -92,6 +93,8 @@ public:
} }
int selectionLevel; int selectionLevel;
int tableSelectionLevel;
int rowSelectionLevel;
bool enableHeaderText; bool enableHeaderText;
std::vector<int> columnWidths; std::vector<int> columnWidths;
int minimumHeight; ///< Not used if If < 0 int minimumHeight; ///< Not used if If < 0
@@ -114,7 +117,8 @@ public:
~PdmUiTableViewEditor(); ~PdmUiTableViewEditor();
void enableHeaderText(bool enable); void enableHeaderText(bool enable);
void setSelectionLevel(int selectionLevel); void setTableSelectionLevel(int selectionLevel);
void setRowSelectionLevel(int selectionLevel);
PdmObjectHandle* pdmObjectFromModelIndex(const QModelIndex& mi); PdmObjectHandle* pdmObjectFromModelIndex(const QModelIndex& mi);
QTableView* tableView(); QTableView* tableView();
@@ -131,6 +135,7 @@ private:
bool isSelectionRoleDefined() const; bool isSelectionRoleDefined() const;
void updateSelectionManagerFromTableSelection(); void updateSelectionManagerFromTableSelection();
bool eventFilter(QObject* obj, QEvent* event);
PdmChildArrayFieldHandle* childArrayFieldHandle(); PdmChildArrayFieldHandle* childArrayFieldHandle();
private slots: private slots:
@@ -149,7 +154,8 @@ private:
PdmUiCheckBoxDelegate* m_checkboxDelegate; PdmUiCheckBoxDelegate* m_checkboxDelegate;
bool m_useDefaultContextMenu; bool m_useDefaultContextMenu;
int m_selectionLevel; int m_tableSelectionLevel;
int m_rowSelectionLevel;
bool m_isBlockingSelectionManagerChanged; bool m_isBlockingSelectionManagerChanged;
caf::PdmChildArrayFieldHandle* m_previousFieldHandle; caf::PdmChildArrayFieldHandle* m_previousFieldHandle;