#include "sessiontreemodel.h" #include #include #include #include #include #include "sessiontreeitem.h" #include "vsession.h" #include "sessionsiconholder.h" SessionTreeModel::SessionTreeModel(QObject *parent) : QAbstractItemModel(parent) { root_ = new SessionTreeItem("dummy"); iconHolder = new SessionsIconHolder(*this); } SessionTreeModel::~SessionTreeModel() { delete root_; } int SessionTreeModel::columnCount(const QModelIndex& /*parent*/) const { return 1; } int SessionTreeModel::rowCount(const QModelIndex &parent) const { SessionTreeItem* parentItem; if (parent.column() > 0) { return 0; } if (!parent.isValid()) { parentItem = root_; } else { parentItem = static_cast(parent.internalPointer()); } return parentItem->childCount(); } QVariant SessionTreeModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) { return QVariant(); } SessionTreeItem* item = static_cast(index.internalPointer()); const Session* s = item->session(); if (s) { if (role == Qt::DisplayRole) return s->shortDescription(); if (role == Qt::ToolTipRole) return s->description(); if (role == Qt::DecorationRole) { if (index.column() == 0) { // TODO: is this line needed? QString icon(s->icon()); // check if attribute is a valid url: if (icon.startsWith("http://")) { // try to load icon from url QIcon url_icon = iconHolder->getIcon(QUrl(icon)); if (!url_icon.isNull()) { return url_icon; } } else { // try to load icon from QResource QIcon res_icon = iconHolder->getIcon(icon); if (!res_icon.isNull()) { return res_icon; } } // fallback to os icon if (s->type() == Session::VSESSION) { const VSession* vs = (VSession*) s; if (vs->getAttribute("os", "param").toLower().startsWith("win")) { return iconHolder->getIcon("windows"); } else { return iconHolder->getIcon("linux"); } } } } } else if (role == Qt::DisplayRole) { // this is a section item (X Sessions / Virtual Sessions) return item->text(); } return QVariant(); } Qt::ItemFlags SessionTreeModel::flags(const QModelIndex &index) const { if (!index.isValid()) { return 0; } SessionTreeItem* item = static_cast(index.internalPointer()); if (item->session()) { return Qt::ItemIsEnabled | Qt::ItemIsSelectable; } else { return Qt::ItemIsEnabled; } } QVariant SessionTreeModel::headerData(int /*section*/, Qt::Orientation /*orientation*/, int /*role*/) const { return QVariant(); } QModelIndex SessionTreeModel::index(int row, int column, const QModelIndex &parent) const { if (!hasIndex(row, column, parent)) { return QModelIndex(); } SessionTreeItem *parentItem; if (!parent.isValid()) { parentItem = root_; } else { parentItem = static_cast(parent.internalPointer()); } SessionTreeItem *childItem = parentItem->child(row); if (childItem) { return createIndex(row, column, childItem); } else { return QModelIndex(); } } QModelIndex SessionTreeModel::parent(const QModelIndex &index) const { if (!index.isValid()) { return QModelIndex(); } SessionTreeItem *childItem = static_cast(index.internalPointer()); SessionTreeItem *parentItem = childItem->parent(); if (parentItem == root_) { return QModelIndex(); } return createIndex(parentItem->row(), 0, parentItem); } void SessionTreeModel::addItems(const QList& sessions, const QString& section) { SessionTreeItem* parentItem; bool sectionExists = false; for (int i = 0; i < root_->childCount(); ++i) { SessionTreeItem* item = root_->child(i); if (item->text() == section) { parentItem = item; sectionExists = true; break; } } if (!sectionExists) { parentItem = new SessionTreeItem(section, root_); root_->appendChild(parentItem); } foreach (Session* s, sessions) { parentItem->appendChild(new SessionTreeItem(s, parentItem)); } } void SessionTreeModel::addLabelItem(const QString& label, const QString& section) { SessionTreeItem* parentItem; bool sectionExists = false; for (int i = 0; i < root_->childCount(); ++i) { SessionTreeItem* item = root_->child(i); if (item->text() == section) { parentItem = item; sectionExists = true; break; } } if (!sectionExists) { parentItem = new SessionTreeItem(section, root_); root_->appendChild(parentItem); } parentItem->appendChild(new SessionTreeItem(label, parentItem)); } void SessionTreeModel::removeItem(const QString& name, const QString& section) { SessionTreeItem* parentItem; bool sectionExists = false; for (int i = 0; i < root_->childCount(); ++i) { SessionTreeItem* item = root_->child(i); if (item->text() == section) { parentItem = item; sectionExists = true; break; } } if (sectionExists) { for (int i = 0; i < parentItem->childCount(); ++i) { SessionTreeItem* item = parentItem->child(i); if (item->text() == name) { parentItem->removeChild(item); } } } } void SessionTreeModel::updateView() { emit layoutChanged(); }