#include "lrcompletermodel.h" #include CompleterModel::CompleterModel(QObject *parent) : QAbstractItemModel(parent){m_root.setModel(this);} QModelIndex CompleterModel::index(int row, int column, const QModelIndex &parent) const { CompleterItem const *parentItem; if (!parent.isValid()) parentItem = &m_root; else parentItem = static_cast(parent.internalPointer()); if ((parentItem == nullptr) || (row < 0) || (column < 0) || (row >= parentItem->rowCount()) || (column >= 1)) { return QModelIndex(); } return createIndex(row, column, parentItem->child(row)); } QModelIndex CompleterModel::parent(const QModelIndex &child) const { if (child.isValid()){ CompleterItem *childItem = static_cast(child.internalPointer()); CompleterItem *parentItem = childItem->parent(); if (parentItem != &m_root) { return indexFromItem(parentItem); } } return QModelIndex(); } int CompleterModel::rowCount(const QModelIndex &parent) const { if (parent.isValid()){ CompleterItem *parentItem = static_cast(parent.internalPointer()); return parentItem->rowCount(); } return m_root.rowCount(); } int CompleterModel::columnCount(const QModelIndex &parent) const { Q_UNUSED(parent) return 1; } QVariant CompleterModel::data(const QModelIndex &index, int role) const { if (index.isValid()){ CompleterItem* item = static_cast(index.internalPointer()); switch (role) { case Qt::DisplayRole: case Qt::EditRole: if (!item) return QVariant(); if (index.column()==0){ return item->text(); } else { return ""; } case Qt::DecorationRole : if (!item) return QIcon(); if (index.column()==0){ return item->icon(); } else return QIcon(); default: return QVariant(); } } return QVariant(); } QList CompleterModel::findItems(const QString &text, Qt::MatchFlags flags, int column) const { QModelIndexList indexes = match(index(0, column, QModelIndex()), Qt::DisplayRole, text, -1, flags); QList items; const int numIndexes = indexes.size(); items.reserve(numIndexes); for (int i = 0; i < numIndexes; ++i) items.append(itemFromIndex(indexes.at(i))); return items; } void CompleterModel::clear() { beginResetModel(); m_root.clear(); endResetModel(); } CompleterItem *CompleterModel::itemFromIndex(const QModelIndex index) const { if ((index.row() < 0) || (index.column() < 0) || (index.model() != this)) return nullptr; CompleterItem *parent = static_cast(index.internalPointer()); if (parent == nullptr) return nullptr; CompleterItem *item = parent->child(index.row()); return item; } QModelIndex CompleterModel::indexFromItem(CompleterItem *item) const { if (item && item->parent()){ return createIndex(item->row(), 0, item); } return QModelIndex(); } CompleterItem::~CompleterItem(){} void CompleterItem::setIcon(const QIcon &newIcon) { m_icon = newIcon; } void CompleterItem::setText(const QString &newText) { m_text = newText; } void CompleterItem::appendRow(CompleterItem *child){ child->m_parent = this; child->m_model = this->m_model; m_children.append(QSharedPointer(child)); if (m_model){ QModelIndex start = m_model->indexFromItem(child); emit m_model->dataChanged(start, start); } } void CompleterItem::appendRows(const QList &children){ foreach(CompleterItem* item, children){ appendRow(item); } }