diff --git a/components/CMakeLists.txt b/components/CMakeLists.txt --- a/components/CMakeLists.txt +++ b/components/CMakeLists.txt @@ -1,4 +1,6 @@ +add_definitions(-DTRANSLATION_DOMAIN=\"plasmashellprivateplugin\") + install(DIRECTORY workspace/ DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/plasma/workspace/components) add_subdirectory(shellprivate) add_subdirectory(keyboardlayout) -add_subdirectory(sessionsprivate) \ No newline at end of file +add_subdirectory(sessionsprivate) diff --git a/components/shellprivate/Messages.sh b/components/Messages.sh rename from components/shellprivate/Messages.sh rename to components/Messages.sh diff --git a/components/sessionsprivate/CMakeLists.txt b/components/sessionsprivate/CMakeLists.txt --- a/components/sessionsprivate/CMakeLists.txt +++ b/components/sessionsprivate/CMakeLists.txt @@ -17,6 +17,7 @@ KF5::CoreAddons KF5::ConfigCore KF5::ConfigGui + KF5::I18n PW::KWorkspace ) diff --git a/components/sessionsprivate/sessionsmodel.h b/components/sessionsprivate/sessionsmodel.h --- a/components/sessionsprivate/sessionsmodel.h +++ b/components/sessionsprivate/sessionsmodel.h @@ -55,6 +55,7 @@ Q_PROPERTY(bool canSwitchUser READ canSwitchUser CONSTANT) Q_PROPERTY(bool canStartNewSession READ canStartNewSession CONSTANT) Q_PROPERTY(bool shouldLock READ shouldLock NOTIFY shouldLockChanged) + Q_PROPERTY(bool showNewSessionEntry MEMBER m_showNewSessionEntry WRITE setShowNewSessionEntry NOTIFY showNewSessionEntryChanged) Q_PROPERTY(int count READ rowCount NOTIFY countChanged) @@ -64,18 +65,21 @@ enum class Role { RealName = Qt::DisplayRole, - Icon = Qt::DecorationRole, + Icon = Qt::DecorationRole, //path to a file Name = Qt::UserRole + 1, DisplayNumber, VtNumber, Session, - IsTty + IsTty, + IconName //name of an icon }; bool canSwitchUser() const; bool canStartNewSession() const; bool shouldLock() const; + void setShowNewSessionEntry(bool showNewSessionEntry); + Q_INVOKABLE void reload(); Q_INVOKABLE void switchUser(int vt, bool shouldLock = false); Q_INVOKABLE void startNewSession(bool shouldLock = false); @@ -86,6 +90,7 @@ signals: void shouldLockChanged(); + void showNewSessionEntryChanged(); void countChanged(); void switchedUser(int vt); @@ -103,6 +108,8 @@ int m_pendingVt = 0; bool m_pendingReserve = false; + bool m_showNewSessionEntry = false; + org::freedesktop::ScreenSaver *m_screensaverInterface = nullptr; }; diff --git a/components/sessionsprivate/sessionsmodel.cpp b/components/sessionsprivate/sessionsmodel.cpp --- a/components/sessionsprivate/sessionsmodel.cpp +++ b/components/sessionsprivate/sessionsmodel.cpp @@ -24,6 +24,7 @@ #include #include +#include #include "kscreensaversettings.h" @@ -74,7 +75,12 @@ void SessionsModel::switchUser(int vt, bool shouldLock) { - if (!canSwitchUser() || vt <= 0) { + if (vt < 0) { + startNewSession(shouldLock); + return; + } + + if (!canSwitchUser()) { return; } @@ -188,12 +194,45 @@ }); } +void SessionsModel::setShowNewSessionEntry(bool showNewSessionEntry) +{ + if (showNewSessionEntry == m_showNewSessionEntry) { + return; + } + + int row = m_data.size(); + if (showNewSessionEntry) { + beginInsertRows(QModelIndex(), row, row); + m_showNewSessionEntry = showNewSessionEntry; + endInsertRows(); + } else { + beginRemoveRows(QModelIndex(), row, row); + m_showNewSessionEntry = showNewSessionEntry; + endRemoveRows(); + } + emit countChanged(); +} + + QVariant SessionsModel::data(const QModelIndex &index, int role) const { - if (index.row() < 0 || index.row() >= m_data.count()) { + if (index.row() < 0 || index.row() > rowCount(QModelIndex())) { return QVariant(); } + if (index.row() == m_data.count()) { + switch (static_cast(role)) { + case Role::RealName: return i18n("New Session"); + case Role::IconName: return QStringLiteral("list-add"); + case Role::Name: return i18n("New Session"); + case Role::DisplayNumber: return 0; //NA + case Role::VtNumber: return -1; //an invalid VtNumber - which we'll use to indicate it's to start a new session + case Role::Session: return 0; //NA + case Role::IsTty: return false; //NA + default: return QVariant(); + } + } + const SessionEntry &item = m_data.at(index.row()); switch (static_cast(role)) { @@ -204,23 +243,24 @@ case Role::VtNumber: return item.vtNumber; case Role::Session: return item.session; case Role::IsTty: return item.isTty; + default: return QVariant(); } - return QVariant(); } int SessionsModel::rowCount(const QModelIndex &parent) const { Q_UNUSED(parent); - return m_data.count(); + return m_data.count() + (m_showNewSessionEntry ? 1 : 0); } QHash SessionsModel::roleNames() const { return { {static_cast(Role::Name), QByteArrayLiteral("name")}, {static_cast(Role::RealName), QByteArrayLiteral("realName")}, {static_cast(Role::Icon), QByteArrayLiteral("icon")}, + {static_cast(Role::IconName), QByteArrayLiteral("iconName")}, {static_cast(Role::DisplayNumber), QByteArrayLiteral("displayNumber")}, {static_cast(Role::VtNumber), QByteArrayLiteral("vtNumber")}, {static_cast(Role::Session), QByteArrayLiteral("session")}, diff --git a/components/shellprivate/CMakeLists.txt b/components/shellprivate/CMakeLists.txt --- a/components/shellprivate/CMakeLists.txt +++ b/components/shellprivate/CMakeLists.txt @@ -1,4 +1,3 @@ -add_definitions(-DTRANSLATION_DOMAIN=\"plasmashellprivateplugin\") if (KF5TextEditor_FOUND) set(interactiveconsole_SRCS diff --git a/lookandfeel/contents/components/UserList.qml b/lookandfeel/contents/components/UserList.qml --- a/lookandfeel/contents/components/UserList.qml +++ b/lookandfeel/contents/components/UserList.qml @@ -48,7 +48,7 @@ name: { var displayName = model.realName || model.name - if (model.vtNumber === undefined) { + if (model.vtNumber === undefined || model.vtNumber < 0) { return displayName } diff --git a/lookandfeel/contents/lockscreen/LockScreenUi.qml b/lookandfeel/contents/lockscreen/LockScreenUi.qml --- a/lookandfeel/contents/lockscreen/LockScreenUi.qml +++ b/lookandfeel/contents/lockscreen/LockScreenUi.qml @@ -53,6 +53,7 @@ SessionsModel { id: sessionsModel + showNewSessionEntry: true } PlasmaCore.DataSource { diff --git a/lookandfeel/contents/userswitcher/UserSwitcher.qml b/lookandfeel/contents/userswitcher/UserSwitcher.qml --- a/lookandfeel/contents/userswitcher/UserSwitcher.qml +++ b/lookandfeel/contents/userswitcher/UserSwitcher.qml @@ -45,6 +45,8 @@ SessionsModel { id: sessionsModel + showNewSessionEntry: true + // the calls takes place asynchronously; if we were to dismiss the dialog right // after startNewSession/switchUser we would be destroyed before the reply // returned leaving us do nothing (Bug 356945)