summaryrefslogtreecommitdiff
path: root/src/plugins/bookmarks
diff options
context:
space:
mode:
authorDavid Schulz <david.schulz@theqtcompany.com>2015-04-07 08:30:09 +0200
committerDavid Schulz <david.schulz@theqtcompany.com>2015-04-15 08:56:41 +0000
commit88d9740642ac2f79675ffdec07d15323db1afb96 (patch)
treed91e71d89fea1ef545fcb13bf9fd5330be2a66ac /src/plugins/bookmarks
parent32aff7820fb69ebb20de7f037362ff3b346bf480 (diff)
downloadqt-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.cpp5
-rw-r--r--src/plugins/bookmarks/bookmarkmanager.cpp79
-rw-r--r--src/plugins/bookmarks/bookmarkmanager.h5
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 &note)
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);