diff options
Diffstat (limited to 'SQLiteStudio3/guiSQLiteStudio/selectabledbmodel.cpp')
| -rw-r--r-- | SQLiteStudio3/guiSQLiteStudio/selectabledbmodel.cpp | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/SQLiteStudio3/guiSQLiteStudio/selectabledbmodel.cpp b/SQLiteStudio3/guiSQLiteStudio/selectabledbmodel.cpp new file mode 100644 index 0000000..f19d52d --- /dev/null +++ b/SQLiteStudio3/guiSQLiteStudio/selectabledbmodel.cpp @@ -0,0 +1,109 @@ +#include "selectabledbmodel.h" +#include "dbtree/dbtreeitem.h" +#include "dbtree/dbtreemodel.h" + +SelectableDbModel::SelectableDbModel(QObject* parent) : + QSortFilterProxyModel(parent) +{ +} + +QVariant SelectableDbModel::data(const QModelIndex& index, int role) const +{ + if (role != Qt::CheckStateRole) + return QSortFilterProxyModel::data(index, role); + + DbTreeItem* item = getItemForProxyIndex(index); + if (!item) + return QSortFilterProxyModel::data(index, role); + + DbTreeItem::Type type = item->getType(); + if (type != DbTreeItem::Type::DB) + return QSortFilterProxyModel::data(index, role); + + return checkedDatabases.contains(item->text(), Qt::CaseInsensitive) ? Qt::Checked : Qt::Unchecked; +} + +bool SelectableDbModel::setData(const QModelIndex& index, const QVariant& value, int role) +{ + if (role != Qt::CheckStateRole) + return QSortFilterProxyModel::setData(index, value, role); + + DbTreeItem* item = getItemForProxyIndex(index); + if (!item) + return QSortFilterProxyModel::setData(index, value, role); + + DbTreeItem::Type type = item->getType(); + if (type != DbTreeItem::Type::DB) + return QSortFilterProxyModel::setData(index, value, role); + + if (value.toBool()) + checkedDatabases << item->text(); + else + checkedDatabases.removeOne(item->text()); + + emit dataChanged(index, index, {Qt::CheckStateRole}); + + return true; +} + +Qt::ItemFlags SelectableDbModel::flags(const QModelIndex& index) const +{ + Qt::ItemFlags itemFlags = QSortFilterProxyModel::flags(index); + + DbTreeItem* item = getItemForProxyIndex(index); + if (!item) + return itemFlags; + + DbTreeItem::Type type = item->getType(); + if (item->getDb() && item->getDb()->getVersion() == disabledVersion) + itemFlags ^= Qt::ItemIsEnabled; + else if (type == DbTreeItem::Type::DB) + itemFlags |= Qt::ItemIsUserCheckable; + + return itemFlags; +} + +void SelectableDbModel::setDatabases(const QStringList& databases) +{ + beginResetModel(); + checkedDatabases = databases; + endResetModel(); +} + +QStringList SelectableDbModel::getDatabases() const +{ + return checkedDatabases; +} + +bool SelectableDbModel::filterAcceptsRow(int srcRow, const QModelIndex& srcParent) const +{ + QModelIndex idx = sourceModel()->index(srcRow, 0, srcParent); + DbTreeItem* item = dynamic_cast<DbTreeItem*>(dynamic_cast<DbTreeModel*>(sourceModel())->itemFromIndex(idx)); + switch (item->getType()) + { + case DbTreeItem::Type::DIR: + case DbTreeItem::Type::DB: + return true; + default: + return false; + } + return false; +} + +DbTreeItem* SelectableDbModel::getItemForProxyIndex(const QModelIndex& index) const +{ + QModelIndex srcIdx = mapToSource(index); + DbTreeItem* item = dynamic_cast<DbTreeItem*>(dynamic_cast<DbTreeModel*>(sourceModel())->itemFromIndex(srcIdx)); + return item; +} +int SelectableDbModel::getDisabledVersion() const +{ + return disabledVersion; +} + +void SelectableDbModel::setDisabledVersion(int value) +{ + disabledVersion = value; +} + + |
