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;
32 QString displayName() const;
35 QString UserItem::displayName() const {
36 if (realName.isEmpty()){
45 class UsersModelPrivate {
47 UsersModelPrivate(UsersModel *parent);
48 virtual ~UsersModelPrivate();
49 QList<UserItem> users;
52 UsersModel * const q_ptr;
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);
60 Q_DECLARE_PUBLIC(UsersModel)
64 UsersModelPrivate::UsersModelPrivate(UsersModel* parent) :
67 #if !defined(GLIB_VERSION_2_36)
72 UsersModelPrivate::~UsersModelPrivate()
74 g_signal_handlers_disconnect_by_data(lightdm_user_list_get_instance(), this);
77 void UsersModelPrivate::loadUsers()
81 int rowCount = lightdm_user_list_get_length(lightdm_user_list_get_instance());
86 q->beginInsertRows(QModelIndex(), 0, rowCount-1);
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);
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);
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);
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 that->users.append(user);
131 that->q_func()->endInsertRows();
135 void UsersModelPrivate::cb_userChanged(LightDMUserList *user_list, LightDMUser *ldmUser, gpointer data)
138 UsersModelPrivate *that = static_cast<UsersModelPrivate*>(data);
140 QString userToChange = QString::fromUtf8(lightdm_user_get_name(ldmUser));
142 for (int i=0;i<that->users.size();i++) {
143 if (that->users[i].name == userToChange) {
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);
152 QModelIndex index = that->q_ptr->createIndex(i, 0);
153 that->q_ptr->dataChanged(index, index);
160 void UsersModelPrivate::cb_userRemoved(LightDMUserList *user_list, LightDMUser *ldmUser, gpointer data)
164 UsersModelPrivate *that = static_cast<UsersModelPrivate*>(data);
165 QString userToRemove = QString::fromUtf8(lightdm_user_get_name(ldmUser));
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();
177 UsersModel::UsersModel(QObject *parent) :
178 QAbstractListModel(parent),
179 d_ptr(new UsersModelPrivate(this))
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";
197 UsersModel::~UsersModel()
203 int UsersModel::rowCount(const QModelIndex &parent) const
205 Q_D(const UsersModel);
206 if (parent == QModelIndex()) {
207 return d->users.size();
213 QVariant UsersModel::data(const QModelIndex &index, int role) const
215 Q_D(const UsersModel);
217 if (!index.isValid()) {
221 int row = index.row();
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;
249 #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
250 #include "usersmodel_moc5.cpp"
252 #include "usersmodel_moc4.cpp"