/* * Copyright (C) 2020-2022 Roy Qu (royqh1979@gmail.com) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "bookmarkmodel.h" #include "../systemconsts.h" #include #include #include #include #include #include #include #include "../utils.h" BookmarkModel::BookmarkModel(QObject* parent):QAbstractTableModel(parent) { } QSet BookmarkModel::bookmarksInFile(const QString &filename) { QSet lines; foreach (const PBookmark& bookmark, mBookmarks) { if (bookmark->filename.compare(filename, PATH_SENSITIVITY) == 0) { lines.insert(bookmark->line); } } return lines; } void BookmarkModel::addBookmark(const QString &filename, int line, const QString &description) { Q_ASSERT(!isBookmarkExists(filename,line)); PBookmark bookmark = std::make_shared(); bookmark->filename = filename; bookmark->line = line; bookmark->description = description; beginInsertRows(QModelIndex(),mBookmarks.count(),mBookmarks.count()); mBookmarks.append(bookmark); endInsertRows(); } PBookmark BookmarkModel::bookmark(int i) { return mBookmarks[i]; } PBookmark BookmarkModel::bookmark(const QString &filename, int line) { for (int i=0;ifilename.compare(filename, PATH_SENSITIVITY) == 0 && bookmark->line == line) { return bookmark; } } return PBookmark(); } bool BookmarkModel::removeBookmark(const QString &filename, int line) { for (int i=0;ifilename.compare(filename, PATH_SENSITIVITY) == 0 && bookmark->line == line) { removeBookmarkAt(i); return true; } } return false; } void BookmarkModel::removeBookmarks(const QString &filename) { for (int i=mBookmarks.count()-1;i>=0;i--) { PBookmark bookmark = mBookmarks[i]; if (bookmark->filename.compare(filename, PATH_SENSITIVITY) == 0) { removeBookmarkAt(i); } } } void BookmarkModel::clear() { beginResetModel(); mBookmarks.clear(); endResetModel(); } bool BookmarkModel::updateDescription(const QString &filename, int line, const QString &description) { for (int i=0;ifilename.compare(filename, PATH_SENSITIVITY) == 0 && bookmark->line == line) { bookmark->description = description; emit dataChanged(createIndex(i,0),createIndex(i,2)); return true; } } return false; } void BookmarkModel::save(const QString &filename) { QFile file(filename); if (file.open(QFile::WriteOnly | QFile::Truncate)) { QJsonArray array; foreach (const PBookmark& bookmark, mBookmarks) { QJsonObject obj; obj["filename"]=bookmark->filename; obj["line"]=bookmark->line; obj["description"]=bookmark->description; array.append(obj); } QJsonDocument doc; doc.setArray(array); if (file.write(doc.toJson())<0) { throw FileError(tr("Save file '%1' failed.") .arg(filename)); } } else { throw FileError(tr("Can't open file '%1' for write.") .arg(filename)); } } void BookmarkModel::load(const QString& filename) { clear(); QFile file(filename); if (!file.exists()) return; if (file.open(QFile::ReadOnly)) { QByteArray content = file.readAll(); QJsonParseError error; QJsonDocument doc(QJsonDocument::fromJson(content,&error)); if (error.error != QJsonParseError::NoError) { throw FileError(tr("Error in json file '%1':%2 : %3") .arg(filename) .arg(error.offset) .arg(error.errorString())); } QJsonArray array = doc.array(); for (int i=0;i=0;i--){ PBookmark bookmark = mBookmarks[i]; if (bookmark->filename == filename && bookmark->line>=startLine) { if (bookmark->line >= startLine+count) { bookmark->line -= count; emit dataChanged(createIndex(i,0),createIndex(i,2)); } else { removeBookmarkAt(i); } } } } void BookmarkModel::onFileInsertLines(const QString &filename, int startLine, int count) { for (int i = mBookmarks.count()-1;i>=0;i--){ PBookmark bookmark = mBookmarks[i]; if (bookmark->filename == filename && bookmark->line>=startLine) { bookmark->line+=count; emit dataChanged(createIndex(i,0),createIndex(i,2)); } } } void BookmarkModel::removeBookmarkAt(int i) { beginRemoveRows(QModelIndex(), i,i); mBookmarks.removeAt(i); endRemoveRows(); } bool BookmarkModel::isBookmarkExists(const QString &filename, int line) { foreach (const PBookmark& bookmark, mBookmarks) { if (bookmark->filename.compare(filename, PATH_SENSITIVITY) == 0 && bookmark->line == line) { return true; } } return false; } int BookmarkModel::rowCount(const QModelIndex &) const { return mBookmarks.count(); } QVariant BookmarkModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); int row = index.row(); PBookmark bookmark = mBookmarks[row]; if (role == Qt::DisplayRole) { switch(index.column()) { case 0: return bookmark->description; case 1: return bookmark->line; case 2: return bookmark->filename; } } return QVariant(); } int BookmarkModel::columnCount(const QModelIndex &) const { return 3; } QVariant BookmarkModel::headerData(int section, Qt::Orientation orientation, int role) const { if (orientation == Qt::Horizontal) { if (role == Qt::DisplayRole) { switch(section) { case 0: return tr("Description"); case 1: return tr("Line"); case 2: return tr("Filename"); } } } return QVariant(); }