@@ -63,24 +63,70 @@ QVariant MangleModel::data(const QModelIndex &index, int role) const
6363
6464UsersModel::UsersModel(QObject* parent)
6565 : UnitySortFilterProxyModelQML(parent)
66+ , m_showManual(false)
6667{
67− setModel(new MangleModel(this));
68+ if (!Greeter::instance()->hideUsersHint()) {
69+ setModel(new MangleModel(this));
70+ }
6871 setSortCaseSensitivity(Qt::CaseInsensitive);
6972 setSortLocaleAware(true);
7073 setSortRole(QLightDM::UsersModel::RealNameRole);
7174 sort(0);
75+
76+ connect(this, &UnitySortFilterProxyModelQML::countChanged,
77+ this, &UsersModel::updateShowManual);
78+ updateShowManual();
79+}
80+
81+void UsersModel::updateShowManual()
82+{
83+ // Show manual login if we are asked to OR if no other entry exists
84+ bool showManual = Greeter::instance()->showManualLoginHint() ||
85+ (QSortFilterProxyModel::rowCount() == 0 &&
86+ !Greeter::instance()->hasGuestAccount());
87+
88+ if (m_showManual != showManual) {
89+ int row = QSortFilterProxyModel::rowCount();
90+ if (showManual)
91+ beginInsertRows(QModelIndex(), row, row);
92+ else
93+ beginRemoveRows(QModelIndex(), row, row);
94+
95+ m_showManual = showManual;
96+
97+ if (showManual)
98+ endInsertRows();
99+ else
100+ endRemoveRows();
101+ }
102+}
103+
104+int UsersModel::manualRow() const
105+{
106+ if (!m_showManual)
107+ return -1;
108+
109+ return QSortFilterProxyModel::rowCount();
72110}
73111
74112int UsersModel::guestRow() const
75113{
76− return Greeter::instance()->hasGuestAccount() ?
77− UnitySortFilterProxyModelQML::rowCount() : -1;
114+ if (!Greeter::instance()->hasGuestAccount())
115+ return -1;
116+
117+ int row = QSortFilterProxyModel::rowCount();
118+ if (m_showManual)
119+ row++;
120+
121+ return row;
78122}
79123
80124int UsersModel::rowCount(const QModelIndex &parent) const
81125{
82126 auto count = UnitySortFilterProxyModelQML::rowCount(parent);
83127
128+ if (m_showManual && !parent.isValid())
129+ count++;
84130 if (Greeter::instance()->hasGuestAccount() && !parent.isValid())
85131 count++;
86132
@@ -89,7 +135,7 @@ int UsersModel::rowCount(const QModelIndex &parent) const
89135
90136QModelIndex UsersModel::index(int row, int column, const QModelIndex &parent) const
91137{
92− if (row == guestRow() && !parent.isValid()) {
138+ if ((row == manualRow() || row == guestRow()) && !parent.isValid()) {
93139 return createIndex(row, column);
94140 } else {
95141 return UnitySortFilterProxyModelQML::index(row, column, parent);
@@ -98,7 +144,15 @@ QModelIndex UsersModel::index(int row, int column, const QModelIndex &parent) co
98144
99145QVariant UsersModel::data(const QModelIndex &index, int role) const
100146{
101− if (index.row() == guestRow() && index.column() == 0) {
147+ if (index.row() == manualRow() && index.column() == 0) {
148+ switch (role) {
149+ case QLightDM::UsersModel::NameRole: return QStringLiteral("*other");
150+ case QLightDM::UsersModel::RealNameRole: return gettext("Login");
151+ case QLightDM::UsersModel::LoggedInRole: return false;
152+ case QLightDM::UsersModel::SessionRole: return Greeter::instance()->defaultSessionHint();
153+ default: return QVariant();
154+ }
155+ } else if (index.row() == guestRow() && index.column() == 0) {
102156 switch (role) {
103157 case QLightDM::UsersModel::NameRole: return QStringLiteral("*guest");
104158 case QLightDM::UsersModel::RealNameRole: return gettext("Guest Session");