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 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
12 #include "QLightDM/usersmodel.h"
14 #include <QtCore/QString>
15 #include <QtCore/QDebug>
16 #include <QtGui/QPixmap>
20 using namespace QLightDM;
27 QString homeDirectory;
30 QString displayName() const;
33 QString UserItem::displayName() const {
34 if (realName.isEmpty()){
43 class UsersModelPrivate {
45 UsersModelPrivate(UsersModel *parent);
46 virtual ~UsersModelPrivate();
47 QList<UserItem> users;
50 UsersModel * const q_ptr;
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);
58 Q_DECLARE_PUBLIC(UsersModel)
62 UsersModelPrivate::UsersModelPrivate(UsersModel* parent) :
68 UsersModelPrivate::~UsersModelPrivate()
70 g_signal_handlers_disconnect_by_func(lightdm_user_list_get_instance(), NULL, this);
73 void UsersModelPrivate::loadUsers()
77 int rowCount = lightdm_user_list_get_length(lightdm_user_list_get_instance());
82 q->beginInsertRows(QModelIndex(), 0, rowCount-1);
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);
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);
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);
107 void UsersModelPrivate::cb_userAdded(LightDMUserList *user_list, LightDMUser *ldmUser, gpointer data)
110 UsersModelPrivate *that = static_cast<UsersModelPrivate*>(data);
112 that->q_func()->beginInsertRows(QModelIndex(), that->users.size(), that->users.size());
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);
122 that->q_func()->endInsertRows();
126 void UsersModelPrivate::cb_userChanged(LightDMUserList *user_list, LightDMUser *ldmUser, gpointer data)
129 UsersModelPrivate *that = static_cast<UsersModelPrivate*>(data);
131 QString userToChange = QString::fromLocal8Bit(lightdm_user_get_name(ldmUser));
133 for (int i=0;i<that->users.size();i++) {
134 if (that->users[i].name == userToChange) {
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);
141 QModelIndex index = that->q_ptr->createIndex(i, 0);
142 that->q_ptr->dataChanged(index, index);
149 void UsersModelPrivate::cb_userRemoved(LightDMUserList *user_list, LightDMUser *ldmUser, gpointer data)
153 UsersModelPrivate *that = static_cast<UsersModelPrivate*>(data);
154 QString userToRemove = QString::fromLocal8Bit(lightdm_user_get_name(ldmUser));
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();
167 UsersModel::UsersModel(QObject *parent) :
168 QAbstractListModel(parent),
169 d_ptr(new UsersModelPrivate(this))
172 QHash<int, QByteArray> roles;
173 roles[NameRole] = "name";
174 roles[RealNameRole] = "realName";
175 roles[LoggedInRole] = "loggedIn";
181 UsersModel::~UsersModel()
187 int UsersModel::rowCount(const QModelIndex &parent) const
189 Q_D(const UsersModel);
190 if (parent == QModelIndex()) {
191 return d->users.size();
197 QVariant UsersModel::data(const QModelIndex &index, int role) const
199 Q_D(const UsersModel);
201 if (!index.isValid()) {
205 int row = index.row();
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;
223 #include "usersmodel_moc.cpp"