@@ -12,20 +12,22 @@
1212 *
1313 * You should have received a copy of the GNU General Public License
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Author: Michael Terry <michael.terry@canonical.com>
1715 */
1816
17+#include "Greeter.h"
1918#include "UsersModel.h"
19+#include <QIdentityProxyModel>
2020#include <QLightDM/UsersModel>
21−#include <QtCore/QSortFilterProxyModel>
21+
22+#include <libintl.h>
2223
2324// First, we define an internal class that wraps LightDM's UsersModel. This
2425// 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.
2628// (We can't modify the data directly in UsersModel below because it won't sort
2729// using the modified data.)
28−class MangleModel : public QSortFilterProxyModel
30+class MangleModel : public QIdentityProxyModel
2931{
3032 Q_OBJECT
3133
@@ -33,21 +35,41 @@ public:
3335 explicit MangleModel(QObject* parent=0);
3436
3537 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;
40+
41+private:
42+ int guestRow() const;
3643};
3744
3845MangleModel::MangleModel(QObject* parent)
39− : QSortFilterProxyModel(parent)
46+ : QIdentityProxyModel(parent)
4047{
4148 setSourceModel(new QLightDM::UsersModel(this));
4249}
4350
4451QVariant MangleModel::data(const QModelIndex &index, int role) const
4552{
46− QVariant variantData = QSortFilterProxyModel::data(index, role);
53+ QVariant variantData;
54+
55+ if (index.row() == guestRow() && index.column() == 0) {
56+ switch (role) {
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;
65+ }
66+ } else {
67+ variantData = QIdentityProxyModel::data(index, role);
68+ }
4769
4870 // If user's real name is empty, switch to unix name
4971 if (role == QLightDM::UsersModel::RealNameRole && variantData.toString().isEmpty()) {
50− variantData = QSortFilterProxyModel::data(index, QLightDM::UsersModel::NameRole);
72+ variantData = QIdentityProxyModel::data(index, QLightDM::UsersModel::NameRole);
5173 } else if (role == QLightDM::UsersModel::BackgroundPathRole && variantData.toString().startsWith('#')) {
5274 const QString stringData = "data:image/svg+xml,<svg><rect width='100%' height='100%' fill='" + variantData.toString() + "'/></svg>";
5375 variantData = stringData;
@@ -56,6 +78,31 @@ QVariant MangleModel::data(const QModelIndex &index, int role) const
5678 return variantData;
5779}
5880
81+int MangleModel::guestRow() const
82+{
83+ return Greeter::instance()->hasGuestAccount() ?
84+ QIdentityProxyModel::rowCount() : -1;
85+}
86+
87+int MangleModel::rowCount(const QModelIndex &parent) const
88+{
89+ auto count = QIdentityProxyModel::rowCount(parent);
90+
91+ if (Greeter::instance()->hasGuestAccount() && !parent.isValid())
92+ count++;
93+
94+ return count;
95+}
96+
97+QModelIndex MangleModel::index(int row, int column, const QModelIndex &parent) const
98+{
99+ if (row == guestRow() && !parent.isValid()) {
100+ return createIndex(row, column);
101+ } else {
102+ return QIdentityProxyModel::index(row, column, parent);
103+ }
104+}
105+
59106// **** Now we continue with actual UsersModel class ****
60107
61108UsersModel::UsersModel(QObject* parent)
@@ -68,4 +115,17 @@ UsersModel::UsersModel(QObject* parent)
68115 sort(0);
69116}
70117
118+bool UsersModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const
119+{
120+ auto leftName = source_left.data(QLightDM::UsersModel::NameRole);
121+ auto rightName = source_right.data(QLightDM::UsersModel::NameRole);
122+
123+ if (leftName == QStringLiteral("*guest"))
124+ return false;
125+ if (rightName == QStringLiteral("*guest"))
126+ return true;
127+
128+ return UnitySortFilterProxyModelQML::lessThan(source_left, source_right);
129+}
130+
71131#include "UsersModel.moc"