Qt: Allow customizing toolbar actions

Signed-off-by: SternXD <[email protected]>
This commit is contained in:
SternXD
2026-09-18 11:46:14 +02:00
committed by lightningterror
parent 7d40829ba4
commit eb9640704f
14 changed files with 567 additions and 1 deletions
+3
View File
@@ -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
View File
@@ -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);
+6
View File
@@ -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();
+6
View File
@@ -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&amp;k Toolbar</string>
</property>
</action>
<action name="actionCustomizeToolbar">
<property name="text">
<string>&amp;Customize Toolbar...</string>
</property>
</action>
<action name="actionViewStatusBar">
<property name="checkable">
<bool>true</bool>
+210
View File
@@ -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"
+41
View File
@@ -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;
};
+196
View File
@@ -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>
+3
View File
@@ -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" />
+3
View File
@@ -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

+4
View File
@@ -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>