summaryrefslogtreecommitdiffstats
path: root/src/sessiontreemodel.cpp
diff options
context:
space:
mode:
authorJan Darmochwal2010-10-03 18:39:42 +0200
committerJan Darmochwal2010-10-03 18:39:42 +0200
commitee3f7eafae9e2e570c95e1afa9bea156ba3bf736 (patch)
tree7ffcb71280a344bde5249069991a1b5b841474df /src/sessiontreemodel.cpp
parentQt port is almost complete (at least it compiles) (diff)
downloadvmchooser-ee3f7eafae9e2e570c95e1afa9bea156ba3bf736.tar.gz
vmchooser-ee3f7eafae9e2e570c95e1afa9bea156ba3bf736.tar.xz
vmchooser-ee3f7eafae9e2e570c95e1afa9bea156ba3bf736.zip
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
Diffstat (limited to 'src/sessiontreemodel.cpp')
-rw-r--r--src/sessiontreemodel.cpp169
1 files changed, 169 insertions, 0 deletions
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 <QIcon>
+#include <QString>
+#include <QFileInfo>
+#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<SessionTreeItem*>(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<SessionTreeItem*>(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<SessionTreeItem*>(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<SessionTreeItem*>(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<SessionTreeItem*>(index.internalPointer());
+ SessionTreeItem *parentItem = childItem->parent();
+
+ if (parentItem == root_) {
+ return QModelIndex();
+ }
+
+ return createIndex(parentItem->row(), 0, parentItem);
+}
+
+void SessionTreeModel::addItems(const QList<Session*>& 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));
+ }
+}