]> git.sven.stormbind.net Git - sven/vym.git/blobdiff - src/slidemodel.cpp
New upstream version 2.9.22
[sven/vym.git] / src / slidemodel.cpp
diff --git a/src/slidemodel.cpp b/src/slidemodel.cpp
new file mode 100644 (file)
index 0000000..0f08a99
--- /dev/null
@@ -0,0 +1,314 @@
+#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;
+}