mirror of
https://github.com/PCSX2/pcsx2.git
synced 2026-10-11 22:49:56 +00:00
Qt: Allow customizing toolbar actions
Signed-off-by: SternXD <[email protected]>
This commit is contained in:
@@ -35,6 +35,9 @@ target_sources(pcsx2-qt PRIVATE
|
||||
SetupWizardDialog.h
|
||||
SetupWizardDialog.ui
|
||||
Themes.cpp
|
||||
ToolbarCustomizationDialog.cpp
|
||||
ToolbarCustomizationDialog.h
|
||||
ToolbarCustomizationDialog.ui
|
||||
Translations.cpp
|
||||
QtHost.cpp
|
||||
QtHost.h
|
||||
|
||||
+91
-1
@@ -20,6 +20,7 @@
|
||||
#include "Settings/MemoryCardCreateDialog.h"
|
||||
#include "Tools/InputRecording/InputRecordingViewer.h"
|
||||
#include "Tools/InputRecording/NewInputRecordingDlg.h"
|
||||
#include "ToolbarCustomizationDialog.h"
|
||||
|
||||
#if !defined(__APPLE__)
|
||||
#include "ShortcutCreationDialog.h"
|
||||
@@ -92,6 +93,14 @@ const char* MainWindow::DISC_IMAGE_FILTER = QT_TRANSLATE_NOOP("MainWindow", "All
|
||||
"GZ Images (*.gz);;"
|
||||
"Block Dumps (*.dump)");
|
||||
|
||||
const char* MainWindow::DEFAULT_TOOLBAR_LAYOUT =
|
||||
"start_file,start_disc,start_bios,fullscreen_ui,,"
|
||||
"power_off,reset,pause,change_disc,,"
|
||||
"screenshot,video_capture,,"
|
||||
"load_state,save_state,,"
|
||||
"fullscreen,,"
|
||||
"settings,controller_settings,hotkey_settings";
|
||||
|
||||
MainWindow* g_main_window = nullptr;
|
||||
|
||||
// UI thread VM validity.
|
||||
@@ -208,7 +217,8 @@ void MainWindow::setupAdditionalUi()
|
||||
const bool toolbars_locked = Host::GetBaseBoolSettingValue("UI", "LockToolbar", false);
|
||||
m_ui.actionViewLockToolbar->setChecked(toolbars_locked);
|
||||
m_ui.toolBar->setMovable(!toolbars_locked);
|
||||
m_ui.toolBar->setContextMenuPolicy(Qt::PreventContextMenu);
|
||||
m_ui.toolBar->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
connect(m_ui.toolBar, &QToolBar::customContextMenuRequested, this, &MainWindow::onToolbarContextMenuRequested);
|
||||
|
||||
m_settings_toolbar_menu = new QMenu(m_ui.toolBar);
|
||||
m_settings_toolbar_menu->addAction(m_ui.actionSettings);
|
||||
@@ -230,6 +240,8 @@ void MainWindow::setupAdditionalUi()
|
||||
m_ui.actionGridViewShowFullTitles->setChecked(m_game_list_widget->getShowGridFullCoverTitles());
|
||||
m_ui.mainContainer->addWidget(m_game_list_widget);
|
||||
|
||||
rebuildToolbar();
|
||||
|
||||
updateEmulationActions(false, false, false);
|
||||
updateDisplayRelatedActions(false, false, false);
|
||||
|
||||
@@ -529,6 +541,7 @@ void MainWindow::connectSignals()
|
||||
connect(m_ui.actionRescanAllGames, &QAction::triggered, [this]() { refreshGameList(true, true); });
|
||||
connect(m_ui.actionViewToolbar, &QAction::toggled, this, &MainWindow::onViewToolbarActionToggled);
|
||||
connect(m_ui.actionViewLockToolbar, &QAction::toggled, this, &MainWindow::onViewLockToolbarActionToggled);
|
||||
connect(m_ui.actionCustomizeToolbar, &QAction::triggered, this, &MainWindow::onCustomizeToolbarTriggered);
|
||||
connect(m_ui.actionViewStatusBar, &QAction::toggled, this, &MainWindow::onViewStatusBarActionToggled);
|
||||
connect(m_ui.actionViewGameList, &QAction::triggered, this, &MainWindow::onViewGameListActionTriggered);
|
||||
connect(m_ui.actionViewGameGrid, &QAction::triggered, this, &MainWindow::onViewGameGridActionTriggered);
|
||||
@@ -2038,6 +2051,83 @@ void MainWindow::onViewLockToolbarActionToggled(bool checked)
|
||||
m_ui.toolBar->setMovable(!checked);
|
||||
}
|
||||
|
||||
static std::vector<ToolbarActionInfo> getToolbarActionRegistry(const Ui::MainWindow& ui)
|
||||
{
|
||||
return {
|
||||
{"start_file", ui.actionToolbarStartFile},
|
||||
{"start_disc", ui.actionToolbarStartDisc},
|
||||
{"start_bios", ui.actionToolbarStartBios},
|
||||
{"fullscreen_ui", ui.actionToolbarStartFullscreenUI},
|
||||
{"power_off", ui.actionToolbarPowerOff},
|
||||
{"reset", ui.actionToolbarReset},
|
||||
{"pause", ui.actionToolbarPause},
|
||||
{"change_disc", ui.actionToolbarChangeDisc},
|
||||
{"screenshot", ui.actionToolbarScreenshot},
|
||||
{"video_capture", ui.actionVideoCapture},
|
||||
{"load_state", ui.actionToolbarLoadState},
|
||||
{"save_state", ui.actionToolbarSaveState},
|
||||
{"fullscreen", ui.actionToolbarFullscreen},
|
||||
{"settings", ui.actionToolbarSettings},
|
||||
{"game_settings", ui.actionViewGameProperties},
|
||||
{"controller_settings", ui.actionToolbarControllerSettings},
|
||||
{"hotkey_settings", ui.actionToolbarHotkeySettings},
|
||||
{"debugger", ui.actionDebugger},
|
||||
};
|
||||
}
|
||||
|
||||
void MainWindow::rebuildToolbar()
|
||||
{
|
||||
std::string layout_str = Host::GetBaseStringSettingValue("UI", "ToolbarItems", DEFAULT_TOOLBAR_LAYOUT);
|
||||
if (layout_str.empty())
|
||||
layout_str = DEFAULT_TOOLBAR_LAYOUT;
|
||||
|
||||
const auto registry = getToolbarActionRegistry(m_ui);
|
||||
QHash<QString, QAction*> action_map;
|
||||
for (const auto& item : registry)
|
||||
{
|
||||
if (item.action)
|
||||
action_map.insert(QString::fromUtf8(item.id), item.action);
|
||||
}
|
||||
|
||||
m_ui.toolBar->clear();
|
||||
|
||||
const QStringList items = QString::fromStdString(layout_str).split(QLatin1Char(','), Qt::KeepEmptyParts);
|
||||
for (const QString& item_id : items)
|
||||
{
|
||||
const QString trimmed_id = item_id.trimmed();
|
||||
if (trimmed_id.isEmpty())
|
||||
{
|
||||
m_ui.toolBar->addSeparator();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (QAction* act = action_map.value(trimmed_id, nullptr); act != nullptr)
|
||||
{
|
||||
m_ui.toolBar->addAction(act);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
updateEmulationActions(s_vm_valid, s_vm_valid, false);
|
||||
}
|
||||
|
||||
void MainWindow::onCustomizeToolbarTriggered()
|
||||
{
|
||||
ToolbarCustomizationDialog dlg(this, getToolbarActionRegistry(m_ui));
|
||||
if (dlg.exec() == QDialog::Accepted)
|
||||
rebuildToolbar();
|
||||
}
|
||||
|
||||
void MainWindow::onToolbarContextMenuRequested(const QPoint& pos)
|
||||
{
|
||||
QMenu menu(m_ui.toolBar);
|
||||
|
||||
menu.addAction(m_ui.actionViewLockToolbar);
|
||||
menu.addAction(m_ui.actionCustomizeToolbar);
|
||||
|
||||
menu.exec(m_ui.toolBar->mapToGlobal(pos));
|
||||
}
|
||||
|
||||
void MainWindow::onViewStatusBarActionToggled(bool checked)
|
||||
{
|
||||
Host::SetBaseBoolSettingValue("UI", "ShowStatusBar", checked);
|
||||
|
||||
@@ -83,11 +83,15 @@ public:
|
||||
/// Default filter for opening a disc image.
|
||||
static const char* DISC_IMAGE_FILTER;
|
||||
|
||||
/// Default layout for the toolbar.
|
||||
static const char* DEFAULT_TOOLBAR_LAYOUT;
|
||||
|
||||
public:
|
||||
MainWindow();
|
||||
~MainWindow();
|
||||
|
||||
void initialize();
|
||||
void rebuildToolbar();
|
||||
void connectVMThreadSignals(EmuThread* thread);
|
||||
void startupUpdateCheck();
|
||||
void resetSettings(bool ui);
|
||||
@@ -175,6 +179,8 @@ private Q_SLOTS:
|
||||
void onFullscreenUIStateChange(bool running);
|
||||
void onViewToolbarActionToggled(bool checked);
|
||||
void onViewLockToolbarActionToggled(bool checked);
|
||||
void onCustomizeToolbarTriggered();
|
||||
void onToolbarContextMenuRequested(const QPoint& pos);
|
||||
void onViewStatusBarActionToggled(bool checked);
|
||||
void onViewGameListActionTriggered();
|
||||
void onViewGameGridActionTriggered();
|
||||
|
||||
@@ -164,6 +164,7 @@
|
||||
</widget>
|
||||
<addaction name="actionViewToolbar"/>
|
||||
<addaction name="actionViewLockToolbar"/>
|
||||
<addaction name="actionCustomizeToolbar"/>
|
||||
<addaction name="actionViewStatusBar"/>
|
||||
<addaction name="actionViewStatusBarVerbose"/>
|
||||
<addaction name="separator"/>
|
||||
@@ -735,6 +736,11 @@
|
||||
<string>Loc&k Toolbar</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionCustomizeToolbar">
|
||||
<property name="text">
|
||||
<string>&Customize Toolbar...</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionViewStatusBar">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
|
||||
@@ -0,0 +1,210 @@
|
||||
// SPDX-FileCopyrightText: 2002-2026 PCSX2 Dev Team
|
||||
// SPDX-License-Identifier: GPL-3.0+
|
||||
|
||||
#include "ToolbarCustomizationDialog.h"
|
||||
#include "MainWindow.h"
|
||||
#include "QtHost.h"
|
||||
|
||||
ToolbarCustomizationDialog::ToolbarCustomizationDialog(QWidget* parent, std::vector<ToolbarActionInfo> action_registry)
|
||||
: QDialog(parent)
|
||||
, m_action_registry(std::move(action_registry))
|
||||
{
|
||||
m_ui.setupUi(this);
|
||||
setWindowIcon(QtHost::GetAppIcon());
|
||||
|
||||
m_ui.currentList->setDragDropMode(QAbstractItemView::InternalMove);
|
||||
m_ui.currentList->setDefaultDropAction(Qt::MoveAction);
|
||||
|
||||
std::string layout_str = Host::GetBaseStringSettingValue("UI", "ToolbarItems", MainWindow::DEFAULT_TOOLBAR_LAYOUT);
|
||||
if (layout_str.empty())
|
||||
layout_str = MainWindow::DEFAULT_TOOLBAR_LAYOUT;
|
||||
populateFromLayout(QString::fromStdString(layout_str));
|
||||
|
||||
connect(m_ui.addButton, &QPushButton::clicked, this, &ToolbarCustomizationDialog::onAddClicked);
|
||||
connect(m_ui.removeButton, &QPushButton::clicked, this, &ToolbarCustomizationDialog::onRemoveClicked);
|
||||
connect(m_ui.moveUpButton, &QPushButton::clicked, this, &ToolbarCustomizationDialog::onMoveUpClicked);
|
||||
connect(m_ui.moveDownButton, &QPushButton::clicked, this, &ToolbarCustomizationDialog::onMoveDownClicked);
|
||||
connect(m_ui.addSeparatorButton, &QPushButton::clicked, this, &ToolbarCustomizationDialog::onAddSeparatorClicked);
|
||||
connect(m_ui.buttonBox->button(QDialogButtonBox::RestoreDefaults), &QPushButton::clicked, this,
|
||||
&ToolbarCustomizationDialog::onRestoreDefaultsClicked);
|
||||
|
||||
connect(m_ui.availableList, &QListWidget::itemDoubleClicked, this, &ToolbarCustomizationDialog::onAddClicked);
|
||||
connect(m_ui.currentList, &QListWidget::itemDoubleClicked, this, &ToolbarCustomizationDialog::onRemoveClicked);
|
||||
|
||||
connect(m_ui.availableList, &QListWidget::itemSelectionChanged, this, &ToolbarCustomizationDialog::updateButtonStates);
|
||||
connect(m_ui.currentList, &QListWidget::itemSelectionChanged, this, &ToolbarCustomizationDialog::updateButtonStates);
|
||||
|
||||
connect(m_ui.buttonBox, &QDialogButtonBox::accepted, this, &ToolbarCustomizationDialog::onAccepted);
|
||||
connect(m_ui.buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
|
||||
|
||||
updateButtonStates();
|
||||
}
|
||||
|
||||
ToolbarCustomizationDialog::~ToolbarCustomizationDialog() = default;
|
||||
|
||||
void ToolbarCustomizationDialog::populateFromLayout(const QString& layout_str)
|
||||
{
|
||||
m_ui.availableList->clear();
|
||||
m_ui.currentList->clear();
|
||||
|
||||
const QStringList items = layout_str.split(QLatin1Char(','), Qt::KeepEmptyParts);
|
||||
QSet<QString> added_ids;
|
||||
|
||||
QHash<QString, const ToolbarActionInfo*> registry_map;
|
||||
for (const ToolbarActionInfo& info : m_action_registry)
|
||||
registry_map.insert(QString::fromUtf8(info.id), &info);
|
||||
|
||||
for (const QString& item_id : items)
|
||||
{
|
||||
const QString trimmed = item_id.trimmed();
|
||||
if (trimmed.isEmpty())
|
||||
{
|
||||
QListWidgetItem* item = new QListWidgetItem(tr("--- Separator ---"), m_ui.currentList);
|
||||
item->setData(Qt::UserRole, QString());
|
||||
}
|
||||
else
|
||||
{
|
||||
auto it = registry_map.find(trimmed);
|
||||
if (it != registry_map.end())
|
||||
{
|
||||
const ToolbarActionInfo* info = it.value();
|
||||
const QIcon icon = info->action ? info->action->icon() : QIcon();
|
||||
const QString text = info->action ? info->action->iconText() : QString();
|
||||
QListWidgetItem* item = new QListWidgetItem(icon, text, m_ui.currentList);
|
||||
item->setData(Qt::UserRole, QString::fromUtf8(info->id));
|
||||
added_ids.insert(QString::fromUtf8(info->id));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (const ToolbarActionInfo& info : m_action_registry)
|
||||
{
|
||||
if (!added_ids.contains(QString::fromUtf8(info.id)))
|
||||
{
|
||||
const QIcon icon = info.action ? info.action->icon() : QIcon();
|
||||
const QString text = info.action ? info.action->iconText() : QString();
|
||||
QListWidgetItem* item = new QListWidgetItem(icon, text, m_ui.availableList);
|
||||
item->setData(Qt::UserRole, QString::fromUtf8(info.id));
|
||||
}
|
||||
}
|
||||
|
||||
updateButtonStates();
|
||||
}
|
||||
|
||||
void ToolbarCustomizationDialog::onRestoreDefaultsClicked()
|
||||
{
|
||||
populateFromLayout(QString::fromUtf8(MainWindow::DEFAULT_TOOLBAR_LAYOUT));
|
||||
}
|
||||
|
||||
void ToolbarCustomizationDialog::onAddClicked()
|
||||
{
|
||||
QListWidgetItem* taken = m_ui.availableList->takeItem(m_ui.availableList->currentRow());
|
||||
if (!taken)
|
||||
return;
|
||||
|
||||
int target_row = m_ui.currentList->currentRow();
|
||||
if (target_row < 0)
|
||||
target_row = m_ui.currentList->count();
|
||||
else
|
||||
target_row++;
|
||||
|
||||
m_ui.currentList->insertItem(target_row, taken);
|
||||
m_ui.currentList->setCurrentRow(target_row);
|
||||
updateButtonStates();
|
||||
}
|
||||
|
||||
void ToolbarCustomizationDialog::onRemoveClicked()
|
||||
{
|
||||
QListWidgetItem* current = m_ui.currentList->currentItem();
|
||||
if (!current)
|
||||
return;
|
||||
|
||||
const int row = m_ui.currentList->row(current);
|
||||
const QString id = current->data(Qt::UserRole).toString();
|
||||
|
||||
if (id.isEmpty())
|
||||
{
|
||||
delete m_ui.currentList->takeItem(row);
|
||||
}
|
||||
else
|
||||
{
|
||||
QListWidgetItem* taken = m_ui.currentList->takeItem(row);
|
||||
m_ui.availableList->addItem(taken);
|
||||
m_ui.availableList->setCurrentItem(taken);
|
||||
}
|
||||
|
||||
updateButtonStates();
|
||||
}
|
||||
|
||||
void ToolbarCustomizationDialog::onMoveUpClicked()
|
||||
{
|
||||
const int row = m_ui.currentList->currentRow();
|
||||
if (row <= 0)
|
||||
return;
|
||||
|
||||
QListWidgetItem* item = m_ui.currentList->takeItem(row);
|
||||
m_ui.currentList->insertItem(row - 1, item);
|
||||
m_ui.currentList->setCurrentRow(row - 1);
|
||||
updateButtonStates();
|
||||
}
|
||||
|
||||
void ToolbarCustomizationDialog::onMoveDownClicked()
|
||||
{
|
||||
const int row = m_ui.currentList->currentRow();
|
||||
if (row < 0 || row >= m_ui.currentList->count() - 1)
|
||||
return;
|
||||
|
||||
QListWidgetItem* item = m_ui.currentList->takeItem(row);
|
||||
m_ui.currentList->insertItem(row + 1, item);
|
||||
m_ui.currentList->setCurrentRow(row + 1);
|
||||
updateButtonStates();
|
||||
}
|
||||
|
||||
void ToolbarCustomizationDialog::onAddSeparatorClicked()
|
||||
{
|
||||
int target_row = m_ui.currentList->currentRow();
|
||||
if (target_row < 0)
|
||||
target_row = m_ui.currentList->count();
|
||||
else
|
||||
target_row++;
|
||||
|
||||
QListWidgetItem* item = new QListWidgetItem(tr("--- Separator ---"));
|
||||
item->setData(Qt::UserRole, QString());
|
||||
m_ui.currentList->insertItem(target_row, item);
|
||||
m_ui.currentList->setCurrentRow(target_row);
|
||||
updateButtonStates();
|
||||
}
|
||||
|
||||
void ToolbarCustomizationDialog::onAccepted()
|
||||
{
|
||||
QStringList items;
|
||||
for (int i = 0; i < m_ui.currentList->count(); ++i)
|
||||
{
|
||||
const QListWidgetItem* item = m_ui.currentList->item(i);
|
||||
items.append(item->data(Qt::UserRole).toString());
|
||||
}
|
||||
|
||||
const QString layout_str = items.join(QLatin1Char(','));
|
||||
if (layout_str == QLatin1StringView(MainWindow::DEFAULT_TOOLBAR_LAYOUT))
|
||||
Host::RemoveBaseSettingValue("UI", "ToolbarItems");
|
||||
else
|
||||
Host::SetBaseStringSettingValue("UI", "ToolbarItems", layout_str.toUtf8().constData());
|
||||
|
||||
Host::CommitBaseSettingChanges();
|
||||
accept();
|
||||
}
|
||||
|
||||
void ToolbarCustomizationDialog::updateButtonStates()
|
||||
{
|
||||
const bool has_available_selection = (m_ui.availableList->currentItem() != nullptr);
|
||||
const bool has_current_selection = (m_ui.currentList->currentItem() != nullptr);
|
||||
const int current_row = m_ui.currentList->currentRow();
|
||||
const int current_count = m_ui.currentList->count();
|
||||
|
||||
m_ui.addButton->setEnabled(has_available_selection);
|
||||
m_ui.removeButton->setEnabled(has_current_selection);
|
||||
m_ui.moveUpButton->setEnabled(has_current_selection && current_row > 0);
|
||||
m_ui.moveDownButton->setEnabled(has_current_selection && current_row >= 0 && current_row < current_count - 1);
|
||||
}
|
||||
|
||||
#include "moc_ToolbarCustomizationDialog.cpp"
|
||||
@@ -0,0 +1,41 @@
|
||||
// SPDX-FileCopyrightText: 2002-2026 PCSX2 Dev Team
|
||||
// SPDX-License-Identifier: GPL-3.0+
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "ui_ToolbarCustomizationDialog.h"
|
||||
|
||||
#include <vector>
|
||||
|
||||
class QAction;
|
||||
|
||||
struct ToolbarActionInfo
|
||||
{
|
||||
const char* id = nullptr;
|
||||
QAction* action = nullptr;
|
||||
};
|
||||
|
||||
class ToolbarCustomizationDialog final : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit ToolbarCustomizationDialog(QWidget* parent, std::vector<ToolbarActionInfo> action_registry);
|
||||
~ToolbarCustomizationDialog() override;
|
||||
|
||||
private Q_SLOTS:
|
||||
void onAddClicked();
|
||||
void onRemoveClicked();
|
||||
void onMoveUpClicked();
|
||||
void onMoveDownClicked();
|
||||
void onAddSeparatorClicked();
|
||||
void onRestoreDefaultsClicked();
|
||||
void onAccepted();
|
||||
void updateButtonStates();
|
||||
|
||||
private:
|
||||
void populateFromLayout(const QString& layout_str);
|
||||
|
||||
std::vector<ToolbarActionInfo> m_action_registry;
|
||||
Ui::ToolbarCustomizationDialog m_ui;
|
||||
};
|
||||
@@ -0,0 +1,196 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>ToolbarCustomizationDialog</class>
|
||||
<widget class="QDialog" name="ToolbarCustomizationDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>600</width>
|
||||
<height>420</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Customize Toolbar</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="mainLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="instructionsLabel">
|
||||
<property name="text">
|
||||
<string>Select actions to display on the toolbar and arrange their order.</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="listsLayout">
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="availableLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="availableLabel">
|
||||
<property name="text">
|
||||
<string>Available Actions:</string>
|
||||
</property>
|
||||
<property name="buddy">
|
||||
<cstring>availableList</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QListWidget" name="availableList">
|
||||
<property name="iconSize">
|
||||
<size>
|
||||
<width>24</width>
|
||||
<height>24</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="transferButtonsLayout">
|
||||
<item>
|
||||
<spacer name="transferSpacerTop">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Orientation::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="addButton">
|
||||
<property name="text">
|
||||
<string>Add</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="arrow-right-line"/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="removeButton">
|
||||
<property name="text">
|
||||
<string>Remove</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="arrow-left-line"/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="transferSpacerBottom">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Orientation::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="currentLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="currentLabel">
|
||||
<property name="text">
|
||||
<string>Current Toolbar:</string>
|
||||
</property>
|
||||
<property name="buddy">
|
||||
<cstring>currentList</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QListWidget" name="currentList">
|
||||
<property name="iconSize">
|
||||
<size>
|
||||
<width>24</width>
|
||||
<height>24</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="reorderButtonsLayout">
|
||||
<item>
|
||||
<spacer name="reorderSpacerTop">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Orientation::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="moveUpButton">
|
||||
<property name="text">
|
||||
<string>Move Up</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="arrow-up-line"/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="moveDownButton">
|
||||
<property name="text">
|
||||
<string>Move Down</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="arrow-down-line"/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="addSeparatorButton">
|
||||
<property name="text">
|
||||
<string>Add Separator</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="reorderSpacerBottom">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Orientation::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok|QDialogButtonBox::StandardButton::RestoreDefaults</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources>
|
||||
<include location="resources/resources.qrc"/>
|
||||
</resources>
|
||||
<connections/>
|
||||
</ui>
|
||||
@@ -110,6 +110,7 @@
|
||||
<ClCompile Include="Settings\MemoryCardConvertWorker.cpp" />
|
||||
<ClCompile Include="SetupWizardDialog.cpp" />
|
||||
<ClCompile Include="Themes.cpp" />
|
||||
<ClCompile Include="ToolbarCustomizationDialog.cpp" />
|
||||
<ClCompile Include="Tools\InputRecording\InputRecordingViewer.cpp" />
|
||||
<ClCompile Include="Tools\InputRecording\NewInputRecordingDlg.cpp" />
|
||||
<ClCompile Include="Debugger\AnalysisOptionsDialog.cpp" />
|
||||
@@ -189,6 +190,7 @@
|
||||
<ItemGroup>
|
||||
<ClInclude Include="AsyncDialogs.h" />
|
||||
<QtMoc Include="SetupWizardDialog.h" />
|
||||
<QtMoc Include="ToolbarCustomizationDialog.h" />
|
||||
<QtMoc Include="Settings\InterfaceSettingsWidget.h" />
|
||||
<QtMoc Include="Settings\GameListSettingsWidget.h" />
|
||||
<QtMoc Include="Settings\BIOSSettingsWidget.h" />
|
||||
@@ -295,6 +297,7 @@
|
||||
<QtUi Include="AutoUpdaterDialog.ui" />
|
||||
<QtUi Include="CoverDownloadDialog.ui" />
|
||||
<QtUi Include="ShortcutCreationDialog.ui" />
|
||||
<QtUi Include="ToolbarCustomizationDialog.ui" />
|
||||
<QtUi Include="Debugger\AnalysisOptionsDialog.ui" />
|
||||
<QtUi Include="Debugger\Breakpoints\BreakpointDialog.ui" />
|
||||
<QtUi Include="Debugger\Breakpoints\BreakpointView.ui" />
|
||||
|
||||
@@ -180,6 +180,7 @@
|
||||
</ClCompile>
|
||||
<ClCompile Include="ColorPickerButton.cpp" />
|
||||
<ClCompile Include="Themes.cpp" />
|
||||
<ClCompile Include="ToolbarCustomizationDialog.cpp" />
|
||||
<ClCompile Include="Settings\GamePatchSettingsWidget.cpp">
|
||||
<Filter>Settings</Filter>
|
||||
</ClCompile>
|
||||
@@ -435,6 +436,7 @@
|
||||
</QtMoc>
|
||||
<QtMoc Include="ColorPickerButton.h" />
|
||||
<QtMoc Include="SetupWizardDialog.h" />
|
||||
<QtMoc Include="ToolbarCustomizationDialog.h" />
|
||||
<QtMoc Include="Settings\GameCheatSettingsWidget.h">
|
||||
<Filter>Settings</Filter>
|
||||
</QtMoc>
|
||||
@@ -785,6 +787,7 @@
|
||||
<QtUi Include="MainWindow.ui" />
|
||||
<QtUi Include="SetupWizardDialog.ui" />
|
||||
<QtUi Include="ShortcutCreationDialog.ui" />
|
||||
<QtUi Include="ToolbarCustomizationDialog.ui" />
|
||||
<QtUi Include="Debugger\StackView.ui">
|
||||
<Filter>Debugger</Filter>
|
||||
</QtUi>
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="#000"><path d="M13.0001 16.1716L18.3641 10.8076L19.7783 12.2218L12.0001 20L4.22192 12.2218L5.63614 10.8076L11.0001 16.1716V4H13.0001V16.1716Z"></path></svg>
|
||||
|
After Width: | Height: | Size: 222 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="#000"><path d="M13.0001 7.82843V20H11.0001V7.82843L5.63614 13.1924L4.22192 11.7782L12.0001 4L19.7783 11.7782L18.3641 13.1924L13.0001 7.82843Z"></path></svg>
|
||||
|
After Width: | Height: | Size: 222 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="#fff"><path d="M13.0001 16.1716L18.3641 10.8076L19.7783 12.2218L12.0001 20L4.22192 12.2218L5.63614 10.8076L11.0001 16.1716V4H13.0001V16.1716Z"></path></svg>
|
||||
|
After Width: | Height: | Size: 222 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="#fff"><path d="M13.0001 7.82843V20H11.0001V7.82843L5.63614 13.1924L4.22192 11.7782L12.0001 4L19.7783 11.7782L18.3641 13.1924L13.0001 7.82843Z"></path></svg>
|
||||
|
After Width: | Height: | Size: 222 B |
@@ -2,6 +2,8 @@
|
||||
<qresource>
|
||||
<file>icons/AppIcon64.png</file>
|
||||
<file>icons/black/index.theme</file>
|
||||
<file>icons/black/svg/arrow-up-line.svg</file>
|
||||
<file>icons/black/svg/arrow-down-line.svg</file>
|
||||
<file>icons/black/svg/arrow-left-line.svg</file>
|
||||
<file>icons/black/svg/arrow-left-right-line.svg</file>
|
||||
<file>icons/black/svg/arrow-right-line.svg</file>
|
||||
@@ -115,6 +117,8 @@
|
||||
<file>icons/QT.png</file>
|
||||
<file>icons/update.png</file>
|
||||
<file>icons/white/index.theme</file>
|
||||
<file>icons/white/svg/arrow-up-line.svg</file>
|
||||
<file>icons/white/svg/arrow-down-line.svg</file>
|
||||
<file>icons/white/svg/arrow-left-line.svg</file>
|
||||
<file>icons/white/svg/arrow-left-right-line.svg</file>
|
||||
<file>icons/white/svg/arrow-right-line.svg</file>
|
||||
|
||||
Reference in New Issue
Block a user