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
wilder-5.14
David Edmundson 10 years ago
parent 40feeb4d94
commit 82b0aa2ada
  1. 4
      components/CMakeLists.txt
  2. 0
      components/Messages.sh
  3. 1
      components/sessionsprivate/CMakeLists.txt
  4. 48
      components/sessionsprivate/sessionsmodel.cpp
  5. 11
      components/sessionsprivate/sessionsmodel.h
  6. 1
      components/shellprivate/CMakeLists.txt
  7. 2
      lookandfeel/contents/components/UserList.qml
  8. 1
      lookandfeel/contents/lockscreen/LockScreenUi.qml
  9. 2
      lookandfeel/contents/userswitcher/UserSwitcher.qml

@ -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)
add_subdirectory(sessionsprivate)

@ -17,6 +17,7 @@ target_link_libraries(sessionsprivateplugin
KF5::CoreAddons
KF5::ConfigCore
KF5::ConfigGui
KF5::I18n
PW::KWorkspace
)

@ -24,6 +24,7 @@
#include <KAuthorized>
#include <KUser>
#include <KLocalizedString>
#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<void (bool)> &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>(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>(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<int, QByteArray> SessionsModel::roleNames() const
@ -221,6 +260,7 @@ QHash<int, QByteArray> SessionsModel::roleNames() const
{static_cast<int>(Role::Name), QByteArrayLiteral("name")},
{static_cast<int>(Role::RealName), QByteArrayLiteral("realName")},
{static_cast<int>(Role::Icon), QByteArrayLiteral("icon")},
{static_cast<int>(Role::IconName), QByteArrayLiteral("iconName")},
{static_cast<int>(Role::DisplayNumber), QByteArrayLiteral("displayNumber")},
{static_cast<int>(Role::VtNumber), QByteArrayLiteral("vtNumber")},
{static_cast<int>(Role::Session), QByteArrayLiteral("session")},

@ -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;
};

@ -1,4 +1,3 @@
add_definitions(-DTRANSLATION_DOMAIN=\"plasmashellprivateplugin\")
if (KF5TextEditor_FOUND)
set(interactiveconsole_SRCS

@ -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
}

@ -53,6 +53,7 @@ PlasmaCore.ColorScope {
SessionsModel {
id: sessionsModel
showNewSessionEntry: true
}
PlasmaCore.DataSource {

@ -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)

Loading…
Cancel
Save