From 0e2f414cb6998116cca7b3e367176178ec3975db Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Thu, 12 Jun 2025 18:03:44 +0300 Subject: [PATCH] initial user management dialog --- CMakeLists.txt | 2 + REUSE.toml | 1 + src/images/users_icon.png | Bin 0 -> 3736 bytes src/qt_gui/main_window.cpp | 7 +++ src/qt_gui/main_window_ui.h | 6 ++ src/qt_gui/user_management_dialog.cpp | 68 ++++++++++++++++++++++ src/qt_gui/user_management_dialog.h | 20 +++++++ src/shadps4.qrc | 79 +++++++++++++------------- 8 files changed, 144 insertions(+), 39 deletions(-) create mode 100644 src/images/users_icon.png create mode 100644 src/qt_gui/user_management_dialog.cpp create mode 100644 src/qt_gui/user_management_dialog.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 12ff0b53a..17d09909c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1059,6 +1059,8 @@ set(QT_GUI src/qt_gui/about_dialog.cpp src/qt_gui/gui_settings.h src/qt_gui/settings.cpp src/qt_gui/settings.h + src/qt_gui/user_management_dialog.cpp + src/qt_gui/user_management_dialog.h ${EMULATOR} ${RESOURCE_FILES} ${TRANSLATIONS} diff --git a/REUSE.toml b/REUSE.toml index 662987611..b1a5e4850 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -53,6 +53,7 @@ path = [ "src/images/refreshlist_icon.png", "src/images/settings_icon.png", "src/images/fullscreen_icon.png", + "src/images/users_icon.png", "src/images/stop_icon.png", "src/images/utils_icon.png", "src/images/shadPS4.icns", diff --git a/src/images/users_icon.png b/src/images/users_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..43e5ab73f8a9cb680d81eaa6b34402aa5214af2c GIT binary patch literal 3736 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 literal 0 HcmV?d00001 diff --git a/src/qt_gui/main_window.cpp b/src/qt_gui/main_window.cpp index c6da49182..10004da99 100644 --- a/src/qt_gui/main_window.cpp +++ b/src/qt_gui/main_window.cpp @@ -27,6 +27,7 @@ #ifdef ENABLE_DISCORD_RPC #include "common/discord_rpc_handler.h" #endif +#include "user_management_dialog.h" MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); @@ -440,6 +441,11 @@ void MainWindow::CreateConnects() { settingsDialog->exec(); }); + connect(ui->userManagement, &QAction::triggered, this, [this]() { + user_manager_dialog user_manager(this); + user_manager.exec(); + }); + connect(ui->settingsButton, &QPushButton::clicked, this, [this]() { auto settingsDialog = new SettingsDialog(m_gui_settings, m_compat_info, this); @@ -1103,6 +1109,7 @@ void MainWindow::SetUiIcons(bool isWhite) { ui->menuGame_List_Mode->setIcon(RecolorIcon(ui->menuGame_List_Mode->icon(), isWhite)); ui->trophyViewerAct->setIcon(RecolorIcon(ui->trophyViewerAct->icon(), isWhite)); ui->configureAct->setIcon(RecolorIcon(ui->configureAct->icon(), isWhite)); + ui->userManagement->setIcon(RecolorIcon(ui->userManagement->icon(), isWhite)); ui->addElfFolderAct->setIcon(RecolorIcon(ui->addElfFolderAct->icon(), isWhite)); } diff --git a/src/qt_gui/main_window_ui.h b/src/qt_gui/main_window_ui.h index 4ce71013e..37ce273ac 100644 --- a/src/qt_gui/main_window_ui.h +++ b/src/qt_gui/main_window_ui.h @@ -32,6 +32,7 @@ public: #endif QAction* aboutAct; QAction* configureAct; + QAction* userManagement; QAction* setThemeDark; QAction* setThemeLight; QAction* setThemeGreen; @@ -155,6 +156,9 @@ public: configureAct = new QAction(MainWindow); configureAct->setObjectName("configureAct"); configureAct->setIcon(QIcon(":images/settings_icon.png")); + userManagement = new QAction(MainWindow); + userManagement->setObjectName("userManagement"); + userManagement->setIcon(QIcon(":images/users_icon.png")); setThemeDark = new QAction(MainWindow); setThemeDark->setObjectName("setThemeDark"); setThemeDark->setCheckable(true); @@ -329,6 +333,7 @@ public: menuGame_List_Mode->addAction(setlistModeGridAct); menuGame_List_Mode->addAction(setlistElfAct); menuSettings->addAction(configureAct); + menuSettings->addAction(userManagement); menuSettings->addAction(gameInstallPathAct); menuSettings->addAction(menuUtils->menuAction()); menuUtils->addAction(downloadCheatsPatchesAct); @@ -355,6 +360,7 @@ public: #endif aboutAct->setText(QCoreApplication::translate("MainWindow", "About shadPS4", nullptr)); configureAct->setText(QCoreApplication::translate("MainWindow", "Configure...", nullptr)); + userManagement->setText(QCoreApplication::translate("MainWindow", "User Management", nullptr)); #if QT_CONFIG(tooltip) #endif // QT_CONFIG(tooltip) menuRecent->setTitle(QCoreApplication::translate("MainWindow", "Recent Games", nullptr)); diff --git a/src/qt_gui/user_management_dialog.cpp b/src/qt_gui/user_management_dialog.cpp new file mode 100644 index 000000000..735b72b1d --- /dev/null +++ b/src/qt_gui/user_management_dialog.cpp @@ -0,0 +1,68 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "user_management_dialog.h" + +user_manager_dialog::user_manager_dialog(QWidget* parent) : QDialog(parent) { + setWindowTitle(tr("User Manager")); + setMinimumSize(QSize(500, 400)); + setModal(true); + + Init(); +} + +void user_manager_dialog::Init() { + // Table + m_table = new QTableWidget(this); + m_table->setSelectionMode(QAbstractItemView::SelectionMode::SingleSelection); + m_table->setSelectionBehavior(QAbstractItemView::SelectRows); + m_table->setContextMenuPolicy(Qt::CustomContextMenu); + m_table->setColumnCount(2); + m_table->setCornerButtonEnabled(false); + m_table->setAlternatingRowColors(true); + m_table->setHorizontalHeaderLabels(QStringList() << tr("User ID") << tr("User Name")); + m_table->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft); + m_table->horizontalHeader()->setStretchLastSection(true); + m_table->horizontalHeader()->setDefaultSectionSize(150); + m_table->installEventFilter(this); + + QPushButton* push_remove_user = new QPushButton(tr("&Delete User"), this); + push_remove_user->setAutoDefault(false); + + QPushButton* push_create_user = new QPushButton(tr("&Create User"), this); + push_create_user->setAutoDefault(false); + + QPushButton* push_rename_user = new QPushButton(tr("&Rename User"), this); + push_rename_user->setAutoDefault(false); + + QPushButton* push_close = new QPushButton(tr("&Close"), this); + push_close->setAutoDefault(false); + + // Button Layout + QHBoxLayout* hbox_buttons = new QHBoxLayout(); + hbox_buttons->addWidget(push_create_user); + hbox_buttons->addWidget(push_rename_user); + hbox_buttons->addWidget(push_remove_user); + hbox_buttons->addStretch(); + hbox_buttons->addWidget(push_close); + + // Main Layout + QVBoxLayout* vbox_main = new QVBoxLayout(); + vbox_main->setAlignment(Qt::AlignCenter); + vbox_main->addWidget(m_table); + vbox_main->addLayout(hbox_buttons); + setLayout(vbox_main); +} \ No newline at end of file diff --git a/src/qt_gui/user_management_dialog.h b/src/qt_gui/user_management_dialog.h new file mode 100644 index 000000000..ee0d3d4c1 --- /dev/null +++ b/src/qt_gui/user_management_dialog.h @@ -0,0 +1,20 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include + +class user_manager_dialog : public QDialog { + Q_OBJECT + +public: + explicit user_manager_dialog(QWidget* parent = nullptr); + +private: + void Init(); + + QTableWidget* m_table = nullptr; + +}; \ No newline at end of file diff --git a/src/shadps4.qrc b/src/shadps4.qrc index 2aee394c8..09bc2acf8 100644 --- a/src/shadps4.qrc +++ b/src/shadps4.qrc @@ -1,41 +1,42 @@ - - images/shadps4.ico - images/shadps4.png - images/about_icon.png - images/dump_icon.png - images/play_icon.png - images/pause_icon.png - images/stop_icon.png - images/utils_icon.png - images/file_icon.png - images/folder_icon.png - images/themes_icon.png - images/iconsize_icon.png - images/list_icon.png - images/grid_icon.png - images/exit_icon.png - images/settings_icon.png - images/controller_icon.png - images/restart_game_icon.png - images/update_icon.png - images/list_mode_icon.png - images/flag_jp.png - images/flag_eu.png - images/flag_unk.png - images/flag_us.png - images/flag_world.png - images/flag_china.png - images/github.png - images/discord.png - images/ko-fi.png - images/youtube.png - images/website.png - images/ps4_controller.png - images/keyboard_icon.png - images/KBM.png - images/fullscreen_icon.png - images/refreshlist_icon.png - images/trophy_icon.png - + + images/shadps4.ico + images/shadps4.png + images/about_icon.png + images/dump_icon.png + images/play_icon.png + images/pause_icon.png + images/stop_icon.png + images/utils_icon.png + images/file_icon.png + images/folder_icon.png + images/themes_icon.png + images/iconsize_icon.png + images/list_icon.png + images/grid_icon.png + images/exit_icon.png + images/settings_icon.png + images/users_icon.png + images/controller_icon.png + images/restart_game_icon.png + images/update_icon.png + images/list_mode_icon.png + images/flag_jp.png + images/flag_eu.png + images/flag_unk.png + images/flag_us.png + images/flag_world.png + images/flag_china.png + images/github.png + images/discord.png + images/ko-fi.png + images/youtube.png + images/website.png + images/ps4_controller.png + images/keyboard_icon.png + images/KBM.png + images/fullscreen_icon.png + images/refreshlist_icon.png + images/trophy_icon.png +