diff --git a/src/frontend/AudioSettings.cpp b/src/frontend/AudioSettings.cpp index bcf6632a..121f9eef 100644 --- a/src/frontend/AudioSettings.cpp +++ b/src/frontend/AudioSettings.cpp @@ -1,6 +1,4 @@ #include -#include -#include AudioSettings::AudioSettings(nlohmann::json &settings) : settings(settings), QWidget(nullptr) { lockChannels->setChecked(JSONGetField(settings, "audio", "lock")); @@ -9,7 +7,7 @@ AudioSettings::AudioSettings(nlohmann::json &settings) : settings(settings), QWi volumeL->setRange(0, 100); volumeR->setRange(0, 100); - connect(lockChannels, &QCheckBox::stateChanged, this, [&]() { + connect(lockChannels.get(), &QCheckBox::stateChanged, this, [&]() { JSONSetField(settings, "audio", "lock", lockChannels->isChecked()); if (lockChannels->isChecked()) { volumeR->setValue(volumeL->value()); @@ -18,7 +16,7 @@ AudioSettings::AudioSettings(nlohmann::json &settings) : settings(settings), QWi emit modified(); }); - connect(volumeL, &QSlider::valueChanged, this, [&]() { + connect(volumeL.get(), &QSlider::valueChanged, this, [&]() { JSONSetField(settings, "audio", "volumeL", float(volumeL->value()) / 100.f); if (lockChannels->isChecked()) { volumeR->setValue(volumeL->value()); @@ -27,26 +25,20 @@ AudioSettings::AudioSettings(nlohmann::json &settings) : settings(settings), QWi emit modified(); }); - connect(volumeR, &QSlider::valueChanged, this, [&]() { + connect(volumeR.get(), &QSlider::valueChanged, this, [&]() { if (!lockChannels->isChecked()) { JSONSetField(settings, "audio", "volumeR", float(volumeR->value()) / 100.f); } emit modified(); }); - auto labelLock = new QLabel("Lock channels:"); - auto labelL = new QLabel("Volume L"); - auto labelR = new QLabel("Volume R"); - - auto mainLayout = new QVBoxLayout; - auto volLayout = new QHBoxLayout; - mainLayout->addWidget(labelLock); - mainLayout->addWidget(lockChannels); - volLayout->addWidget(labelL); - volLayout->addWidget(volumeL); - volLayout->addWidget(labelR); - volLayout->addWidget(volumeR); - mainLayout->addLayout(volLayout); + mainLayout->addWidget(labelLock.get()); + mainLayout->addWidget(lockChannels.get()); + volLayout->addWidget(labelL.get()); + volLayout->addWidget(volumeL.get()); + volLayout->addWidget(labelR.get()); + volLayout->addWidget(volumeR.get()); + mainLayout->addLayout(volLayout.get()); mainLayout->addStretch(); - setLayout(mainLayout); + setLayout(mainLayout.get()); } diff --git a/src/frontend/AudioSettings.hpp b/src/frontend/AudioSettings.hpp index 0adf663d..8392508f 100644 --- a/src/frontend/AudioSettings.hpp +++ b/src/frontend/AudioSettings.hpp @@ -3,12 +3,20 @@ #include #include #include +#include +#include class AudioSettings : public QWidget { - QCheckBox *lockChannels = new QCheckBox; + std::unique_ptr lockChannels = std::make_unique(); + std::unique_ptr labelLock = std::make_unique("Lock channels:"); + std::unique_ptr labelL = std::make_unique("Volume L"); + std::unique_ptr labelR = std::make_unique("Volume R"); + std::unique_ptr mainLayout = std::make_unique(); + std::unique_ptr volLayout = std::make_unique(); Q_OBJECT public: - QSlider *volumeL = new QSlider(Qt::Horizontal), *volumeR = new QSlider(Qt::Horizontal); + std::unique_ptr volumeL = std::make_unique(Qt::Horizontal), + volumeR = std::make_unique(Qt::Horizontal); AudioSettings(nlohmann::json &); nlohmann::json &settings; Q_SIGNALS: diff --git a/src/frontend/CMakeLists.txt b/src/frontend/CMakeLists.txt index 708801b2..fd53971b 100644 --- a/src/frontend/CMakeLists.txt +++ b/src/frontend/CMakeLists.txt @@ -78,7 +78,8 @@ add_executable(kaizen-qt InputSettings.hpp InputSettings.cpp Debugger.hpp - Debugger.cpp) + Debugger.cpp + CodeModel.hpp) include(CheckCCompilerFlag) diff --git a/src/frontend/CPUSettings.cpp b/src/frontend/CPUSettings.cpp index 6e6c7a25..6b989e15 100644 --- a/src/frontend/CPUSettings.cpp +++ b/src/frontend/CPUSettings.cpp @@ -1,7 +1,5 @@ #include #include -#include -#include #include CPUSettings::CPUSettings(nlohmann::json &settings) : settings(settings), QWidget(nullptr) { @@ -14,7 +12,7 @@ CPUSettings::CPUSettings(nlohmann::json &settings) : settings(settings), QWidget cpuTypes->setCurrentIndex(0); } - connect(cpuTypes, &QComboBox::currentIndexChanged, this, [&]() { + connect(cpuTypes.get(), &QComboBox::currentIndexChanged, this, [&]() { if (cpuTypes->currentIndex() == 0) { JSONSetField(settings, "cpu", "type", "interpreter"); //} else if (cpuTypes->currentIndex() == 1) { @@ -26,11 +24,8 @@ CPUSettings::CPUSettings(nlohmann::json &settings) : settings(settings), QWidget emit modified(); }); - auto label = new QLabel("CPU type:"); - - auto mainLayout = new QVBoxLayout; - mainLayout->addWidget(label); - mainLayout->addWidget(cpuTypes); + mainLayout->addWidget(label.get()); + mainLayout->addWidget(cpuTypes.get()); mainLayout->addStretch(); - setLayout(mainLayout); + setLayout(mainLayout.get()); } diff --git a/src/frontend/CPUSettings.hpp b/src/frontend/CPUSettings.hpp index 39b009cb..829da8d5 100644 --- a/src/frontend/CPUSettings.hpp +++ b/src/frontend/CPUSettings.hpp @@ -2,9 +2,13 @@ #include #include #include +#include +#include class CPUSettings : public QWidget { - QComboBox *cpuTypes = new QComboBox; + std::unique_ptr cpuTypes = std::make_unique(); + std::unique_ptr label = std::make_unique("CPU type:"); + std::unique_ptr mainLayout = std::make_unique(); Q_OBJECT public: CPUSettings(nlohmann::json &); diff --git a/src/frontend/CodeModel.hpp b/src/frontend/CodeModel.hpp new file mode 100644 index 00000000..3a3dc1f8 --- /dev/null +++ b/src/frontend/CodeModel.hpp @@ -0,0 +1,12 @@ +#pragma once +#include + +class CodeModel final : public QAbstractTableModel { + Q_OBJECT +public: + ~CodeModel() override {} + explicit CodeModel(QObject *parent = nullptr) {} + int rowCount(const QModelIndex &parent = QModelIndex()) const override { return 1; } + int columnCount(const QModelIndex &parent = QModelIndex()) const override { return 2; } + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override { return {}; } +}; \ No newline at end of file diff --git a/src/frontend/Debugger.cpp b/src/frontend/Debugger.cpp index ef33578e..de86290b 100644 --- a/src/frontend/Debugger.cpp +++ b/src/frontend/Debugger.cpp @@ -1,29 +1,23 @@ #include -#include Debugger::Debugger() : QWidget(nullptr) { - disassembly = new QDockWidget; disassembly->setWindowTitle("Disassembly"); disassembly->setFeatures(QDockWidget::DockWidgetFloatable | QDockWidget::DockWidgetMovable); - codeView = new QTreeView(disassembly); codeView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); codeView->setHeaderHidden(true); - cpuState = new QDockWidget; + codeView->setModel(codeModel.get()); cpuState->setWindowTitle("Registers"); cpuState->setFeatures(QDockWidget::DockWidgetFloatable | QDockWidget::DockWidgetMovable); - registers = new QTreeView(cpuState); registers->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - horLayout = new QHBoxLayout; - horLayout->addWidget(disassembly); - horLayout->addWidget(cpuState); + horLayout->addWidget(disassembly.get()); + horLayout->addWidget(cpuState.get()); - verLayout = new QVBoxLayout; - verLayout->addLayout(horLayout); + verLayout->addLayout(horLayout.get()); - setLayout(verLayout); + setLayout(verLayout.get()); - connect(codeView, &QTreeView::activated, this, [&](QModelIndex index) { + connect(codeView.get(), &QTreeView::activated, this, [&](QModelIndex index) { }); } diff --git a/src/frontend/Debugger.hpp b/src/frontend/Debugger.hpp index 14c2ff3f..b37f2987 100644 --- a/src/frontend/Debugger.hpp +++ b/src/frontend/Debugger.hpp @@ -4,12 +4,16 @@ #include #include #include +#include class Debugger : public QWidget { - QDockWidget *disassembly{}, *cpuState{}; - QTreeView *codeView{}, *registers{}; - QHBoxLayout *horLayout{}; - QVBoxLayout *verLayout{}; + std::unique_ptr disassembly = std::make_unique(), + cpuState = std::make_unique(); + std::unique_ptr codeView = std::make_unique(disassembly.get()), + registers = std::make_unique(cpuState.get()); + std::unique_ptr horLayout = std::make_unique(); + std::unique_ptr verLayout = std::make_unique(); + std::unique_ptr codeModel = std::make_unique(); public: Debugger(); diff --git a/src/frontend/EmuThread.hpp b/src/frontend/EmuThread.hpp index 12524c74..87754bcd 100644 --- a/src/frontend/EmuThread.hpp +++ b/src/frontend/EmuThread.hpp @@ -16,7 +16,7 @@ public: [[noreturn]] void run() noexcept override; - SDL_Gamepad *controller = nullptr; + SDL_Gamepad *controller{}; ParallelRDP parallel; n64::Core core; SettingsWindow &settings; diff --git a/src/frontend/InputSettings.cpp b/src/frontend/InputSettings.cpp index 16492e03..34b88922 100644 --- a/src/frontend/InputSettings.cpp +++ b/src/frontend/InputSettings.cpp @@ -1,68 +1,66 @@ #include -#include -#include #include InputSettings::InputSettings(nlohmann::json &settings) : settings(settings), QWidget(nullptr) { - n64_button_labels[0] = new QLabel("A"); - n64_button_labels[1] = new QLabel("B"); - n64_button_labels[2] = new QLabel("Z"); - n64_button_labels[3] = new QLabel("Start"); - n64_button_labels[4] = new QLabel("L"); - n64_button_labels[5] = new QLabel("R"); - n64_button_labels[6] = new QLabel("Dpad Up"); - n64_button_labels[7] = new QLabel("Dpad Down"); - n64_button_labels[8] = new QLabel("Dpad Left"); - n64_button_labels[9] = new QLabel("Dpad Right"); - n64_button_labels[10] = new QLabel("C Up"); - n64_button_labels[11] = new QLabel("C Down"); - n64_button_labels[12] = new QLabel("C Left"); - n64_button_labels[13] = new QLabel("C Right"); - n64_button_labels[14] = new QLabel("Analog Up"); - n64_button_labels[15] = new QLabel("Analog Down"); - n64_button_labels[16] = new QLabel("Analog Left"); - n64_button_labels[17] = new QLabel("Analog Right"); + n64_button_labels[0] = std::make_unique("A"); + n64_button_labels[1] = std::make_unique("B"); + n64_button_labels[2] = std::make_unique("Z"); + n64_button_labels[3] = std::make_unique("Start"); + n64_button_labels[4] = std::make_unique("L"); + n64_button_labels[5] = std::make_unique("R"); + n64_button_labels[6] = std::make_unique("Dpad Up"); + n64_button_labels[7] = std::make_unique("Dpad Down"); + n64_button_labels[8] = std::make_unique("Dpad Left"); + n64_button_labels[9] = std::make_unique("Dpad Right"); + n64_button_labels[10] = std::make_unique("C Up"); + n64_button_labels[11] = std::make_unique("C Down"); + n64_button_labels[12] = std::make_unique("C Left"); + n64_button_labels[13] = std::make_unique("C Right"); + n64_button_labels[14] = std::make_unique("Analog Up"); + n64_button_labels[15] = std::make_unique("Analog Down"); + n64_button_labels[16] = std::make_unique("Analog Left"); + n64_button_labels[17] = std::make_unique("Analog Right"); auto str = JSONGetField(settings, "input", "A"); - kb_buttons[0] = new QPushButton(str.c_str()); + kb_buttons[0] = std::make_unique(str.c_str()); str = JSONGetField(settings, "input", "B"); - kb_buttons[1] = new QPushButton(str.c_str()); + kb_buttons[1] = std::make_unique(str.c_str()); str = JSONGetField(settings, "input", "Z"); - kb_buttons[2] = new QPushButton(str.c_str()); + kb_buttons[2] = std::make_unique(str.c_str()); str = JSONGetField(settings, "input", "Start"); - kb_buttons[3] = new QPushButton(str.c_str()); + kb_buttons[3] = std::make_unique(str.c_str()); str = JSONGetField(settings, "input", "L"); - kb_buttons[4] = new QPushButton(str.c_str()); + kb_buttons[4] = std::make_unique(str.c_str()); str = JSONGetField(settings, "input", "R"); - kb_buttons[5] = new QPushButton(str.c_str()); + kb_buttons[5] = std::make_unique(str.c_str()); str = JSONGetField(settings, "input", "Dpad Up"); - kb_buttons[6] = new QPushButton(str.c_str()); + kb_buttons[6] = std::make_unique(str.c_str()); str = JSONGetField(settings, "input", "Dpad Down"); - kb_buttons[7] = new QPushButton(str.c_str()); + kb_buttons[7] = std::make_unique(str.c_str()); str = JSONGetField(settings, "input", "Dpad Left"); - kb_buttons[8] = new QPushButton(str.c_str()); + kb_buttons[8] = std::make_unique(str.c_str()); str = JSONGetField(settings, "input", "Dpad Right"); - kb_buttons[9] = new QPushButton(str.c_str()); + kb_buttons[9] = std::make_unique(str.c_str()); str = JSONGetField(settings, "input", "C Up"); - kb_buttons[10] = new QPushButton(str.c_str()); + kb_buttons[10] = std::make_unique(str.c_str()); str = JSONGetField(settings, "input", "C Down"); - kb_buttons[11] = new QPushButton(str.c_str()); + kb_buttons[11] = std::make_unique(str.c_str()); str = JSONGetField(settings, "input", "C Left"); - kb_buttons[12] = new QPushButton(str.c_str()); + kb_buttons[12] = std::make_unique(str.c_str()); str = JSONGetField(settings, "input", "C Right"); - kb_buttons[13] = new QPushButton(str.c_str()); + kb_buttons[13] = std::make_unique(str.c_str()); str = JSONGetField(settings, "input", "Analog Up"); - kb_buttons[14] = new QPushButton(str.c_str()); + kb_buttons[14] = std::make_unique(str.c_str()); str = JSONGetField(settings, "input", "Analog Down"); - kb_buttons[15] = new QPushButton(str.c_str()); + kb_buttons[15] = std::make_unique(str.c_str()); str = JSONGetField(settings, "input", "Analog Left"); - kb_buttons[16] = new QPushButton(str.c_str()); + kb_buttons[16] = std::make_unique(str.c_str()); str = JSONGetField(settings, "input", "Analog Right"); - kb_buttons[17] = new QPushButton(str.c_str()); + kb_buttons[17] = std::make_unique(str.c_str()); for (int i = 0; i < 18; i++) { - connect(kb_buttons[i], &QPushButton::pressed, this, [&, i]() { - for (auto kb_button : kb_buttons) { + connect(kb_buttons[i].get(), &QPushButton::pressed, this, [&, i]() { + for (auto& kb_button : kb_buttons) { kb_button->setEnabled(false); } grabKeyboard(); @@ -71,64 +69,53 @@ InputSettings::InputSettings(nlohmann::json &settings) : settings(settings), QWi }); } - auto AB = new QHBoxLayout; - auto ZStart = new QHBoxLayout; - auto LR = new QHBoxLayout; - auto DupDdown = new QHBoxLayout; - auto DleftDright = new QHBoxLayout; - auto CupCdown = new QHBoxLayout; - auto CleftCright = new QHBoxLayout; - auto AupAdown = new QHBoxLayout; - auto AleftAright = new QHBoxLayout; - auto mainLayout = new QVBoxLayout; - - AB->addWidget(n64_button_labels[0]); - AB->addWidget(kb_buttons[0]); - AB->addWidget(n64_button_labels[1]); - AB->addWidget(kb_buttons[1]); - mainLayout->addLayout(AB); - ZStart->addWidget(n64_button_labels[2]); - ZStart->addWidget(kb_buttons[2]); - ZStart->addWidget(n64_button_labels[3]); - ZStart->addWidget(kb_buttons[3]); - mainLayout->addLayout(ZStart); - LR->addWidget(n64_button_labels[4]); - LR->addWidget(kb_buttons[4]); - LR->addWidget(n64_button_labels[5]); - LR->addWidget(kb_buttons[5]); - mainLayout->addLayout(LR); - DupDdown->addWidget(n64_button_labels[6]); - DupDdown->addWidget(kb_buttons[6]); - DupDdown->addWidget(n64_button_labels[7]); - DupDdown->addWidget(kb_buttons[7]); - mainLayout->addLayout(DupDdown); - DleftDright->addWidget(n64_button_labels[8]); - DleftDright->addWidget(kb_buttons[8]); - DleftDright->addWidget(n64_button_labels[9]); - DleftDright->addWidget(kb_buttons[9]); - mainLayout->addLayout(DleftDright); - CupCdown->addWidget(n64_button_labels[10]); - CupCdown->addWidget(kb_buttons[10]); - CupCdown->addWidget(n64_button_labels[11]); - CupCdown->addWidget(kb_buttons[11]); - mainLayout->addLayout(CupCdown); - CleftCright->addWidget(n64_button_labels[12]); - CleftCright->addWidget(kb_buttons[12]); - CleftCright->addWidget(n64_button_labels[13]); - CleftCright->addWidget(kb_buttons[13]); - mainLayout->addLayout(CleftCright); - AupAdown->addWidget(n64_button_labels[14]); - AupAdown->addWidget(kb_buttons[14]); - AupAdown->addWidget(n64_button_labels[15]); - AupAdown->addWidget(kb_buttons[15]); - mainLayout->addLayout(AupAdown); - AleftAright->addWidget(n64_button_labels[16]); - AleftAright->addWidget(kb_buttons[16]); - AleftAright->addWidget(n64_button_labels[17]); - AleftAright->addWidget(kb_buttons[17]); - mainLayout->addLayout(AleftAright); + AB->addWidget(n64_button_labels[0].get()); + AB->addWidget(kb_buttons[0].get()); + AB->addWidget(n64_button_labels[1].get()); + AB->addWidget(kb_buttons[1].get()); + mainLayout->addLayout(AB.get()); + ZStart->addWidget(n64_button_labels[2].get()); + ZStart->addWidget(kb_buttons[2].get()); + ZStart->addWidget(n64_button_labels[3].get()); + ZStart->addWidget(kb_buttons[3].get()); + mainLayout->addLayout(ZStart.get()); + LR->addWidget(n64_button_labels[4].get()); + LR->addWidget(kb_buttons[4].get()); + LR->addWidget(n64_button_labels[5].get()); + LR->addWidget(kb_buttons[5].get()); + mainLayout->addLayout(LR.get()); + DupDdown->addWidget(n64_button_labels[6].get()); + DupDdown->addWidget(kb_buttons[6].get()); + DupDdown->addWidget(n64_button_labels[7].get()); + DupDdown->addWidget(kb_buttons[7].get()); + mainLayout->addLayout(DupDdown.get()); + DleftDright->addWidget(n64_button_labels[8].get()); + DleftDright->addWidget(kb_buttons[8].get()); + DleftDright->addWidget(n64_button_labels[9].get()); + DleftDright->addWidget(kb_buttons[9].get()); + mainLayout->addLayout(DleftDright.get()); + CupCdown->addWidget(n64_button_labels[10].get()); + CupCdown->addWidget(kb_buttons[10].get()); + CupCdown->addWidget(n64_button_labels[11].get()); + CupCdown->addWidget(kb_buttons[11].get()); + mainLayout->addLayout(CupCdown.get()); + CleftCright->addWidget(n64_button_labels[12].get()); + CleftCright->addWidget(kb_buttons[12].get()); + CleftCright->addWidget(n64_button_labels[13].get()); + CleftCright->addWidget(kb_buttons[13].get()); + mainLayout->addLayout(CleftCright.get()); + AupAdown->addWidget(n64_button_labels[14].get()); + AupAdown->addWidget(kb_buttons[14].get()); + AupAdown->addWidget(n64_button_labels[15].get()); + AupAdown->addWidget(kb_buttons[15].get()); + mainLayout->addLayout(AupAdown.get()); + AleftAright->addWidget(n64_button_labels[16].get()); + AleftAright->addWidget(kb_buttons[16].get()); + AleftAright->addWidget(n64_button_labels[17].get()); + AleftAright->addWidget(kb_buttons[17].get()); + mainLayout->addLayout(AleftAright.get()); mainLayout->addStretch(); - setLayout(mainLayout); + setLayout(mainLayout.get()); } @@ -140,7 +127,7 @@ void InputSettings::keyPressEvent(QKeyEvent *e) { kb_buttons[which_grabbing]->setText(k); grabbing = false; which_grabbing = -1; - for (auto kb_button : kb_buttons) { + for (auto& kb_button : kb_buttons) { kb_button->setEnabled(true); } releaseKeyboard(); diff --git a/src/frontend/InputSettings.hpp b/src/frontend/InputSettings.hpp index 3aa21e16..9a23e6fe 100644 --- a/src/frontend/InputSettings.hpp +++ b/src/frontend/InputSettings.hpp @@ -3,12 +3,25 @@ #include #include #include +#include +#include class InputSettings : public QWidget { bool grabbing = false; int which_grabbing = -1; - QPushButton *kb_buttons[18]; - QLabel *n64_button_labels[18]; + + std::unique_ptr AB = std::make_unique(); + std::unique_ptr ZStart = std::make_unique(); + std::unique_ptr LR = std::make_unique(); + std::unique_ptr DupDdown = std::make_unique(); + std::unique_ptr DleftDright = std::make_unique(); + std::unique_ptr CupCdown = std::make_unique(); + std::unique_ptr CleftCright = std::make_unique(); + std::unique_ptr AupAdown = std::make_unique(); + std::unique_ptr AleftAright = std::make_unique(); + std::unique_ptr mainLayout = std::make_unique(); + std::array, 18> kb_buttons; + std::array, 18> n64_button_labels; Q_OBJECT public: InputSettings(nlohmann::json &); diff --git a/src/frontend/MainWindow.cpp b/src/frontend/MainWindow.cpp index 6867cbb3..d5d54070 100644 --- a/src/frontend/MainWindow.cpp +++ b/src/frontend/MainWindow.cpp @@ -1,74 +1,67 @@ #include -#include -#include -#include -#include -#include -#include -#include MainWindow::MainWindow() noexcept { if (objectName().isEmpty()) setObjectName("MainWindow"); resize(800, 646); - actionOpenDebuggerWindow = new QAction(this); + actionOpenDebuggerWindow = std::make_unique(this); actionOpenDebuggerWindow->setObjectName("actionOpenDebuggerWindow"); - actionAbout = new QAction(this); + actionAbout = std::make_unique(this); actionAbout->setObjectName("actionAbout"); - actionOpen = new QAction(this); + actionOpen = std::make_unique(this); actionOpen->setObjectName("actionOpen"); - actionExit = new QAction(this); + actionExit = std::make_unique(this); actionExit->setObjectName("actionExit"); - actionPause = new QAction(this); + actionPause = std::make_unique(this); actionPause->setObjectName("actionPause"); - actionReset = new QAction(this); + actionReset = std::make_unique(this); actionReset->setObjectName("actionReset"); - actionStop = new QAction(this); + actionStop = std::make_unique(this); actionStop->setObjectName("actionStop"); - actionSettings = new QAction(this); + actionSettings = std::make_unique(this); actionSettings->setObjectName("actionSettings"); - centralwidget = new QWidget(this); + centralwidget = std::make_unique(this); centralwidget->setObjectName("centralwidget"); - verticalLayout = new QVBoxLayout; + verticalLayout = std::make_unique(); verticalLayout->setSpacing(0); verticalLayout->setObjectName("verticalLayout"); verticalLayout->setContentsMargins(0, 0, 0, 0); - vulkanWidget = new RenderWidget; + vulkanWidget = std::make_unique(); vulkanWidget->setObjectName("vulkanWidget"); - verticalLayout->addWidget(vulkanWidget); + verticalLayout->addWidget(vulkanWidget.get()); - centralwidget->setLayout(verticalLayout); + centralwidget->setLayout(verticalLayout.get()); - setCentralWidget(centralwidget); - menubar = new QMenuBar(this); + setCentralWidget(centralwidget.get()); + menubar = std::make_unique(this); menubar->setObjectName("menubar"); menubar->setGeometry(QRect(0, 0, 800, 22)); - menuFile = new QMenu(menubar); + menuFile = std::make_unique(menubar.get()); menuFile->setObjectName("menuFile"); - menuEmulation = new QMenu(menubar); + menuEmulation = std::make_unique(menubar.get()); menuEmulation->setObjectName("menuEmulation"); - menuTools = new QMenu(menubar); + menuTools = std::make_unique(menubar.get()); menuTools->setObjectName("menuTools"); - menuAbout = new QMenu(menubar); + menuAbout = std::make_unique(menubar.get()); menuAbout->setObjectName("menuAbout"); - setMenuBar(menubar); - statusbar = new QStatusBar(this); + setMenuBar(menubar.get()); + statusbar = std::make_unique(this); statusbar->setObjectName("statusbar"); - setStatusBar(statusbar); + setStatusBar(statusbar.get()); menubar->addAction(menuFile->menuAction()); menubar->addAction(menuEmulation->menuAction()); menubar->addAction(menuTools->menuAction()); menubar->addAction(menuAbout->menuAction()); - menuFile->addAction(actionOpen); - menuFile->addAction(actionExit); - menuEmulation->addAction(actionSettings); - menuEmulation->addAction(actionPause); - menuEmulation->addAction(actionReset); - menuEmulation->addAction(actionStop); - menuTools->addAction(actionOpenDebuggerWindow); - menuAbout->addAction(actionAbout); + menuFile->addAction(actionOpen.get()); + menuFile->addAction(actionExit.get()); + menuEmulation->addAction(actionSettings.get()); + menuEmulation->addAction(actionPause.get()); + menuEmulation->addAction(actionReset.get()); + menuEmulation->addAction(actionStop.get()); + menuTools->addAction(actionOpenDebuggerWindow.get()); + menuAbout->addAction(actionAbout.get()); Retranslate(); @@ -109,7 +102,7 @@ void MainWindow::Retranslate() { } // retranslateUi void MainWindow::ConnectSignalsToSlots() noexcept { - connect(actionOpen, &QAction::triggered, this, [this]() { + connect(actionOpen.get(), &QAction::triggered, this, [this]() { QString file_name = QFileDialog::getOpenFileName( this, "Nintendo 64 executable", QString(), "All supported types (*.zip *.ZIP *.7z *.7Z *.rar *.RAR *.tar *.TAR *.n64 *.N64 *.v64 *.V64 *.z64 *.Z64)"); @@ -120,13 +113,13 @@ void MainWindow::ConnectSignalsToSlots() noexcept { } }); - connect(actionExit, &QAction::triggered, this, [this]() { emit Exit(); }); + connect(actionExit.get(), &QAction::triggered, this, [this]() { emit Exit(); }); connect(this, &MainWindow::destroyed, this, [this]() { emit Exit(); }); - connect(actionReset, &QAction::triggered, this, [this]() { emit Reset(); }); + connect(actionReset.get(), &QAction::triggered, this, [this]() { emit Reset(); }); - connect(actionStop, &QAction::triggered, this, [this]() { + connect(actionStop.get(), &QAction::triggered, this, [this]() { vulkanWidget->hide(); actionPause->setDisabled(true); actionReset->setDisabled(true); @@ -134,13 +127,13 @@ void MainWindow::ConnectSignalsToSlots() noexcept { emit Stop(); }); - connect(actionPause, &QAction::triggered, this, [this]() { + connect(actionPause.get(), &QAction::triggered, this, [this]() { textPauseToggle = !textPauseToggle; actionPause->setText(textPauseToggle ? "Resume" : "Pause"); emit Pause(); }); - connect(actionAbout, &QAction::triggered, this, [this]() { + connect(actionAbout.get(), &QAction::triggered, this, [this]() { QMessageBox::about(this, tr("About Kaizen"), tr("Kaizen is a Nintendo 64 emulator that strives to offer a friendly user " "experience and great compatibility.\n" @@ -148,6 +141,6 @@ void MainWindow::ConnectSignalsToSlots() noexcept { "Nintendo 64 is a registered trademarks of Nintendo Co., Ltd.")); }); - connect(actionSettings, &QAction::triggered, this, [this]() { emit OpenSettings(); }); - connect(actionOpenDebuggerWindow, &QAction::triggered, this, [this]() { emit OpenDebugger(); }); + connect(actionSettings.get(), &QAction::triggered, this, [this]() { emit OpenSettings(); }); + connect(actionOpenDebuggerWindow.get(), &QAction::triggered, this, [this]() { emit OpenDebugger(); }); } diff --git a/src/frontend/MainWindow.hpp b/src/frontend/MainWindow.hpp index 0c65895b..b821de25 100644 --- a/src/frontend/MainWindow.hpp +++ b/src/frontend/MainWindow.hpp @@ -2,6 +2,13 @@ #include #include #include +#include +#include +#include +#include +#include +#include +#include #include #include @@ -11,23 +18,23 @@ class MainWindow : public QMainWindow { public: MainWindow() noexcept; - QAction *actionOpenDebuggerWindow; - QAction *actionAbout; - QAction *actionOpen; - QAction *actionExit; - QAction *actionPause; - QAction *actionReset; - QAction *actionStop; - QAction *actionSettings; - QWidget *centralwidget; - QVBoxLayout *verticalLayout; - RenderWidget *vulkanWidget; - QMenuBar *menubar; - QMenu *menuFile; - QMenu *menuEmulation; - QMenu *menuTools; - QMenu *menuAbout; - QStatusBar *statusbar; + std::unique_ptr actionOpenDebuggerWindow{}; + std::unique_ptr actionAbout{}; + std::unique_ptr actionOpen{}; + std::unique_ptr actionExit{}; + std::unique_ptr actionPause{}; + std::unique_ptr actionReset{}; + std::unique_ptr actionStop{}; + std::unique_ptr actionSettings{}; + std::unique_ptr centralwidget{}; + std::unique_ptr verticalLayout{}; + std::unique_ptr vulkanWidget{}; + std::unique_ptr menubar{}; + std::unique_ptr menuFile{}; + std::unique_ptr menuEmulation{}; + std::unique_ptr menuTools{}; + std::unique_ptr menuAbout{}; + std::unique_ptr statusbar{}; private: void Retranslate(); diff --git a/src/frontend/RenderWidget.hpp b/src/frontend/RenderWidget.hpp index 1fb5b772..ecdd50f0 100644 --- a/src/frontend/RenderWidget.hpp +++ b/src/frontend/RenderWidget.hpp @@ -29,18 +29,18 @@ struct QtInstanceFactory : Vulkan::InstanceFactory { class QtParallelRdpWindowInfo : public ParallelRDP::WindowInfo { public: - explicit QtParallelRdpWindowInfo(QWindow *window) : window(window) {} + explicit QtParallelRdpWindowInfo(QWindow* window) : window(window) {} CoordinatePair get_window_size() override { return CoordinatePair{static_cast(window->width()), static_cast(window->height())}; } private: - QWindow *window; + std::shared_ptr window{}; }; class QtWSIPlatform final : public Vulkan::WSIPlatform { public: - explicit QtWSIPlatform(QWindow *window) : window(window) {} + explicit QtWSIPlatform(QWindow* window) : window(window) {} std::vector get_instance_extensions() override { auto vec = std::vector(); @@ -53,7 +53,7 @@ public: } VkSurfaceKHR create_surface(VkInstance, VkPhysicalDevice) override { - return QVulkanInstance::surfaceForWindow(window); + return QVulkanInstance::surfaceForWindow(window.get()); } void destroy_surface(VkInstance, VkSurfaceKHR) override {} @@ -73,7 +73,7 @@ public: VkApplicationInfo appInfo{.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, .apiVersion = VK_API_VERSION_1_3}; - QWindow *window; + std::shared_ptr window{}; }; class RenderWidget : public QWidget { diff --git a/src/frontend/SettingsWindow.cpp b/src/frontend/SettingsWindow.cpp index 2d62a9df..f2094a9a 100644 --- a/src/frontend/SettingsWindow.cpp +++ b/src/frontend/SettingsWindow.cpp @@ -1,7 +1,3 @@ -#include -#include -#include -#include #include #include @@ -18,47 +14,43 @@ SettingsWindow::SettingsWindow() : QWidget(nullptr) { resize(500, 400); setWindowTitle("Settings"); - cpuSettings = new CPUSettings(settings); - audioSettings = new AudioSettings(settings); - inputSettings = new InputSettings(settings); - generalSettings = new QWidget; + cpuSettings = std::make_unique(settings); + audioSettings = std::make_unique(settings); + inputSettings = std::make_unique(settings); + generalSettings = std::make_unique(); keyMap = inputSettings->GetMappedKeys(); - folderLabelPrefix = new QLabel("Save files' path: "); - folderLabel = new QLabel(fmt::format("{}", savePath).c_str()); + folderLabel = std::make_unique(fmt::format("{}", savePath).c_str()); - connect(folderBtn, &QPushButton::pressed, this, [&]() { + connect(folderBtn.get(), &QPushButton::pressed, this, [&]() { savePath = QFileDialog::getExistingDirectory(this, tr("Select directory")).toStdString(); folderLabel->setText(fmt::format("{}", savePath).c_str()); JSONSetField(settings, "general", "savePath", savePath); apply->setEnabled(true); }); - auto generalLayout = new QHBoxLayout; - auto generalLayoutV = new QVBoxLayout; - generalLayout->addWidget(folderLabelPrefix); - generalLayout->addWidget(folderLabel); + generalLayout->addWidget(folderLabelPrefix.get()); + generalLayout->addWidget(folderLabel.get()); generalLayout->addStretch(); - generalLayout->addWidget(folderBtn); - generalLayoutV->addLayout(generalLayout); + generalLayout->addWidget(folderBtn.get()); + generalLayoutV->addLayout(generalLayout.get()); generalLayoutV->addStretch(); - generalSettings->setLayout(generalLayoutV); + generalSettings->setLayout(generalLayoutV.get()); - auto *tabs = new QTabWidget; - tabs->addTab(generalSettings, tr("General")); - tabs->addTab(cpuSettings, tr("CPU")); - tabs->addTab(audioSettings, tr("Audio")); - tabs->addTab(inputSettings, tr("Input")); + tabs->addTab(generalSettings.get(), tr("General")); + tabs->addTab(cpuSettings.get(), tr("CPU")); + tabs->addTab(audioSettings.get(), tr("Audio")); + tabs->addTab(inputSettings.get(), tr("Input")); apply->setEnabled(false); - connect(cpuSettings, &CPUSettings::modified, this, [&]() { apply->setEnabled(true); }); + connect(cpuSettings.get(), &CPUSettings::modified, this, [&]() { apply->setEnabled(true); }); - connect(audioSettings, &AudioSettings::modified, this, [&]() { apply->setEnabled(true); }); + connect(audioSettings.get(), &AudioSettings::modified, this, [&]() { apply->setEnabled(true); }); - connect(inputSettings, &InputSettings::modified, this, [&]() { apply->setEnabled(true); }); + connect(inputSettings.get(), &InputSettings::modified, this, [&]() { apply->setEnabled(true); }); - connect(apply, &QPushButton::pressed, this, [&]() { + connect(apply.get(), &QPushButton::pressed, this, [&]() { auto newMap = inputSettings->GetMappedKeys(); if (!std::equal(keyMap.begin(), keyMap.end(), newMap.begin(), newMap.end())) { keyMap = newMap; @@ -70,13 +62,11 @@ SettingsWindow::SettingsWindow() : QWidget(nullptr) { file.close(); }); - connect(cancel, &QPushButton::pressed, this, &QWidget::hide); + connect(cancel.get(), &QPushButton::pressed, this, &QWidget::hide); - QVBoxLayout *mainLayout = new QVBoxLayout; - QHBoxLayout *buttonsLayout = new QHBoxLayout; - buttonsLayout->addWidget(apply); - buttonsLayout->addWidget(cancel); - mainLayout->addWidget(tabs); - mainLayout->addLayout(buttonsLayout); - setLayout(mainLayout); + buttonsLayout->addWidget(apply.get()); + buttonsLayout->addWidget(cancel.get()); + mainLayout->addWidget(tabs.get()); + mainLayout->addLayout(buttonsLayout.get()); + setLayout(mainLayout.get()); } diff --git a/src/frontend/SettingsWindow.hpp b/src/frontend/SettingsWindow.hpp index 27a640c1..3969ca35 100644 --- a/src/frontend/SettingsWindow.hpp +++ b/src/frontend/SettingsWindow.hpp @@ -6,14 +6,23 @@ #include #include #include +#include +#include +#include +#include class SettingsWindow : public QWidget { - QPushButton *cancel = new QPushButton("Cancel"); - QPushButton *apply = new QPushButton("Apply"); - QFileIconProvider *iconProv = new QFileIconProvider; - QPushButton *folderBtn = new QPushButton(iconProv->icon(QFileIconProvider::Folder), ""); - QLabel *folderLabelPrefix; - QLabel *folderLabel; + std::unique_ptr cancel = std::make_unique("Cancel"); + std::unique_ptr apply = std::make_unique("Apply"); + std::unique_ptr iconProv = std::make_unique(); + std::unique_ptr folderBtn = std::make_unique(iconProv->icon(QFileIconProvider::Folder), ""); + std::unique_ptr folderLabelPrefix = std::make_unique("Save files' path: "); + std::unique_ptr folderLabel; + std::unique_ptr generalLayout = std::make_unique(); + std::unique_ptr generalLayoutV = std::make_unique(); + std::unique_ptr tabs = std::make_unique(); + std::unique_ptr mainLayout = std::make_unique(); + std::unique_ptr buttonsLayout = std::make_unique(); Q_OBJECT public: float getVolumeL() { return float(audioSettings->volumeL->value()) / 100.f; } @@ -21,10 +30,10 @@ public: std::array keyMap{}; SettingsWindow(); nlohmann::json settings; - CPUSettings *cpuSettings; - AudioSettings *audioSettings; - InputSettings *inputSettings; - QWidget *generalSettings; + std::unique_ptr cpuSettings{}; + std::unique_ptr audioSettings{}; + std::unique_ptr inputSettings{}; + std::unique_ptr generalSettings{}; Q_SIGNALS: void regrabKeyboard(); };