From ee3f7eafae9e2e570c95e1afa9bea156ba3bf736 Mon Sep 17 00:00:00 2001 From: Jan Darmochwal Date: Sun, 3 Oct 2010 18:39:42 +0200 Subject: TreeView for sessions (replaces ListView) TreeView with SessionTreeModel replaces the old List View Other changes: * fixed bad copy and paste in CMakeLists.txt * added make clean to build.sh * removed moc_ and ui_ files from src --- src/sessiontreemodel.cpp | 169 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 src/sessiontreemodel.cpp (limited to 'src/sessiontreemodel.cpp') diff --git a/src/sessiontreemodel.cpp b/src/sessiontreemodel.cpp new file mode 100644 index 0000000..d3cd7ac --- /dev/null +++ b/src/sessiontreemodel.cpp @@ -0,0 +1,169 @@ +#include +#include +#include +#include "sessiontreemodel.h" +#include "sessiontreeitem.h" + +SessionTreeModel::SessionTreeModel(QObject *parent) + : QAbstractItemModel(parent) +{ + printf("new SessionTreeModel created\n"); + root_ = new SessionTreeItem("dummy"); +} + +SessionTreeModel::~SessionTreeModel() +{ + delete root_; +} + +int SessionTreeModel::columnCount(const QModelIndex &parent) const + { + //TODO: check if this is right for invalid parent of root_ + 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 +{ + printf("request for model row %d role %d\n", index.row(), role); + + 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) { + // TODO: use cache for icons + if (index.column() == 0) { // TODO: is this line needed? + QString icon(s->icon()); + + if (QFileInfo(icon).isAbsolute()) { + // try to load icon from file + return QIcon(icon); + } else { + // try to load icon from QResource + return QIcon(":" + icon.toLower()); + } + } + } + } 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)); + } +} -- cgit v1.2.3-55-g7522