]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blob - liblightdm-qt/usersmodel.cpp
Merged 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 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/usersmodel.h"
13
14 #include <QtCore/QString>
15 #include <QtCore/QDebug>
16 #include <QtGui/QPixmap>
17
18 #include <lightdm.h>
19
20 using namespace QLightDM;
21
22 class UserItem
23 {
24 public:
25     QString name;
26     QString realName;
27     QString homeDirectory;
28     QString image;
29     bool isLoggedIn;
30     QString displayName() const;
31 };
32
33 QString UserItem::displayName() const {
34     if (realName.isEmpty()){
35         return name;
36     }
37     else {
38         return realName;
39     }
40 }
41
42 namespace QLightDM {
43 class UsersModelPrivate {
44 public:
45     UsersModelPrivate(UsersModel *parent);
46     virtual ~UsersModelPrivate();
47     QList<UserItem> users;
48
49     protected:
50         UsersModel * const q_ptr;
51
52         void loadUsers();
53
54         static void cb_userAdded(LightDMUserList *user_list, LightDMUser *user, gpointer data);
55         static void cb_userChanged(LightDMUserList *user_list, LightDMUser *user, gpointer data);
56         static void cb_userRemoved(LightDMUserList *user_list, LightDMUser *user, gpointer data);
57     private:
58         Q_DECLARE_PUBLIC(UsersModel)
59 };
60 }
61
62 UsersModelPrivate::UsersModelPrivate(UsersModel* parent) :
63     q_ptr(parent)
64 {
65     g_type_init();
66 }
67
68 UsersModelPrivate::~UsersModelPrivate()
69 {
70     g_signal_handlers_disconnect_by_func(lightdm_user_list_get_instance(), NULL, this);
71 }
72
73 void UsersModelPrivate::loadUsers()
74 {
75     Q_Q(UsersModel);
76
77     int rowCount = lightdm_user_list_get_length(lightdm_user_list_get_instance());
78
79     if (rowCount == 0) {
80         return;
81     } else {
82         q->beginInsertRows(QModelIndex(), 0, rowCount-1);
83
84         const GList *items, *item;
85         items = lightdm_user_list_get_users(lightdm_user_list_get_instance());
86         for (item = items; item; item = item->next) {
87             LightDMUser *ldmUser = static_cast<LightDMUser*>(item->data);
88
89             UserItem user;
90             user.name = QString::fromLocal8Bit(lightdm_user_get_name(ldmUser));
91             user.homeDirectory = QString::fromLocal8Bit(lightdm_user_get_home_directory(ldmUser));
92             user.realName = QString::fromLocal8Bit(lightdm_user_get_real_name(ldmUser));
93             user.image = QString::fromLocal8Bit(lightdm_user_get_image(ldmUser));
94             user.isLoggedIn = lightdm_user_get_logged_in(ldmUser);
95             users.append(user);
96         }
97
98         q->endInsertRows();
99     }
100     g_signal_connect(lightdm_user_list_get_instance(), "user-added", G_CALLBACK (cb_userAdded), this);
101     g_signal_connect(lightdm_user_list_get_instance(), "user-changed", G_CALLBACK (cb_userChanged), this);
102     g_signal_connect(lightdm_user_list_get_instance(), "user-removed", G_CALLBACK (cb_userRemoved), this);
103 }
104
105
106
107 void UsersModelPrivate::cb_userAdded(LightDMUserList *user_list, LightDMUser *ldmUser, gpointer data)
108 {
109     Q_UNUSED(user_list)
110     UsersModelPrivate *that = static_cast<UsersModelPrivate*>(data);
111
112     that->q_func()->beginInsertRows(QModelIndex(), that->users.size(), that->users.size());
113
114     UserItem user;
115     user.name = QString::fromLocal8Bit(lightdm_user_get_name(ldmUser));
116     user.homeDirectory = QString::fromLocal8Bit(lightdm_user_get_home_directory(ldmUser));
117     user.realName = QString::fromLocal8Bit(lightdm_user_get_real_name(ldmUser));
118     user.image = QString::fromLocal8Bit(lightdm_user_get_image(ldmUser));
119     user.isLoggedIn = lightdm_user_get_logged_in(ldmUser);
120     that->users.append(user);
121
122     that->q_func()->endInsertRows();
123
124 }
125
126 void UsersModelPrivate::cb_userChanged(LightDMUserList *user_list, LightDMUser *ldmUser, gpointer data)
127 {
128     Q_UNUSED(user_list)
129     UsersModelPrivate *that = static_cast<UsersModelPrivate*>(data);
130
131     QString userToChange = QString::fromLocal8Bit(lightdm_user_get_name(ldmUser));
132
133     for (int i=0;i<that->users.size();i++) {
134         if (that->users[i].name == userToChange) {
135
136             that->users[i].homeDirectory = QString::fromLocal8Bit(lightdm_user_get_home_directory(ldmUser));
137             that->users[i].realName = QString::fromLocal8Bit(lightdm_user_get_real_name(ldmUser));
138             that->users[i].image = QString::fromLocal8Bit(lightdm_user_get_image(ldmUser));
139             that->users[i].isLoggedIn = lightdm_user_get_logged_in(ldmUser);
140
141             QModelIndex index = that->q_ptr->createIndex(i, 0);
142             that->q_ptr->dataChanged(index, index);
143             break;
144         }
145     }
146 }
147
148
149 void UsersModelPrivate::cb_userRemoved(LightDMUserList *user_list, LightDMUser *ldmUser, gpointer data)
150 {
151     Q_UNUSED(user_list)
152
153     UsersModelPrivate *that = static_cast<UsersModelPrivate*>(data);
154     QString userToRemove = QString::fromLocal8Bit(lightdm_user_get_name(ldmUser));
155
156     QList<UserItem>::iterator i;
157     for (int i=0;i<that->users.size();i++) {
158         if (that->users[i].name == userToRemove) {
159             that->q_ptr->beginRemoveRows(QModelIndex(), i, i);
160             that->users.removeAt(i);
161             that->q_ptr->endMoveRows();
162             break;
163         }
164     }
165 }
166
167 UsersModel::UsersModel(QObject *parent) :
168     QAbstractListModel(parent),
169     d_ptr(new UsersModelPrivate(this))
170 {
171     Q_D(UsersModel);
172     QHash<int, QByteArray> roles;
173     roles[NameRole] = "name";
174     roles[RealNameRole] = "realName";
175     roles[LoggedInRole] = "loggedIn";
176     setRoleNames(roles);
177     d->loadUsers();
178
179 }
180
181 UsersModel::~UsersModel()
182 {
183     delete d_ptr;
184 }
185
186
187 int UsersModel::rowCount(const QModelIndex &parent) const
188 {
189     Q_D(const UsersModel);
190     if (parent == QModelIndex()) {
191         return d->users.size();
192     }
193
194     return 0;
195 }
196
197 QVariant UsersModel::data(const QModelIndex &index, int role) const
198 {
199     Q_D(const UsersModel);
200
201     if (!index.isValid()) {
202         return QVariant();
203     }
204
205     int row = index.row();
206     switch (role) {
207     case Qt::DisplayRole:
208         return d->users[row].displayName();
209     case Qt::DecorationRole:
210         return QPixmap(d->users[row].image);
211     case UsersModel::NameRole:
212         return d->users[row].name;
213     case UsersModel::RealNameRole:
214         return d->users[row].realName;
215     case UsersModel::LoggedInRole:
216         return d->users[row].isLoggedIn;
217     }
218
219     return QVariant();
220 }
221
222
223 #include "usersmodel_moc.cpp"