KF6::I18n
KF6::KCMUtilsQuick
KF6::Wallet
+ PW::KWorkspace
Qt::DBus
crypt
)
Connections {
target: user
function onPasswordSuccessfullyChanged() {
- // Prompt to change the wallet password of the logged-in user
- if (usersDetailPage.user.loggedIn && usersDetailPage.user.usesDefaultWallet()) {
+ // Prompt to change the wallet password of the current user
+ if (usersDetailPage.user.isCurrentUser && usersDetailPage.user.usesDefaultWallet()) {
changeWalletPassword.open()
}
}
return pending
}
+ function deleteUser(uid: int, deleteUserFiles: bool) {
+ if (usersDetailPage.user.loggedIn) {
+ deleteLoggedInUserWarningDialog.askedToDeleteUserFilesWhenImpossible = deleteUserFiles
+ deleteLoggedInUserWarningDialog.open()
+ } else {
+ kcm.mainUi.deleteUser(usersDetailPage.user.uid, deleteUserFiles)
+ }
+ }
+
Component.onCompleted: {
kcm.needsSave = Qt.binding(resolvePending)
}
position: Kirigami.InlineMessage.Position.Header
}
+ Kirigami.PromptDialog {
+ id: deleteLoggedInUserWarningDialog
+
+ property bool askedToDeleteUserFilesWhenImpossible: false
+
+ parent: usersDetailPage.QQC2.Overlay.overlay
+ maximumWidth: Kirigami.Units.gridUnit * 30
+
+ title: askedToDeleteUserFilesWhenImpossible
+ ? i18nc("@title:window", "Delete Logged-In User Without Deleting Files?")
+ : i18nc("@title:window", "Delete Logged-In User?")
+ subtitle: askedToDeleteUserFilesWhenImpossible
+ ? xi18nc("@info:usagetip", "%1 is currently logged in, so their files cannot be deleted. Delete just the account instead?<nl/><nl/>This will make %1 unable to log in again, and they may experience strange behaviors until they log out.", usersDetailPage.user.displayPrimaryName)
+ : i18nc("@info:usagetip", "%1 is currently logged in. Deleting the account will make them unable to log in again, and they may experience strange behaviors until they log out.", usersDetailPage.user.displayPrimaryName)
+ dialogType: Kirigami.PromptDialog.Warning
+ standardButtons: Kirigami.Dialog.Ok | Kirigami.Dialog.Cancel
+
+ onAccepted: kcm.mainUi.deleteUser(usersDetailPage.user.uid, false)
+
+ Component.onCompleted: {
+ standardButton(Kirigami.Dialog.Ok).text = i18nc("@action: button", "Delete %1", usersDetailPage.user.realName)
+ standardButton(Kirigami.Dialog.Ok).icon.name = "edit-delete"
+ }
+ }
+
ColumnLayout {
KirigamiComponents.AvatarButton {
readonly property int size: 6 * Kirigami.Units.gridUnit
QQC2.Button {
id: deleteUser
- enabled: !usersDetailPage.user.loggedIn && (!kcm.userModel.rowCount() < 2)
+ enabled: !usersDetailPage.user.isCurrentUser
KeyNavigation.down: fingerprintButton
text: i18n("Delete files")
icon.name: "edit-delete-shred"
onClicked: {
- kcm.mainUi.deleteUser(usersDetailPage.user.uid, true)
+ usersDetailPage.deleteUser(usersDetailPage.user.uid, true);
}
}
QQC2.MenuItem {
text: i18n("Keep files")
icon.name: "document-multiple"
onClicked: {
- kcm.mainUi.deleteUser(usersDetailPage.user.uid, false)
+ usersDetailPage.deleteUser(usersDetailPage.user.uid, false);
}
}
}
if (kcm.fingerprintModel.currentlyEnrolling) {
kcm.fingerprintModel.stopEnrolling();
}
- kcm.fingerprintModel.switchUser(user.name == kcm.userModel.getLoggedInUser().name ? "" : user.name);
+ kcm.fingerprintModel.switchUser(user.name == kcm.userModel.getCurrentUser().name ? "" : user.name);
if (fingerprintButton.dialog === null) {
const component = Qt.createComponent("FingerprintDialog.qml");
kcm.columnWidth = Kirigami.Units.gridUnit * 15
// Push users page on desktop for two pane layout
- kcm.push("UserDetailsPage.qml", { user: kcm.userModel.getLoggedInUser() })
+ kcm.push("UserDetailsPage.qml", { user: kcm.userModel.getCurrentUser() })
}
}
#include <QImage>
#include <QImageWriter>
#include <config-workspace.h>
+#include <kdisplaymanager.h>
#include <sys/types.h>
#include <unistd.h>
userDataChanged = true;
Q_EMIT administratorChanged();
}
- const auto loggedIn = (mUid == getuid());
- if (mLoggedIn != loggedIn) {
- mLoggedIn = loggedIn;
- mOriginalLoggedIn = mLoggedIn;
+
+ mIsCurrentUser = (mUid == getuid());
+
+ mOriginalLoggedIn = mLoggedIn;
+
+ SessList sessions;
+ KDisplayManager displayManager;
+ displayManager.localSessions(sessions);
+ for (auto s : sessions) {
+ if (s.user == mOriginalName)
+ mLoggedIn = true;
+ }
+
+ if (mOriginalLoggedIn != mLoggedIn) {
userDataChanged = true;
+ Q_EMIT loggedInChanged();
}
+
if (userDataChanged) {
Q_EMIT dataChanged();
}
KWallet::Wallet::changePassword(QStringLiteral("kdewallet"), 1);
}
+bool User::isCurrentUser() const
+{
+ return mIsCurrentUser;
+}
+
bool User::loggedIn() const
{
return mLoggedIn;
Q_PROPERTY(bool faceValid READ faceValid NOTIFY faceValidChanged)
- Q_PROPERTY(bool loggedIn READ loggedIn CONSTANT)
+ Q_PROPERTY(bool isCurrentUser READ isCurrentUser CONSTANT)
+
+ Q_PROPERTY(bool loggedIn READ loggedIn NOTIFY loggedInChanged)
Q_PROPERTY(bool administrator READ administrator WRITE setAdministrator NOTIFY administratorChanged)
QString email() const;
QUrl face() const;
bool faceValid() const;
+ bool isCurrentUser() const;
bool loggedIn() const;
bool administrator() const;
QDBusObjectPath path() const;
void realNameChanged();
void displayNamesChanged();
void emailChanged();
+ void loggedInChanged();
void faceChanged();
void faceValidChanged();
void administratorChanged();
bool mOriginalAdministrator = false;
bool mFaceValid = false;
bool mOriginalFaceValid = false;
+ bool mIsCurrentUser = false;
bool mLoggedIn = false;
bool mOriginalLoggedIn = false;
QDBusObjectPath mPath;
}
std::ranges::stable_partition(m_userList, [](User *u) {
- return u->loggedIn();
+ return u->isCurrentUser();
});
connect(this, &QAbstractItemModel::rowsInserted, this, &UserModel::moreThanOneAdminUserChanged);
names.insert(AdministratorRole, QByteArrayLiteral("administrator"));
names.insert(UserRole, QByteArrayLiteral("userObject"));
names.insert(FaceValidRole, QByteArrayLiteral("faceValid"));
+ names.insert(IsCurrentUserRole, QByteArrayLiteral("isCurrentUser"));
names.insert(LoggedInRole, QByteArrayLiteral("loggedIn"));
names.insert(SectionHeaderRole, QByteArrayLiteral("sectionHeader"));
return names;
UserModel::~UserModel() = default;
-User *UserModel::getLoggedInUser() const
+User *UserModel::getCurrentUser() const
{
for (const auto user : std::as_const(m_userList)) {
- if (user->loggedIn()) {
+ if (user->isCurrentUser()) {
return user;
}
}
return QFile::exists(user->face().path());
case UserRole:
return QVariant::fromValue(user);
+ case IsCurrentUserRole:
+ return user->isCurrentUser();
case LoggedInRole:
return user->loggedIn();
case SectionHeaderRole:
- return user->loggedIn() ? i18n("Your Account") : i18n("Other Accounts");
+ return user->isCurrentUser() ? i18n("Your Account") : i18n("Other Accounts");
}
return QVariant();
FaceValidRole,
AdministratorRole,
UserRole,
+ IsCurrentUserRole,
LoggedInRole,
SectionHeaderRole,
};
QVariant data(const QModelIndex &index, int role) const override;
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
- Q_INVOKABLE User *getLoggedInUser() const;
+ Q_INVOKABLE User *getCurrentUser() const;
QHash<int, QByteArray> roleNames() const override;