diff options
| author | 2023-04-30 18:30:36 -0400 | |
|---|---|---|
| committer | 2023-04-30 18:30:36 -0400 | |
| commit | 3565aad630864ecdbe53fdaa501ea708555b3c7c (patch) | |
| tree | c743e4ad0bad39ebdb2f514c7cc52d34a257ebbe /SQLiteStudio3/guiSQLiteStudio/windows/codesnippeteditormodel.cpp | |
| parent | 1fdc150116cad39aae5c5da407c3312b47a59e3a (diff) | |
New upstream version 3.4.4+dfsg.upstream/3.4.4+dfsg
Diffstat (limited to 'SQLiteStudio3/guiSQLiteStudio/windows/codesnippeteditormodel.cpp')
| -rw-r--r-- | SQLiteStudio3/guiSQLiteStudio/windows/codesnippeteditormodel.cpp | 287 |
1 files changed, 287 insertions, 0 deletions
diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/codesnippeteditormodel.cpp b/SQLiteStudio3/guiSQLiteStudio/windows/codesnippeteditormodel.cpp new file mode 100644 index 0000000..585db7b --- /dev/null +++ b/SQLiteStudio3/guiSQLiteStudio/windows/codesnippeteditormodel.cpp @@ -0,0 +1,287 @@ +#include "codesnippeteditormodel.h" +#include "common/strhash.h" +#include "common/unused.h" +#include "iconmanager.h" + +#include <QKeySequence> + +#define SETTER(X, Y) \ +if (!isValidRowIndex(row) || X == Y) \ + return; \ + \ + X = Y; \ + emitDataChanged(row); + +#define GETTER(X, Y) \ +if (!isValidRowIndex(row)) \ + return Y; \ + \ + return X; + +CodeSnippetEditorModel::CodeSnippetEditorModel(QObject* parent) : + QAbstractListModel(parent) +{ +} + +void CodeSnippetEditorModel::clearModified() +{ + beginResetModel(); + for (Snippet*& snip : snippetList) + snip->modified = false; + + listModified = false; + originalSnippetList = snippetList; + + endResetModel(); +} + +bool CodeSnippetEditorModel::isModified() const +{ + if (snippetList != originalSnippetList) + return true; + + for (Snippet* snip : snippetList) + { + if (snip->modified) + return true; + } + return false; +} + +bool CodeSnippetEditorModel::isModified(int row) const +{ + GETTER(snippetList[row]->modified, false); +} + +void CodeSnippetEditorModel::setModified(int row, bool modified) +{ + SETTER(snippetList[row]->modified, modified); +} + +bool CodeSnippetEditorModel::isValid() const +{ + for (Snippet* snip : snippetList) + { + if (!snip->valid) + return false; + } + return true; +} + +bool CodeSnippetEditorModel::isValid(int row) const +{ + GETTER(snippetList[row]->valid, false); +} + +void CodeSnippetEditorModel::setValid(int row, bool valid) +{ + SETTER(snippetList[row]->valid, valid); +} + +void CodeSnippetEditorModel::setCode(int row, const QString& code) +{ + SETTER(snippetList[row]->data.code, code); +} + +QString CodeSnippetEditorModel::getCode(int row) const +{ + GETTER(snippetList[row]->data.code, QString()); +} + +void CodeSnippetEditorModel::setName(int row, const QString& newName) +{ + SETTER(snippetList[row]->data.name, newName); +} + +QString CodeSnippetEditorModel::getName(int row) const +{ + GETTER(snippetList[row]->data.name, QString()); +} + +void CodeSnippetEditorModel::setHotkey(int row, const QKeySequence& value) +{ + SETTER(snippetList[row]->data.hotkey, value.toString()); +} + +QKeySequence CodeSnippetEditorModel::getHotkey(int row) const +{ + GETTER(QKeySequence(snippetList[row]->data.hotkey), QKeySequence()); +} + +void CodeSnippetEditorModel::setData(const QList<CodeSnippetManager::CodeSnippet*>& snippets) +{ + beginResetModel(); + + for (Snippet*& snippetPtr : snippetList) + delete snippetPtr; + + snippetList.clear(); + + for (CodeSnippetManager::CodeSnippet* snip : snippets) + snippetList << new Snippet(snip); + + listModified = false; + originalSnippetList = snippetList; + + endResetModel(); +} + +void CodeSnippetEditorModel::addSnippet(CodeSnippetManager::CodeSnippet* snippet) +{ + int row = snippetList.size(); + + beginInsertRows(QModelIndex(), row, row); + + snippetList << new Snippet(snippet); + listModified = true; + + endInsertRows(); +} + +void CodeSnippetEditorModel::deleteSnippet(int row) +{ + if (!isValidRowIndex(row)) + return; + + beginRemoveRows(QModelIndex(), row, row); + + delete snippetList[row]; + snippetList.removeAt(row); + + listModified = true; + + endRemoveRows(); +} + +QList<CodeSnippetManager::CodeSnippet*> CodeSnippetEditorModel::generateSnippets() const +{ + QList<CodeSnippetManager::CodeSnippet*> results; + for (Snippet* snip: snippetList) + results << new CodeSnippetManager::CodeSnippet(snip->data); + + return results; +} + +QStringList CodeSnippetEditorModel::getSnippetNames() const +{ + QStringList names; + for (Snippet* snip : snippetList) + names << snip->data.name; + + return names; +} + +void CodeSnippetEditorModel::validateNames() +{ + StrHash<QList<int>> counter; + + int row = 0; + for (Snippet*& snip : snippetList) + { + snip->valid &= true; + counter[snip->data.name] << row++; + } + + QHashIterator<QString,QList<int>> cntIt = counter.iterator(); + while (cntIt.hasNext()) + { + cntIt.next(); + if (cntIt.value().size() > 1) + { + for (int cntRow : cntIt.value()) + setValid(cntRow, false); + } + } + + QModelIndex idx; + for (int i = 0; i < snippetList.size(); i++) + { + idx = index(i); + emit dataChanged(idx, idx); + } +} + +bool CodeSnippetEditorModel::isAllowedName(int rowToSkip, const QString& nameToValidate) +{ + QStringList names = getSnippetNames(); + names.removeAt(rowToSkip); + return !names.contains(nameToValidate, Qt::CaseInsensitive); +} + +bool CodeSnippetEditorModel::isAllowedHotkey(int rowToSkip, const QKeySequence& hotkeyToValidate) +{ + QList<QKeySequence> keys; + for (Snippet*& snip : snippetList) + keys << snip->data.hotkey; + + keys.removeAt(rowToSkip); + return !keys.contains(hotkeyToValidate); +} + +bool CodeSnippetEditorModel::isValidRowIndex(int row) const +{ + return (row >= 0 && row < snippetList.size()); +} + +int CodeSnippetEditorModel::moveUp(int row) +{ + if (row <= 0 || row >= snippetList.size()) + return row; + + snippetList.move(row, row - 1); + return row - 1; +} + +int CodeSnippetEditorModel::moveDown(int row) +{ + if (row < 0 || row + 1 >= snippetList.size()) + return row; + + snippetList.move(row, row + 1); + return row + 1; +} + +int CodeSnippetEditorModel::rowCount(const QModelIndex& parent) const +{ + UNUSED(parent); + return snippetList.size(); +} + +QVariant CodeSnippetEditorModel::data(const QModelIndex& index, int role) const +{ + if (!index.isValid() || !isValidRowIndex(index.row())) + return QVariant(); + + if (role == Qt::DisplayRole) + { + Snippet* sn = snippetList[index.row()]; + return sn->data.name; + } + + if (role == Qt::DecorationRole) + { + QIcon icon = ICONS.CODE_SNIPPET; + if (!snippetList[index.row()]->valid) + icon = Icon::merge(icon, Icon::ERROR); + + return icon; + } + + return QVariant(); +} + +void CodeSnippetEditorModel::emitDataChanged(int row) +{ + QModelIndex idx = index(row); + emit dataChanged(idx, idx); +} + +CodeSnippetEditorModel::Snippet::Snippet() +{ +} + +CodeSnippetEditorModel::Snippet::Snippet(CodeSnippetManager::CodeSnippet* other) +{ + data = CodeSnippetManager::CodeSnippet(*other); + originalName = data.name; +} |
