From 82b0aa2ada438d07a1b4cd8d7a8d8691450b45a2 Mon Sep 17 00:00:00 2001 From: David Edmundson Date: Fri, 26 Aug 2016 16:01:44 +0100 Subject: [PATCH] Add new session button to SessionsModel Summary: This (optionally) appends an entry to the SessionsModel to append a "New Session" option. The lock screen / user switcher are then modified to use it. Messages.sh is modified so all components are covered by the same pot. Reviewers: #plasma Subscribers: plasma-devel Tags: #plasma Differential Revision: https://phabricator.kde.org/D2594 --- components/CMakeLists.txt | 4 +- components/{shellprivate => }/Messages.sh | 0 components/sessionsprivate/CMakeLists.txt | 1 + components/sessionsprivate/sessionsmodel.cpp | 48 +++++++++++++++++-- components/sessionsprivate/sessionsmodel.h | 11 ++++- components/shellprivate/CMakeLists.txt | 1 - lookandfeel/contents/components/UserList.qml | 2 +- .../contents/lockscreen/LockScreenUi.qml | 1 + .../contents/userswitcher/UserSwitcher.qml | 2 + 9 files changed, 61 insertions(+), 9 deletions(-) rename components/{shellprivate => }/Messages.sh (100%) diff --git a/components/CMakeLists.txt b/components/CMakeLists.txt index e0ba9505f..80821248e 100644 --- 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 similarity index 100% rename from components/shellprivate/Messages.sh rename to components/Messages.sh diff --git a/components/sessionsprivate/CMakeLists.txt b/components/sessionsprivate/CMakeLists.txt index 2d8fcf1c6..1eca937c8 100644 --- a/components/sessionsprivate/CMakeLists.txt +++ b/components/sessionsprivate/CMakeLists.txt @@ -17,6 +17,7 @@ target_link_libraries(sessionsprivateplugin KF5::CoreAddons KF5::ConfigCore KF5::ConfigGui + KF5::I18n PW::KWorkspace ) diff --git a/components/sessionsprivate/sessionsmodel.cpp b/components/sessionsprivate/sessionsmodel.cpp index aaf4a03d4..5517bfc6a 100644 --- a/components/sessionsprivate/sessionsmodel.cpp +++ b/components/sessionsprivate/sessionsmodel.cpp @@ -24,6 +24,7 @@ #include #include +#include #include "kscreensaversettings.h" @@ -74,7 +75,12 @@ bool SessionsModel::shouldLock() const 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::checkScreenLocked(const std::function &cb) }); } +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,15 +243,15 @@ QVariant SessionsModel::data(const QModelIndex &index, int role) const 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 @@ -221,6 +260,7 @@ QHash SessionsModel::roleNames() const {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/sessionsprivate/sessionsmodel.h b/components/sessionsprivate/sessionsmodel.h index 460165654..6381b6287 100644 --- a/components/sessionsprivate/sessionsmodel.h +++ b/components/sessionsprivate/sessionsmodel.h @@ -55,6 +55,7 @@ class SessionsModel : public QAbstractListModel 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 @@ public: 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 @@ public: signals: void shouldLockChanged(); + void showNewSessionEntryChanged(); void countChanged(); void switchedUser(int vt); @@ -103,6 +108,8 @@ private: int m_pendingVt = 0; bool m_pendingReserve = false; + bool m_showNewSessionEntry = false; + org::freedesktop::ScreenSaver *m_screensaverInterface = nullptr; }; diff --git a/components/shellprivate/CMakeLists.txt b/components/shellprivate/CMakeLists.txt index 09b5128b2..0d964b96d 100644 --- 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 index 1aca3b0dc..62c95c746 100644 --- a/lookandfeel/contents/components/UserList.qml +++ b/lookandfeel/contents/components/UserList.qml @@ -48,7 +48,7 @@ ListView { 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 index ffc34dc3c..bcd989d70 100644 --- a/lookandfeel/contents/lockscreen/LockScreenUi.qml +++ b/lookandfeel/contents/lockscreen/LockScreenUi.qml @@ -53,6 +53,7 @@ PlasmaCore.ColorScope { SessionsModel { id: sessionsModel + showNewSessionEntry: true } PlasmaCore.DataSource { diff --git a/lookandfeel/contents/userswitcher/UserSwitcher.qml b/lookandfeel/contents/userswitcher/UserSwitcher.qml index e748a937b..eb3ea5476 100644 --- a/lookandfeel/contents/userswitcher/UserSwitcher.qml +++ b/lookandfeel/contents/userswitcher/UserSwitcher.qml @@ -45,6 +45,8 @@ PlasmaCore.ColorScope { 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)