-
-
Notifications
You must be signed in to change notification settings - Fork 1.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Q scale factor from preferences #3960
Changes from 10 commits
a147a63
6fe8dfe
3a41380
ca9e1b8
efbfb27
27e66c9
3cbfba0
6bb1451
a6942b5
2aee818
72cd0b3
03422cd
d3fabee
28581b9
46182d1
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,11 +1,13 @@ | ||
#include <QApplication> | ||
#include <QDir> | ||
#include <QSettings> | ||
#include <QString> | ||
#include <QStringList> | ||
#include <QTextCodec> | ||
#include <QThread> | ||
#include <QtDebug> | ||
|
||
#include "config.h" | ||
#include "coreservices.h" | ||
#include "errordialoghandler.h" | ||
#include "mixxxapplication.h" | ||
|
@@ -22,6 +24,9 @@ namespace { | |
constexpr int kFatalErrorOnStartupExitCode = 1; | ||
constexpr int kParseCmdlineArgsErrorExitCode = 2; | ||
|
||
constexpr char kScaleFactorEnvVar[] = "QT_SCALE_FACTOR"; | ||
const QString kScaleFactorConfigKey = QStringLiteral("ScaleFactor"); | ||
|
||
int runMixxx(MixxxApplication* app, const CmdlineArgs& args) { | ||
auto coreServices = std::make_shared<mixxx::CoreServices>(args); | ||
MixxxMainWindow mainWindow(app, coreServices); | ||
|
@@ -38,6 +43,41 @@ int runMixxx(MixxxApplication* app, const CmdlineArgs& args) { | |
} | ||
} | ||
|
||
void adjustScaleFactor(CmdlineArgs* pArgs) { | ||
if (qEnvironmentVariableIsSet(kScaleFactorEnvVar)) { | ||
bool ok; | ||
const double f = qgetenv(kScaleFactorEnvVar).toDouble(&ok); | ||
if (ok && f > 0) { | ||
// The environment variable overrides the preferences option | ||
qDebug() << "Using" << kScaleFactorEnvVar << f; | ||
pArgs->storeScaleFactor(f); | ||
return; | ||
} | ||
} | ||
// We cannot use ConfigObject, because it depends on MixxxApplication | ||
// but the scale factor is read during it's constructor. | ||
// QHighDpiScaling can not be used afterwards because it is private. | ||
auto cfgFile = QFile(QDir(pArgs->getSettingsPath()).filePath(MIXXX_SETTINGS_FILE)); | ||
if (cfgFile.open(QFile::ReadOnly | QFile::Text)) { | ||
QTextStream in(&cfgFile); | ||
QString strScaleFactor; | ||
QString line = in.readLine(); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Better use |
||
while (!line.isNull()) { | ||
if (line.startsWith(kScaleFactorConfigKey)) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Have you considered using There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, unfortunately the attempt failed because QSettings expects a "=" between key and value, which is not used in our ini file. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ok. It looks like only the constructor depends on QApplication to construct file paths. Can you just add a ConfigObject static method like |
||
strScaleFactor = line.mid(kScaleFactorConfigKey.size() + 1); | ||
break; | ||
} | ||
line = in.readLine(); | ||
} | ||
double scaleFactor = strScaleFactor.toDouble(); | ||
if (scaleFactor > 0) { | ||
qDebug() << "Using preferences ScaleFactor" << scaleFactor; | ||
qputenv(kScaleFactorEnvVar, strScaleFactor.toLocal8Bit()); | ||
pArgs->storeScaleFactor(scaleFactor); | ||
} | ||
} | ||
} | ||
|
||
} // anonymous namespace | ||
|
||
int main(int argc, char * argv[]) { | ||
|
@@ -83,6 +123,8 @@ int main(int argc, char * argv[]) { | |
Sandbox::checkSandboxed(); | ||
#endif | ||
|
||
adjustScaleFactor(&args); | ||
|
||
MixxxApplication app(argc, argv); | ||
|
||
#ifdef __APPLE__ | ||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -24,6 +24,19 @@ | |||||||||||||||||
using mixxx::skin::SkinManifest; | ||||||||||||||||||
using mixxx::skin::SkinPointer; | ||||||||||||||||||
|
||||||||||||||||||
namespace { | ||||||||||||||||||
|
||||||||||||||||||
const QString kConfigGroup = QStringLiteral("[Config]"); | ||||||||||||||||||
const QString kControlsGroup = QStringLiteral("[Controls]"); | ||||||||||||||||||
const QString kScaleFactorKey = QStringLiteral("ScaleFactor"); | ||||||||||||||||||
const QString kStartInFullscreenKey = QStringLiteral("StartInFullscreen"); | ||||||||||||||||||
const QString kSchemeKey = QStringLiteral("Scheme"); | ||||||||||||||||||
const QString kResizableSkinKey = QStringLiteral("ResizableSkin"); | ||||||||||||||||||
const QString kLocaleKey = QStringLiteral("Locale"); | ||||||||||||||||||
const QString kTooltipsKey = QStringLiteral("Tooltips"); | ||||||||||||||||||
|
||||||||||||||||||
} // namespace | ||||||||||||||||||
|
||||||||||||||||||
DlgPrefInterface::DlgPrefInterface( | ||||||||||||||||||
QWidget* parent, | ||||||||||||||||||
std::shared_ptr<mixxx::ScreensaverManager> pScreensaverManager, | ||||||||||||||||||
|
@@ -34,9 +47,8 @@ DlgPrefInterface::DlgPrefInterface( | |||||||||||||||||
m_pScreensaverManager(pScreensaverManager), | ||||||||||||||||||
m_pSkinLoader(pSkinLoader), | ||||||||||||||||||
m_pSkin(pSkinLoader->getConfiguredSkin()), | ||||||||||||||||||
m_dScaleFactorAuto(1.0), | ||||||||||||||||||
m_bUseAutoScaleFactor(false), | ||||||||||||||||||
m_dScaleFactor(1.0), | ||||||||||||||||||
m_minScaleFactor(1.0), | ||||||||||||||||||
m_dDevicePixelRatio(1.0), | ||||||||||||||||||
m_bStartWithFullScreen(false), | ||||||||||||||||||
m_bRebootMixxxView(false) { | ||||||||||||||||||
|
@@ -45,6 +57,16 @@ DlgPrefInterface::DlgPrefInterface( | |||||||||||||||||
// get the pixel ratio to display a crisp skin preview when Mixxx is scaled | ||||||||||||||||||
m_dDevicePixelRatio = getDevicePixelRatioF(this); | ||||||||||||||||||
|
||||||||||||||||||
// Calculate the minimum scale factor that leads to a device pixel ratio of 1.0 | ||||||||||||||||||
// m_dDevicePixelRatio must not drop below 1.0 because this creates an | ||||||||||||||||||
// unusable GUI with visual artefacts | ||||||||||||||||||
double initialScaleFactor = CmdlineArgs::Instance().getScaleFactor(); | ||||||||||||||||||
if (initialScaleFactor <= 0) { | ||||||||||||||||||
initialScaleFactor = 1.0; | ||||||||||||||||||
} | ||||||||||||||||||
double unscaledDevicePixelRatio = m_dDevicePixelRatio / initialScaleFactor; | ||||||||||||||||||
m_minScaleFactor = 1 / unscaledDevicePixelRatio; | ||||||||||||||||||
|
||||||||||||||||||
VERIFY_OR_DEBUG_ASSERT(m_pSkin != nullptr) { | ||||||||||||||||||
qWarning() << "Skipping creation of DlgPrefInterface because there is no skin available."; | ||||||||||||||||||
return; | ||||||||||||||||||
|
@@ -149,13 +171,12 @@ DlgPrefInterface::DlgPrefInterface( | |||||||||||||||||
this, | ||||||||||||||||||
&DlgPrefInterface::slotSetScheme); | ||||||||||||||||||
|
||||||||||||||||||
checkBoxScaleFactorAuto->hide(); | ||||||||||||||||||
spinBoxScaleFactor->hide(); | ||||||||||||||||||
labelScaleFactor->hide(); | ||||||||||||||||||
|
||||||||||||||||||
// Start in fullscreen mode | ||||||||||||||||||
checkBoxStartFullScreen->setChecked(m_pConfig->getValueString( | ||||||||||||||||||
ConfigKey("[Config]", "StartInFullscreen")).toInt()==1); | ||||||||||||||||||
checkBoxStartFullScreen->setChecked( | ||||||||||||||||||
m_pConfig | ||||||||||||||||||
->getValueString( | ||||||||||||||||||
ConfigKey(kConfigGroup, kStartInFullscreenKey)) | ||||||||||||||||||
.toInt() == 1); | ||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. there are some ugly linebreaks now.
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why not make the whole config key a constant? Then the line would be shorter. |
||||||||||||||||||
|
||||||||||||||||||
// Screensaver mode | ||||||||||||||||||
comboBoxScreensaver->clear(); | ||||||||||||||||||
|
@@ -211,7 +232,7 @@ void DlgPrefInterface::slotUpdateSchemes() { | |||||||||||||||||
m_colorScheme = QString(); | ||||||||||||||||||
} else { | ||||||||||||||||||
ComboBoxSchemeconf->setEnabled(true); | ||||||||||||||||||
QString configScheme = m_pConfig->getValueString(ConfigKey("[Config]", "Scheme")); | ||||||||||||||||||
QString configScheme = m_pConfig->getValueString(ConfigKey(kConfigGroup, kSchemeKey)); | ||||||||||||||||||
bool foundConfigScheme = false; | ||||||||||||||||||
for (int i = 0; i < schlist.size(); i++) { | ||||||||||||||||||
ComboBoxSchemeconf->addItem(schlist[i]); | ||||||||||||||||||
|
@@ -234,7 +255,7 @@ void DlgPrefInterface::slotUpdateSchemes() { | |||||||||||||||||
|
||||||||||||||||||
void DlgPrefInterface::slotUpdate() { | ||||||||||||||||||
const QString skinNameOnUpdate = | ||||||||||||||||||
m_pConfig->getValueString(ConfigKey("[Config]", "ResizableSkin")); | ||||||||||||||||||
m_pConfig->getValueString(ConfigKey(kConfigGroup, kResizableSkinKey)); | ||||||||||||||||||
const SkinPointer pSkinOnUpdate = m_skins[skinNameOnUpdate]; | ||||||||||||||||||
if (pSkinOnUpdate != nullptr && pSkinOnUpdate->isValid()) { | ||||||||||||||||||
m_skinNameOnUpdate = pSkinOnUpdate->name(); | ||||||||||||||||||
|
@@ -245,19 +266,18 @@ void DlgPrefInterface::slotUpdate() { | |||||||||||||||||
slotUpdateSchemes(); | ||||||||||||||||||
m_bRebootMixxxView = false; | ||||||||||||||||||
|
||||||||||||||||||
m_localeOnUpdate = m_pConfig->getValueString(ConfigKey("[Config]", "Locale")); | ||||||||||||||||||
m_localeOnUpdate = m_pConfig->getValueString(ConfigKey(kConfigGroup, kLocaleKey)); | ||||||||||||||||||
ComboBoxLocale->setCurrentIndex(ComboBoxLocale->findData(m_localeOnUpdate)); | ||||||||||||||||||
|
||||||||||||||||||
checkBoxScaleFactorAuto->setChecked(m_pConfig->getValue( | ||||||||||||||||||
ConfigKey("[Config]", "ScaleFactorAuto"), m_bUseAutoScaleFactor)); | ||||||||||||||||||
|
||||||||||||||||||
// The spinbox shows a percentage but Mixxx stores a multiplication factor | ||||||||||||||||||
// with 1.00 as no scaling, so multiply the stored value by 100. | ||||||||||||||||||
spinBoxScaleFactor->setValue(m_pConfig->getValue( | ||||||||||||||||||
uklotzde marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||
ConfigKey("[Config]", "ScaleFactor"), m_dScaleFactor) * 100); | ||||||||||||||||||
ConfigKey(kConfigGroup, kScaleFactorKey), m_dScaleFactor) * | ||||||||||||||||||
100); | ||||||||||||||||||
spinBoxScaleFactor->setMinimum(m_minScaleFactor * 100); | ||||||||||||||||||
|
||||||||||||||||||
checkBoxStartFullScreen->setChecked(m_pConfig->getValue( | ||||||||||||||||||
ConfigKey("[Config]", "StartInFullscreen"), m_bStartWithFullScreen)); | ||||||||||||||||||
ConfigKey(kConfigGroup, kStartInFullscreenKey), m_bStartWithFullScreen)); | ||||||||||||||||||
|
||||||||||||||||||
loadTooltipPreferenceFromConfig(); | ||||||||||||||||||
|
||||||||||||||||||
|
@@ -276,9 +296,6 @@ void DlgPrefInterface::slotResetToDefaults() { | |||||||||||||||||
// Default to normal size widgets | ||||||||||||||||||
// The spinbox shows a percentage with 100% as no scaling. | ||||||||||||||||||
spinBoxScaleFactor->setValue(100); | ||||||||||||||||||
if (m_dScaleFactorAuto > 0) { | ||||||||||||||||||
checkBoxScaleFactorAuto->setChecked(true); | ||||||||||||||||||
} | ||||||||||||||||||
|
||||||||||||||||||
// Don't start in full screen. | ||||||||||||||||||
checkBoxStartFullScreen->setChecked(false); | ||||||||||||||||||
|
@@ -291,29 +308,6 @@ void DlgPrefInterface::slotResetToDefaults() { | |||||||||||||||||
radioButtonTooltipsLibraryAndSkin->setChecked(true); | ||||||||||||||||||
} | ||||||||||||||||||
|
||||||||||||||||||
void DlgPrefInterface::slotSetScaleFactor(double newValue) { | ||||||||||||||||||
// The spinbox shows a percentage, but Mixxx stores a multiplication factor | ||||||||||||||||||
// with 1.00 as no change. | ||||||||||||||||||
newValue /= 100.0; | ||||||||||||||||||
if (m_dScaleFactor != newValue) { | ||||||||||||||||||
m_dScaleFactor = newValue; | ||||||||||||||||||
m_bRebootMixxxView = true; | ||||||||||||||||||
} | ||||||||||||||||||
} | ||||||||||||||||||
|
||||||||||||||||||
void DlgPrefInterface::slotSetScaleFactorAuto(bool newValue) { | ||||||||||||||||||
if (newValue) { | ||||||||||||||||||
if (!m_bUseAutoScaleFactor) { | ||||||||||||||||||
m_bRebootMixxxView = true; | ||||||||||||||||||
} | ||||||||||||||||||
} else { | ||||||||||||||||||
slotSetScaleFactor(newValue); | ||||||||||||||||||
} | ||||||||||||||||||
|
||||||||||||||||||
m_bUseAutoScaleFactor = newValue; | ||||||||||||||||||
spinBoxScaleFactor->setEnabled(!newValue); | ||||||||||||||||||
} | ||||||||||||||||||
|
||||||||||||||||||
void DlgPrefInterface::slotSetTooltips() { | ||||||||||||||||||
m_tooltipMode = mixxx::TooltipsPreference::TOOLTIPS_ON; | ||||||||||||||||||
if (radioButtonTooltipsOff->isChecked()) { | ||||||||||||||||||
|
@@ -325,9 +319,10 @@ void DlgPrefInterface::slotSetTooltips() { | |||||||||||||||||
|
||||||||||||||||||
void DlgPrefInterface::notifyRebootNecessary() { | ||||||||||||||||||
// make the fact that you have to restart mixxx more obvious | ||||||||||||||||||
QMessageBox::information( | ||||||||||||||||||
this, tr("Information"), | ||||||||||||||||||
tr("Mixxx must be restarted before the new locale setting will take effect.")); | ||||||||||||||||||
QMessageBox::information(this, | ||||||||||||||||||
tr("Information"), | ||||||||||||||||||
tr("Mixxx must be restarted before the new locale or scaling " | ||||||||||||||||||
"settings will take effect.")); | ||||||||||||||||||
} | ||||||||||||||||||
|
||||||||||||||||||
void DlgPrefInterface::slotSetScheme(int) { | ||||||||||||||||||
|
@@ -389,26 +384,20 @@ void DlgPrefInterface::slotSetSkin(int) { | |||||||||||||||||
} | ||||||||||||||||||
|
||||||||||||||||||
void DlgPrefInterface::slotApply() { | ||||||||||||||||||
m_pConfig->set(ConfigKey("[Config]", "ResizableSkin"), m_pSkin->name()); | ||||||||||||||||||
m_pConfig->set(ConfigKey("[Config]", "Scheme"), m_colorScheme); | ||||||||||||||||||
m_pConfig->set(ConfigKey(kConfigGroup, kResizableSkinKey), m_pSkin->name()); | ||||||||||||||||||
m_pConfig->set(ConfigKey(kConfigGroup, kSchemeKey), m_colorScheme); | ||||||||||||||||||
|
||||||||||||||||||
QString locale = ComboBoxLocale->itemData( | ||||||||||||||||||
ComboBoxLocale->currentIndex()).toString(); | ||||||||||||||||||
m_pConfig->set(ConfigKey("[Config]", "Locale"), locale); | ||||||||||||||||||
m_pConfig->set(ConfigKey(kConfigGroup, kLocaleKey), locale); | ||||||||||||||||||
|
||||||||||||||||||
m_pConfig->setValue( | ||||||||||||||||||
ConfigKey("[Config]", "ScaleFactorAuto"), m_bUseAutoScaleFactor); | ||||||||||||||||||
if (m_bUseAutoScaleFactor) { | ||||||||||||||||||
m_pConfig->setValue( | ||||||||||||||||||
ConfigKey("[Config]", "ScaleFactor"), m_dScaleFactorAuto); | ||||||||||||||||||
} else { | ||||||||||||||||||
m_pConfig->setValue(ConfigKey("[Config]", "ScaleFactor"), m_dScaleFactor); | ||||||||||||||||||
} | ||||||||||||||||||
double scaleFactor = spinBoxScaleFactor->value() / 100; | ||||||||||||||||||
m_pConfig->setValue(ConfigKey(kConfigGroup, kScaleFactorKey), scaleFactor); | ||||||||||||||||||
|
||||||||||||||||||
m_pConfig->set(ConfigKey("[Config]", "StartInFullscreen"), | ||||||||||||||||||
m_pConfig->set(ConfigKey(kConfigGroup, kStartInFullscreenKey), | ||||||||||||||||||
ConfigValue(checkBoxStartFullScreen->isChecked())); | ||||||||||||||||||
|
||||||||||||||||||
m_pConfig->set(ConfigKey("[Controls]", "Tooltips"), | ||||||||||||||||||
m_pConfig->set(ConfigKey(kControlsGroup, kTooltipsKey), | ||||||||||||||||||
ConfigValue(static_cast<int>(m_tooltipMode))); | ||||||||||||||||||
emit tooltipModeChanged(m_tooltipMode); | ||||||||||||||||||
|
||||||||||||||||||
|
@@ -421,10 +410,11 @@ void DlgPrefInterface::slotApply() { | |||||||||||||||||
static_cast<mixxx::ScreenSaverPreference>(screensaverComboBoxState)); | ||||||||||||||||||
} | ||||||||||||||||||
|
||||||||||||||||||
if (locale != m_localeOnUpdate) { | ||||||||||||||||||
if (locale != m_localeOnUpdate || scaleFactor != m_dScaleFactor) { | ||||||||||||||||||
notifyRebootNecessary(); | ||||||||||||||||||
// hack to prevent showing the notification when pressing "Okay" after "Apply" | ||||||||||||||||||
m_localeOnUpdate = locale; | ||||||||||||||||||
m_dScaleFactor = scaleFactor; | ||||||||||||||||||
} | ||||||||||||||||||
|
||||||||||||||||||
if (m_bRebootMixxxView) { | ||||||||||||||||||
|
@@ -437,7 +427,7 @@ void DlgPrefInterface::slotApply() { | |||||||||||||||||
|
||||||||||||||||||
void DlgPrefInterface::loadTooltipPreferenceFromConfig() { | ||||||||||||||||||
const auto tooltipMode = static_cast<mixxx::TooltipsPreference>( | ||||||||||||||||||
m_pConfig->getValue(ConfigKey("[Controls]", "Tooltips"), | ||||||||||||||||||
m_pConfig->getValue(ConfigKey(kControlsGroup, kTooltipsKey), | ||||||||||||||||||
static_cast<int>(mixxx::TooltipsPreference::TOOLTIPS_ON))); | ||||||||||||||||||
switch (tooltipMode) { | ||||||||||||||||||
case mixxx::TooltipsPreference::TOOLTIPS_OFF: | ||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
QSettings seems to be unused and a left-over from previous experiments?