From 2bfd515b03e0eb7fbefe4b76f7879a43863306e8 Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 9 Nov 2020 11:08:45 +0100 Subject: [PATCH] Utils: Allow BaseTreeView users to hide columns manually ... using a context menu on the header views. Use the feature in the debugger views where it was previously un-intuitively available as part of the main context menu of the view, but not in the header. Task-number: QTCREATORBUG-24384 Change-Id: I3f030c3dd8ce35dc91bad921e37d2273bfe548b5 Reviewed-by: Eike Ziller Reviewed-by: Christian Stenger --- src/libs/utils/basetreeview.cpp | 27 +++++++++++++++++++ src/libs/utils/basetreeview.h | 2 ++ src/plugins/debugger/breakhandler.cpp | 2 -- src/plugins/debugger/debuggercore.h | 3 --- src/plugins/debugger/debuggerengine.cpp | 7 +++++ src/plugins/debugger/debuggerplugin.cpp | 22 ++------------- src/plugins/debugger/moduleshandler.cpp | 1 - .../debugger/peripheralregisterhandler.cpp | 1 - src/plugins/debugger/registerhandler.cpp | 1 - src/plugins/debugger/sourcefileshandler.cpp | 1 - src/plugins/debugger/stackhandler.cpp | 1 - src/plugins/debugger/threadshandler.cpp | 1 - src/plugins/debugger/watchhandler.cpp | 2 -- 13 files changed, 38 insertions(+), 33 deletions(-) diff --git a/src/libs/utils/basetreeview.cpp b/src/libs/utils/basetreeview.cpp index eb754dddb52..f35bf9ef37d 100644 --- a/src/libs/utils/basetreeview.cpp +++ b/src/libs/utils/basetreeview.cpp @@ -552,6 +552,33 @@ void BaseTreeView::setSpanColumn(int column) d->setSpanColumn(column); } +void BaseTreeView::enableColumnHiding() +{ + header()->setContextMenuPolicy(Qt::CustomContextMenu); + connect(header(), &QWidget::customContextMenuRequested, this, [this](const QPoint &pos) { + QTC_ASSERT(model(), return); + const int columns = model()->columnCount(); + QMenu menu; + int shown = 0; + for (int i = 0; i < columns; ++i) + shown += !isColumnHidden(i); + for (int i = 0; i < columns; ++i) { + QString columnName = model()->headerData(i, Qt::Horizontal).toString(); + QAction *act = menu.addAction(tr("Show %1 Column").arg(columnName)); + act->setCheckable(true); + act->setChecked(!isColumnHidden(i)); + // Prevent disabling the last visible column as there's no way back. + if (shown == 1 && !isColumnHidden(i)) + act->setEnabled(false); + QObject::connect(act, &QAction::toggled, &menu, [this, i](bool on) { + setColumnHidden(i, !on); + }); + } + menu.addSeparator(); + menu.exec(mapToGlobal(pos)); + }); +} + void BaseTreeView::refreshSpanColumn() { d->rebalanceColumns(); diff --git a/src/libs/utils/basetreeview.h b/src/libs/utils/basetreeview.h index de68685b6af..2e6c9c1c6c9 100644 --- a/src/libs/utils/basetreeview.h +++ b/src/libs/utils/basetreeview.h @@ -78,6 +78,8 @@ public: int spanColumn() const; void setSpanColumn(int column); + void enableColumnHiding(); + // In some situations this needs to be called when manually resizing columns when the span // column is set. void refreshSpanColumn(); diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp index a8eefd92e61..5964c68ab64 100644 --- a/src/plugins/debugger/breakhandler.cpp +++ b/src/plugins/debugger/breakhandler.cpp @@ -1671,7 +1671,6 @@ bool BreakHandler::contextMenuEvent(const ItemViewEvent &ev) menu->addSeparator(); menu->addAction(action(UseToolTipsInBreakpointsView)->action()); - Internal::addHideColumnActions(menu, ev.view()); menu->addAction(action(SettingsDialog)->action()); menu->popup(ev.globalPos()); @@ -2632,7 +2631,6 @@ bool BreakpointManager::contextMenuEvent(const ItemViewEvent &ev) menu->addSeparator(); menu->addAction(action(UseToolTipsInBreakpointsView)->action()); - Internal::addHideColumnActions(menu, ev.view()); menu->addAction(action(SettingsDialog)->action()); menu->popup(ev.globalPos()); diff --git a/src/plugins/debugger/debuggercore.h b/src/plugins/debugger/debuggercore.h index 91ac86c840a..60881d8f983 100644 --- a/src/plugins/debugger/debuggercore.h +++ b/src/plugins/debugger/debuggercore.h @@ -73,9 +73,6 @@ QAction *addAction(QMenu *menu, const QString &d1, const QString &d2, bool on, QAction *addCheckableAction(QMenu *menu, const QString &display, bool on, bool checked, const std::function &onTriggered); -void addHideColumnActions(QMenu *menu, QWidget *widget); - - // Qt's various build paths for unpatched versions QStringList qtBuildPaths(); diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp index c7540e8ae1d..ff43cb7d975 100644 --- a/src/plugins/debugger/debuggerengine.cpp +++ b/src/plugins/debugger/debuggerengine.cpp @@ -635,6 +635,7 @@ void DebuggerEnginePrivate::setupViews() m_modulesView->setModel(m_modulesHandler.model()); m_modulesView->setSortingEnabled(true); m_modulesView->setSettings(settings, "Debugger.ModulesView"); + m_modulesView->enableColumnHiding(); connect(m_modulesView, &BaseTreeView::aboutToShow, m_engine, &DebuggerEngine::reloadModules, Qt::QueuedConnection); @@ -646,6 +647,7 @@ void DebuggerEnginePrivate::setupViews() m_registerView->setModel(m_registerHandler.model()); m_registerView->setRootIsDecorated(true); m_registerView->setSettings(settings, "Debugger.RegisterView"); + m_registerView->enableColumnHiding(); connect(m_registerView, &BaseTreeView::aboutToShow, m_engine, &DebuggerEngine::reloadRegisters, Qt::QueuedConnection); @@ -657,6 +659,7 @@ void DebuggerEnginePrivate::setupViews() m_peripheralRegisterView->setModel(m_peripheralRegisterHandler.model()); m_peripheralRegisterView->setRootIsDecorated(true); m_peripheralRegisterView->setSettings(settings, "Debugger.PeripheralRegisterView"); + m_peripheralRegisterView->enableColumnHiding(); connect(m_peripheralRegisterView, &BaseTreeView::aboutToShow, m_engine, &DebuggerEngine::reloadPeripheralRegisters, Qt::QueuedConnection); @@ -668,6 +671,7 @@ void DebuggerEnginePrivate::setupViews() m_stackView->setModel(m_stackHandler.model()); m_stackView->setSettings(settings, "Debugger.StackView"); m_stackView->setIconSize(QSize(10, 10)); + m_stackView->enableColumnHiding(); m_stackWindow = addSearch(m_stackView); m_stackWindow->setObjectName("Debugger.Dock.Stack." + engineId); m_stackWindow->setWindowTitle(tr("&Stack")); @@ -676,6 +680,7 @@ void DebuggerEnginePrivate::setupViews() m_sourceFilesView->setModel(m_sourceFilesHandler.model()); m_sourceFilesView->setSortingEnabled(true); m_sourceFilesView->setSettings(settings, "Debugger.SourceFilesView"); + m_sourceFilesView->enableColumnHiding(); connect(m_sourceFilesView, &BaseTreeView::aboutToShow, m_engine, &DebuggerEngine::reloadSourceFiles, Qt::QueuedConnection); @@ -689,6 +694,7 @@ void DebuggerEnginePrivate::setupViews() m_threadsView->setSettings(settings, "Debugger.ThreadsView"); m_threadsView->setIconSize(QSize(10, 10)); m_threadsView->setSpanColumn(ThreadData::FunctionColumn); + m_threadsView->enableColumnHiding(); m_threadsWindow = addSearch(m_threadsView); m_threadsWindow->setObjectName("Debugger.Dock.Threads." + engineId); m_threadsWindow->setWindowTitle(tr("&Threads")); @@ -738,6 +744,7 @@ void DebuggerEnginePrivate::setupViews() m_breakView->setSettings(settings, "Debugger.BreakWindow"); m_breakView->setModel(m_breakHandler.model()); m_breakView->setRootIsDecorated(true); + m_breakView->enableColumnHiding(); m_breakWindow = addSearch(m_breakView); m_breakWindow->setObjectName("Debugger.Dock.Break." + engineId); m_breakWindow->setWindowTitle(tr("&Breakpoints")); diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index c784b2adfbb..6ab8ee18baa 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -459,26 +459,6 @@ QAction *addCheckableAction(QMenu *menu, const QString &display, bool on, bool c return act; } -void addHideColumnActions(QMenu *menu, QWidget *widget) -{ - QTreeView *view = qobject_cast(widget); - QTC_ASSERT(view, return); - QAbstractItemModel *model = view->model(); - QTC_ASSERT(model, return); - const int columns = model->columnCount(); - menu->addSeparator(); - for (int i = 0; i < columns; ++i) { - QString columnName = model->headerData(i, Qt::Horizontal).toString(); - QAction *act = menu->addAction(DebuggerPlugin::tr("Show %1 Column").arg(columnName)); - act->setCheckable(true); - act->setChecked(!view->isColumnHidden(i)); - QObject::connect(act, &QAction::toggled, menu, [view, i](bool on) { - view->setColumnHidden(i, !on); - }); - } - menu->addSeparator(); -} - /////////////////////////////////////////////////////////////////////// // // DebugMode @@ -840,6 +820,7 @@ DebuggerPluginPrivate::DebuggerPluginPrivate(const QStringList &arguments) breakpointManagerView->setRootIsDecorated(true); breakpointManagerView->setModel(BreakpointManager::model()); breakpointManagerView->setSpanColumn(BreakpointFunctionColumn); + breakpointManagerView->enableColumnHiding(); auto breakpointManagerWindow = addSearch(breakpointManagerView); breakpointManagerWindow->setWindowTitle(tr("Breakpoint Preset")); @@ -854,6 +835,7 @@ DebuggerPluginPrivate::DebuggerPluginPrivate(const QStringList &arguments) engineManagerView->setIconSize(QSize(10, 10)); engineManagerView->setModel(m_engineManager.model()); engineManagerView->setSelectionMode(QAbstractItemView::SingleSelection); + engineManagerView->enableColumnHiding(); auto engineManagerWindow = addSearch(engineManagerView); engineManagerWindow->setWindowTitle(tr("Debugger Perspectives")); diff --git a/src/plugins/debugger/moduleshandler.cpp b/src/plugins/debugger/moduleshandler.cpp index 878ae20f57d..29ab553de8d 100644 --- a/src/plugins/debugger/moduleshandler.cpp +++ b/src/plugins/debugger/moduleshandler.cpp @@ -223,7 +223,6 @@ bool ModulesModel::contextMenuEvent(const ItemViewEvent &ev) canShowSymbols && moduleNameValid, [this, modulePath] { engine->requestModuleSections(modulePath); }); - Internal::addHideColumnActions(menu, ev.view()); menu->addAction(action(SettingsDialog)->action()); menu->popup(ev.globalPos()); diff --git a/src/plugins/debugger/peripheralregisterhandler.cpp b/src/plugins/debugger/peripheralregisterhandler.cpp index 0236697d7e0..bc57fe2e945 100644 --- a/src/plugins/debugger/peripheralregisterhandler.cpp +++ b/src/plugins/debugger/peripheralregisterhandler.cpp @@ -786,7 +786,6 @@ bool PeripheralRegisterHandler::contextMenuEvent(const ItemViewEvent &ev) menu->addMenu(fmtMenu); } - Internal::addHideColumnActions(menu, ev.view()); menu->addAction(action(SettingsDialog)->action()); menu->popup(ev.globalPos()); return true; diff --git a/src/plugins/debugger/registerhandler.cpp b/src/plugins/debugger/registerhandler.cpp index 3f5a4b7984f..d3d73f81ed4 100644 --- a/src/plugins/debugger/registerhandler.cpp +++ b/src/plugins/debugger/registerhandler.cpp @@ -756,7 +756,6 @@ bool RegisterHandler::contextMenuEvent(const ItemViewEvent &ev) addFormatAction(tr("Octal"), OctalFormat); addFormatAction(tr("Binary"), BinaryFormat); - Internal::addHideColumnActions(menu, ev.view()); menu->addAction(action(SettingsDialog)->action()); menu->popup(ev.globalPos()); return true; diff --git a/src/plugins/debugger/sourcefileshandler.cpp b/src/plugins/debugger/sourcefileshandler.cpp index badf3701755..30c5810ec80 100644 --- a/src/plugins/debugger/sourcefileshandler.cpp +++ b/src/plugins/debugger/sourcefileshandler.cpp @@ -137,7 +137,6 @@ bool SourceFilesHandler::setData(const QModelIndex &idx, const QVariant &data, i addAction(tr("Open File \"%1\"").arg(name), true, [this, name] { m_engine->gotoLocation(FilePath::fromString(name)); }); - Internal::addHideColumnActions(menu, ev.view()); menu->addAction(action(SettingsDialog)->action()); menu->popup(ev.globalPos()); return true; diff --git a/src/plugins/debugger/stackhandler.cpp b/src/plugins/debugger/stackhandler.cpp index ecbe04e98cf..fe94cc5f205 100644 --- a/src/plugins/debugger/stackhandler.cpp +++ b/src/plugins/debugger/stackhandler.cpp @@ -517,7 +517,6 @@ bool StackHandler::contextMenuEvent(const ItemViewEvent &ev) menu->addSeparator(); menu->addAction(action(UseToolTipsInStackView)->action()); - Internal::addHideColumnActions(menu, ev.view()); menu->addAction(action(SettingsDialog)->action()); menu->popup(ev.globalPos()); return true; diff --git a/src/plugins/debugger/threadshandler.cpp b/src/plugins/debugger/threadshandler.cpp index 011ceb0d7d6..a574909469e 100644 --- a/src/plugins/debugger/threadshandler.cpp +++ b/src/plugins/debugger/threadshandler.cpp @@ -258,7 +258,6 @@ bool ThreadsHandler::setData(const QModelIndex &idx, const QVariant &data, int r if (ev.as()) { auto menu = new QMenu; - Internal::addHideColumnActions(menu, ev.view()); menu->addAction(action(SettingsDialog)->action()); menu->popup(ev.globalPos()); return true; diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp index 65b8abd69c9..a7e48fcfaf7 100644 --- a/src/plugins/debugger/watchhandler.cpp +++ b/src/plugins/debugger/watchhandler.cpp @@ -1745,8 +1745,6 @@ bool WatchModel::contextMenuEvent(const ItemViewEvent &ev) menu->addAction(action(UseDynamicType)->action()); menu->addAction(action(SettingsDialog)->action()); - Internal::addHideColumnActions(menu, ev.view()); - menu->addAction(action(SettingsDialog)->action()); connect(menu, &QMenu::aboutToHide, menu, &QObject::deleteLater); menu->popup(ev.globalPos()); return true;