diff options
author | hjk <hjk121@nokiamail.com> | 2013-11-14 13:24:02 +0100 |
---|---|---|
committer | hjk <hjk121@nokiamail.com> | 2013-11-17 22:55:22 +0100 |
commit | fefbc172f2a6a0ae6b7ee510cd5770533636f28d (patch) | |
tree | d95b05a222d148c711f4f040e1d1d1e5bb8c90b9 /src/plugins/debugger | |
parent | 7f6c793f756042b801aba321dcfc946560a4700a (diff) | |
download | qt-creator-fefbc172f2a6a0ae6b7ee510cd5770533636f28d.tar.gz |
Debugger: Use thread id, not model row to remember current thread
Task-number: QTCREATORBUG-9207
Change-Id: Ic98fb9a99c250dccf2735f28d0d3fefa7d1da52f
Reviewed-by: hjk <hjk121@nokiamail.com>
Diffstat (limited to 'src/plugins/debugger')
-rw-r--r-- | src/plugins/debugger/threaddata.h | 1 | ||||
-rw-r--r-- | src/plugins/debugger/threadshandler.cpp | 84 | ||||
-rw-r--r-- | src/plugins/debugger/threadshandler.h | 6 |
3 files changed, 51 insertions, 40 deletions
diff --git a/src/plugins/debugger/threaddata.h b/src/plugins/debugger/threaddata.h index 15927dc174..5362cad03b 100644 --- a/src/plugins/debugger/threaddata.h +++ b/src/plugins/debugger/threaddata.h @@ -52,6 +52,7 @@ public: bool isValid() const { return m_id != -1; } qint64 raw() const { return m_id; } bool operator==(const ThreadId other) const { return m_id == other.m_id; } + bool operator!=(const ThreadId other) const { return m_id != other.m_id; } private: qint64 m_id; diff --git a/src/plugins/debugger/threadshandler.cpp b/src/plugins/debugger/threadshandler.cpp index 45504decd6..e5f21ef227 100644 --- a/src/plugins/debugger/threadshandler.cpp +++ b/src/plugins/debugger/threadshandler.cpp @@ -130,7 +130,7 @@ static QString threadToolTip(const ThreadData &thread) */ ThreadsHandler::ThreadsHandler() - : m_currentIndex(-1), + : m_currentId(), m_positionIcon(QLatin1String(":/debugger/images/location_16.png")), m_emptyIcon(QLatin1String(":/debugger/images/debugger_empty_14.png")) { @@ -140,6 +140,11 @@ ThreadsHandler::ThreadsHandler() // m_proxyModel->setSourceModel(this); } +int ThreadsHandler::currentThreadIndex() const +{ + return indexOf(m_currentId); +} + int ThreadsHandler::rowCount(const QModelIndex &parent) const { // Since the stack is not a tree, row count is 0 for any valid parent. @@ -196,7 +201,7 @@ QVariant ThreadsHandler::data(const QModelIndex &index, int role) const case Qt::DecorationRole: // Return icon that indicates whether this is the active stack frame. if (index.column() == 0) - return (index.row() == m_currentIndex) ? m_positionIcon : m_emptyIcon; + return (thread.id == m_currentId) ? m_positionIcon : m_emptyIcon; break; case ThreadData::IdRole: return thread.id.raw(); @@ -246,9 +251,7 @@ Qt::ItemFlags ThreadsHandler::flags(const QModelIndex &index) const ThreadId ThreadsHandler::currentThread() const { - if (m_currentIndex < 0 || m_currentIndex >= m_threads.size()) - return ThreadId(); - return m_threads[m_currentIndex].id; + return m_currentId; } ThreadId ThreadsHandler::threadAt(int index) const @@ -259,23 +262,22 @@ ThreadId ThreadsHandler::threadAt(int index) const void ThreadsHandler::setCurrentThread(ThreadId id) { - const int index = indexOf(id); - if (index == m_currentIndex) + if (id == m_currentId) return; + const int index = indexOf(id); if (index == -1) { qWarning("ThreadsHandler::setCurrentThreadId: No such thread %d.", int(id.raw())); return; } // Emit changed for previous frame. - if (m_currentIndex != -1) - dataChanged(m_currentIndex); + threadDataChanged(m_currentId); - m_currentIndex = index; + m_currentId = id; // Emit changed for new frame. - dataChanged(m_currentIndex); + threadDataChanged(m_currentId); updateThreadBox(); } @@ -297,7 +299,7 @@ void ThreadsHandler::updateThread(const ThreadData &thread) endInsertRows(); } else { mergeThreadData(m_threads[i], thread); - dataChanged(i); + threadDataChanged(thread.id); } } @@ -315,8 +317,14 @@ void ThreadsHandler::setThreads(const Threads &threads) { beginResetModel(); m_threads = threads; - if (m_currentIndex >= m_threads.size()) - m_currentIndex = -1; + bool found = false; + for (int i = 0, n = m_threads.size(); i < n; ++i) + if (threads.at(i).id == m_currentId) { + found = true; + break; + } + if (!found) + m_currentId = ThreadId(); m_resetLocationScheduled = false; endResetModel(); updateThreadBox(); @@ -327,13 +335,17 @@ void ThreadsHandler::updateThreadBox() QStringList list; foreach (const ThreadData &thread, m_threads) list.append(QString::fromLatin1("#%1 %2").arg(thread.id.raw()).arg(thread.name)); - debuggerCore()->setThreads(list, m_currentIndex); + debuggerCore()->setThreads(list, indexOf(m_currentId)); } -void ThreadsHandler::dataChanged(int index) +void ThreadsHandler::threadDataChanged(ThreadId id) { - Q_UNUSED(index); - layoutChanged(); + int row = indexOf(id); + if (row < 0) + return; + QModelIndex l = index(row, 0); + QModelIndex r = index(row, ThreadData::ColumnCount - 1); + dataChanged(l, r); } Threads ThreadsHandler::threads() const @@ -351,7 +363,7 @@ void ThreadsHandler::removeAll() { beginResetModel(); m_threads.clear(); - m_currentIndex = -1; + m_currentId = ThreadId(); endResetModel(); } @@ -381,7 +393,7 @@ void ThreadsHandler::notifyRunning(ThreadId id) int i = indexOf(id); if (i >= 0) { m_threads[i].notifyRunning(); - dataChanged(i); + threadDataChanged(id); } } @@ -411,7 +423,7 @@ void ThreadsHandler::notifyStopped(ThreadId id) int i = indexOf(id); if (i >= 0) { m_threads[i].stopped = true; - dataChanged(i); + threadDataChanged(id); } } @@ -423,15 +435,10 @@ void ThreadsHandler::updateThreads(const GdbMi &data) // state="stopped",core="0"}],current-thread-id="1" // Emit changed for previous frame. - if (m_currentIndex != -1) { - dataChanged(m_currentIndex); - m_currentIndex = -1; - } - - ThreadId currentId; - const GdbMi current = data["current-thread-id"]; - if (current.isValid()) - currentId = ThreadId(current.data().toLongLong()); +// if (m_currentIndex != -1) { +// rowChanged(m_currentIndex); +// m_currentIndex = -1; +// } const QList<GdbMi> items = data["threads"].children(); const int n = items.size(); @@ -449,17 +456,20 @@ void ThreadsHandler::updateThreads(const GdbMi &data) thread.fileName = frame["fullname"].toLatin1(); thread.lineNumber = frame["line"].toInt(); thread.module = QString::fromLocal8Bit(frame["from"].data()); - thread.stopped = true; thread.name = item["name"].toLatin1(); - if (thread.state == QLatin1String("running")) - thread.stopped = false; - if (thread.id == currentId) - m_currentIndex = index; + thread.stopped = thread.state != QLatin1String("running"); updateThread(thread); } - if (m_currentIndex != -1) - dataChanged(m_currentIndex); + const GdbMi current = data["current-thread-id"]; + if (current.isValid()) { + ThreadId currentId = ThreadId(current.data().toLongLong()); + if (currentId != m_currentId) { + threadDataChanged(m_currentId); + m_currentId = currentId; + threadDataChanged(m_currentId); + } + } updateThreadBox(); } diff --git a/src/plugins/debugger/threadshandler.h b/src/plugins/debugger/threadshandler.h index 4b717eae31..2720ef4f11 100644 --- a/src/plugins/debugger/threadshandler.h +++ b/src/plugins/debugger/threadshandler.h @@ -57,7 +57,7 @@ class ThreadsHandler : public QAbstractTableModel public: ThreadsHandler(); - int currentThreadIndex() const { return m_currentIndex; } + int currentThreadIndex() const; ThreadId currentThread() const; ThreadId threadAt(int index) const; void setCurrentThread(ThreadId id); @@ -93,10 +93,10 @@ private: int role = Qt::DisplayRole) const; Qt::ItemFlags flags(const QModelIndex &index) const; void updateThreadBox(); - void dataChanged(int index); + void threadDataChanged(ThreadId id); Threads m_threads; - int m_currentIndex; + ThreadId m_currentId; const QIcon m_positionIcon; const QIcon m_emptyIcon; |