From e04ec364c1c10ef7183dfdc3f9d43cabeaca71ab Mon Sep 17 00:00:00 2001 From: Henk Kalkwater Date: Wed, 18 Aug 2021 00:04:27 +0200 Subject: [PATCH] Add UserLoader back + misc regression fixes --- core/CMakeLists.txt | 6 ++ core/include/JellyfinQt/apimodel.h | 2 + core/include/JellyfinQt/jellyfin.h | 2 + core/include/JellyfinQt/model/user.h | 39 ++++++++ core/include/JellyfinQt/viewmodel/itemmodel.h | 1 - core/include/JellyfinQt/viewmodel/user.h | 94 +++++++++++++++++++ core/include/JellyfinQt/viewmodel/usermodel.h | 75 +++++++++++++++ core/src/apimodel.cpp | 9 ++ core/src/jellyfin.cpp | 4 + core/src/model/user.cpp | 38 ++++++++ core/src/viewmodel/user.cpp | 55 +++++++++++ core/src/viewmodel/usermodel.cpp | 56 +++++++++++ sailfish/qml/pages/MainPage.qml | 6 +- sailfish/qml/pages/SettingsPage.qml | 11 ++- sailfish/qml/pages/setup/LoginDialog.qml | 29 +++--- 15 files changed, 406 insertions(+), 21 deletions(-) create mode 100644 core/include/JellyfinQt/model/user.h create mode 100644 core/include/JellyfinQt/viewmodel/user.h create mode 100644 core/include/JellyfinQt/viewmodel/usermodel.h create mode 100644 core/src/model/user.cpp create mode 100644 core/src/viewmodel/user.cpp create mode 100644 core/src/viewmodel/usermodel.cpp diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 8d8da3c..8f7a688 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -9,6 +9,7 @@ set(JellyfinQt_SOURCES src/model/item.cpp src/model/playlist.cpp src/model/shuffle.cpp + src/model/user.cpp src/support/jsonconv.cpp src/support/loader.cpp @@ -20,6 +21,8 @@ set(JellyfinQt_SOURCES src/viewmodel/playbackmanager.cpp src/viewmodel/playlist.cpp src/viewmodel/userdata.cpp + src/viewmodel/usermodel.cpp + src/viewmodel/user.cpp src/apiclient.cpp src/apimodel.cpp src/credentialmanager.cpp @@ -36,6 +39,7 @@ set(JellyfinQt_HEADERS include/JellyfinQt/model/item.h include/JellyfinQt/model/playlist.h include/JellyfinQt/model/shuffle.h + include/JellyfinQt/model/user.h include/JellyfinQt/support/jsonconv.h include/JellyfinQt/support/jsonconvimpl.h include/JellyfinQt/support/loader.h @@ -48,6 +52,8 @@ set(JellyfinQt_HEADERS include/JellyfinQt/viewmodel/playbackmanager.h include/JellyfinQt/viewmodel/playlist.h include/JellyfinQt/viewmodel/userdata.h + include/JellyfinQt/viewmodel/usermodel.h + include/JellyfinQt/viewmodel/user.h include/JellyfinQt/apiclient.h include/JellyfinQt/apimodel.h include/JellyfinQt/credentialmanager.h diff --git a/core/include/JellyfinQt/apimodel.h b/core/include/JellyfinQt/apimodel.h index 657ddf8..528051e 100644 --- a/core/include/JellyfinQt/apimodel.h +++ b/core/include/JellyfinQt/apimodel.h @@ -252,6 +252,8 @@ extern template int extractTotalRecordCount(const QList &resul extern template void setRequestLimit(Loader::GetLatestMediaParams ¶ms, int limit); extern template bool setRequestStartIndex(Loader::GetLatestMediaParams ¶ms, int offset); +extern template QList extractRecords(const QList &result); +extern template int extractTotalRecordCount(const QList &result); #endif /** diff --git a/core/include/JellyfinQt/jellyfin.h b/core/include/JellyfinQt/jellyfin.h index eb12149..257680e 100644 --- a/core/include/JellyfinQt/jellyfin.h +++ b/core/include/JellyfinQt/jellyfin.h @@ -37,6 +37,8 @@ #include "viewmodel/modelstatus.h" #include "viewmodel/playbackmanager.h" #include "viewmodel/userdata.h" +#include "viewmodel/usermodel.h" +#include "viewmodel/user.h" namespace Jellyfin { diff --git a/core/include/JellyfinQt/model/user.h b/core/include/JellyfinQt/model/user.h new file mode 100644 index 0000000..32cf8d7 --- /dev/null +++ b/core/include/JellyfinQt/model/user.h @@ -0,0 +1,39 @@ +/* + * Sailfin: a Jellyfin client written using Qt + * Copyright (C) 2021 Chris Josten and the Sailfin Contributors. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef JELLYFIN_MODEL_USER_H +#define JELLYFIN_MODEL_USER_H + +#include "../dto/userdto.h" + +namespace Jellyfin { +namespace Model { + +class User : public DTO::UserDto { + +public: + User(); + User(const DTO::UserDto &data, ApiClient *apiClient = nullptr); + + bool sameAs(const DTO::UserDto &other); +}; + +} +} // NS Jellyfin + +#endif // JELLYFIN_MODEL_USER_H diff --git a/core/include/JellyfinQt/viewmodel/itemmodel.h b/core/include/JellyfinQt/viewmodel/itemmodel.h index 65fc79a..f9885d4 100644 --- a/core/include/JellyfinQt/viewmodel/itemmodel.h +++ b/core/include/JellyfinQt/viewmodel/itemmodel.h @@ -323,7 +323,6 @@ public: QVariant data(const QModelIndex &index, int role) const override; QSharedPointer itemAt(int index); }; - #undef JFRN } // NS Jellyfin diff --git a/core/include/JellyfinQt/viewmodel/user.h b/core/include/JellyfinQt/viewmodel/user.h new file mode 100644 index 0000000..e82ccb8 --- /dev/null +++ b/core/include/JellyfinQt/viewmodel/user.h @@ -0,0 +1,94 @@ +/* + * Sailfin: a Jellyfin client written using Qt + * Copyright (C) 2021 Chris Josten and the Sailfin Contributors. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef JELLYFIN_VIEWMODEL_USER_H +#define JELLYFIN_VIEWMODEL_USER_H + +#include +#include +#include + +#include "../loader/http/getitem.h" +#include "../loader/requesttypes.h" +#include "../model/user.h" +#include "loader.h" + +namespace Jellyfin { + +namespace ViewModel { + +class User : public QObject { + Q_OBJECT +public: + explicit User(QObject *parent = nullptr, QSharedPointer data = QSharedPointer::create()); + + Q_PROPERTY(QString name READ name NOTIFY nameChanged) + Q_PROPERTY(QString serverId READ serverId NOTIFY serverIdChanged) + Q_PROPERTY(QString serverName READ serverName NOTIFY serverNameChanged) + Q_PROPERTY(QString userId READ userId NOTIFY userIdChanged) + Q_PROPERTY(QString primaryImageTag READ primaryImageTag NOTIFY primaryImageTagChanged) + Q_PROPERTY(bool hasPassword READ hasPassword NOTIFY hasPasswordChanged) + Q_PROPERTY(bool hasConfiguredPassword READ hasConfiguredPassword NOTIFY hasConfiguredPasswordChanged) + Q_PROPERTY(bool hasConfiguredEasyPassword READ hasConfiguredEasyPassword NOTIFY hasConfiguredEasyPasswordChanged) + + QString name() const { return m_data->name(); } + QString serverId() const { return m_data->serverId(); } + QString serverName() const { return m_data->serverName(); } + QString userId() const { return m_data->jellyfinId(); } + QString primaryImageTag() const { return m_data->primaryImageTag(); } + bool hasPassword() const { return m_data->hasPassword(); } + bool hasConfiguredPassword() const { return m_data->hasConfiguredPassword(); } + bool hasConfiguredEasyPassword() const { return m_data->hasConfiguredEasyPassword(); } + + QSharedPointer data() const { return m_data; } + void setData(QSharedPointer newData); + +signals: + void nameChanged(QString newName); + void serverIdChanged(QString newServerId); + void serverNameChanged(QString newServerName); + void userIdChanged(QString newUserId); + void primaryImageTagChanged(QString newPrimaryImageTag); + void hasPasswordChanged(bool newHasPassword); + void hasConfiguredPasswordChanged(bool newHasConfiguredPassword); + void hasConfiguredEasyPasswordChanged(bool newHasConfiguredEasyPasswordChanged); + +private: + QSharedPointer m_data; + +}; + +using UserLoaderBase = Loader; +class UserLoader : public UserLoaderBase { + Q_OBJECT +public: + explicit UserLoader(QObject *parent = nullptr); + Q_PROPERTY(QString userId READ userId WRITE setUserId NOTIFY userIdChanged) + + QString userId() const { return m_parameters.userId(); } + void setUserId(QString newUserId); + virtual bool canReload() const override; + +signals: + void userIdChanged(const QString &newUserId) const; +}; + +} +} // NS Jellyfin + +#endif // JELLYFIN_VIEWMODEL_USER_H diff --git a/core/include/JellyfinQt/viewmodel/usermodel.h b/core/include/JellyfinQt/viewmodel/usermodel.h new file mode 100644 index 0000000..f3023a1 --- /dev/null +++ b/core/include/JellyfinQt/viewmodel/usermodel.h @@ -0,0 +1,75 @@ +/* + * Sailfin: a Jellyfin client written using Qt + * Copyright (C) 2021 Chris Josten and the Sailfin Contributors. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef JELLYFIN_VIEWMODEL_USERMODEL_H +#define JELLYFIN_VIEWMODEL_USERMODEL_H + +#include +#include +#include + +#include "../loader/http/getpublicusers.h" +#include "../loader/requesttypes.h" +#include "../model/user.h" +#include "../apimodel.h" +#include "propertyhelper.h" + + +namespace Jellyfin { +namespace ViewModel { + +// Jellyfin Forward Read/Write Property +#define FWDPROP(type, propName, propSetName) JF_FWD_RW_PROP(type, propName, propSetName, this->m_parameters) + +class UserModel : public ApiModel { + Q_OBJECT +public: + enum RoleNames { + userId = Qt::UserRole + 1, + name, + hasPassword, + primaryImageTag, + }; + + explicit UserModel (QObject *parent = nullptr); + + virtual QHash roleNames() const override { + return { + { RoleNames::userId, "userId" }, + { RoleNames::name, "name" }, + { RoleNames::hasPassword, "hasPassword" }, + { RoleNames::primaryImageTag, "primaryImageTag" }, + }; + } + QVariant data(const QModelIndex &index, int role) const override; +}; + +using PublicUsersLoaderBase = LoaderModelLoader, Jellyfin::Loader::GetPublicUsersParams>; +class PublicUsersLoader : public PublicUsersLoaderBase { + Q_OBJECT +public: + explicit PublicUsersLoader(QObject *parent = nullptr); + bool canReload() const override; +}; + +#undef FWDPROP + +} // NS ViewModel +} // NS Jellyfin + +#endif // JELLYFIN_VIEWMODEL_USERMODEL_H diff --git a/core/src/apimodel.cpp b/core/src/apimodel.cpp index c818aee..24faa06 100644 --- a/core/src/apimodel.cpp +++ b/core/src/apimodel.cpp @@ -141,6 +141,15 @@ bool setRequestStartIndex(Loader::GetLatestMediaParams ¶ms, int offset) { return false; } +template<> +QList extractRecords(const QList &result) { + return result; +} + +template<> +int extractTotalRecordCount(const QList &result) { + return result.size(); +} void registerModels(const char *URI) { Q_UNUSED(URI) diff --git a/core/src/jellyfin.cpp b/core/src/jellyfin.cpp index 95852b4..4d05fb2 100644 --- a/core/src/jellyfin.cpp +++ b/core/src/jellyfin.cpp @@ -24,6 +24,7 @@ void registerTypes(const char *uri) { qmlRegisterType(uri, 1, 0, "ServerDiscoveryModel"); qmlRegisterType(uri, 1, 0, "PlaybackManager"); qmlRegisterUncreatableType(uri, 1, 0, "Item", "Acquire one via ItemLoader or exposed properties"); + qmlRegisterUncreatableType(uri, 1, 0, "User", "Acquire one via UserLoader or exposed properties"); qmlRegisterUncreatableType(uri, 1, 0, "EventBus", "Obtain one via your ApiClient"); qmlRegisterUncreatableType(uri, 1, 0, "WebSocket", "Obtain one via your ApiClient"); qmlRegisterUncreatableType(uri, 1, 0, "UserData", "Obtain one via an Item"); @@ -32,16 +33,19 @@ void registerTypes(const char *uri) { qmlRegisterUncreatableType(uri, 1, 0, "BaseApiModel", "Please use one of its subclasses"); qmlRegisterUncreatableType(uri, 1, 0, "BaseModelLoader", "Please use one of its subclasses"); qmlRegisterType(uri, 1, 0, "ItemModel"); + qmlRegisterType(uri, 1, 0, "UserModel"); // Loaders qmlRegisterUncreatableType(uri, 1, 0, "LoaderBase", "Use one of its subclasses"); qmlRegisterType(uri, 1, 0, "ItemLoader"); + qmlRegisterType(uri, 1, 0, "UserLoader"); qmlRegisterType(uri, 1, 0, "LatestMediaLoader"); qmlRegisterType(uri, 1, 0, "UserItemsLoader"); qmlRegisterType(uri, 1, 0, "UsersViewsLoader"); qmlRegisterType(uri, 1, 0, "ResumeItemsLoader"); qmlRegisterType(uri, 1, 0, "ShowSeasonsLoader"); qmlRegisterType(uri, 1, 0, "ShowEpisodesLoader"); + qmlRegisterType(uri, 1, 0, "PublicUsersLoader"); // Enumerations qmlRegisterUncreatableType(uri, 1, 0, "GeneralCommandType", "Is an enum"); diff --git a/core/src/model/user.cpp b/core/src/model/user.cpp new file mode 100644 index 0000000..a5e5e59 --- /dev/null +++ b/core/src/model/user.cpp @@ -0,0 +1,38 @@ +/* + * Sailfin: a Jellyfin client written using Qt + * Copyright (C) 2021 Chris Josten and the Sailfin Contributors. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "JellyfinQt/model/user.h" + +namespace Jellyfin { +namespace Model { + +User::User() {} + +User::User(const DTO::UserDto &other, ApiClient *apiClient) + : DTO::UserDto(other) { + Q_UNUSED(apiClient) +} + +bool User::sameAs(const DTO::UserDto &other) { + return this->jellyfinId() == other.jellyfinId(); +} + + +} // NS Model +} // NS Jellyfin diff --git a/core/src/viewmodel/user.cpp b/core/src/viewmodel/user.cpp new file mode 100644 index 0000000..9079a95 --- /dev/null +++ b/core/src/viewmodel/user.cpp @@ -0,0 +1,55 @@ +/* + * Sailfin: a Jellyfin client written using Qt + * Copyright (C) 2021 Chris Josten and the Sailfin Contributors. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "JellyfinQt/viewmodel/user.h" + +#include "JellyfinQt/loader/http/getuserbyid.h" + +namespace Jellyfin { +namespace ViewModel { + +// User +User::User(QObject *parent, QSharedPointer data) + : QObject(parent), + m_data(data) { + +} + +void User::setData(QSharedPointer newData) { + m_data = newData; +} + + +// UserLoader +UserLoader::UserLoader(QObject *parent) + : UserLoaderBase(new Jellyfin::Loader::HTTP::GetUserByIdLoader(), parent) {} + +void UserLoader::setUserId(QString newUserId) { + m_parameters.setUserId(newUserId); + reloadIfNeeded(); + emit userIdChanged(newUserId); +} + +bool UserLoader::canReload() const { + return UserLoaderBase::canReload() + && !m_parameters.userId().isEmpty(); +} + +} // NS ViewModel +} // NS Jellyfin diff --git a/core/src/viewmodel/usermodel.cpp b/core/src/viewmodel/usermodel.cpp new file mode 100644 index 0000000..162a1b8 --- /dev/null +++ b/core/src/viewmodel/usermodel.cpp @@ -0,0 +1,56 @@ +/* + * Sailfin: a Jellyfin client written using Qt + * Copyright (C) 2021 Chris Josten and the Sailfin Contributors. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include "JellyfinQt/viewmodel/usermodel.h" + +namespace Jellyfin { +namespace ViewModel { + +UserModel::UserModel(QObject *parent) + : ApiModel(parent) {} + +QVariant UserModel::data(const QModelIndex &index, int role) const { + if (role <= Qt::UserRole || !index.isValid()) return QVariant(); + int row = index.row(); + if (row < 0 || row >= m_array.size()) return QVariant(); + QSharedPointer item = m_array[row]; + + switch(role) { + case userId: + return QVariant(item->jellyfinId()); + case name: + return QVariant(item->name()); + case hasPassword: + return QVariant(item->hasPassword()); + case primaryImageTag: + return QVariant(item->primaryImageTag()); + default: + return QVariant(); + } +} + +PublicUsersLoader::PublicUsersLoader(QObject *parent) + : PublicUsersLoaderBase(new Loader::HTTP::GetPublicUsersLoader(), parent) {} + +bool PublicUsersLoader::canReload() const { + return m_apiClient != nullptr && !m_apiClient->baseUrl().isNull(); +} + + +} // NS ViewModel +} // NS Jellyfin diff --git a/sailfish/qml/pages/MainPage.qml b/sailfish/qml/pages/MainPage.qml index a2931d5..eae8111 100644 --- a/sailfish/qml/pages/MainPage.qml +++ b/sailfish/qml/pages/MainPage.qml @@ -185,8 +185,8 @@ Page { if (force || (appWindow.apiClient.authenticated && !_modelsLoaded)) { _modelsLoaded = true; mediaLibraryModel.reload() - //userResumeModel.reload() - //showNextUpModel.reload() + userResumeModel.reload() + showNextUpModel.reload() } } @@ -225,7 +225,7 @@ Page { value: model.imageBlurHashes["Primary"][model.imageTags["Primary"]] } landscape: !isPortrait - progress: (typeof model.userData !== "undefined") ? model.userData.playedPercentage / 100 : 0.0 + progress: (typeof model.userDataPlayedProgress !== 0.0) ? model.userDataPlayedPercentage / 100 : 0.0 onClicked: { pageStack.push(Utils.getPageUrl(model.mediaType, model.type, model.isFolder), {"itemId": model.jellyfinId, "itemData": model.qtObject}) diff --git a/sailfish/qml/pages/SettingsPage.qml b/sailfish/qml/pages/SettingsPage.qml index c288c5f..9a8846a 100644 --- a/sailfish/qml/pages/SettingsPage.qml +++ b/sailfish/qml/pages/SettingsPage.qml @@ -28,6 +28,8 @@ Page { id: settingsPage allowedOrientations: Orientation.All + property alias loggedInUser: userLoader.data + SilicaFlickable { anchors.fill: parent contentHeight: content.height @@ -58,9 +60,10 @@ Page { rightMargin: Theme.horizontalPageMargin } height: user.implicitHeight + server.implicitHeight + Theme.paddingMedium - QtObject { - id: loggedInUser - //apiClient: ApiClient + J.UserLoader{ + id: userLoader + apiClient: appWindow.apiClient + userId: appWindow.apiClient.userId } RemoteImage { id: userIcon @@ -81,7 +84,7 @@ Page { bottom: parent.verticalCenter right: parent.right } - text: loggedInUser.status == User.Ready ? loggedInUser.name : apiClient.userId + text: userLoader.status === J.UserLoader.Ready ? loggedInUser.name : apiClient.userId color: Theme.highlightColor } diff --git a/sailfish/qml/pages/setup/LoginDialog.qml b/sailfish/qml/pages/setup/LoginDialog.qml index 1bce9d3..31dac6a 100644 --- a/sailfish/qml/pages/setup/LoginDialog.qml +++ b/sailfish/qml/pages/setup/LoginDialog.qml @@ -33,6 +33,8 @@ Dialog { property string loginMessage property Page firstPage property QtObject /*User*/ selectedUser: null + property bool userSelected: false + property bool selectedUserHasPassword: true property string error @@ -66,13 +68,13 @@ Dialog { } } - QtObject { id: userModel; } - - /*PublicUserModel { + J.UserModel { id: userModel - apiClient: appWindow.apiClient - Component.onCompleted: reload(); - }*/ + loader: J.PublicUsersLoader { + id: userLoader + apiClient: appWindow.apiClient + } + } DialogHeader { id: dialogHeader @@ -100,14 +102,15 @@ Dialog { width: parent.width Repeater { id: userRepeater - model: 0 //userModel + model: userModel delegate: UserGridDelegate { name: model.name - image: model.primaryImageTag ? "%1/Users/%2/Images/Primary?tag=%3".arg(apiClient.baseUrl).arg(model.jellyfinId).arg(model.primaryImageTag) : "" + image: model.primaryImageTag ? "%1/Users/%2/Images/Primary?tag=%3".arg(apiClient.baseUrl).arg(model.userId).arg(model.primaryImageTag) : "" highlighted: model.name === username.text onHighlightedChanged: { if (highlighted) { - selectedUser = model.qtObject + userSelected = true + selectedUserHasPassword = model.hasPassword } } onClicked: { @@ -138,7 +141,7 @@ Dialog { // Wil be executed before the onHighlightChanged of the UserDelegate // This is done to update the UI after an user is selected and this field has // been changed, to not let the UI be in an invalid state (e.g. no user selected, password field disabled) - selectedUser = null + userSelected = false } } @@ -199,7 +202,7 @@ Dialog { }, State { name: "users" - when: userRepeater.count != 0 && selectedUser === null + when: userRepeater.count != 0 && !userSelected PropertyChanges { target: userList visible: true @@ -207,7 +210,7 @@ Dialog { }, State { name: "selectedUserPassword" - when: selectedUser !== null && selectedUser.hasPassword + when: userSelected && selectedUserHasPassword extend: "users" PropertyChanges { target: password @@ -216,7 +219,7 @@ Dialog { }, State { name: "selectedUserNoPassword" - when: selectedUser !== null && !selectedUser.hasPassword + when: userSelected && !selectedUserHasPassword extend: "users" PropertyChanges { target: password