Files
qelectrotech-source-mirror/sources/utils/qetsettings.cpp
T
Kellermorph 9af562fcbd Remember the sheet background colour between runs
Picking a sheet (folio) background colour in the diagram editor was lost
on every restart. Diagram::background_color is a static initialised to
white and PaletteGraphicsView's s_custom_bg a static bool, and neither
was ever written anywhere -- Diagram::toXml() carries no colour attribute
either -- so closing and reopening a project always came back on the
default and the choice had to be made again.

Store it in QSettings under diagrameditor/sheet_background_* as a pair of
values rather than one: the colour, and whether it was picked explicitly.
Both halves are needed. "#ffffff, follow the system" and "#ffffff, always
white" are the same colour and two behaviours -- the first is what the
views invert on a dark palette -- so keeping only the colour would
silently turn one into the other on the next start, which is the reported
problem one step removed.

The colour is written as HexRgb on purpose. The SVG export gives
Diagram::background_color an alpha of 0 to render a transparent
background and never puts it back, and that transient value must not be
persisted as a permanently transparent sheet.

Applied from main() after the headless export and scripting branch -- those
return before reaching it and must keep rendering on plain white, the rule
ProjectPrintWindow already enforces for printing -- and before QETApp is
constructed, since that constructor already loads the projects given on
the command line. The GUI export dialog is left alone: it renders through
drawBackground(), so what you see is what you export, as it already was
within a session.

Saved at the moment the colour is applied rather than at shutdown, so
neither the print window's temporary white nor the SVG export's alpha can
reach it. The button's constructor now mirrors the stored state instead of
always claiming "system colour", and the "recently used" list is stored
alongside it.

Covered by tst_sheetbackgroundsetting, which pins the custom flag and the
dropped alpha -- the two rules a single stored colour would lose.
2026-09-24 10:30:01 +02:00

219 lines
7.0 KiB
C++

/*
Copyright 2006-2026 The QElectroTech Team
This file is part of QElectroTech.
QElectroTech is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
QElectroTech is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
*/
#include "qetsettings.h"
#include <QSettings>
#include <QVariant>
#include <QByteArray>
namespace QetSettings
{
/**
* @brief setHdpiScaleFactorRoundingPolicy
* Write the value of HdpiScaleFactorRoundingPolicy in
* QElectroTech settings
* the value is in form of a string.
* @a policy can be : Round, Ceil, Floor, RoundPreferFloor, PassThrough
* In case of wrong policy, PassThrough is use as default value.
* The value is stored with key : hdpi_scale_factor_rounding_policy
* @sa Qt::HighDpiScaleFactorRoundingPolicy
* @param policy
*/
void setHdpiScaleFactorRoundingPolicy(const QString &policy_str)
{
auto policy = QString("PassThrough");
if (policy_str == QLatin1String("Round")) {
policy = "Round";
} else if (policy_str == QLatin1String("Ceil")) {
policy = "Ceil";
} else if (policy_str == QLatin1String("Floor")) {
policy = "Floor";
} else if (policy_str == QLatin1String("RoundPreferFloor")) {
policy = "RoundPreferFloor";
}
QSettings settings;
settings.setValue("hdpi_scale_factor_rounding_policy", policy);
}
/**
* @brief setHdpiScaleFactorRoundingPolicy
* Overload function
* @sa void setHdpiScaleFactorRoundingPolicy(const QString &policy_str)
* @param policy
*/
void setHdpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy policy)
{
QString policy_str;
switch (policy) {
case Qt::HighDpiScaleFactorRoundingPolicy::Round:
policy_str = "Round";
break;
case Qt::HighDpiScaleFactorRoundingPolicy::Ceil:
policy_str = "Ceil";
break;
case Qt::HighDpiScaleFactorRoundingPolicy::Floor:
policy_str = "Floor";
break;
case Qt::HighDpiScaleFactorRoundingPolicy::RoundPreferFloor:
policy_str = "RoundPreferFloor";
break;
default:
policy_str = "PassThrough";
break;
}
QSettings settings;
settings.setValue("hdpi_scale_factor_rounding_policy", policy_str);
}
/**
* @brief hdpiScaleFactorRoundingPolicy
* @param default_policy
* @return the hdpiScaleFactorRoundingPolicy value stored in current settings.
* @sa setHdpiScaleFactorRoundingPolicy
*/
Qt::HighDpiScaleFactorRoundingPolicy hdpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy default_policy)
{
QSettings settings;
auto value_ = settings.value("hdpi_scale_factor_rounding_policy");
if (value_ == QLatin1String("Round")) {
return Qt::HighDpiScaleFactorRoundingPolicy::Round;
} else if (value_ == QLatin1String("Ceil")) {
return Qt::HighDpiScaleFactorRoundingPolicy::Ceil;
} else if (value_ == QLatin1String("Floor")) {
return Qt::HighDpiScaleFactorRoundingPolicy::Floor;
} else if (value_ == QLatin1String("RoundPreferFloor")) {
return Qt::HighDpiScaleFactorRoundingPolicy::RoundPreferFloor;
} else if (value_ == QLatin1String("PassThrough")) {
return Qt::HighDpiScaleFactorRoundingPolicy::PassThrough;
} else {
return default_policy;
}
}
/**
* @brief scriptingForcedByEnvironment
* @return true if QET_ENABLE_SCRIPTING is set to 1 in the environment.
*
* The way to turn scripting on where there is nobody to tick a box:
* a headless run, a CI job, a build server. Those have no settings
* file worth writing to -- and on a machine whose HOME is created
* fresh for the run, writing one would not survive anyway.
*/
bool scriptingForcedByEnvironment()
{
return qgetenv("QET_ENABLE_SCRIPTING") == QByteArray("1");
}
/**
* @brief scriptingEnabled
* @return whether QElectroTech may run a JavaScript script.
*
* Off unless the user turned it on. A script reaches the whole project
* and the filesystem through the export calls, so it is capability the
* great majority of users never asked for; leaving it on by default
* would hand it to them anyway. @sa setScriptingEnabled
*
* The environment override wins over the stored value, and is checked
* first so that a machine with no settings at all still answers.
*/
bool scriptingEnabled()
{
if (scriptingForcedByEnvironment()) {
return true;
}
QSettings settings;
return settings.value("scripting/enabled", false).toBool();
}
/**
* @brief setScriptingEnabled
* Store whether scripting is allowed. @sa scriptingEnabled
* @param enabled
*/
void setScriptingEnabled(bool enabled)
{
QSettings settings;
settings.setValue("scripting/enabled", enabled);
}
/**
* @brief setSheetBackground
* Store the sheet background last picked in the diagram editor, so the
* next start opens on it for every project, old or new. @sa sheetBackground
* @param background
*/
void setSheetBackground(const SheetBackground &background)
{
QSettings settings;
//HexRgb, not HexArgb, on purpose: Diagram::background_color is
//temporarily given an alpha of 0 by the SVG export to make the
//background transparent, and that transient value must never end
//up here as a stored transparent sheet.
settings.setValue(QStringLiteral("diagrameditor/sheet_background_color"),
background.color.name(QColor::HexRgb));
settings.setValue(QStringLiteral("diagrameditor/sheet_background_custom"),
background.custom);
}
/**
* @brief sheetBackground
* @return the sheet background stored by setSheetBackground(), or the
* built-in default (white, following the system) when there is none.
* @sa setSheetBackground
*/
SheetBackground sheetBackground()
{
QSettings settings;
SheetBackground background;
background.custom = settings.value(
QStringLiteral("diagrameditor/sheet_background_custom"),
false).toBool();
const QColor stored(settings.value(
QStringLiteral("diagrameditor/sheet_background_color"),
QStringLiteral("#ffffff")).toString());
background.color = stored.isValid() ? stored : QColor(Qt::white);
return background;
}
/**
* @brief sheetBackgroundRecentColors
* @return the "recently used" sheet background colours, most recent
* first. Empty until the user has picked a non-preset colour.
* @sa setSheetBackgroundRecentColors
*/
QStringList sheetBackgroundRecentColors()
{
QSettings settings;
return settings.value(QStringLiteral("diagrameditor/sheet_background_recent")).toStringList();
}
/**
* @brief setSheetBackgroundRecentColors
* Store the "recently used" sheet background colours, most recent first.
* @sa sheetBackgroundRecentColors
* @param colors
*/
void setSheetBackgroundRecentColors(const QStringList &colors)
{
QSettings settings;
settings.setValue(QStringLiteral("diagrameditor/sheet_background_recent"), colors);
}
}