From f0835e93d8a41193b226633754f28978748ca05e Mon Sep 17 00:00:00 2001 From: Putta Khunchalee Date: Sat, 30 Nov 2024 23:48:20 +0700 Subject: [PATCH] Initializes firmware installation popup (#1150) --- gui/CMakeLists.txt | 1 - gui/cpu_settings.cpp | 107 ---------------------- gui/cpu_settings.hpp | 19 ---- gui/launch_settings.cpp | 11 --- gui/launch_settings.hpp | 4 - gui/resources.qrc | 2 - gui/resources/fallbackicon0.png | Bin 35147 -> 0 bytes gui/src/setup/mod.rs | 28 +++--- gui/{resources => ui/main}/cpu-64-bit.svg | 0 gui/ui/main/{tabs => }/cpu.slint | 0 gui/ui/main/{tabs => }/display.slint | 0 gui/ui/main/tabs.slint | 13 +-- gui/ui/setup.slint | 68 ++++++-------- gui/ui/setup/firmware.slint | 27 +++++- gui/ui/setup/nav.slint | 33 +++++++ 15 files changed, 107 insertions(+), 206 deletions(-) delete mode 100644 gui/cpu_settings.cpp delete mode 100644 gui/cpu_settings.hpp delete mode 100644 gui/resources/fallbackicon0.png rename gui/{resources => ui/main}/cpu-64-bit.svg (100%) rename gui/ui/main/{tabs => }/cpu.slint (100%) rename gui/ui/main/{tabs => }/display.slint (100%) create mode 100644 gui/ui/setup/nav.slint diff --git a/gui/CMakeLists.txt b/gui/CMakeLists.txt index 5973d2609..4e18fed09 100644 --- a/gui/CMakeLists.txt +++ b/gui/CMakeLists.txt @@ -9,7 +9,6 @@ endif() # Setup GUI. add_executable(obliteration WIN32 MACOSX_BUNDLE app_data.cpp - cpu_settings.cpp display_settings.cpp initialize_wizard.cpp launch_settings.cpp diff --git a/gui/cpu_settings.cpp b/gui/cpu_settings.cpp deleted file mode 100644 index a19a7e12c..000000000 --- a/gui/cpu_settings.cpp +++ /dev/null @@ -1,107 +0,0 @@ -#include "cpu_settings.hpp" - -#include -#include -#include -#include -#include -#include -#include - -CpuSettings::CpuSettings(QWidget *parent) : - QWidget(parent), - m_debugAddr(nullptr) -{ - auto layout = new QGridLayout(); - - layout->addWidget(buildCount(), 0, 0); - layout->addWidget(buildDebug(), 0, 1); - layout->setRowStretch(1, 1); - - setLayout(layout); -} - -CpuSettings::~CpuSettings() -{ -} - -QWidget *CpuSettings::buildCount() -{ - auto group = new QGroupBox("Count"); - auto layout = new QGridLayout(); - - // Slider. - auto slider = new QSlider(Qt::Horizontal); - - slider->setTickInterval(1); - slider->setTickPosition(QSlider::TicksAbove); - slider->setRange(1, 16); - slider->setValue(8); - - layout->addWidget(slider, 0, 0); - - // Value. - auto value = new QLabel("8"); - - connect(slider, &QAbstractSlider::valueChanged, value, qOverload(&QLabel::setNum)); - - layout->addWidget(value, 0, 1); - - // Description. - auto desc = new QLabel("Changing this value to other than 8 may crash the game."); - - desc->setWordWrap(true); - - layout->addWidget(desc, 1, 0, 1, -1); - - group->setLayout(layout); - - return group; -} - -QWidget *CpuSettings::buildDebug() -{ - auto group = new QGroupBox("Debug"); - auto layout = new QGridLayout(); - - // Address label. - auto label = new QLabel("Listen address:"); - - layout->addWidget(label, 0, 0); - - // Address editor. - m_debugAddr = new QLineEdit("127.0.0.1:1234"); - - label->setBuddy(m_debugAddr); - - layout->addWidget(m_debugAddr, 0, 1); - - // Start. - auto start = new QPushButton("Start"); - - connect(start, &QAbstractButton::clicked, [this] { - auto addr = m_debugAddr->text(); - - if (addr.isEmpty()) { - QMessageBox::critical(this, "Error", "Listen address cannot be empty."); - return; - } - - emit debugClicked(addr); - }); - - layout->addWidget(start, 0, 2); - - // Description. - auto desc = new QLabel( - "Specify a TCP address to listen for a debugger. The kernel will wait for a debugger to " - "connect before start."); - - desc->setWordWrap(true); - - layout->addWidget(desc, 1, 0, 1, -1); - - group->setLayout(layout); - - return group; -} diff --git a/gui/cpu_settings.hpp b/gui/cpu_settings.hpp deleted file mode 100644 index bbe96d027..000000000 --- a/gui/cpu_settings.hpp +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once - -#include - -class QLineEdit; - -class CpuSettings final : public QWidget { - Q_OBJECT -public: - CpuSettings(QWidget *parent = nullptr); - ~CpuSettings() override; -signals: - void debugClicked(const QString &addr); -private: - QWidget *buildCount(); - QWidget *buildDebug(); - - QLineEdit *m_debugAddr; -}; diff --git a/gui/launch_settings.cpp b/gui/launch_settings.cpp index d3907aac6..32f3f719a 100644 --- a/gui/launch_settings.cpp +++ b/gui/launch_settings.cpp @@ -1,5 +1,4 @@ #include "launch_settings.hpp" -#include "cpu_settings.hpp" #include "display_settings.hpp" #include "resources.hpp" @@ -26,7 +25,6 @@ LaunchSettings::LaunchSettings( #endif QWidget(parent), m_display(nullptr), - m_cpu(nullptr), m_profiles(nullptr) { auto layout = new QVBoxLayout(); @@ -71,15 +69,6 @@ QWidget *LaunchSettings::buildSettings(QList &&vkDevices) tab->addTab(m_display, loadIcon(":/resources/monitor.svg", iconSize), "Display"); - // CPU settings. - m_cpu = new CpuSettings(); - - connect(m_cpu, &CpuSettings::debugClicked, [this](const QString &addr) { - emit startClicked(addr); - }); - - tab->addTab(m_cpu, loadIcon(":/resources/cpu-64-bit.svg", iconSize), "CPU"); - return tab; } diff --git a/gui/launch_settings.hpp b/gui/launch_settings.hpp index 0d8da1299..b1252b251 100644 --- a/gui/launch_settings.hpp +++ b/gui/launch_settings.hpp @@ -6,13 +6,10 @@ #endif #include -class CpuSettings; #ifndef __APPLE__ class DisplayDevice; #endif class DisplaySettings; -class GameListModel; -class ProfileList; class QComboBox; class QLayout; class QTableView; @@ -43,6 +40,5 @@ class LaunchSettings final : public QWidget { QLayout *buildActions(); DisplaySettings *m_display; - CpuSettings *m_cpu; QComboBox *m_profiles; }; diff --git a/gui/resources.qrc b/gui/resources.qrc index 87934eb21..7475c97f7 100644 --- a/gui/resources.qrc +++ b/gui/resources.qrc @@ -2,8 +2,6 @@ resources/content-save.svg - resources/cpu-64-bit.svg - resources/fallbackicon0.png resources/monitor.svg resources/obliteration-icon.png resources/play.svg diff --git a/gui/resources/fallbackicon0.png b/gui/resources/fallbackicon0.png deleted file mode 100644 index 0841196eaff6bd2a4024c55338b164c8d0c7a082..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35147 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 Result { // TODO: Check if already configured and skip wizard. let win = SetupWizard::new().map_err(SetupError::CreateWindow)?; - let cancel = Rc::new(Cell::new(false)); + let finish = Rc::new(Cell::new(false)); win.on_cancel({ let win = win.as_weak(); - let cancel = cancel.clone(); - move || { - win.unwrap().hide().unwrap(); - cancel.set(true); - } + move || win.unwrap().hide().unwrap() }); - win.window().on_close_requested({ + win.on_browse_firmware({ let win = win.as_weak(); - let cancel = cancel.clone(); move || { - win.unwrap().hide().unwrap(); - cancel.set(true); - - CloseRequestResponse::HideWindow + slint::spawn_local(browse_firmware(win.unwrap())).unwrap(); } }); - win.on_browse_firmware({ + win.on_finish({ let win = win.as_weak(); + let finish = finish.clone(); move || { - slint::spawn_local(browse_firmware(win.unwrap())).unwrap(); + win.unwrap().hide().unwrap(); + finish.set(true); } }); @@ -46,9 +40,9 @@ pub fn run_setup() -> Result { drop(win); // Extract GUI states. - let cancel = Rc::into_inner(cancel).unwrap().into_inner(); + let finish = Rc::into_inner(finish).unwrap().into_inner(); - Ok(!cancel) + Ok(finish) } async fn browse_firmware(win: SetupWizard) { diff --git a/gui/resources/cpu-64-bit.svg b/gui/ui/main/cpu-64-bit.svg similarity index 100% rename from gui/resources/cpu-64-bit.svg rename to gui/ui/main/cpu-64-bit.svg diff --git a/gui/ui/main/tabs/cpu.slint b/gui/ui/main/cpu.slint similarity index 100% rename from gui/ui/main/tabs/cpu.slint rename to gui/ui/main/cpu.slint diff --git a/gui/ui/main/tabs/display.slint b/gui/ui/main/display.slint similarity index 100% rename from gui/ui/main/tabs/display.slint rename to gui/ui/main/display.slint diff --git a/gui/ui/main/tabs.slint b/gui/ui/main/tabs.slint index b4fd0f2e0..9376b23d8 100644 --- a/gui/ui/main/tabs.slint +++ b/gui/ui/main/tabs.slint @@ -1,6 +1,6 @@ import { Button, HorizontalBox, VerticalBox } from "std-widgets.slint"; -import { DisplayTab } from "tabs/display.slint"; -import { CpuTab } from "tabs/cpu.slint"; +import { DisplayTab } from "display.slint"; +import { CpuTab } from "cpu.slint"; import { Menu } from "menu.slint"; enum Tab { @@ -10,10 +10,10 @@ enum Tab { } export component Tabs { - property tab: Tab.Display; - in property <[string]> devices; + private property tab: Tab.Display; + VerticalBox { padding: 0; @@ -40,9 +40,10 @@ export component Tabs { Button { text: "CPU"; - icon: @image-url("../../resources/cpu-64-bit.svg"); - horizontal-stretch: 1; + icon: @image-url("cpu-64-bit.svg"); + colorize-icon: true; primary: root.tab == Tab.Cpu; + horizontal-stretch: 1; clicked => { root.tab = Tab.Cpu } diff --git a/gui/ui/setup.slint b/gui/ui/setup.slint index f33a7571f..50133c104 100644 --- a/gui/ui/setup.slint +++ b/gui/ui/setup.slint @@ -1,7 +1,8 @@ -import { HorizontalBox, Button, Palette, StandardButton } from "std-widgets.slint"; import { Intro } from "setup/intro.slint"; -import { Firmware } from "setup/firmware.slint"; +import { Firmware, InstallFirmware } from "setup/firmware.slint"; import { Conclusion } from "setup/conclusion.slint"; +import { NavBar } from "setup/nav.slint"; +import { Palette } from "std-widgets.slint"; // https://github.com/slint-ui/slint/issues/6880 enum WizardPage { @@ -13,20 +14,20 @@ enum WizardPage { export component SetupWizard inherits Window { title: "Setup Obliteration"; icon: @image-url("icon.png"); - min-width: 500px; - min-height: 400px; - preferred-width: 500px; // Force word-wrap instead of expand the window. + width: 500px; // PopupWindow does not resize with the window somehow. + height: 400px; // Same here. in-out property firmware-dump; - pure callback cancel(); + pure callback cancel <=> nav.cancel; pure callback browse-firmware(); + pure callback finish(); private property page: WizardPage.Intro; states [ finished when page == WizardPage.Conclusion: { - next.text: "Finish"; + nav.next-text: "Finish"; } ] @@ -48,40 +49,31 @@ export component SetupWizard inherits Window { vertical-stretch: 1; } - Rectangle { - background: Palette.alternate-background; - - HorizontalBox { - alignment: end; - - Button { - text: "< Back"; - enabled: root.page != WizardPage.Intro && root.page != WizardPage.Conclusion; - clicked => { - if root.page == WizardPage.Firmware { - root.page = WizardPage.Intro; - } - } - } - - next := Button { - text: "Next >"; - clicked => { - if root.page == WizardPage.Intro { - root.page = WizardPage.Firmware; - } else if root.page == WizardPage.Firmware { - root.page = WizardPage.Conclusion; - } - } + nav := NavBar { + back-text: "< Back"; + back-enabled: root.page != WizardPage.Intro && root.page != WizardPage.Conclusion; + next-text: "Next >"; + back-clicked => { + if root.page == WizardPage.Firmware { + root.page = WizardPage.Intro; } - - StandardButton { - kind: StandardButtonKind.cancel; - clicked => { - cancel(); - } + } + next-clicked => { + if root.page == WizardPage.Intro { + root.page = WizardPage.Firmware; + } else if root.page == WizardPage.Firmware { + install-firmware.show(); + } else if root.page == WizardPage.Conclusion { + finish(); } } } } + + install-firmware := InstallFirmware { + x: 10px; + y: 150px; + width: parent.width - 20px; + height: parent.height - 300px; + } } diff --git a/gui/ui/setup/firmware.slint b/gui/ui/setup/firmware.slint index 416e64430..9749fb12e 100644 --- a/gui/ui/setup/firmware.slint +++ b/gui/ui/setup/firmware.slint @@ -1,4 +1,4 @@ -import { VerticalBox, HorizontalBox, LineEdit, Button } from "std-widgets.slint"; +import { VerticalBox, HorizontalBox, LineEdit, Button, Palette, ProgressIndicator } from "std-widgets.slint"; import { Header } from "header.slint"; export component Firmware { @@ -33,3 +33,28 @@ export component Firmware { Rectangle { } } } + +export component InstallFirmware inherits PopupWindow { + close-on-click: false; + + Rectangle { + background: Palette.alternate-background; + border-color: Palette.border; + border-width: 1px; + + VerticalBox { + alignment: center; + + Text { + text: "Installing firmware..."; + horizontal-alignment: center; + } + + ProgressIndicator { } + + Text { + horizontal-alignment: center; + } + } + } +} diff --git a/gui/ui/setup/nav.slint b/gui/ui/setup/nav.slint new file mode 100644 index 000000000..a69dc1fa5 --- /dev/null +++ b/gui/ui/setup/nav.slint @@ -0,0 +1,33 @@ +import { HorizontalBox, Button, StandardButton, Palette } from "std-widgets.slint"; + +export component NavBar inherits Rectangle { + in property back-text; + in property back-enabled; + in property next-text; + + callback back-clicked <=> back.clicked; + callback next-clicked <=> next.clicked; + pure callback cancel(); + + background: Palette.alternate-background; + + HorizontalBox { + alignment: end; + + back := Button { + text: root.back-text; + enabled: root.back-enabled; + } + + next := Button { + text: root.next-text; + } + + StandardButton { + kind: StandardButtonKind.cancel; + clicked => { + cancel(); + } + } + } +}