aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/src/mainwindow.cpp11
-rw-r--r--src/src/moapplication.cpp43
-rw-r--r--src/src/settingsdialogtheme.cpp54
3 files changed, 31 insertions, 77 deletions
diff --git a/src/src/mainwindow.cpp b/src/src/mainwindow.cpp
index acdde48..e3cb1e4 100644
--- a/src/src/mainwindow.cpp
+++ b/src/src/mainwindow.cpp
@@ -2821,15 +2821,8 @@ void MainWindow::openPluginsFolder()
void MainWindow::openStylesheetsFolder()
{
- // Open the instance's stylesheets directory (where custom themes from
- // modlists live), or the user data dir as fallback.
- QString ssPath;
- if (auto ci = InstanceManager::singleton().currentInstance()) {
- ssPath =
- ci->directory() + "/" + QString::fromStdWString(AppConfig::stylesheetsPath());
- } else {
- ssPath = fluorineDataDir() + "/stylesheets";
- }
+ const QString ssPath = QCoreApplication::applicationDirPath() + "/" +
+ QString::fromStdWString(AppConfig::stylesheetsPath());
QDir().mkpath(ssPath);
shell::Explore(ssPath);
}
diff --git a/src/src/moapplication.cpp b/src/src/moapplication.cpp
index eb6e46d..f09f746 100644
--- a/src/src/moapplication.cpp
+++ b/src/src/moapplication.cpp
@@ -721,42 +721,31 @@ bool MOApplication::setStyleFile(const QString& styleName)
}
// set new stylesheet or clear it
if (styleName.length() != 0) {
- // Search for the stylesheet in multiple locations:
- // 1. applicationDirPath()/stylesheets/ — bundled themes
- // 2. instance baseDir/stylesheets/ — instance/portable themes (modlists)
- // 3. fluorineDataDir()/stylesheets/ — user-installed custom themes
+ // Stylesheets are application resources. Do not load copies supplied by an
+ // instance or from another user-writable search location.
const QString ssSubdir = MOBase::ToQString(AppConfig::stylesheetsPath());
- QStringList searchDirs;
- searchDirs << applicationDirPath() + "/" + ssSubdir;
- if (m_instance) {
- // Prefer baseDirectory() (populated after readFromIni), fall back to
- // directory() which is always set by the constructor.
- QString base = m_instance->baseDirectory();
- if (base.isEmpty())
- base = m_instance->directory();
- const QString instanceDir = base + "/" + ssSubdir;
- if (!searchDirs.contains(instanceDir))
- searchDirs << instanceDir;
- }
- const QString userDir = fluorineDataDir() + "/stylesheets";
- if (!searchDirs.contains(userDir))
- searchDirs << userDir;
-
+ const QString stylesheetDir = applicationDirPath() + "/" + ssSubdir;
QString resolved;
- for (const auto& dir : searchDirs) {
- QString const candidate = dir + "/" + styleName;
- if (QFile::exists(candidate)) {
- resolved = candidate;
- break;
+ if (QFileInfo(styleName).fileName() == styleName) {
+ const QString candidate = stylesheetDir + "/" + styleName;
+ const QString canonicalDir = QDir(stylesheetDir).canonicalPath();
+ const QString canonicalFile = QFileInfo(candidate).canonicalFilePath();
+ if (!canonicalDir.isEmpty() &&
+ canonicalFile.startsWith(canonicalDir + "/") &&
+ QFileInfo(canonicalFile).isFile()) {
+ resolved = canonicalFile;
}
}
if (!resolved.isEmpty()) {
m_styleWatcher.addPath(resolved);
updateStyle(resolved);
- } else {
- // Could be a built-in Qt style name (e.g. "Fusion")
+ } else if (QStyleFactory::keys().contains(styleName)) {
updateStyle(styleName);
+ } else {
+ log::warn("stylesheet '{}' is not installed in '{}'", styleName,
+ stylesheetDir);
+ return false;
}
} else {
setStyle(new ProxyStyle(QStyleFactory::create(m_defaultStyle)));
diff --git a/src/src/settingsdialogtheme.cpp b/src/src/settingsdialogtheme.cpp
index 951e997..289f550 100644
--- a/src/src/settingsdialogtheme.cpp
+++ b/src/src/settingsdialogtheme.cpp
@@ -1,11 +1,9 @@
#include "settingsdialogtheme.h"
#include "categoriesdialog.h"
#include "colortable.h"
-#include "instancemanager.h"
#include "modlist.h"
#include "shared/appconfig.h"
#include "ui_settingsdialog.h"
-#include "fluorinepaths.h"
#include <QFontDatabase>
#include <QFontInfo>
@@ -83,33 +81,14 @@ void ThemeSettingsTab::addStyles()
ui->styleBox->insertSeparator(ui->styleBox->count());
- // Collect .qss files from all stylesheet search directories, deduplicating
- // by filename so bundled themes aren't listed twice.
- const QString ssSubdir = QString::fromStdWString(AppConfig::stylesheetsPath());
- QStringList searchDirs;
- searchDirs << QCoreApplication::applicationDirPath() + "/" + ssSubdir;
- if (auto ci = InstanceManager::singleton().currentInstance()) {
- // currentInstance() returns a bare Instance (readFromIni() not called),
- // so baseDirectory() is empty. Use directory() which is always set.
- const QString instanceDir = ci->directory() + "/" + ssSubdir;
- if (!searchDirs.contains(instanceDir))
- searchDirs << instanceDir;
- }
- const QString userDir = fluorineDataDir() + "/stylesheets";
- if (!searchDirs.contains(userDir))
- searchDirs << userDir;
-
- QSet<QString> seen;
- for (const auto& dir : searchDirs) {
- QDirIterator iter(dir, QStringList("*.qss"), QDir::Files);
- while (iter.hasNext()) {
- iter.next();
- const QString fileName = iter.fileName();
- if (seen.contains(fileName))
- continue;
- seen.insert(fileName);
- ui->styleBox->addItem(iter.fileInfo().completeBaseName(), fileName);
- }
+ // Only expose stylesheets installed with Fluorine Manager.
+ const QString ssSubdir = QString::fromStdWString(AppConfig::stylesheetsPath());
+ const QString stylesheetDir =
+ QCoreApplication::applicationDirPath() + "/" + ssSubdir;
+ QDirIterator iter(stylesheetDir, QStringList("*.qss"), QDir::Files);
+ while (iter.hasNext()) {
+ iter.next();
+ ui->styleBox->addItem(iter.fileInfo().completeBaseName(), iter.fileName());
}
}
@@ -159,15 +138,8 @@ void ThemeSettingsTab::selectFontFamily()
void ThemeSettingsTab::onExploreStyles()
{
- // Open the instance's stylesheets directory (where custom themes from
- // modlists live), or the user data dir as fallback.
- QString ssPath;
- if (auto ci = InstanceManager::singleton().currentInstance()) {
- ssPath =
- ci->directory() + "/" + QString::fromStdWString(AppConfig::stylesheetsPath());
- } else {
- ssPath = fluorineDataDir() + "/stylesheets";
- }
- QDir().mkpath(ssPath);
- shell::Explore(ssPath);
-}
+ const QString ssPath = QCoreApplication::applicationDirPath() + "/" +
+ QString::fromStdWString(AppConfig::stylesheetsPath());
+ QDir().mkpath(ssPath);
+ shell::Explore(ssPath);
+}