X-Git-Url: https://git.sven.stormbind.net/?a=blobdiff_plain;f=src%2Fslidemodel.cpp;fp=src%2Fslidemodel.cpp;h=0f08a99d9fbd7780a33d1c22ca030e3012c30c9c;hb=d483bd8e6523c23c6f1d8908a2e0611c2bc9ff4f;hp=0000000000000000000000000000000000000000;hpb=7dfa3fe589d1722d49681f42cdb0bf1e6efb5223;p=sven%2Fvym.git diff --git a/src/slidemodel.cpp b/src/slidemodel.cpp new file mode 100644 index 0000000..0f08a99 --- /dev/null +++ b/src/slidemodel.cpp @@ -0,0 +1,314 @@ +#include "slidemodel.h" + +#include "slideitem.h" +#include "vymmodel.h" + +#include +#include + +SlideModel::SlideModel(VymModel *vm) : QAbstractItemModel(NULL) +{ + QVector rootData; + rootData << "Slide"; + rootItem = new SlideItem(rootData, NULL, this); + vymModel = vm; +} + +SlideModel::~SlideModel() { delete rootItem; } + +void SlideModel::clear() +{ + if (rootItem->childCount() > 0) + removeRows(0, rowCount(QModelIndex())); +} + +VymModel *SlideModel::getVymModel() { return vymModel; } + +int SlideModel::columnCount(const QModelIndex & /* parent */) const +{ + return rootItem->columnCount(); +} + +QVariant SlideModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid()) + return QVariant(); + + if (role != Qt::DisplayRole && role != Qt::EditRole) + return QVariant(); + + SlideItem *item = getItem(index); + + return item->data(index.column()); +} + +Qt::ItemFlags SlideModel::flags(const QModelIndex &index) const +{ + if (!index.isValid()) + return 0; + + return Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable; +} + +QVariant SlideModel::headerData(int section, Qt::Orientation orientation, + int role) const +{ + if (orientation == Qt::Horizontal && role == Qt::DisplayRole) + return rootItem->data(section); + + return QVariant(); +} + +QModelIndex SlideModel::index(SlideItem *fri) +{ + if (!fri || !fri->parent()) + return QModelIndex(); + else + return createIndex(fri->row(), 0, fri); +} + +QModelIndex SlideModel::index(int row, int column, + const QModelIndex &parent) const +{ + if (parent.isValid() && parent.column() != 0) + return QModelIndex(); + + SlideItem *parentItem = getItem(parent); + + SlideItem *childItem = parentItem->child(row); + if (childItem) + return createIndex(row, column, childItem); + else + return QModelIndex(); +} + +bool SlideModel::insertColumns(int position, int columns, + const QModelIndex &parent) +{ + bool success; + + beginInsertColumns(parent, position, position + columns - 1); + success = rootItem->insertColumns(position, columns); + endInsertColumns(); + + return success; +} + +bool SlideModel::insertRows(int position, int rows, const QModelIndex &parent) +{ + SlideItem *parentItem = getItem(parent); + bool success; + + beginInsertRows(parent, position, position + rows - 1); + success = + parentItem->insertChildren(position, rows, rootItem->columnCount()); + endInsertRows(); + + return success; +} + +QModelIndex SlideModel::parent(const QModelIndex &index) const +{ + if (!index.isValid()) + return QModelIndex(); + + SlideItem *childItem = getItem(index); + SlideItem *parentItem = childItem->parent(); + + if (parentItem == rootItem) + return QModelIndex(); + + return createIndex(parentItem->childNumber(), 0, parentItem); +} + +bool SlideModel::removeColumns(int position, int columns, + const QModelIndex &parent) +{ + bool success; + + beginRemoveColumns(parent, position, position + columns - 1); + success = rootItem->removeColumns(position, columns); + endRemoveColumns(); + + if (rootItem->columnCount() == 0) + removeRows(0, rowCount()); + + return success; +} + +bool SlideModel::removeRows(int position, int rows, const QModelIndex &parent) +{ + SlideItem *parentItem = getItem(parent); + bool success = true; + + beginRemoveRows(parent, position, position + rows - 1); + success = parentItem->removeChildren(position, rows); + endRemoveRows(); + + return success; +} + +int SlideModel::count() { return rootItem->childCount(); } + +int SlideModel::rowCount(const QModelIndex &parent) const +{ + SlideItem *parentItem = getItem(parent); + + return parentItem->childCount(); +} + +bool SlideModel::setData(const QModelIndex &index, const QVariant &value, + int role) +{ + if (role != Qt::EditRole) + return false; + + SlideItem *item = getItem(index); + bool result = item->setData(index.column(), value); + + if (result) + emit dataChanged(index, index); + + return result; +} + +bool SlideModel::setHeaderData(int section, Qt::Orientation orientation, + const QVariant &value, int role) +{ + if (role != Qt::EditRole || orientation != Qt::Horizontal) + return false; + + bool result = rootItem->setData(section, value); + + if (result) + emit headerDataChanged(orientation, section, section); + + return result; +} + +SlideItem *SlideModel::addSlide(SlideItem *dst, int n) +{ + SlideItem *si = NULL; + if (!dst) + dst = rootItem; + + emit(layoutAboutToBeChanged()); + + QModelIndex parix = index(dst); + if (n < 0) + n = dst->childCount(); + beginInsertRows(parix, n, n); + if (rootItem->insertChildren(n, 1, 0)) { + QModelIndex ix = index(n, 0, QModelIndex()); + si = getItem(ix); + } + endInsertRows(); + emit(layoutChanged()); + + return si; +} + +void SlideModel::deleteSlide(SlideItem *si) +{ + QModelIndex ix = index(si); + if (ix.isValid()) { + QModelIndex px = ix.parent(); + int n = si->childNumber(); + removeRows(n, 1, px); + } +} + +bool SlideModel::relinkSlide(SlideItem *si, SlideItem *dst, int pos) +{ + if (si && dst) { + emit(layoutAboutToBeChanged()); + SlideItem *pi = si->parent(); + + // Remove at current position + int n = si->childNumber(); + + beginRemoveRows(index(pi), n, n); + pi->removeItem(n); + endRemoveRows(); + + if (pos < 0 || pos > dst->childCount()) + pos = dst->childCount(); + + // Insert at new position + beginInsertRows(index(dst), pos, pos); + dst->insertItem(pos, si); + endInsertRows(); + + emit(layoutChanged()); + + selModel->select(index(si), QItemSelectionModel::ClearAndSelect); + + return true; + } + return false; +} + +SlideItem *SlideModel::getItem(const QModelIndex &index) const +{ + if (index.isValid()) { + SlideItem *item = static_cast(index.internalPointer()); + if (item) + return item; + } + return rootItem; +} + +SlideItem *SlideModel::getSlide(int n) +{ + if (n >= count() || n < 0) + return NULL; + return getItem(index(n, 0, QModelIndex())); +} + +SlideItem *SlideModel::findSlideID(uint n) +{ + for (int i = 0; i < rootItem->childCount(); i++) + if (rootItem->child(i)->getID() == n) + return rootItem->child(i); + return NULL; +} + +QString SlideModel::saveToDir() +{ + QString s; + for (int i = 0; i < rootItem->childCount(); i++) + s += rootItem->child(i)->saveToDir(); + return s; +} + +void SlideModel::setSearchString(const QString &s) { searchString = s; } + +QString SlideModel::getSearchString() { return searchString; } + +void SlideModel::setSearchFlags(QTextDocument::FindFlags f) { searchFlags = f; } + +QTextDocument::FindFlags SlideModel::getSearchFlags() { return searchFlags; } + +void SlideModel::setSelectionModel(QItemSelectionModel *sm) { selModel = sm; } + +QItemSelectionModel *SlideModel::getSelectionModel() { return selModel; } + +QModelIndex SlideModel::getSelectedIndex() +{ + if (!selModel) { + qDebug() << "SlideModel: No selection model!"; + return QModelIndex(); + } + QModelIndexList list = selModel->selectedIndexes(); + if (!list.isEmpty()) + return list.first(); + return QModelIndex(); +} + +SlideItem *SlideModel::getSelectedItem() +{ + QModelIndex ix = getSelectedIndex(); + if (ix.isValid()) + return getItem(ix); + return NULL; +}