diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e7c7baa3b..445d17040 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,5 +1,5 @@ # External dependencies. -find_package(Qt6 COMPONENTS Widgets REQUIRED) +find_package(Qt6 REQUIRED COMPONENTS Svg Widgets) find_package(Threads REQUIRED) if(WIN32 OR (UNIX AND NOT APPLE)) find_package(Vulkan REQUIRED) @@ -58,6 +58,7 @@ add_executable(obliteration WIN32 MACOSX_BUNDLE ansi_escape.cpp app_data.cpp core.cpp + cpu_settings.cpp display_settings.cpp game_graphic_settings.cpp game_models.cpp @@ -109,7 +110,7 @@ endif() target_compile_features(obliteration PRIVATE cxx_std_17) -target_link_libraries(obliteration PRIVATE Qt6::Widgets) +target_link_libraries(obliteration PRIVATE Qt6::Svg Qt6::Widgets) target_link_libraries(obliteration PRIVATE Threads::Threads) target_link_libraries(obliteration PRIVATE ${LIBCORE}) diff --git a/src/core/src/profile/mod.rs b/src/core/src/profile/mod.rs index 906df3d73..fbe85ce0b 100644 --- a/src/core/src/profile/mod.rs +++ b/src/core/src/profile/mod.rs @@ -4,6 +4,7 @@ use obconf::Config; use serde::{Deserialize, Serialize}; use std::ffi::{c_char, CStr, CString}; use std::fs::File; +use std::num::NonZero; use std::path::Path; use std::ptr::null_mut; use std::time::SystemTime; @@ -131,7 +132,9 @@ impl Default for Profile { id: Uuid::new_v4(), name: CString::new("Default").unwrap(), display_resolution: DisplayResolution::Hd, - kernel_config: Config::default(), + kernel_config: Config { + max_cpu: NonZero::new(8).unwrap(), + }, created: SystemTime::now(), } } diff --git a/src/cpu_settings.cpp b/src/cpu_settings.cpp new file mode 100644 index 000000000..2140b836a --- /dev/null +++ b/src/cpu_settings.cpp @@ -0,0 +1,55 @@ +#include "cpu_settings.hpp" + +#include +#include +#include +#include + +CpuSettings::CpuSettings(QWidget *parent) : + QWidget(parent) +{ + auto layout = new QGridLayout(); + + layout->addWidget(buildCount(), 0, 0); + 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; +} diff --git a/src/cpu_settings.hpp b/src/cpu_settings.hpp new file mode 100644 index 000000000..476260498 --- /dev/null +++ b/src/cpu_settings.hpp @@ -0,0 +1,11 @@ +#pragma once + +#include + +class CpuSettings final : public QWidget { +public: + CpuSettings(QWidget *parent = nullptr); + ~CpuSettings() override; +private: + QWidget *buildCount(); +}; diff --git a/src/launch_settings.cpp b/src/launch_settings.cpp index f06a28fbf..5e992ddab 100644 --- a/src/launch_settings.cpp +++ b/src/launch_settings.cpp @@ -1,4 +1,5 @@ #include "launch_settings.hpp" +#include "cpu_settings.hpp" #include "display_settings.hpp" #include "game_models.hpp" #include "game_settings.hpp" @@ -31,6 +32,7 @@ LaunchSettings::LaunchSettings( #endif QWidget(parent), m_display(nullptr), + m_cpu(nullptr), m_games(nullptr), m_profiles(nullptr) { @@ -73,6 +75,7 @@ QWidget *LaunchSettings::buildSettings(GameListModel *games, QListiconSize(); // Display settings. #ifdef __APPLE__ @@ -81,7 +84,12 @@ QWidget *LaunchSettings::buildSettings(GameListModel *games, QListaddTab(m_display, loadIcon(":/resources/monitor.svg"), "Display"); + tab->addTab(m_display, loadIcon(":/resources/monitor.svg", iconSize), "Display"); + + // CPU settings. + m_cpu = new CpuSettings(); + + tab->addTab(m_cpu, loadIcon(":/resources/cpu-64-bit.svg", iconSize), "CPU"); // Game list. m_games = new QTableView(); @@ -96,7 +104,7 @@ QWidget *LaunchSettings::buildSettings(GameListModel *games, QListaddTab(m_games, loadIcon(":/resources/view-comfy.svg"), "Games"); + tab->addTab(m_games, loadIcon(":/resources/view-comfy.svg", iconSize), "Games"); return tab; } @@ -119,7 +127,9 @@ QLayout *LaunchSettings::buildActions(ProfileList *profiles) layout->addWidget(actions); // Save button. - auto save = new QPushButton(loadIcon(":/resources/content-save.svg"), "Save"); + auto save = new QPushButton("Save"); + + save->setIcon(loadIcon(":/resources/content-save.svg", save->iconSize())); connect(save, &QAbstractButton::clicked, [this]() { auto index = m_profiles->currentIndex(); @@ -134,7 +144,9 @@ QLayout *LaunchSettings::buildActions(ProfileList *profiles) actions->addButton(save, QDialogButtonBox::ApplyRole); // Start button. - auto start = new QPushButton(loadIcon(":/resources/play.svg"), "Start"); + auto start = new QPushButton("Start"); + + start->setIcon(loadIcon(":/resources/play.svg", start->iconSize())); connect(start, &QAbstractButton::clicked, [this]() { emit startClicked(); }); @@ -157,8 +169,8 @@ void LaunchSettings::requestGamesContextMenu(const QPoint &pos) // Setup menu. QMenu menu(this); - QAction openFolder(loadIcon(":/resources/folder-open-outline.svg"), "Open &Folder", this); - QAction settings(loadIcon(":/resources/cog-outline.svg"), "&Settings", this); + QAction openFolder("Open &Folder", this); + QAction settings("&Settings", this); menu.addAction(&openFolder); menu.addAction(&settings); diff --git a/src/launch_settings.hpp b/src/launch_settings.hpp index dcad04faf..fd2e10f60 100644 --- a/src/launch_settings.hpp +++ b/src/launch_settings.hpp @@ -8,6 +8,7 @@ #endif #include +class CpuSettings; class DisplaySettings; class GameListModel; class ProfileList; @@ -45,6 +46,7 @@ class LaunchSettings final : public QWidget { void profileChanged(int index); DisplaySettings *m_display; + CpuSettings *m_cpu; QTableView *m_games; QComboBox *m_profiles; }; diff --git a/src/main_window.cpp b/src/main_window.cpp index 61dc1c9ae..e0ec5b50e 100644 --- a/src/main_window.cpp +++ b/src/main_window.cpp @@ -53,11 +53,6 @@ MainWindow::MainWindow(QVulkanInstance *vulkan, QList &&vkDevi auto openSystemFolder = new QAction("Open System &Folder", this); auto quit = new QAction("&Quit", this); -#ifndef __APPLE__ - installPkg->setIcon(loadIcon(":/resources/archive-arrow-down-outline.svg")); - openSystemFolder->setIcon(loadIcon(":/resources/folder-open-outline.svg")); -#endif - connect(installPkg, &QAction::triggered, this, &MainWindow::installPkg); connect(openSystemFolder, &QAction::triggered, this, &MainWindow::openSystemFolder); connect(quit, &QAction::triggered, this, &MainWindow::close); diff --git a/src/resources.cpp b/src/resources.cpp index 778991f31..8c6d2204c 100644 --- a/src/resources.cpp +++ b/src/resources.cpp @@ -2,14 +2,26 @@ #include #include +#include #include #include +#include #include -QIcon loadIcon(const QString &fileName) +QIcon loadIcon(const QString &fileName, const QSize &size) { - QImage icon(fileName); + // Prepare to render the icon. We use the highest pixel ratio here so the icon will look sharp + // on any screen if the user have multiple monitors. + QSvgRenderer renderer(fileName); + QImage icon(size * qGuiApp->devicePixelRatio(), QImage::Format_ARGB32); + + icon.fill(0); + + // Render. + QPainter painter(&icon); + + renderer.render(&painter); if (QGuiApplication::styleHints()->colorScheme() == Qt::ColorScheme::Dark) { icon.invertPixels(); diff --git a/src/resources.hpp b/src/resources.hpp index d05ceb0cb..823600354 100644 --- a/src/resources.hpp +++ b/src/resources.hpp @@ -2,4 +2,7 @@ #include -QIcon loadIcon(const QString &fileName); +class QSize; + +/// Only SVG file is supported. +QIcon loadIcon(const QString &fileName, const QSize &size); diff --git a/src/resources.qrc b/src/resources.qrc index 4fcdb84dc..2211df2a5 100644 --- a/src/resources.qrc +++ b/src/resources.qrc @@ -1,11 +1,9 @@ - resources/archive-arrow-down-outline.svg - resources/cog-outline.svg resources/content-save.svg + resources/cpu-64-bit.svg resources/fallbackicon0.png - resources/folder-open-outline.svg resources/monitor.svg resources/obliteration-icon.png resources/play.svg diff --git a/src/resources/archive-arrow-down-outline.svg b/src/resources/archive-arrow-down-outline.svg deleted file mode 100644 index bf20520b2..000000000 --- a/src/resources/archive-arrow-down-outline.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/resources/cog-outline.svg b/src/resources/cog-outline.svg deleted file mode 100644 index b8c89c257..000000000 --- a/src/resources/cog-outline.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/resources/cpu-64-bit.svg b/src/resources/cpu-64-bit.svg new file mode 100644 index 000000000..b321f13e0 --- /dev/null +++ b/src/resources/cpu-64-bit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/resources/folder-open-outline.svg b/src/resources/folder-open-outline.svg deleted file mode 100644 index 28af2ad74..000000000 --- a/src/resources/folder-open-outline.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file