From 6177fa014885515bccc38a9c9f917fa60c1fd4ab Mon Sep 17 00:00:00 2001 From: Trial97 Date: Wed, 7 May 2025 20:22:41 +0300 Subject: [PATCH] feat: make resource header config global Signed-off-by: Trial97 --- launcher/Application.cpp | 2 + launcher/minecraft/MinecraftInstance.cpp | 3 + launcher/minecraft/mod/ModFolderModel.cpp | 1 - .../minecraft/mod/ResourceFolderModel.cpp | 68 ++++++++++++++++--- launcher/minecraft/mod/ResourceFolderModel.h | 1 - .../minecraft/mod/TexturePackFolderModel.cpp | 1 - launcher/ui/MainWindow.cpp | 4 +- .../pages/instance/ExternalResourcesPage.cpp | 4 +- .../ui/pages/instance/ScreenshotsPage.cpp | 4 +- launcher/ui/pages/instance/ServersPage.cpp | 4 +- launcher/ui/pages/instance/VersionPage.cpp | 4 +- launcher/ui/pages/instance/WorldListPage.cpp | 4 +- 12 files changed, 76 insertions(+), 24 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index a098eab14..c8d2849c9 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -816,6 +816,8 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) m_settings->registerSetting("TPDownloadGeometry", ""); m_settings->registerSetting("ShaderDownloadGeometry", ""); + m_settings->registerSetting("UI/FolderResourceColumnVisibility", QVariantMap{}); + // HACK: This code feels so stupid is there a less stupid way of doing this? { m_settings->registerSetting("PastebinURL", ""); diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp index fafe7bd37..ed8ed398d 100644 --- a/launcher/minecraft/MinecraftInstance.cpp +++ b/launcher/minecraft/MinecraftInstance.cpp @@ -231,6 +231,9 @@ void MinecraftInstance::loadSpecificSettings() auto envSetting = m_settings->registerSetting("OverrideEnv", false); m_settings->registerOverride(global_settings->getSetting("Env"), envSetting); + m_settings->registerSetting("UI/ColumnsOverride", false); + m_settings->registerSetting("UI/FolderResourceColumnVisibility", QVariantMap{}); + m_settings->set("InstanceType", "OneSix"); } diff --git a/launcher/minecraft/mod/ModFolderModel.cpp b/launcher/minecraft/mod/ModFolderModel.cpp index 43888ae27..b613e0af1 100644 --- a/launcher/minecraft/mod/ModFolderModel.cpp +++ b/launcher/minecraft/mod/ModFolderModel.cpp @@ -67,7 +67,6 @@ ModFolderModel::ModFolderModel(const QDir& dir, BaseInstance* instance, bool is_ QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Interactive }; m_columnsHideable = { false, true, false, true, true, true, true, true, true, true, true }; - m_columnsHiddenByDefault = { false, false, false, false, false, false, false, true, true, true, true }; } QVariant ModFolderModel::data(const QModelIndex& index, int role) const diff --git a/launcher/minecraft/mod/ResourceFolderModel.cpp b/launcher/minecraft/mod/ResourceFolderModel.cpp index bf40c81d7..21093066d 100644 --- a/launcher/minecraft/mod/ResourceFolderModel.cpp +++ b/launcher/minecraft/mod/ResourceFolderModel.cpp @@ -1,4 +1,5 @@ #include "ResourceFolderModel.h" +#include #include #include @@ -587,28 +588,77 @@ void ResourceFolderModel::setupHeaderAction(QAction* act, int column) void ResourceFolderModel::saveColumns(QTreeView* tree) { - auto const setting_name = QString("UI/%1_Page/Columns").arg(id()); - auto setting = m_instance->settings()->getOrRegisterSetting(setting_name); + auto const settingName = QString("UI/%1_Page/Columns").arg(id()); + auto setting = m_instance->settings()->getSetting(settingName); - setting->set(tree->header()->saveState()); + setting->set(tree->header()->saveState().toBase64()); + + // neither passthrough nor override settings works for this usecase as I need to only set the global when the gate is false + auto settings = m_instance->settings(); + if (!settings->get("UI/ColumnsOverride").toBool()) { + settings = APPLICATION->settings(); + } + auto visibility = settings->get("UI/FolderResourceColumnVisibility").toMap(); + for (auto i = 0; i < m_column_names.size(); ++i) { + if (m_columnsHideable[i]) { + auto name = m_column_names[i]; + visibility[name] = !tree->isColumnHidden(i); + } + } + settings->set("UI/FolderResourceColumnVisibility", visibility); } void ResourceFolderModel::loadColumns(QTreeView* tree) { - for (auto i = 0; i < m_columnsHiddenByDefault.size(); ++i) { - tree->setColumnHidden(i, m_columnsHiddenByDefault[i]); + auto const settingName = QString("UI/%1_Page/Columns").arg(id()); + + auto setting = m_instance->settings()->getOrRegisterSetting(settingName, QByteArray{}); + tree->header()->restoreState(QByteArray::fromBase64(setting->get().toByteArray())); + + auto setVisible = [this, tree](QVariant value) { + auto visibility = value.toMap(); + for (auto i = 0; i < m_column_names.size(); ++i) { + if (m_columnsHideable[i]) { + auto name = m_column_names[i]; + tree->setColumnHidden(i, !visibility.value(name, false).toBool()); + } + } + }; + + // neither passthrough nor override settings works for this usecase as I need to only set the global when the gate is false + auto settings = m_instance->settings(); + if (!settings->get("UI/ColumnsOverride").toBool()) { + settings = APPLICATION->settings(); } + auto visibility = settings->getSetting("UI/FolderResourceColumnVisibility"); + setVisible(visibility->get().toMap()); - auto const setting_name = QString("UI/%1_Page/Columns").arg(id()); - auto setting = m_instance->settings()->getOrRegisterSetting(setting_name); - - tree->header()->restoreState(setting->get().toByteArray()); + // allways connect the signal in case the setting is toggled on and off + auto gSetting = APPLICATION->settings()->getOrRegisterSetting("UI/FolderResourceColumnVisibility"); + connect(gSetting.get(), &Setting::SettingChanged, tree, [this, setVisible](const Setting&, QVariant value) { + if (!m_instance->settings()->get("UI/ColumnsOverride").toBool()) { + setVisible(value.toMap()); + } + }); } QMenu* ResourceFolderModel::createHeaderContextMenu(QTreeView* tree) { auto menu = new QMenu(tree); + { // action to decide if the visibility is per instance or not + auto act = new QAction(tr("Overide Columns Visibility"), menu); + + act->setCheckable(true); + act->setChecked(m_instance->settings()->get("UI/ColumnsOverride").toBool()); + + connect(act, &QAction::toggled, tree, [this, tree](bool toggled) { + m_instance->settings()->set("UI/ColumnsOverride", toggled); + saveColumns(tree); + }); + + menu->addAction(act); + } menu->addSeparator()->setText(tr("Show / Hide Columns")); for (int col = 0; col < columnCount(); ++col) { diff --git a/launcher/minecraft/mod/ResourceFolderModel.h b/launcher/minecraft/mod/ResourceFolderModel.h index f6173b0d9..759861e14 100644 --- a/launcher/minecraft/mod/ResourceFolderModel.h +++ b/launcher/minecraft/mod/ResourceFolderModel.h @@ -243,7 +243,6 @@ class ResourceFolderModel : public QAbstractListModel { QList m_column_resize_modes = { QHeaderView::Interactive, QHeaderView::Stretch, QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Interactive }; QList m_columnsHideable = { false, false, true, true, true }; - QList m_columnsHiddenByDefault = { false, false, false, false, true }; QDir m_dir; BaseInstance* m_instance; diff --git a/launcher/minecraft/mod/TexturePackFolderModel.cpp b/launcher/minecraft/mod/TexturePackFolderModel.cpp index 4d7c71359..8b89b45cd 100644 --- a/launcher/minecraft/mod/TexturePackFolderModel.cpp +++ b/launcher/minecraft/mod/TexturePackFolderModel.cpp @@ -51,7 +51,6 @@ TexturePackFolderModel::TexturePackFolderModel(const QDir& dir, BaseInstance* in m_column_resize_modes = { QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Stretch, QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Interactive }; m_columnsHideable = { false, true, false, true, true, true }; - m_columnsHiddenByDefault = { false, false, false, false, false, true }; } Task* TexturePackFolderModel::createParseTask(Resource& resource) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index e0f37968f..5af108331 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -181,7 +181,7 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWi auto const setting_name = QString("WideBarVisibility_%1").arg(ui->instanceToolBar->objectName()); instanceToolbarSetting = APPLICATION->settings()->getOrRegisterSetting(setting_name); - ui->instanceToolBar->setVisibilityState(instanceToolbarSetting->get().toByteArray()); + ui->instanceToolBar->setVisibilityState(QByteArray::fromBase64(instanceToolbarSetting->get().toByteArray())); ui->instanceToolBar->addContextMenuAction(ui->newsToolBar->toggleViewAction()); ui->instanceToolBar->addContextMenuAction(ui->instanceToolBar->toggleViewAction()); @@ -1493,7 +1493,7 @@ void MainWindow::closeEvent(QCloseEvent* event) // Save the window state and geometry. APPLICATION->settings()->set("MainWindowState", saveState().toBase64()); APPLICATION->settings()->set("MainWindowGeometry", saveGeometry().toBase64()); - instanceToolbarSetting->set(ui->instanceToolBar->getVisibilityState()); + instanceToolbarSetting->set(ui->instanceToolBar->getVisibilityState().toBase64()); event->accept(); emit isClosing(); } diff --git a/launcher/ui/pages/instance/ExternalResourcesPage.cpp b/launcher/ui/pages/instance/ExternalResourcesPage.cpp index be65e6948..b11b4970a 100644 --- a/launcher/ui/pages/instance/ExternalResourcesPage.cpp +++ b/launcher/ui/pages/instance/ExternalResourcesPage.cpp @@ -148,14 +148,14 @@ void ExternalResourcesPage::openedImpl() auto const setting_name = QString("WideBarVisibility_%1").arg(id()); m_wide_bar_setting = APPLICATION->settings()->getOrRegisterSetting(setting_name); - ui->actionsToolbar->setVisibilityState(m_wide_bar_setting->get().toByteArray()); + ui->actionsToolbar->setVisibilityState(QByteArray::fromBase64(m_wide_bar_setting->get().toByteArray())); } void ExternalResourcesPage::closedImpl() { m_model->stopWatching(); - m_wide_bar_setting->set(ui->actionsToolbar->getVisibilityState()); + m_wide_bar_setting->set(ui->actionsToolbar->getVisibilityState().toBase64()); } void ExternalResourcesPage::retranslate() diff --git a/launcher/ui/pages/instance/ScreenshotsPage.cpp b/launcher/ui/pages/instance/ScreenshotsPage.cpp index e59002a15..850d85288 100644 --- a/launcher/ui/pages/instance/ScreenshotsPage.cpp +++ b/launcher/ui/pages/instance/ScreenshotsPage.cpp @@ -562,12 +562,12 @@ void ScreenshotsPage::openedImpl() auto const setting_name = QString("WideBarVisibility_%1").arg(id()); m_wide_bar_setting = APPLICATION->settings()->getOrRegisterSetting(setting_name); - ui->toolBar->setVisibilityState(m_wide_bar_setting->get().toByteArray()); + ui->toolBar->setVisibilityState(QByteArray::fromBase64(m_wide_bar_setting->get().toByteArray())); } void ScreenshotsPage::closedImpl() { - m_wide_bar_setting->set(ui->toolBar->getVisibilityState()); + m_wide_bar_setting->set(ui->toolBar->getVisibilityState().toBase64()); } #include "ScreenshotsPage.moc" diff --git a/launcher/ui/pages/instance/ServersPage.cpp b/launcher/ui/pages/instance/ServersPage.cpp index 245bbffe2..ecf4b58dd 100644 --- a/launcher/ui/pages/instance/ServersPage.cpp +++ b/launcher/ui/pages/instance/ServersPage.cpp @@ -705,7 +705,7 @@ void ServersPage::openedImpl() auto const setting_name = QString("WideBarVisibility_%1").arg(id()); m_wide_bar_setting = APPLICATION->settings()->getOrRegisterSetting(setting_name); - ui->toolBar->setVisibilityState(m_wide_bar_setting->get().toByteArray()); + ui->toolBar->setVisibilityState(QByteArray::fromBase64(m_wide_bar_setting->get().toByteArray())); // ping servers m_model->queryServersStatus(); @@ -715,7 +715,7 @@ void ServersPage::closedImpl() { m_model->unobserve(); - m_wide_bar_setting->set(ui->toolBar->getVisibilityState()); + m_wide_bar_setting->set(ui->toolBar->getVisibilityState().toBase64()); } void ServersPage::on_actionAdd_triggered() diff --git a/launcher/ui/pages/instance/VersionPage.cpp b/launcher/ui/pages/instance/VersionPage.cpp index a1eeb3d25..16f5918b8 100644 --- a/launcher/ui/pages/instance/VersionPage.cpp +++ b/launcher/ui/pages/instance/VersionPage.cpp @@ -126,11 +126,11 @@ void VersionPage::openedImpl() auto const setting_name = QString("WideBarVisibility_%1").arg(id()); m_wide_bar_setting = APPLICATION->settings()->getOrRegisterSetting(setting_name); - ui->toolBar->setVisibilityState(m_wide_bar_setting->get().toByteArray()); + ui->toolBar->setVisibilityState(QByteArray::fromBase64(m_wide_bar_setting->get().toByteArray())); } void VersionPage::closedImpl() { - m_wide_bar_setting->set(ui->toolBar->getVisibilityState()); + m_wide_bar_setting->set(ui->toolBar->getVisibilityState().toBase64()); } QMenu* VersionPage::createPopupMenu() diff --git a/launcher/ui/pages/instance/WorldListPage.cpp b/launcher/ui/pages/instance/WorldListPage.cpp index 9e1a0fb55..e044c1083 100644 --- a/launcher/ui/pages/instance/WorldListPage.cpp +++ b/launcher/ui/pages/instance/WorldListPage.cpp @@ -121,14 +121,14 @@ void WorldListPage::openedImpl() auto const setting_name = QString("WideBarVisibility_%1").arg(id()); m_wide_bar_setting = APPLICATION->settings()->getOrRegisterSetting(setting_name); - ui->toolBar->setVisibilityState(m_wide_bar_setting->get().toByteArray()); + ui->toolBar->setVisibilityState(QByteArray::fromBase64(m_wide_bar_setting->get().toByteArray())); } void WorldListPage::closedImpl() { m_worlds->stopWatching(); - m_wide_bar_setting->set(ui->toolBar->getVisibilityState()); + m_wide_bar_setting->set(ui->toolBar->getVisibilityState().toBase64()); } WorldListPage::~WorldListPage()