@@ -12,20 +12,22 @@
13 * You should have received a copy of the GNU General Public License
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16− * Author: Michael Terry <michael.terry@canonical.com>
19#include "UsersModel.h"
18#include "UsersModel.h"
19+#include <QIdentityProxyModel>
20#include <QLightDM/UsersModel>
20#include <QLightDM/UsersModel>
21−#include <QtCore/QSortFilterProxyModel>
21+
23// First, we define an internal class that wraps LightDM's UsersModel. This
24// First, we define an internal class that wraps LightDM's UsersModel. This
24// class will modify some of the data coming from LightDM. For example, we
25// class will modify some of the data coming from LightDM. For example, we
25−// modify any empty Real Names into just normal Names.
26+// modify any empty Real Names into just normal Names. We also add optional
27+// rows, depending on configuration.
26// (We can't modify the data directly in UsersModel below because it won't sort
28// (We can't modify the data directly in UsersModel below because it won't sort
27// using the modified data.)
29// using the modified data.)
28−class MangleModel : public QSortFilterProxyModel
30+class MangleModel : public QIdentityProxyModel
@@ -33,21 +35,41 @@ public:
33 explicit MangleModel(QObject* parent=0);
35 explicit MangleModel(QObject* parent=0);
35 QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
37 QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
38+ int rowCount(const QModelIndex &parent = QModelIndex()) const override;
39+ QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;
42+ int guestRow() const;
38MangleModel::MangleModel(QObject* parent)
45MangleModel::MangleModel(QObject* parent)
39− : QSortFilterProxyModel(parent)
46+ : QIdentityProxyModel(parent)
41 setSourceModel(new QLightDM::UsersModel(this));
48 setSourceModel(new QLightDM::UsersModel(this));
44QVariant MangleModel::data(const QModelIndex &index, int role) const
51QVariant MangleModel::data(const QModelIndex &index, int role) const
46− QVariant variantData = QSortFilterProxyModel::data(index, role);
53+ QVariant variantData;
55+ if (index.row() == guestRow() && index.column() == 0) {
57+ case QLightDM::UsersModel::NameRole:
58+ variantData = QStringLiteral("*guest"); break;
59+ case QLightDM::UsersModel::RealNameRole:
60+ variantData = gettext("Guest Session"); break;
61+ case QLightDM::UsersModel::LoggedInRole:
62+ variantData = false; break;
63+ case QLightDM::UsersModel::SessionRole:
64+ variantData = Greeter::instance()->defaultSessionHint(); break;
67+ variantData = QIdentityProxyModel::data(index, role);
48 // If user's real name is empty, switch to unix name
70 // If user's real name is empty, switch to unix name
49 if (role == QLightDM::UsersModel::RealNameRole && variantData.toString().isEmpty()) {
71 if (role == QLightDM::UsersModel::RealNameRole && variantData.toString().isEmpty()) {
50− variantData = QSortFilterProxyModel::data(index, QLightDM::UsersModel::NameRole);
72+ variantData = QIdentityProxyModel::data(index, QLightDM::UsersModel::NameRole);
51 } else if (role == QLightDM::UsersModel::BackgroundPathRole && variantData.toString().startsWith('#')) {
73 } else if (role == QLightDM::UsersModel::BackgroundPathRole && variantData.toString().startsWith('#')) {
52 const QString stringData = "data:image/svg+xml,<svg><rect width='100%' height='100%' fill='" + variantData.toString() + "'/></svg>";
74 const QString stringData = "data:image/svg+xml,<svg><rect width='100%' height='100%' fill='" + variantData.toString() + "'/></svg>";
53 variantData = stringData;
75 variantData = stringData;
@@ -56,6 +78,31 @@ QVariant MangleModel::data(const QModelIndex &index, int role) const
56 return variantData;
78 return variantData;
81+int MangleModel::guestRow() const
83+ return Greeter::instance()->hasGuestAccount() ?
84+ QIdentityProxyModel::rowCount() : -1;
87+int MangleModel::rowCount(const QModelIndex &parent) const
89+ auto count = QIdentityProxyModel::rowCount(parent);
91+ if (Greeter::instance()->hasGuestAccount() && !parent.isValid())
97+QModelIndex MangleModel::index(int row, int column, const QModelIndex &parent) const
99+ if (row == guestRow() && !parent.isValid()) {
100+ return createIndex(row, column);
102+ return QIdentityProxyModel::index(row, column, parent);
59// **** Now we continue with actual UsersModel class ****
106// **** Now we continue with actual UsersModel class ****
61UsersModel::UsersModel(QObject* parent)
108UsersModel::UsersModel(QObject* parent)
@@ -68,4 +115,17 @@ UsersModel::UsersModel(QObject* parent)
118+bool UsersModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const
120+ auto leftName = source_left.data(QLightDM::UsersModel::NameRole);
121+ auto rightName = source_right.data(QLightDM::UsersModel::NameRole);
123+ if (leftName == QStringLiteral("*guest"))
125+ if (rightName == QStringLiteral("*guest"))
128+ return UnitySortFilterProxyModelQML::lessThan(source_left, source_right);
71#include "UsersModel.moc"
131#include "UsersModel.moc"