From 6f0fa5114dd9bb0bdf42c3391fe7ee3368aaf004 Mon Sep 17 00:00:00 2001 From: Daniel Teske Date: Wed, 29 Feb 2012 16:15:25 +0100 Subject: [PATCH] Make TaskMarks clickable and jump to the right task in the taskwindow That means it is no longer possible to make bookmarks on lines with errors or warnings by simply clicking. That's not nice. It might be better to do something different, but let's see how the feedback to this is. Change-Id: I34788ff638ed49c21001d03cd60f992ffabd6153 Reviewed-by: hjk Reviewed-by: Eike Ziller --- src/plugins/projectexplorer/taskhub.cpp | 18 ++++++++++++++++++ src/plugins/projectexplorer/taskhub.h | 2 ++ src/plugins/projectexplorer/taskmodel.cpp | 22 +++++++++++++++++++--- src/plugins/projectexplorer/taskmodel.h | 2 ++ src/plugins/projectexplorer/taskwindow.cpp | 10 ++++++++++ src/plugins/projectexplorer/taskwindow.h | 1 + src/plugins/texteditor/basetexteditor.cpp | 10 ++++++++++ src/plugins/texteditor/itexteditor.h | 3 ++- src/plugins/texteditor/itextmark.cpp | 8 ++++++++ src/plugins/texteditor/itextmark.h | 2 ++ 10 files changed, 74 insertions(+), 4 deletions(-) diff --git a/src/plugins/projectexplorer/taskhub.cpp b/src/plugins/projectexplorer/taskhub.cpp index 6717f4b285f..a05d9dc1fa1 100644 --- a/src/plugins/projectexplorer/taskhub.cpp +++ b/src/plugins/projectexplorer/taskhub.cpp @@ -45,6 +45,9 @@ public: : BaseTextMark(fileName, lineNumber), m_id(id), m_visible(visible) {} + bool clickable() const; + void clicked(); + void updateLineNumber(int lineNumber); void removedFromEditor(); bool visible() const; @@ -69,6 +72,16 @@ bool TaskMark::visible() const return m_visible; } +bool TaskMark::clickable() const +{ + return true; +} + +void TaskMark::clicked() +{ + ProjectExplorerPlugin::instance()->taskHub()->taskMarkClicked(m_id); +} + TaskHub::TaskHub() : m_errorIcon(QLatin1String(":/projectexplorer/images/compile_error.png")), m_warningIcon(QLatin1String(":/projectexplorer/images/compile_warning.png")) @@ -114,6 +127,11 @@ void TaskHub::updateTaskLineNumber(unsigned int id, int line) emit taskLineNumberUpdated(id, line); } +void TaskHub::taskMarkClicked(unsigned int id) +{ + emit showTask(id); +} + void TaskHub::setCategoryVisibility(const Core::Id &categoryId, bool visible) { emit categoryVisibilityChanged(categoryId, visible); diff --git a/src/plugins/projectexplorer/taskhub.h b/src/plugins/projectexplorer/taskhub.h index 8dd962eafb7..6f92c3dd5ef 100644 --- a/src/plugins/projectexplorer/taskhub.h +++ b/src/plugins/projectexplorer/taskhub.h @@ -53,6 +53,7 @@ public: void clearTasks(const Core::Id &categoryId = Core::Id()); void removeTask(const Task &task); void updateTaskLineNumber(unsigned int id, int line); + void taskMarkClicked(unsigned int id); void setCategoryVisibility(const Core::Id &categoryId, bool visible); void popup(bool withFocus); @@ -67,6 +68,7 @@ signals: void taskLineNumberUpdated(unsigned int id, int line); void categoryVisibilityChanged(const Core::Id &categoryId, bool visible); void popupRequested(bool withFocus); + void showTask(unsigned int id); private: const QIcon m_errorIcon; const QIcon m_warningIcon; diff --git a/src/plugins/projectexplorer/taskmodel.cpp b/src/plugins/projectexplorer/taskmodel.cpp index 7a7a73360be..1d929e0f4f4 100644 --- a/src/plugins/projectexplorer/taskmodel.cpp +++ b/src/plugins/projectexplorer/taskmodel.cpp @@ -148,11 +148,18 @@ void TaskModel::removeTask(const Task &task) } } +int TaskModel::rowForId(unsigned int id) +{ + QList::const_iterator it = qLowerBound(m_tasks.constBegin(), m_tasks.constEnd(), id, sortById); + if (it == m_tasks.constEnd()) + return -1; + return it - m_tasks.constBegin(); +} + void TaskModel::updateTaskLineNumber(unsigned int id, int line) { - QList::iterator it = qLowerBound(m_tasks.begin(), m_tasks.end(), id, sortById); - QTC_ASSERT(it != m_tasks.end(), return) - int i = it - m_tasks.begin(); + int i = rowForId(id); + QTC_ASSERT(i != -1, return) if (m_tasks.at(i).taskId == id) { m_tasks[i].movedLine = line; emit dataChanged(index(i, 0), index(i, 0)); @@ -444,6 +451,15 @@ void TaskFilterModel::handleReset() invalidateFilter(); } +QModelIndex TaskFilterModel::mapFromSource(const QModelIndex &idx) const +{ + updateMapping(); + QList::const_iterator it = qBinaryFind(m_mapping.constBegin(), m_mapping.constEnd(), idx.row()); + if (it == m_mapping.constEnd()) + return QModelIndex(); + return index(it - m_mapping.constBegin(), 0); +} + QModelIndex TaskFilterModel::mapToSource(const QModelIndex &index) const { updateMapping(); diff --git a/src/plugins/projectexplorer/taskmodel.h b/src/plugins/projectexplorer/taskmodel.h index 1dfb6733c93..017e489b6ec 100644 --- a/src/plugins/projectexplorer/taskmodel.h +++ b/src/plugins/projectexplorer/taskmodel.h @@ -78,6 +78,7 @@ public: bool hasFile(const QModelIndex &index) const; + int rowForId(unsigned int id); private: class CategoryData @@ -161,6 +162,7 @@ public: bool hasFile(const QModelIndex &index) const { return m_sourceModel->hasFile(mapToSource(index)); } + QModelIndex mapFromSource(const QModelIndex &idx) const; private slots: void handleNewRows(const QModelIndex &index, int first, int last); void handleRemovedRows(const QModelIndex &index, int first, int last); diff --git a/src/plugins/projectexplorer/taskwindow.cpp b/src/plugins/projectexplorer/taskwindow.cpp index 4f0a93bebf1..efb720d7cef 100644 --- a/src/plugins/projectexplorer/taskwindow.cpp +++ b/src/plugins/projectexplorer/taskwindow.cpp @@ -304,6 +304,8 @@ TaskWindow::TaskWindow(TaskHub *taskhub) : d(new TaskWindowPrivate) this, SLOT(setCategoryVisibility(Core::Id,bool))); connect(d->m_taskHub, SIGNAL(popupRequested(bool)), this, SLOT(popup(bool))); + connect(d->m_taskHub, SIGNAL(showTask(uint)), + this, SLOT(showTask(uint))); } TaskWindow::~TaskWindow() @@ -388,6 +390,14 @@ void TaskWindow::updatedTaskLineNumber(unsigned int id, int line) emit tasksChanged(); } +void TaskWindow::showTask(unsigned int id) +{ + int sourceRow = d->m_model->rowForId(id); + QModelIndex sourceIdx = d->m_model->index(sourceRow, 0); + QModelIndex filterIdx = d->m_filter->mapFromSource(sourceIdx); + d->m_listview->setCurrentIndex(filterIdx); +} + void TaskWindow::triggerDefaultHandler(const QModelIndex &index) { if (!index.isValid()) diff --git a/src/plugins/projectexplorer/taskwindow.h b/src/plugins/projectexplorer/taskwindow.h index 35ca1ea296e..8a41bf9b1f4 100644 --- a/src/plugins/projectexplorer/taskwindow.h +++ b/src/plugins/projectexplorer/taskwindow.h @@ -90,6 +90,7 @@ private slots: void addTask(const ProjectExplorer::Task &task); void removeTask(const ProjectExplorer::Task &task); void updatedTaskLineNumber(unsigned int id, int line); + void showTask(unsigned int id); void clearTasks(const Core::Id &categoryId); void setCategoryVisibility(const Core::Id &categoryId, bool visible); diff --git a/src/plugins/texteditor/basetexteditor.cpp b/src/plugins/texteditor/basetexteditor.cpp index 349ab63c10b..7c37c024089 100644 --- a/src/plugins/texteditor/basetexteditor.cpp +++ b/src/plugins/texteditor/basetexteditor.cpp @@ -4443,12 +4443,22 @@ void BaseTextEditorWidget::extraAreaMouseEvent(QMouseEvent *e) int n = d->extraAreaToggleMarkBlockNumber; d->extraAreaToggleMarkBlockNumber = -1; if (cursor.blockNumber() == n) { + if (TextBlockUserData *data = static_cast(cursor.block().userData())) { + foreach (ITextMark *mark, data->marks()) { + if (mark->clickable()) { + mark->clicked(); + return; + } + } + } + int line = n + 1; ITextEditor::MarkRequestKind kind; if (QApplication::keyboardModifiers() & Qt::ShiftModifier) kind = ITextEditor::BookmarkRequest; else kind = ITextEditor::BreakpointRequest; + emit editor()->markRequested(editor(), line, kind); } } diff --git a/src/plugins/texteditor/itexteditor.h b/src/plugins/texteditor/itexteditor.h index 7910346d074..deade3e40ae 100644 --- a/src/plugins/texteditor/itexteditor.h +++ b/src/plugins/texteditor/itexteditor.h @@ -110,7 +110,8 @@ public: enum MarkRequestKind { BreakpointRequest, - BookmarkRequest + BookmarkRequest, + TaskMarkRequest }; signals: diff --git a/src/plugins/texteditor/itextmark.cpp b/src/plugins/texteditor/itextmark.cpp index 4aebbad154e..a999b6367e5 100644 --- a/src/plugins/texteditor/itextmark.cpp +++ b/src/plugins/texteditor/itextmark.cpp @@ -84,3 +84,11 @@ double ITextMark::widthFactor() const { return 1.0; } + +bool ITextMark::clickable() const +{ + return false; +} + +void ITextMark::clicked() +{} diff --git a/src/plugins/texteditor/itextmark.h b/src/plugins/texteditor/itextmark.h index 81ea17ceeef..48be8b0992c 100644 --- a/src/plugins/texteditor/itextmark.h +++ b/src/plugins/texteditor/itextmark.h @@ -75,6 +75,8 @@ public: void setPriority(Priority prioriy); virtual bool visible() const; virtual double widthFactor() const; + virtual bool clickable() const; + virtual void clicked(); private: int m_lineNumber;