+#include "slidemodel.h"
+
+#include "slideitem.h"
+#include "vymmodel.h"
+
+#include <QDebug>
+#include <QItemSelectionModel>
+
+SlideModel::SlideModel(VymModel *vm) : QAbstractItemModel(NULL)
+{
+ QVector<QVariant> 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<SlideItem *>(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;
+}