diff --git a/kcm/src/controlpanel.cpp b/kcm/src/controlpanel.cpp --- a/kcm/src/controlpanel.cpp +++ b/kcm/src/controlpanel.cpp @@ -65,8 +65,10 @@ void ControlPanel::addOutput(const KScreen::OutputPtr &output) { - OutputConfig *outputCfg = new OutputConfig(output, this); + OutputConfig *outputCfg = new OutputConfig(this); outputCfg->setVisible(false); + outputCfg->setShowScaleOption(mConfig->supportedFeatures().testFlag(KScreen::Config::Feature::PerOutputScaling)); + outputCfg->setOutput(output); connect(outputCfg, &OutputConfig::changed, this, &ControlPanel::changed); diff --git a/kcm/src/outputconfig.h b/kcm/src/outputconfig.h --- a/kcm/src/outputconfig.h +++ b/kcm/src/outputconfig.h @@ -47,10 +47,14 @@ KScreen::OutputPtr output() const; void setTitle(const QString &title); + void setShowScaleOption(bool showScaleOption); + bool showScaleOption() const; + protected Q_SLOTS: void slotResolutionChanged(const QSize &size); void slotRotationChanged(int index); void slotRefreshRateChanged(int index); + void slotScaleChanged(int index); Q_SIGNALS: void changed(); @@ -64,7 +68,9 @@ QCheckBox *mEnabled; ResolutionSlider *mResolution; QComboBox *mRotation; + QComboBox *mScale; QComboBox *mRefreshRate; + bool mShowScaleOption = false; }; #endif // OUTPUTCONFIG_H diff --git a/kcm/src/outputconfig.cpp b/kcm/src/outputconfig.cpp --- a/kcm/src/outputconfig.cpp +++ b/kcm/src/outputconfig.cpp @@ -82,6 +82,12 @@ mRotation->setCurrentIndex(index); }); + connect(mOutput.data(), &KScreen::Output::scaleChanged, + this, [=]() { + const int index = mScale->findData(mOutput->scale()); + mScale->setCurrentIndex(index); + }); + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); QVBoxLayout *vbox = new QVBoxLayout(this); @@ -120,7 +126,18 @@ formLayout->addRow(i18n("Orientation:"), mRotation); - formLayout->addItem(new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum)); + if (mShowScaleOption) { + mScale = new QComboBox(this); + mScale->addItem(i18nc("Scale multiplier, show everything at 1 times normal scale", "1x"), 1); + mScale->addItem(i18nc("Scale multiplier, show everything at 2 times normal scale", "2x"), 2); + connect(mScale, static_cast(&QComboBox::activated), + this, &OutputConfig::slotScaleChanged); + mScale->setCurrentIndex(mScale->findData(mOutput->scale())); + + formLayout->addRow(i18n("Scale:"), mScale); + + formLayout->addItem(new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum)); + } CollapsableButton *advancedButton = new CollapsableButton(i18n("Advanced Settings"), this); advancedButton->setCollapsed(true); @@ -224,3 +241,23 @@ Q_EMIT changed(); } + +void OutputConfig::slotScaleChanged(int index) +{ + auto scale = mScale->itemData(index).toInt(); + mOutput->setScale(scale); + Q_EMIT changed(); +} + +void OutputConfig::setShowScaleOption(bool showScaleOption) +{ + mShowScaleOption = showScaleOption; + if (mOutput) { + initUi(); + } +} + +bool OutputConfig::showScaleOption() const +{ + return mShowScaleOption; +} diff --git a/kcm/src/widget.h b/kcm/src/widget.h --- a/kcm/src/widget.h +++ b/kcm/src/widget.h @@ -91,6 +91,7 @@ PrimaryOutputCombo *mPrimaryCombo; QComboBox *mProfilesCombo; + QPushButton *mScaleAllOutputsButton; QPushButton *mUnifyButton; QPushButton *mSaveProfileButton; diff --git a/kcm/src/widget.cpp b/kcm/src/widget.cpp --- a/kcm/src/widget.cpp +++ b/kcm/src/widget.cpp @@ -119,15 +119,16 @@ vbox->addWidget(mUnifyButton); - auto setScaleButton = new QPushButton(i18n("Scale Display"), this); - connect(setScaleButton, &QPushButton::released, + mScaleAllOutputsButton = new QPushButton(i18n("Scale Display"), this); + connect(mScaleAllOutputsButton, &QPushButton::released, [this] { QPointer dialog = new ScalingConfig(mConfig->outputs(), this); dialog->exec(); delete dialog; }); - - vbox->addWidget(setScaleButton); + + vbox->addWidget(mScaleAllOutputsButton); + mOutputTimer = new QTimer(this); connect(mOutputTimer, &QTimer::timeout, @@ -174,6 +175,8 @@ mControlPanel->setConfig(mConfig); mPrimaryCombo->setConfig(mConfig); mUnifyButton->setEnabled(mConfig->outputs().count() > 1); + mScaleAllOutputsButton->setVisible(!mConfig->supportedFeatures().testFlag(KScreen::Config::Feature::PerOutputScaling)); + for (const KScreen::OutputPtr &output : mConfig->outputs()) { connect(output.data(), &KScreen::Output::isEnabledChanged,