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 000000000..43e5ab73f Binary files /dev/null and b/src/images/users_icon.png differ 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 +