2 * Copyright (C) 2010-2011 David Edmundson.
3 * Author: David Edmundson <kde@davidedmundson.co.uk>
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.
11 #include "QLightDM/usersmodel.h"
13 #include <QtCore/QString>
14 #include <QtCore/QDebug>
15 #include <QtGui/QIcon>
19 using namespace QLightDM;
26 QString homeDirectory;
33 QString displayName() const;
36 QString UserItem::displayName() const {
37 if (realName.isEmpty()){
46 class UsersModelPrivate {
48 UsersModelPrivate(UsersModel *parent);
49 virtual ~UsersModelPrivate();
50 QList<UserItem> users;
53 UsersModel * const q_ptr;
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);
61 Q_DECLARE_PUBLIC(UsersModel)
65 UsersModelPrivate::UsersModelPrivate(UsersModel* parent) :
68 #if !defined(GLIB_VERSION_2_36)
73 UsersModelPrivate::~UsersModelPrivate()
75 g_signal_handlers_disconnect_by_data(lightdm_user_list_get_instance(), this);
78 void UsersModelPrivate::loadUsers()
82 int rowCount = lightdm_user_list_get_length(lightdm_user_list_get_instance());
87 q->beginInsertRows(QModelIndex(), 0, rowCount-1);
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);
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);
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);
114 void UsersModelPrivate::cb_userAdded(LightDMUserList *user_list, LightDMUser *ldmUser, gpointer data)
117 UsersModelPrivate *that = static_cast<UsersModelPrivate*>(data);
119 that->q_func()->beginInsertRows(QModelIndex(), that->users.size(), that->users.size());
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);
132 that->q_func()->endInsertRows();
136 void UsersModelPrivate::cb_userChanged(LightDMUserList *user_list, LightDMUser *ldmUser, gpointer data)
139 UsersModelPrivate *that = static_cast<UsersModelPrivate*>(data);
141 QString userToChange = QString::fromUtf8(lightdm_user_get_name(ldmUser));
143 for (int i=0;i<that->users.size();i++) {
144 if (that->users[i].name == userToChange) {
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);
154 QModelIndex index = that->q_ptr->createIndex(i, 0);
155 that->q_ptr->dataChanged(index, index);
162 void UsersModelPrivate::cb_userRemoved(LightDMUserList *user_list, LightDMUser *ldmUser, gpointer data)
166 UsersModelPrivate *that = static_cast<UsersModelPrivate*>(data);
167 QString userToRemove = QString::fromUtf8(lightdm_user_get_name(ldmUser));
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();
179 UsersModel::UsersModel(QObject *parent) :
180 QAbstractListModel(parent),
181 d_ptr(new UsersModelPrivate(this))
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";
200 UsersModel::~UsersModel()
206 int UsersModel::rowCount(const QModelIndex &parent) const
208 Q_D(const UsersModel);
209 if (parent == QModelIndex()) {
210 return d->users.size();
216 QVariant UsersModel::data(const QModelIndex &index, int role) const
218 Q_D(const UsersModel);
220 if (!index.isValid()) {
224 int row = index.row();
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;
254 #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
255 #include "usersmodel_moc5.cpp"
257 #include "usersmodel_moc4.cpp"