diff options
author | David Schulz <david.schulz@theqtcompany.com> | 2015-04-07 08:30:09 +0200 |
---|---|---|
committer | David Schulz <david.schulz@theqtcompany.com> | 2015-04-15 08:56:41 +0000 |
commit | 88d9740642ac2f79675ffdec07d15323db1afb96 (patch) | |
tree | d91e71d89fea1ef545fcb13bf9fd5330be2a66ac /src/plugins/bookmarks | |
parent | 32aff7820fb69ebb20de7f037362ff3b346bf480 (diff) | |
download | qt-creator-88d9740642ac2f79675ffdec07d15323db1afb96.tar.gz |
Bookmark: Fix crash after saving file under a different name.
Task-number: QTCREATORBUG-14225
Change-Id: I5416b21dc0494825a892e42ae6bd4ff6f4cc0a56
Reviewed-by: Christian Stenger <christian.stenger@theqtcompany.com>
Reviewed-by: Eike Ziller <eike.ziller@theqtcompany.com>
Diffstat (limited to 'src/plugins/bookmarks')
-rw-r--r-- | src/plugins/bookmarks/bookmark.cpp | 5 | ||||
-rw-r--r-- | src/plugins/bookmarks/bookmarkmanager.cpp | 79 | ||||
-rw-r--r-- | src/plugins/bookmarks/bookmarkmanager.h | 5 |
3 files changed, 58 insertions, 31 deletions
diff --git a/src/plugins/bookmarks/bookmark.cpp b/src/plugins/bookmarks/bookmark.cpp index adeff82903..29c4d83328 100644 --- a/src/plugins/bookmarks/bookmark.cpp +++ b/src/plugins/bookmarks/bookmark.cpp @@ -47,7 +47,7 @@ Bookmark::Bookmark(int lineNumber, BookmarkManager *manager) : void Bookmark::removedFromEditor() { - m_manager->removeBookmark(this); + m_manager->deleteBookmark(this); } void Bookmark::updateLineNumber(int line) @@ -76,8 +76,9 @@ void Bookmark::updateBlock(const QTextBlock &block) void Bookmark::updateFileName(const QString &fileName) { + const QString &oldFileName = this->fileName(); TextMark::updateFileName(fileName); - m_manager->updateBookmark(this); + m_manager->updateBookmarkFileName(this, oldFileName); } void Bookmark::setNote(const QString ¬e) diff --git a/src/plugins/bookmarks/bookmarkmanager.cpp b/src/plugins/bookmarks/bookmarkmanager.cpp index 17936c7f10..e4de592623 100644 --- a/src/plugins/bookmarks/bookmarkmanager.cpp +++ b/src/plugins/bookmarks/bookmarkmanager.cpp @@ -280,7 +280,7 @@ void BookmarkView::removeFromContextMenu() void BookmarkView::removeBookmark(const QModelIndex& index) { Bookmark *bm = m_manager->bookmarkForIndex(index); - m_manager->removeBookmark(bm); + m_manager->deleteBookmark(bm); } void BookmarkView::keyPressEvent(QKeyEvent *event) @@ -313,7 +313,7 @@ void BookmarkView::gotoBookmark(const QModelIndex &index) { Bookmark *bk = m_manager->bookmarkForIndex(index); if (!m_manager->gotoBookmark(bk)) - m_manager->removeBookmark(bk); + m_manager->deleteBookmark(bk); } //// @@ -449,7 +449,7 @@ void BookmarkManager::toggleBookmark(const QString &fileName, int lineNumber) // Remove any existing bookmark on this line if (Bookmark *mark = findBookmark(fileName, lineNumber)) { // TODO check if the bookmark is really on the same markable Interface - removeBookmark(mark); + deleteBookmark(mark); return; } @@ -469,6 +469,17 @@ void BookmarkManager::updateBookmark(Bookmark *bookmark) saveBookmarks(); } +void BookmarkManager::updateBookmarkFileName(Bookmark *bookmark, const QString &oldFileName) +{ + if (oldFileName == bookmark->fileName()) + return; + + if (removeBookmarkFromMap(bookmark, oldFileName)) + addBookmarkToMap(bookmark); + + updateBookmark(bookmark); +} + void BookmarkManager::removeAllBookmarks() { if (m_bookmarksList.isEmpty()) @@ -492,28 +503,35 @@ void BookmarkManager::removeAllBookmarks() endRemoveRows(); } -void BookmarkManager::removeBookmark(Bookmark *bookmark) +bool BookmarkManager::removeBookmarkFromMap(Bookmark *bookmark, const QString &fileName) { - int idx = m_bookmarksList.indexOf(bookmark); - beginRemoveRows(QModelIndex(), idx, idx); - - const QFileInfo fi(bookmark->fileName()); - FileNameBookmarksMap *files = m_bookmarksMap.value(fi.path()); - - FileNameBookmarksMap::iterator i = files->begin(); - while (i != files->end()) { - if (i.value() == bookmark) { - files->erase(i); - delete bookmark; - break; + bool found = false; + const QFileInfo fi(fileName.isEmpty() ? bookmark->fileName() : fileName); + if (FileNameBookmarksMap *files = m_bookmarksMap.value(fi.path())) { + FileNameBookmarksMap::iterator i = files->begin(); + while (i != files->end()) { + if (i.value() == bookmark) { + files->erase(i); + found = true; + break; + } + ++i; + } + if (files->count() <= 0) { + m_bookmarksMap.remove(fi.path()); + delete files; } - ++i; - } - if (files->count() <= 0) { - m_bookmarksMap.remove(fi.path()); - delete files; } + return found; +} +void BookmarkManager::deleteBookmark(Bookmark *bookmark) +{ + int idx = m_bookmarksList.indexOf(bookmark); + beginRemoveRows(QModelIndex(), idx, idx); + + removeBookmarkFromMap(bookmark); + delete bookmark; m_bookmarksList.removeAt(idx); endRemoveRows(); @@ -609,7 +627,7 @@ void BookmarkManager::next() selectionModel()->setCurrentIndex(newIndex, QItemSelectionModel::Select | QItemSelectionModel::Clear); return; } - removeBookmark(bk); + deleteBookmark(bk); if (m_bookmarksList.isEmpty()) // No bookmarks anymore ... return; } @@ -632,7 +650,7 @@ void BookmarkManager::prev() selectionModel()->setCurrentIndex(newIndex, QItemSelectionModel::Select | QItemSelectionModel::Clear); return; } - removeBookmark(bk); + deleteBookmark(bk); if (m_bookmarksList.isEmpty()) return; } @@ -756,6 +774,15 @@ Bookmark *BookmarkManager::findBookmark(const QString &filePath, int lineNumber) return 0; } +void BookmarkManager::addBookmarkToMap(Bookmark *bookmark) +{ + const QFileInfo fi(bookmark->fileName()); + const QString &path = fi.path(); + if (!m_bookmarksMap.contains(path)) + m_bookmarksMap.insert(path, new FileNameBookmarksMap()); + m_bookmarksMap.value(path)->insert(fi.fileName(), bookmark); +} + /* Adds a bookmark to the internal data structures. The 'userset' parameter * determines whether action status should be updated and whether the bookmarks * should be saved to the session settings. @@ -763,12 +790,8 @@ Bookmark *BookmarkManager::findBookmark(const QString &filePath, int lineNumber) void BookmarkManager::addBookmark(Bookmark *bookmark, bool userset) { beginInsertRows(QModelIndex(), m_bookmarksList.size(), m_bookmarksList.size()); - const QFileInfo fi(bookmark->fileName()); - const QString &path = fi.path(); - if (!m_bookmarksMap.contains(path)) - m_bookmarksMap.insert(path, new FileNameBookmarksMap()); - m_bookmarksMap.value(path)->insert(fi.fileName(), bookmark); + addBookmarkToMap(bookmark); m_bookmarksList.append(bookmark); diff --git a/src/plugins/bookmarks/bookmarkmanager.h b/src/plugins/bookmarks/bookmarkmanager.h index a2e1d1d7e6..a86413b758 100644 --- a/src/plugins/bookmarks/bookmarkmanager.h +++ b/src/plugins/bookmarks/bookmarkmanager.h @@ -60,7 +60,8 @@ public: QIcon bookmarkIcon() const { return m_bookmarkIcon; } void updateBookmark(Bookmark *bookmark); - void removeBookmark(Bookmark *bookmark); // Does not remove the mark + void updateBookmarkFileName(Bookmark *bookmark, const QString &oldFileName); + void deleteBookmark(Bookmark *bookmark); // Does not remove the mark void removeAllBookmarks(); Bookmark *bookmarkForIndex(const QModelIndex &index) const; @@ -119,6 +120,8 @@ private: Bookmark *findBookmark(const QString &filePath, int lineNumber); void addBookmark(Bookmark *bookmark, bool userset = true); void addBookmark(const QString &s); + void addBookmarkToMap(Bookmark *bookmark); + bool removeBookmarkFromMap(Bookmark *bookmark, const QString &fileName = QString()); static QString bookmarkToString(const Bookmark *b); void saveBookmarks(); void operateTooltip(QWidget *widget, const QPoint &pos, Bookmark *mark); |