diff options
| author | 2014-12-06 17:33:25 -0500 | |
|---|---|---|
| committer | 2014-12-06 17:33:25 -0500 | |
| commit | 7167ce41b61d2ba2cdb526777a4233eb84a3b66a (patch) | |
| tree | a35c14143716e1f2c98f808c81f89426045a946f /SQLiteStudio3/guiSQLiteStudio/windows/collationseditormodel.cpp | |
Imported Upstream version 2.99.6upstream/2.99.6
Diffstat (limited to 'SQLiteStudio3/guiSQLiteStudio/windows/collationseditormodel.cpp')
| -rw-r--r-- | SQLiteStudio3/guiSQLiteStudio/windows/collationseditormodel.cpp | 287 |
1 files changed, 287 insertions, 0 deletions
diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/collationseditormodel.cpp b/SQLiteStudio3/guiSQLiteStudio/windows/collationseditormodel.cpp new file mode 100644 index 0000000..05ca4e1 --- /dev/null +++ b/SQLiteStudio3/guiSQLiteStudio/windows/collationseditormodel.cpp @@ -0,0 +1,287 @@ +#include "collationseditormodel.h" +#include "common/unused.h" +#include "common/strhash.h" +#include "services/pluginmanager.h" +#include "plugins/scriptingplugin.h" +#include "icon.h" + +#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; + +CollationsEditorModel::CollationsEditorModel(QObject *parent) : + QAbstractListModel(parent) +{ + init(); +} + +void CollationsEditorModel::clearModified() +{ + beginResetModel(); + foreach (Collation* coll, collationList) + coll->modified = false; + + listModified = false; + originalCollationList = collationList; + + endResetModel(); +} + +bool CollationsEditorModel::isModified() const +{ + if (collationList != originalCollationList) + return true; + + foreach (Collation* coll, collationList) + { + if (coll->modified) + return true; + } + return false; +} + +bool CollationsEditorModel::isModified(int row) const +{ + GETTER(collationList[row]->modified, false); +} + +void CollationsEditorModel::setModified(int row, bool modified) +{ + SETTER(collationList[row]->modified, modified); +} + +void CollationsEditorModel::setName(int row, const QString& name) +{ + SETTER(collationList[row]->data->name, name); +} + +QString CollationsEditorModel::getName(int row) const +{ + GETTER(collationList[row]->data->name, QString()); +} + +void CollationsEditorModel::setLang(int row, const QString& lang) +{ + SETTER(collationList[row]->data->lang, lang); +} + +QString CollationsEditorModel::getLang(int row) const +{ + GETTER(collationList[row]->data->lang, QString()); +} + +void CollationsEditorModel::setAllDatabases(int row, bool allDatabases) +{ + SETTER(collationList[row]->data->allDatabases, allDatabases); +} + +bool CollationsEditorModel::getAllDatabases(int row) const +{ + GETTER(collationList[row]->data->allDatabases, true); +} + +void CollationsEditorModel::setCode(int row, const QString& code) +{ + SETTER(collationList[row]->data->code, code); +} + +QString CollationsEditorModel::getCode(int row) const +{ + GETTER(collationList[row]->data->code, QString()); +} + +void CollationsEditorModel::setDatabases(int row, const QStringList& databases) +{ + SETTER(collationList[row]->data->databases, databases); +} + +QStringList CollationsEditorModel::getDatabases(int row) +{ + GETTER(collationList[row]->data->databases, QStringList()); +} + +bool CollationsEditorModel::isValid(int row) const +{ + GETTER(collationList[row]->valid, false); +} + +void CollationsEditorModel::setValid(int row, bool valid) +{ + SETTER(collationList[row]->valid, valid); +} + +bool CollationsEditorModel::isValid() const +{ + foreach (Collation* coll, collationList) + { + if (!coll->valid) + return false; + } + return true; +} + +void CollationsEditorModel::setData(const QList<CollationManager::CollationPtr>& collations) +{ + beginResetModel(); + + Collation* collationPtr = nullptr; + foreach (collationPtr, collationList) + delete collationPtr; + + collationList.clear(); + + foreach (const CollationManager::CollationPtr& coll, collations) + collationList << new Collation(coll); + + listModified = false; + originalCollationList = collationList; + + endResetModel(); +} + +void CollationsEditorModel::addCollation(const CollationManager::CollationPtr& collation) +{ + int row = collationList.size(); + + beginInsertRows(QModelIndex(), row, row); + + collationList << new Collation(collation); + listModified = true; + + endInsertRows(); +} + +void CollationsEditorModel::deleteCollation(int row) +{ + if (!isValidRowIndex(row)) + return; + + beginRemoveRows(QModelIndex(), row, row); + + delete collationList[row]; + collationList.removeAt(row); + + listModified = true; + + endRemoveRows(); +} + +QList<CollationManager::CollationPtr> CollationsEditorModel::getCollations() const +{ + QList<CollationManager::CollationPtr> results; + + foreach (Collation* coll, collationList) + results << coll->data; + + return results; +} + +QStringList CollationsEditorModel::getCollationNames() const +{ + QStringList names; + foreach (Collation* coll, collationList) + names << coll->data->name; + + return names; +} + +void CollationsEditorModel::validateNames() +{ + StrHash<QList<int>> counter; + + int row = 0; + foreach (Collation* coll, collationList) + { + coll->valid &= true; + counter[coll->data->name] << row++; + } + + QHashIterator<QString,QList<int>> cntIt = counter.iterator(); + while (cntIt.hasNext()) + { + cntIt.next(); + if (cntIt.value().size() > 1) + { + foreach (int cntRow, cntIt.value()) + setValid(cntRow, false); + } + } + + QModelIndex idx; + for (int i = 0; i < collationList.size(); i++) + { + idx = index(i); + emit dataChanged(idx, idx); + } +} + +bool CollationsEditorModel::isAllowedName(int rowToSkip, const QString& nameToValidate) +{ + QStringList names = getCollationNames(); + names.removeAt(rowToSkip); + return !names.contains(nameToValidate, Qt::CaseInsensitive); +} + +bool CollationsEditorModel::isValidRowIndex(int row) const +{ + return (row >= 0 && row < collationList.size()); +} + +int CollationsEditorModel::rowCount(const QModelIndex& parent) const +{ + UNUSED(parent); + return collationList.size(); +} + +QVariant CollationsEditorModel::data(const QModelIndex& index, int role) const +{ + if (!index.isValid() || !isValidRowIndex(index.row())) + return QVariant(); + + if (role == Qt::DisplayRole) + return collationList[index.row()]->data->name; + + if (role == Qt::DecorationRole && langToIcon.contains(collationList[index.row()]->data->lang)) + { + QIcon icon = langToIcon[collationList[index.row()]->data->lang]; + if (!collationList[index.row()]->valid) + icon = Icon::merge(icon, Icon::ERROR); + + return icon; + } + + return QVariant(); + +} + +void CollationsEditorModel::init() +{ + foreach (ScriptingPlugin* plugin, PLUGINS->getLoadedPlugins<ScriptingPlugin>()) + langToIcon[plugin->getLanguage()] = QIcon(plugin->getIconPath()); +} + +void CollationsEditorModel::emitDataChanged(int row) +{ + QModelIndex idx = index(row); + emit dataChanged(idx, idx); +} + +CollationsEditorModel::Collation::Collation() +{ + data = CollationManager::CollationPtr::create(); +} + +CollationsEditorModel::Collation::Collation(const CollationManager::CollationPtr& other) +{ + data = CollationManager::CollationPtr::create(*other); + originalName = data->name; +} |
