]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blob - liblightdm-qt/usersmodel.cpp
Merge with trunk
[sojka/lightdm.git] / liblightdm-qt / usersmodel.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 2 or version 3 of the License.
8  * See http://www.gnu.org/copyleft/lgpl.html the full text of the license.
9  */
10
11 #include "QLightDM/usersmodel.h"
12
13 #include <QtCore/QString>
14 #include <QtCore/QDebug>
15 #include <QtGui/QIcon>
16
17 #include <lightdm.h>
18
19 using namespace QLightDM;
20
21 class UserItem
22 {
23 public:
24     QString name;
25     QString realName;
26     QString homeDirectory;
27     QString image;
28     QString background;
29     QString session;
30     bool isLoggedIn;
31     bool hasMessages;
32     QString displayName() const;
33 };
34
35 QString UserItem::displayName() const {
36     if (realName.isEmpty()){
37         return name;
38     }
39     else {
40         return realName;
41     }
42 }
43
44 namespace QLightDM {
45 class UsersModelPrivate {
46 public:
47     UsersModelPrivate(UsersModel *parent);
48     virtual ~UsersModelPrivate();
49     QList<UserItem> users;
50
51     protected:
52         UsersModel * const q_ptr;
53
54         void loadUsers();
55
56         static void cb_userAdded(LightDMUserList *user_list, LightDMUser *user, gpointer data);
57         static void cb_userChanged(LightDMUserList *user_list, LightDMUser *user, gpointer data);
58         static void cb_userRemoved(LightDMUserList *user_list, LightDMUser *user, gpointer data);
59     private:
60         Q_DECLARE_PUBLIC(UsersModel)
61 };
62 }
63
64 UsersModelPrivate::UsersModelPrivate(UsersModel* parent) :
65     q_ptr(parent)
66 {
67 #if !defined(GLIB_VERSION_2_36)
68     g_type_init();
69 #endif  
70 }
71
72 UsersModelPrivate::~UsersModelPrivate()
73 {
74     g_signal_handlers_disconnect_by_data(lightdm_user_list_get_instance(), this);
75 }
76
77 void UsersModelPrivate::loadUsers()
78 {
79     Q_Q(UsersModel);
80
81     int rowCount = lightdm_user_list_get_length(lightdm_user_list_get_instance());
82
83     if (rowCount == 0) {
84         return;
85     } else {
86         q->beginInsertRows(QModelIndex(), 0, rowCount-1);
87
88         const GList *items, *item;
89         items = lightdm_user_list_get_users(lightdm_user_list_get_instance());
90         for (item = items; item; item = item->next) {
91             LightDMUser *ldmUser = static_cast<LightDMUser*>(item->data);
92
93             UserItem user;
94             user.name = QString::fromUtf8(lightdm_user_get_name(ldmUser));
95             user.homeDirectory = QString::fromUtf8(lightdm_user_get_home_directory(ldmUser));
96             user.realName = QString::fromUtf8(lightdm_user_get_real_name(ldmUser));
97             user.image = QString::fromUtf8(lightdm_user_get_image(ldmUser));
98             user.background = QString::fromUtf8(lightdm_user_get_background(ldmUser));
99             user.session = QString::fromUtf8(lightdm_user_get_session(ldmUser));
100             user.isLoggedIn = lightdm_user_get_logged_in(ldmUser);
101             user.hasMessages = lightdm_user_get_has_messages(ldmUser);
102             users.append(user);
103         }
104
105         q->endInsertRows();
106     }
107     g_signal_connect(lightdm_user_list_get_instance(), "user-added", G_CALLBACK (cb_userAdded), this);
108     g_signal_connect(lightdm_user_list_get_instance(), "user-changed", G_CALLBACK (cb_userChanged), this);
109     g_signal_connect(lightdm_user_list_get_instance(), "user-removed", G_CALLBACK (cb_userRemoved), this);
110 }
111
112
113
114 void UsersModelPrivate::cb_userAdded(LightDMUserList *user_list, LightDMUser *ldmUser, gpointer data)
115 {
116     Q_UNUSED(user_list)
117     UsersModelPrivate *that = static_cast<UsersModelPrivate*>(data);
118
119     that->q_func()->beginInsertRows(QModelIndex(), that->users.size(), that->users.size());
120
121     UserItem user;
122     user.name = QString::fromUtf8(lightdm_user_get_name(ldmUser));
123     user.homeDirectory = QString::fromUtf8(lightdm_user_get_home_directory(ldmUser));
124     user.realName = QString::fromUtf8(lightdm_user_get_real_name(ldmUser));
125     user.image = QString::fromUtf8(lightdm_user_get_image(ldmUser));
126     user.background = QString::fromUtf8(lightdm_user_get_background(ldmUser));
127     user.isLoggedIn = lightdm_user_get_logged_in(ldmUser);
128     user.hasMessages = lightdm_user_get_has_messages(ldmUser);
129     that->users.append(user);
130
131     that->q_func()->endInsertRows();
132
133 }
134
135 void UsersModelPrivate::cb_userChanged(LightDMUserList *user_list, LightDMUser *ldmUser, gpointer data)
136 {
137     Q_UNUSED(user_list)
138     UsersModelPrivate *that = static_cast<UsersModelPrivate*>(data);
139
140     QString userToChange = QString::fromUtf8(lightdm_user_get_name(ldmUser));
141
142     for (int i=0;i<that->users.size();i++) {
143         if (that->users[i].name == userToChange) {
144
145             that->users[i].homeDirectory = QString::fromUtf8(lightdm_user_get_home_directory(ldmUser));
146             that->users[i].realName = QString::fromUtf8(lightdm_user_get_real_name(ldmUser));
147             that->users[i].image = QString::fromUtf8(lightdm_user_get_image(ldmUser));
148             that->users[i].background = QString::fromUtf8(lightdm_user_get_background(ldmUser));
149             that->users[i].isLoggedIn = lightdm_user_get_logged_in(ldmUser);
150             that->users[i].hasMessages = lightdm_user_get_has_messages(ldmUser);
151
152             QModelIndex index = that->q_ptr->createIndex(i, 0);
153             that->q_ptr->dataChanged(index, index);
154             break;
155         }
156     }
157 }
158
159
160 void UsersModelPrivate::cb_userRemoved(LightDMUserList *user_list, LightDMUser *ldmUser, gpointer data)
161 {
162     Q_UNUSED(user_list)
163
164     UsersModelPrivate *that = static_cast<UsersModelPrivate*>(data);
165     QString userToRemove = QString::fromUtf8(lightdm_user_get_name(ldmUser));
166
167     for (int i=0;i<that->users.size();i++) {
168         if (that->users[i].name == userToRemove) {
169             that->q_ptr->beginRemoveRows(QModelIndex(), i, i);
170             that->users.removeAt(i);
171             that->q_ptr->endRemoveRows();
172             break;
173         }
174     }
175 }
176
177 UsersModel::UsersModel(QObject *parent) :
178     QAbstractListModel(parent),
179     d_ptr(new UsersModelPrivate(this))
180 {
181     Q_D(UsersModel);
182     // Extend roleNames (we want to keep the "display" role)
183     QHash<int, QByteArray> roles = roleNames();
184     roles[NameRole] = "name";
185     roles[RealNameRole] = "realName";
186     roles[LoggedInRole] = "loggedIn";
187     roles[BackgroundRole] = "background";
188     roles[BackgroundPathRole] = "backgroundPath";
189     roles[SessionRole] = "session";
190     roles[HasMessagesRole] = "hasMessages";
191     roles[ImagePathRole] = "imagePath";
192     setRoleNames(roles);
193     d->loadUsers();
194
195 }
196
197 UsersModel::~UsersModel()
198 {
199     delete d_ptr;
200 }
201
202
203 int UsersModel::rowCount(const QModelIndex &parent) const
204 {
205     Q_D(const UsersModel);
206     if (parent == QModelIndex()) {
207         return d->users.size();
208     }
209
210     return 0;
211 }
212
213 QVariant UsersModel::data(const QModelIndex &index, int role) const
214 {
215     Q_D(const UsersModel);
216
217     if (!index.isValid()) {
218         return QVariant();
219     }
220
221     int row = index.row();
222     switch (role) {
223     case Qt::DisplayRole:
224         return d->users[row].displayName();
225     case Qt::DecorationRole:
226         return QIcon(d->users[row].image);
227     case UsersModel::NameRole:
228         return d->users[row].name;
229     case UsersModel::RealNameRole:
230         return d->users[row].realName;
231     case UsersModel::SessionRole:
232         return d->users[row].session;
233     case UsersModel::LoggedInRole:
234         return d->users[row].isLoggedIn;
235     case UsersModel::BackgroundRole:
236         return QPixmap(d->users[row].background);
237     case UsersModel::BackgroundPathRole:
238         return d->users[row].background;
239     case UsersModel::HasMessagesRole:
240         return d->users[row].hasMessages;
241     case UsersModel::ImagePathRole:
242         return d->users[row].image;
243     }
244
245     return QVariant();
246 }
247
248
249 #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
250 #include "usersmodel_moc5.cpp"
251 #else
252 #include "usersmodel_moc4.cpp"
253 #endif