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