]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blob - liblightdm-qt/sessionsmodel.cpp
Rearrange liblightdm-qt to be the same a liblightdm-gobject
[sojka/lightdm.git] / liblightdm-qt / sessionsmodel.cpp
1 /*
2  * Copyright (C) 2010-2011 David Edmundson.
3  * Author: David Edmundson <kde@davidedmundson.co.uk>
4  *
5  * This library is free software; you can redistribute it and/or modify it under
6  * the terms of the GNU Lesser General Public License as published by the Free
7  * Software Foundation; either version 3 of the License, or (at your option) any
8  * later version. See http://www.gnu.org/copyleft/lgpl.html the full text of the
9  * license.
10  */
11
12 #include "QLightDM/SessionsModel"
13
14 #include <QtCore/QList>
15 #include <QtCore/QDir>
16 #include <QtCore/QVariant>
17 #include <QtCore/QSettings>
18
19 using namespace QLightDM;
20
21 class SessionItem;
22
23 class SessionsModelPrivate
24 {
25 public:
26     QList<SessionItem> items;
27 };
28
29 class SessionItem
30 {
31 public:
32     //FIXME can I make these consts, if I set them in a lovely constructor?
33     QString id;
34     QString name;
35     QString comment;
36 };
37
38 SessionsModel::SessionsModel(QObject *parent) :
39     QAbstractListModel(parent),
40     d(new SessionsModelPrivate())
41 {
42     buildList();
43 }
44
45 SessionsModel::~SessionsModel()
46 {
47 }
48
49 int SessionsModel::rowCount(const QModelIndex &parent) const
50 {
51     if (parent == QModelIndex()) { //if top level
52         return d->items.size();
53     } else {
54         return 0; // no child elements.
55     }
56 }
57
58 QVariant SessionsModel::data(const QModelIndex &index, int role) const
59 {
60     if (! index.isValid()) {
61         return QVariant();
62     }
63
64     int row = index.row();
65
66     switch (role) {
67     case SessionsModel::IdRole:
68         return d->items[row].id;
69     case Qt::DisplayRole:
70         return d->items[row].name;
71     case Qt::ToolTipRole:
72         return d->items[row].comment;
73
74     }
75     return QVariant();
76 }
77
78 void SessionsModel::buildList()
79 {
80     //maybe clear first?
81
82     //FIXME don't hardcode this!
83     QDir sessionDir("/usr/share/xsessions");
84     sessionDir.setNameFilters(QStringList() << "*.desktop");
85
86     QList<SessionItem> items;
87
88     foreach(QString sessionFileName, sessionDir.entryList()) {
89         QSettings sessionData(sessionDir.filePath(sessionFileName), QSettings::IniFormat);
90         sessionData.beginGroup("Desktop Entry");
91         sessionFileName.chop(8);// chop(8) removes '.desktop'
92
93         SessionItem item;
94         item.id = sessionFileName;
95         item.name  = sessionData.value("Name").toString();
96         item.comment = sessionData.value("Comment").toString();
97         items.append(item);
98     }
99
100     beginInsertRows(QModelIndex(), 0, items.size());
101     d->items.append(items);
102     endInsertRows();
103 }