diff --git a/misc/wayland-sessions/treeland-user.desktop.in b/misc/wayland-sessions/treeland-user.desktop.in index 0ce811607..48e35d338 100644 --- a/misc/wayland-sessions/treeland-user.desktop.in +++ b/misc/wayland-sessions/treeland-user.desktop.in @@ -1,5 +1,5 @@ [Desktop Entry] -Name=Treeland +Name=Treeland User Comment=This session is DDE single wayland Exec=${CMAKE_INSTALL_FULL_BINDIR}/treeland-user-wrapper TryExec=${CMAKE_INSTALL_FULL_BINDIR}/treeland diff --git a/src/greeter/greeterproxy.cpp b/src/greeter/greeterproxy.cpp index dbdbfe86b..e865c1c70 100644 --- a/src/greeter/greeterproxy.cpp +++ b/src/greeter/greeterproxy.cpp @@ -88,6 +88,7 @@ class GreeterProxyPrivate bool canHibernate{ false }; bool canHybridSleep{ false }; bool isLocked{ false }; + bool isLoggedIn{ false }; }; GreeterProxy::GreeterProxy(QObject *parent) @@ -109,6 +110,11 @@ GreeterProxy::GreeterProxy(QObject *parent) connect(d->socket, &QLocalSocket::readyRead, this, &GreeterProxy::readyRead); connect(d->socket, &QLocalSocket::errorOccurred, this, &GreeterProxy::error); + connect(this, &GreeterProxy::loginSucceeded, this, [this]([[maybe_unused]] QString user) { + d->isLoggedIn = true; + Q_EMIT isLoggedInChanged(); + }); + d->ddmDisplayManager = new org::deepin::DisplayManager("org.deepin.DisplayManager", "/org/deepin/DisplayManager", QDBusConnection::systemBus()); @@ -157,6 +163,11 @@ bool GreeterProxy::isLocked() const return d->isLocked; } +bool GreeterProxy::isLoggedIn() const +{ + return d->isLoggedIn; +} + bool GreeterProxy::canPowerOff() const { return d->canPowerOff; @@ -287,6 +298,8 @@ static QString getSessionPathByUser(UserPtr userInfo); void GreeterProxy::logout() { qCDebug(treelandGreeter) << "Logout."; + d->isLoggedIn = false; + Q_EMIT isLoggedInChanged(); auto user = userModel()->currentUser(); QThreadPool::globalInstance()->start([user]() { const auto path = getSessionPathByUser(user); diff --git a/src/greeter/greeterproxy.h b/src/greeter/greeterproxy.h index 541bee74b..fcdeca60c 100644 --- a/src/greeter/greeterproxy.h +++ b/src/greeter/greeterproxy.h @@ -46,6 +46,7 @@ class GreeterProxy : public QObject Q_PROPERTY(SessionModel* sessionModel READ sessionModel WRITE setSessionModel NOTIFY sessionModelChanged) Q_PROPERTY(UserModel* userModel READ userModel WRITE setUserModel NOTIFY userModelChanged) Q_PROPERTY(bool isLocked READ isLocked NOTIFY isLockedChanged) + Q_PROPERTY(bool isLoggedIn READ isLoggedIn NOTIFY isLoggedInChanged) public: explicit GreeterProxy(QObject *parent = nullptr); @@ -60,6 +61,7 @@ class GreeterProxy : public QObject bool canHybridSleep() const; bool isConnected() const; + bool isLoggedIn() const; SessionModel *sessionModel() const; void setSessionModel(SessionModel *model); @@ -106,6 +108,7 @@ private Q_SLOTS: void loginSucceeded(const QString &user); void switchToGreeter(); void isLockedChanged(); + void isLoggedInChanged(); private: bool localValidation(const QString &user, const QString &password) const; diff --git a/src/greeter/sessionmodel.cpp b/src/greeter/sessionmodel.cpp index 375d9d04a..5b6e083f1 100644 --- a/src/greeter/sessionmodel.cpp +++ b/src/greeter/sessionmodel.cpp @@ -172,7 +172,7 @@ void SessionModel::populate(Session::Type type, const QStringList &dirPaths) } // add to sessions list // TODO: only show support sessions(X-DDE-SINGLE-WAYLAND) - if (si->isSingleMode() && execAllowed) { + if (execAllowed) { d->displayNames.append(si->displayName()); d->sessions.push_back(si); } else { diff --git a/src/plugins/lockscreen/qml/ControlAction.qml b/src/plugins/lockscreen/qml/ControlAction.qml index 121332d79..f704d75bd 100644 --- a/src/plugins/lockscreen/qml/ControlAction.qml +++ b/src/plugins/lockscreen/qml/ControlAction.qml @@ -16,6 +16,34 @@ RowLayout { property bool powerVisible: powerList.visible required property Item rootItem signal lock() + + // TODO: Design the interface of session selection + D.Button { + id: sessionItem + Layout.alignment: Qt.AlignHCenter + visible: !GreeterModel.proxy.isLoggedIn + + contentItem: D.IconLabel { + text: SessionModel.data(SessionModel.index(GreeterModel.currentSession, 0), SessionModel.NameRole) + color: "white" + } + + SessionList { + id: sessionList + x: (sessionItem.width - sessionList.width) / 2 - 10 + y: -sessionList.height - 10 + } + + background: RoundBlur { + radius: parent.width / 2 + color: Qt.rgba(1.0, 1.0, 1.0, 0.3) + } + + onClicked: { + sessionList.open() + } + } + function showUserList() { userItem.expand = true diff --git a/src/plugins/lockscreen/qml/SessionList.qml b/src/plugins/lockscreen/qml/SessionList.qml index 36a0f7c42..0a4c18d21 100644 --- a/src/plugins/lockscreen/qml/SessionList.qml +++ b/src/plugins/lockscreen/qml/SessionList.qml @@ -9,9 +9,10 @@ import Treeland import LockScreen Popup { + id: popup modal: true width: 220 - height: 140 + height: 280 background: RoundBlur { radius: 12 } @@ -29,8 +30,18 @@ Popup { y: 10 clip: true model: SessionModel + + ScrollBar.vertical: ScrollBar { + id: verticalScrollBar + anchors.right: parent.right + anchors.top: parent.top + anchors.bottom: parent.bottom + policy: ScrollBar.AlwaysOn + } + delegate: Item { required property string name + required property int index width: parent.width height: 60 MouseArea { @@ -45,7 +56,8 @@ Popup { } onClicked: (mouse) => { mouse.accepted = false - updateCurrentSession(list.currentIndex) + updateCurrentSession(index) + popup.close() } }