diff --git a/src/plugins/bookmarks/bookmark.cpp b/src/plugins/bookmarks/bookmark.cpp index 666b146d733..16e6d217805 100644 --- a/src/plugins/bookmarks/bookmark.cpp +++ b/src/plugins/bookmarks/bookmark.cpp @@ -57,6 +57,14 @@ void Bookmark::updateLineNumber(int line) } } +void Bookmark::move(int line) +{ + if (line != lineNumber()) { + BaseTextMark::move(line); + m_manager->updateBookmark(this); + } +} + void Bookmark::updateBlock(const QTextBlock &block) { if (m_lineText != block.text()) { diff --git a/src/plugins/bookmarks/bookmark.h b/src/plugins/bookmarks/bookmark.h index 89e5ea0d54d..5ac9db50d51 100644 --- a/src/plugins/bookmarks/bookmark.h +++ b/src/plugins/bookmarks/bookmark.h @@ -44,6 +44,7 @@ public: Bookmark(const QString &fileName, int lineNumber, BookmarkManager *manager); void updateLineNumber(int lineNumber); + void move(int line); void updateBlock(const QTextBlock &block); void updateFileName(const QString &fileName); void setNote(const QString ¬e); diff --git a/src/plugins/bookmarks/bookmarkmanager.cpp b/src/plugins/bookmarks/bookmarkmanager.cpp index 15986c6e096..d11b9b7376f 100644 --- a/src/plugins/bookmarks/bookmarkmanager.cpp +++ b/src/plugins/bookmarks/bookmarkmanager.cpp @@ -45,15 +45,17 @@ #include #include -#include -#include -#include - #include #include +#include +#include +#include +#include +#include +#include +#include #include #include -#include Q_DECLARE_METATYPE(Bookmarks::Internal::Bookmark*) @@ -243,7 +245,7 @@ void BookmarkView::contextMenuEvent(QContextMenuEvent *event) QMenu menu; QAction *moveUp = menu.addAction(tr("Move Up")); QAction *moveDown = menu.addAction(tr("Move Down")); - QAction *editNote = menu.addAction(tr("Edit Note")); + QAction *edit = menu.addAction(tr("&Edit")); menu.addSeparator(); QAction *remove = menu.addAction(tr("&Remove")); menu.addSeparator(); @@ -254,7 +256,7 @@ void BookmarkView::contextMenuEvent(QContextMenuEvent *event) moveUp->setEnabled(false); moveDown->setEnabled(false); remove->setEnabled(false); - editNote->setEnabled(false); + edit->setEnabled(false); } if (model()->rowCount() == 0) @@ -268,8 +270,8 @@ void BookmarkView::contextMenuEvent(QContextMenuEvent *event) this, SLOT(removeFromContextMenu())); connect(removeAll, SIGNAL(triggered()), this, SLOT(removeAll())); - connect(editNote, SIGNAL(triggered()), - m_manager, SLOT(editNote())); + connect(edit, SIGNAL(triggered()), + m_manager, SLOT(edit())); menu.exec(mapToGlobal(event->pos())); } @@ -673,27 +675,36 @@ void BookmarkManager::moveDown() saveBookmarks(); } -void BookmarkManager::editNote(const QString &fileName, int lineNumber) +void BookmarkManager::edit(const QString &fileName, int lineNumber) { Bookmark *b = findBookmark(fileName, lineNumber); QModelIndex current = selectionModel()->currentIndex(); selectionModel()->setCurrentIndex(current.sibling(m_bookmarksList.indexOf(b), 0), QItemSelectionModel::Select | QItemSelectionModel::Clear); - editNote(); + edit(); } -void BookmarkManager::editNote() +void BookmarkManager::edit() { QModelIndex current = selectionModel()->currentIndex(); Bookmark *b = m_bookmarksList.at(current.row()); - bool inputOk = false; - QString noteText = QInputDialog::getText(0, tr("Edit Note"), - tr("Note text:"), QLineEdit::Normal, - b->note(), &inputOk); - if (inputOk) { - b->updateNote(noteText.replace(QLatin1Char('\t'), QLatin1Char(' '))); + QDialog dlg; + dlg.setWindowTitle(tr("Edit Bookmark")); + auto layout = new QFormLayout(&dlg); + auto noteEdit = new QLineEdit(b->note()); + auto lineNumberEdit = new QLineEdit(QString::number(b->lineNumber())); + auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); + connect(buttonBox, SIGNAL(accepted()), &dlg, SLOT(accept())); + connect(buttonBox, SIGNAL(rejected()), &dlg, SLOT(reject())); + lineNumberEdit->setValidator(new QIntValidator(0, INT_MAX)); + layout->addRow(tr("Note text:"), noteEdit); + layout->addRow(tr("Line number:"), lineNumberEdit); + layout->addWidget(buttonBox); + if (dlg.exec() == QDialog::Accepted) { + b->move(lineNumberEdit->text().toInt()); + b->updateNote(noteEdit->text().replace(QLatin1Char('\t'), QLatin1Char(' '))); emit dataChanged(current, current); saveBookmarks(); } diff --git a/src/plugins/bookmarks/bookmarkmanager.h b/src/plugins/bookmarks/bookmarkmanager.h index 0526fd05a86..ce195897dea 100644 --- a/src/plugins/bookmarks/bookmarkmanager.h +++ b/src/plugins/bookmarks/bookmarkmanager.h @@ -97,8 +97,8 @@ public slots: void prev(); void moveUp(); void moveDown(); - void editNote(); - void editNote(const QString &fileName, int lineNumber); + void edit(); + void edit(const QString &fileName, int lineNumber); bool gotoBookmark(Bookmark *bookmark); signals: diff --git a/src/plugins/bookmarks/bookmarksplugin.cpp b/src/plugins/bookmarks/bookmarksplugin.cpp index caa3c25642b..c4fc525bdb0 100644 --- a/src/plugins/bookmarks/bookmarksplugin.cpp +++ b/src/plugins/bookmarks/bookmarksplugin.cpp @@ -105,7 +105,7 @@ bool BookmarksPlugin::initialize(const QStringList & /*arguments*/, QString *) cmd = Core::ActionManager::registerAction(m_docNextAction, BOOKMARKS_NEXTDOC_ACTION, globalcontext); mbm->addAction(cmd); - m_editNoteAction = new QAction(tr("Edit Bookmark Note"), this); + m_editBookmarkAction = new QAction(tr("Edit Bookmark"), this); m_bookmarkManager = new BookmarkManager; @@ -114,7 +114,7 @@ bool BookmarksPlugin::initialize(const QStringList & /*arguments*/, QString *) connect(m_nextAction, SIGNAL(triggered()), m_bookmarkManager, SLOT(next())); connect(m_docPrevAction, SIGNAL(triggered()), m_bookmarkManager, SLOT(prevInDocument())); connect(m_docNextAction, SIGNAL(triggered()), m_bookmarkManager, SLOT(nextInDocument())); - connect(m_editNoteAction, SIGNAL(triggered()), this, SLOT(bookmarkEditNoteActionTriggered())); + connect(m_editBookmarkAction, SIGNAL(triggered()), this, SLOT(editBookmarkActionTriggered())); connect(m_bookmarkManager, SIGNAL(updateActions(int)), this, SLOT(updateActions(int))); updateActions(m_bookmarkManager->state()); addAutoReleasedObject(new BookmarkViewFactory(m_bookmarkManager)); @@ -189,7 +189,7 @@ void BookmarksPlugin::requestContextMenu(TextEditor::ITextEditor *editor, menu->addAction(m_bookmarkMarginAction); if (m_bookmarkManager->hasBookmarkInPosition(m_bookmarkMarginActionFileName, m_bookmarkMarginActionLineNumber)) - menu->addAction(m_editNoteAction); + menu->addAction(m_editBookmarkAction); } void BookmarksPlugin::bookmarkMarginActionTriggered() @@ -198,9 +198,9 @@ void BookmarksPlugin::bookmarkMarginActionTriggered() m_bookmarkMarginActionLineNumber); } -void BookmarksPlugin::bookmarkEditNoteActionTriggered() +void BookmarksPlugin::editBookmarkActionTriggered() { - m_bookmarkManager->editNote(m_bookmarkMarginActionFileName, m_bookmarkMarginActionLineNumber); + m_bookmarkManager->edit(m_bookmarkMarginActionFileName, m_bookmarkMarginActionLineNumber); } Q_EXPORT_PLUGIN(BookmarksPlugin) diff --git a/src/plugins/bookmarks/bookmarksplugin.h b/src/plugins/bookmarks/bookmarksplugin.h index d417dda3bdf..63045c42cc7 100644 --- a/src/plugins/bookmarks/bookmarksplugin.h +++ b/src/plugins/bookmarks/bookmarksplugin.h @@ -70,7 +70,7 @@ private slots: void requestContextMenu(TextEditor::ITextEditor *editor, int lineNumber, QMenu *menu); void bookmarkMarginActionTriggered(); - void bookmarkEditNoteActionTriggered(); + void editBookmarkActionTriggered(); private: static BookmarksPlugin *m_instance; @@ -81,7 +81,7 @@ private: QAction *m_nextAction; QAction *m_docPrevAction; QAction *m_docNextAction; - QAction *m_editNoteAction; + QAction *m_editBookmarkAction; QAction *m_bookmarkMarginAction; int m_bookmarkMarginActionLineNumber; diff --git a/src/plugins/texteditor/basetextdocumentlayout.cpp b/src/plugins/texteditor/basetextdocumentlayout.cpp index 22291bb5849..619085e3d78 100644 --- a/src/plugins/texteditor/basetextdocumentlayout.cpp +++ b/src/plugins/texteditor/basetextdocumentlayout.cpp @@ -50,6 +50,7 @@ public: TextMarks marksAt(int line) const; void removeMark(ITextMark *mark); void updateMark(ITextMark *mark); + void moveMark(ITextMark *mark, int previousLine); void removeMarkFromMarksCache(TextEditor::ITextMark *mark); private: @@ -177,6 +178,18 @@ void DocumentMarker::updateMark(ITextMark *mark) documentLayout->requestUpdate(); } +void DocumentMarker::moveMark(ITextMark *mark, int previousLine) +{ + QTextBlock block = document->findBlockByNumber(previousLine - 1); + if (TextBlockUserData *data = BaseTextDocumentLayout::testUserData(block)) { + if (!data->removeMark(mark)) + qDebug() << "Could not find mark" << mark << "on line" << previousLine; + } + removeMarkFromMarksCache(mark); + mark->setMarkableInterface(0); + addMark(mark); +} + } // namespace Internal } // namespace TextEditor diff --git a/src/plugins/texteditor/itextmark.cpp b/src/plugins/texteditor/itextmark.cpp index 7102a9b5b30..d6c8b76edb3 100644 --- a/src/plugins/texteditor/itextmark.cpp +++ b/src/plugins/texteditor/itextmark.cpp @@ -53,6 +53,16 @@ void ITextMark::updateLineNumber(int lineNumber) m_lineNumber = lineNumber; } +void ITextMark::move(int line) +{ + if (line == m_lineNumber) + return; + const int previousLine = m_lineNumber; + m_lineNumber = line; + if (m_markableInterface) + m_markableInterface->moveMark(this, previousLine); +} + void ITextMark::updateBlock(const QTextBlock &) {} diff --git a/src/plugins/texteditor/itextmark.h b/src/plugins/texteditor/itextmark.h index f02c5813623..755696275f8 100644 --- a/src/plugins/texteditor/itextmark.h +++ b/src/plugins/texteditor/itextmark.h @@ -72,6 +72,7 @@ public: virtual void paint(QPainter *painter, const QRect &rect) const; virtual void updateLineNumber(int lineNumber); virtual void updateBlock(const QTextBlock &block); + virtual void move(int line); virtual void removedFromEditor(); virtual bool isClickable() const; virtual void clicked(); @@ -114,6 +115,7 @@ public: virtual TextMarks marksAt(int line) const = 0; virtual void removeMark(ITextMark *mark) = 0; virtual void updateMark(ITextMark *mark) = 0; + virtual void moveMark(ITextMark *mark, int previousLine) = 0; }; } // namespace TextEditor