Debugger: Simplify thread switching more

This moves the thread switcher combobox, the only consumer
of part of the threadhandler interface, into the threadhandler.

Change-Id: Icafd72e7777fad9196ce8fb33a79cae26c29a521
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
hjk
2018-08-31 18:30:14 +02:00
parent 944aa963a8
commit 86cd29b13c
5 changed files with 21 additions and 39 deletions

View File

@@ -1496,7 +1496,7 @@ void CdbEngine::requestModuleSymbols(const QString &moduleName)
void CdbEngine::reloadRegisters() void CdbEngine::reloadRegisters()
{ {
if (!(threadsHandler()->currentThreadIndex() >= 0)) if (!threadsHandler()->currentThread())
return; return;
runCommand({"registers", ExtensionCommand, CB(handleRegistersExt)}); runCommand({"registers", ExtensionCommand, CB(handleRegistersExt)});
} }

View File

@@ -394,12 +394,6 @@ public:
m_toolTipManager.resetLocation(); m_toolTipManager.resetLocation();
} }
void selectThread(int index)
{
const Thread thread = m_engine->threadsHandler()->rootItem()->childAt(index);
m_engine->doSelectThread(thread);
}
void handleOperateByInstructionTriggered(bool on) void handleOperateByInstructionTriggered(bool on)
{ {
// Go to source only if we have the file. // Go to source only if we have the file.
@@ -485,7 +479,6 @@ public:
QPointer<LocalsAndInspectorWindow> m_localsAndInspectorWindow; QPointer<LocalsAndInspectorWindow> m_localsAndInspectorWindow;
QPointer<QLabel> m_threadLabel; QPointer<QLabel> m_threadLabel;
QPointer<QComboBox> m_threadBox;
bool m_busy = false; bool m_busy = false;
bool m_isDying = false; bool m_isDying = false;
@@ -746,14 +739,7 @@ void DebuggerEnginePrivate::setupViews()
m_threadLabel = new QLabel(tr("Threads:")); m_threadLabel = new QLabel(tr("Threads:"));
m_perspective->addToolBarWidget(m_threadLabel); m_perspective->addToolBarWidget(m_threadLabel);
m_perspective->addToolBarWidget(m_threadsHandler.threadSwitcher());
m_threadBox = new QComboBox;
m_threadBox->setSizeAdjustPolicy(QComboBox::AdjustToContents);
m_threadBox->setModel(m_threadsHandler.model());
connect(m_threadBox, static_cast<void(QComboBox::*)(int)>(&QComboBox::activated),
this, &DebuggerEnginePrivate::selectThread);
m_perspective->addToolBarWidget(m_threadBox);
connect(TextEditorSettings::instance(), &TextEditorSettings::fontSettingsChanged, connect(TextEditorSettings::instance(), &TextEditorSettings::fontSettingsChanged,
this, [this](const FontSettings &settings) { this, [this](const FontSettings &settings) {
@@ -1321,8 +1307,6 @@ void DebuggerEnginePrivate::updateState(bool alsoUpdateCompanion)
{ {
if (!m_perspective) if (!m_perspective)
return; return;
QTC_ASSERT(m_threadBox, return);
m_threadBox->setCurrentIndex(m_threadsHandler.currentThreadIndex());
const DebuggerState state = m_state; const DebuggerState state = m_state;
const bool companionPreventsAction = m_engine->companionPreventsActions(); const bool companionPreventsAction = m_engine->companionPreventsActions();
@@ -1410,8 +1394,9 @@ void DebuggerEnginePrivate::updateState(bool alsoUpdateCompanion)
m_attachToCoreAction.setEnabled(true); m_attachToCoreAction.setEnabled(true);
m_attachToRemoteServerAction.setEnabled(true); m_attachToRemoteServerAction.setEnabled(true);
m_threadBox->setEnabled(state == InferiorStopOk || state == InferiorUnrunnable); const bool threadsEnabled = state == InferiorStopOk || state == InferiorUnrunnable;
m_threadLabel->setEnabled(m_threadBox->isEnabled()); m_threadsHandler.threadSwitcher()->setEnabled(threadsEnabled);
m_threadLabel->setEnabled(threadsEnabled);
const bool isCore = m_engine->runParameters().startMode == AttachCore; const bool isCore = m_engine->runParameters().startMode == AttachCore;
const bool stopped = state == InferiorStopOk; const bool stopped = state == InferiorStopOk;
@@ -2078,16 +2063,6 @@ void DebuggerEngine::assignValueInDebugger(WatchItem *,
{ {
} }
void DebuggerEngine::doSelectThread(const Thread &thread)
{
QTC_ASSERT(thread, return);
// For immediate visual feedback.
d->m_threadsHandler.setCurrentThread(thread);
d->m_threadBox->setCurrentIndex(d->m_threadsHandler.currentThreadIndex());
// Initiate the actual switching in the debugger backend.
selectThread(thread);
}
void DebuggerEngine::handleRecordReverse(bool record) void DebuggerEngine::handleRecordReverse(bool record)
{ {
executeRecordReverse(record); executeRecordReverse(record);

View File

@@ -317,7 +317,6 @@ public:
virtual void assignValueInDebugger(WatchItem *item, virtual void assignValueInDebugger(WatchItem *item,
const QString &expr, const QVariant &value); const QString &expr, const QVariant &value);
virtual void selectThread(const Internal::Thread &thread) = 0; virtual void selectThread(const Internal::Thread &thread) = 0;
void doSelectThread(const Internal::Thread &thread);
virtual void executeRecordReverse(bool) {} virtual void executeRecordReverse(bool) {}
virtual void executeReverse(bool) {} virtual void executeReverse(bool) {}

View File

@@ -221,6 +221,13 @@ ThreadsHandler::ThreadsHandler(DebuggerEngine *engine)
tr("Address"), tr("Function"), tr("File"), tr("Line"), tr("State"), tr("Address"), tr("Function"), tr("File"), tr("Line"), tr("State"),
tr("Name"), tr("Target ID"), tr("Details"), tr("Core"), tr("Name"), tr("Target ID"), tr("Details"), tr("Core"),
}); });
m_comboBox = new QComboBox;
m_comboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents);
m_comboBox->setModel(this);
connect(m_comboBox, QOverload<int>::of(&QComboBox::activated), this, [this](int row) {
setData(index(row, 0), {}, BaseTreeView::ItemActivatedRole);
});
} }
QVariant ThreadsHandler::data(const QModelIndex &index, int role) const QVariant ThreadsHandler::data(const QModelIndex &index, int role) const
@@ -240,8 +247,11 @@ bool ThreadsHandler::setData(const QModelIndex &idx, const QVariant &data, int r
{ {
if (role == BaseTreeView::ItemActivatedRole) { if (role == BaseTreeView::ItemActivatedRole) {
const Thread thread = itemForIndexAtLevel<1>(idx); const Thread thread = itemForIndexAtLevel<1>(idx);
if (thread != m_currentThread) if (thread != m_currentThread) {
m_engine->doSelectThread(thread); m_currentThread = thread;
m_comboBox->setCurrentIndex(idx.row());
m_engine->selectThread(thread);
}
return true; return true;
} }
@@ -259,11 +269,6 @@ bool ThreadsHandler::setData(const QModelIndex &idx, const QVariant &data, int r
return false; return false;
} }
int ThreadsHandler::currentThreadIndex() const
{
return rootItem()->indexOf(m_currentThread);
}
void ThreadsHandler::sort(int column, Qt::SortOrder order) void ThreadsHandler::sort(int column, Qt::SortOrder order)
{ {
rootItem()->sortChildren([order, column](const ThreadItem *item1, const ThreadItem *item2) -> bool { rootItem()->sortChildren([order, column](const ThreadItem *item1, const ThreadItem *item2) -> bool {

View File

@@ -29,6 +29,7 @@
#include <utils/treemodel.h> #include <utils/treemodel.h>
#include <QComboBox>
#include <QPointer> #include <QPointer>
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
@@ -77,7 +78,6 @@ class ThreadsHandler : public ThreadsHandlerModel
public: public:
explicit ThreadsHandler(DebuggerEngine *engine); explicit ThreadsHandler(DebuggerEngine *engine);
int currentThreadIndex() const;
Thread currentThread() const; Thread currentThread() const;
Thread threadForId(const QString &id) const; Thread threadForId(const QString &id) const;
void setCurrentThread(const Thread &thread); void setCurrentThread(const Thread &thread);
@@ -95,6 +95,8 @@ public:
void notifyRunning(const QString &id); void notifyRunning(const QString &id);
void notifyStopped(const QString &id); void notifyStopped(const QString &id);
QComboBox *threadSwitcher() { return m_comboBox; }
private: private:
void sort(int column, Qt::SortOrder order) override; void sort(int column, Qt::SortOrder order) override;
QVariant data(const QModelIndex &index, int role) const override; QVariant data(const QModelIndex &index, int role) const override;
@@ -103,6 +105,7 @@ private:
DebuggerEngine *m_engine; DebuggerEngine *m_engine;
Thread m_currentThread; Thread m_currentThread;
QHash<QString, QString> m_pidForGroupId; QHash<QString, QString> m_pidForGroupId;
QComboBox *m_comboBox;
}; };
} // namespace Internal } // namespace Internal