Krita Source Code Documentation
Loading...
Searching...
No Matches
KisAndroidScaling Class Reference

#include <KisAndroidScaling.h>

+ Inheritance diagram for KisAndroidScaling:

Signals

void sigInterfaceScaleChanged ()
 
void sigJniSaveInterfaceScale (bool askOnStartup)
 
void sigJniScalingDialogActive (bool active)
 
void sigJniSetPrimaryScreenScale (qreal scale)
 

Public Member Functions

bool isSupported () const
 
 KisAndroidScaling (KisConfig &cfg, KisApplication *app)
 
void showDialog ()
 

Static Public Member Functions

static KisAndroidScaling * instance ()
 

Private Slots

void slotJniSaveInterfaceScale (bool askOnStartup)
 
void slotJniScalingDialogActive (bool active)
 
void slotJniSetPrimaryScreenScale (qreal scale)
 
void slotSplashDialogDismissed ()
 

Private Member Functions

qreal getValidInitialScale (KisConfig &cfg) const
 
void maybeShowDialog (bool startup)
 
void setPrimaryScreenScale (qreal scale)
 

Static Private Member Functions

static bool isHighDpiScalingEnabled ()
 

Private Attributes

QPointer< QScreen > m_initialPrimaryScreen
 
qreal m_initialPrimaryScreenDevicePixelRatio = 0.0
 
bool m_scalingDialogActive = false
 

Detailed Description

Definition at line 16 of file KisAndroidScaling.h.

Constructor & Destructor Documentation

◆ KisAndroidScaling()

KisAndroidScaling::KisAndroidScaling ( KisConfig & cfg,
KisApplication * app )
explicit

Definition at line 22 of file KisAndroidScaling.cpp.

23 : QObject(app)
24{
25 KIS_ASSERT(app);
26
28 QScreen *screen = QGuiApplication::primaryScreen();
29 if (screen) {
31 m_initialPrimaryScreenDevicePixelRatio = screen->devicePixelRatio();
32 }
33 }
34
35 qreal scale = getValidInitialScale(cfg);
36 if (scale >= 1.0) {
38 } else {
39 // Reset the configuration, it wasn't valid or the screen changed.
40 cfg.setAndroidScalingLastInitialScale(cfg.androidScalingLastInitialScale(true));
41 cfg.setAndroidScalingTargetScale(cfg.androidScalingTargetScale(true));
42 cfg.setAndroidScalingAskOnStartup(cfg.androidScalingAskOnStartup(true));
43 }
44
45 // Queued connections are used in the following to make sure they run on
46 // the main thread. The signals may come from the Android UI thread.
47 connect(this,
49 this,
51 Qt::QueuedConnection);
52 connect(this,
54 this,
56 Qt::QueuedConnection);
57 connect(this,
59 this,
61 Qt::QueuedConnection);
62
63 KisAndroidDonations *androidDonations = app->androidDonations();
64 KIS_SAFE_ASSERT_RECOVER_NOOP(androidDonations);
65 if (androidDonations) {
66 connect(androidDonations,
68 this,
70 Qt::QueuedConnection);
71 }
72}
void sigSplashDialogDismissed()
qreal getValidInitialScale(KisConfig &cfg) const
QPointer< QScreen > m_initialPrimaryScreen
qreal m_initialPrimaryScreenDevicePixelRatio
void sigJniScalingDialogActive(bool active)
void sigJniSaveInterfaceScale(bool askOnStartup)
void sigJniSetPrimaryScreenScale(qreal scale)
void setPrimaryScreenScale(qreal scale)
void slotJniSaveInterfaceScale(bool askOnStartup)
void slotJniScalingDialogActive(bool active)
void slotJniSetPrimaryScreenScale(qreal scale)
static bool isHighDpiScalingEnabled()
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:130
#define KIS_ASSERT(cond)
Definition kis_assert.h:33

References getValidInitialScale(), isHighDpiScalingEnabled(), KIS_ASSERT, KIS_SAFE_ASSERT_RECOVER_NOOP, m_initialPrimaryScreen, m_initialPrimaryScreenDevicePixelRatio, setPrimaryScreenScale(), sigJniSaveInterfaceScale(), sigJniScalingDialogActive(), sigJniSetPrimaryScreenScale(), KisAndroidDonations::sigSplashDialogDismissed(), slotJniSaveInterfaceScale(), slotJniScalingDialogActive(), slotJniSetPrimaryScreenScale(), and slotSplashDialogDismissed().

Member Function Documentation

◆ getValidInitialScale()

qreal KisAndroidScaling::getValidInitialScale ( KisConfig & cfg) const
private

Definition at line 128 of file KisAndroidScaling.cpp.

129{
130 if (m_initialPrimaryScreen.isNull()) {
131 return 0.0;
132 }
133
134 // If we don't have a previous screen scale or the default screen scale
135 // changed, the configuration is invalid and we fall back to the default.
136 qreal lastInitialScale = cfg.androidScalingLastInitialScale();
137 if (lastInitialScale < 1.0 || !qFuzzyCompare(lastInitialScale, m_initialPrimaryScreenDevicePixelRatio)) {
138 return 0.0;
139 }
140
141 return cfg.androidScalingTargetScale();
142}
static bool qFuzzyCompare(half p1, half p2)

References m_initialPrimaryScreen, m_initialPrimaryScreenDevicePixelRatio, and qFuzzyCompare().

◆ instance()

KisAndroidScaling * KisAndroidScaling::instance ( )
static

Definition at line 74 of file KisAndroidScaling.cpp.

75{
76 KisApplication *app = qobject_cast<KisApplication *>(KisApplication::instance());
77 if (app) {
78 return app->androidScaling();
79 } else {
80 return nullptr;
81 }
82}
Base class for the Krita app.

◆ isHighDpiScalingEnabled()

bool KisAndroidScaling::isHighDpiScalingEnabled ( )
staticprivate

Definition at line 114 of file KisAndroidScaling.cpp.

115{
116 // Detects whether we have scaling available in this session. Compare
117 // with the startup handling of the scaling setting in main.cc. We do
118 // *not* check the config value here, it only applies after a restart.
119#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
120 return !qEnvironmentVariableIsSet("QT_ENABLE_HIGHDPI_SCALING")
121 && qgetenv("QT_ENABLE_HIGHDPI_SCALING") != QByteArrayLiteral("0");
122#else
123 return QCoreApplication::testAttribute(Qt::AA_EnableHighDpiScaling)
124 && !QCoreApplication::testAttribute(Qt::AA_DisableHighDpiScaling);
125#endif
126}

◆ isSupported()

bool KisAndroidScaling::isSupported ( ) const
inline

Definition at line 25 of file KisAndroidScaling.h.

26 {
27 return !m_initialPrimaryScreen.isNull();
28 }

◆ maybeShowDialog()

void KisAndroidScaling::maybeShowDialog ( bool startup)
private

Definition at line 162 of file KisAndroidScaling.cpp.

163{
164 // We want to see the dialog if scaling is supported, the dialog isn't
165 // already up and either the user manually summoned it or they want to
166 // see the dialog on startup. The user can only decide to remember the
167 // scaling setting after they decided on a target scale at least once
168 // before. This is to make sure that they actually used the application
169 // at that scale and can make an informed decision about not wanting to
170 // see the dialog again instead of despairing at choosing a wrong scale
171 // and being unable to find the dialog again.
173 return;
174 }
175
176 QScreen *screen = m_initialPrimaryScreen.data();
177 if (!screen) {
178 return;
179 }
180
181 KisConfig cfg(true);
182 bool haveTargetScale = cfg.androidScalingTargetScale() >= 1.0;
183 bool askOnStartup = cfg.androidScalingAskOnStartup();
184 if (!startup || askOnStartup) {
185 QJniObject activity = QJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative",
186 "activity",
187 "()Landroid/app/Activity;");
188 KisAndroidUtils::clearJniException(QStringLiteral("getting activity in KisAndroidScalingDialog"));
189
190 if (activity.isValid()) {
191 activity.callMethod<void>("showScalingDialog",
192 "(DDZZ)V",
193 jdouble(m_initialPrimaryScreen->devicePixelRatio()),
195 jboolean(askOnStartup),
196 jboolean(!startup || haveTargetScale));
197 KisAndroidUtils::clearJniException(QStringLiteral("showing scaling dialog in KisAndroidScalingDialog"));
198 }
199 }
200}
void clearJniException(const QString &location)

References KisAndroidUtils::clearJniException(), m_initialPrimaryScreen, m_initialPrimaryScreenDevicePixelRatio, and m_scalingDialogActive.

◆ setPrimaryScreenScale()

void KisAndroidScaling::setPrimaryScreenScale ( qreal scale)
private

Definition at line 144 of file KisAndroidScaling.cpp.

145{
147 QScreen *screen = m_initialPrimaryScreen.data();
148 if (screen) {
149 QPlatformScreen *platformScreen = screen->handle();
150 if (platformScreen) {
151 qreal actualScale = qMax(1.0, scale);
152 qreal densityAdjustment = actualScale / m_initialPrimaryScreenDevicePixelRatio;
153 if (!qFuzzyCompare(densityAdjustment, platformScreen->densityAdjustment())) {
154 platformScreen->setDensityAdjustment(densityAdjustment);
156 }
157 }
158 }
159 }
160}
void sigInterfaceScaleChanged()

References m_initialPrimaryScreen, m_initialPrimaryScreenDevicePixelRatio, qFuzzyCompare(), and sigInterfaceScaleChanged().

◆ showDialog()

void KisAndroidScaling::showDialog ( )
inline

Definition at line 30 of file KisAndroidScaling.h.

31 {
32 maybeShowDialog(false);
33 }
void maybeShowDialog(bool startup)

◆ sigInterfaceScaleChanged

void KisAndroidScaling::sigInterfaceScaleChanged ( )
signal

◆ sigJniSaveInterfaceScale

void KisAndroidScaling::sigJniSaveInterfaceScale ( bool askOnStartup)
signal

◆ sigJniScalingDialogActive

void KisAndroidScaling::sigJniScalingDialogActive ( bool active)
signal

◆ sigJniSetPrimaryScreenScale

void KisAndroidScaling::sigJniSetPrimaryScreenScale ( qreal scale)
signal

◆ slotJniSaveInterfaceScale

void KisAndroidScaling::slotJniSaveInterfaceScale ( bool askOnStartup)
privateslot

Definition at line 96 of file KisAndroidScaling.cpp.

97{
98 KisConfig cfg(false);
100 QScreen *screen = m_initialPrimaryScreen.data();
101 if (screen) {
102 cfg.setAndroidScalingLastInitialScale(m_initialPrimaryScreenDevicePixelRatio);
103 cfg.setAndroidScalingTargetScale(screen->devicePixelRatio());
104 cfg.setAndroidScalingAskOnStartup(askOnStartup);
105 }
106 }
107}

References m_initialPrimaryScreen, m_initialPrimaryScreenDevicePixelRatio, and m_scalingDialogActive.

◆ slotJniScalingDialogActive

void KisAndroidScaling::slotJniScalingDialogActive ( bool active)
privateslot

Definition at line 109 of file KisAndroidScaling.cpp.

110{
111 m_scalingDialogActive = active;
112}

References m_scalingDialogActive.

◆ slotJniSetPrimaryScreenScale

void KisAndroidScaling::slotJniSetPrimaryScreenScale ( qreal scale)
privateslot

Definition at line 89 of file KisAndroidScaling.cpp.

90{
93 }
94}

References m_scalingDialogActive, and setPrimaryScreenScale().

◆ slotSplashDialogDismissed

void KisAndroidScaling::slotSplashDialogDismissed ( )
privateslot

Definition at line 84 of file KisAndroidScaling.cpp.

85{
86 maybeShowDialog(true);
87}

References maybeShowDialog().

Member Data Documentation

◆ m_initialPrimaryScreen

QPointer<QScreen> KisAndroidScaling::m_initialPrimaryScreen
private

Definition at line 56 of file KisAndroidScaling.h.

◆ m_initialPrimaryScreenDevicePixelRatio

qreal KisAndroidScaling::m_initialPrimaryScreenDevicePixelRatio = 0.0
private

Definition at line 57 of file KisAndroidScaling.h.

◆ m_scalingDialogActive

bool KisAndroidScaling::m_scalingDialogActive = false
private

Definition at line 58 of file KisAndroidScaling.h.


The documentation for this class was generated from the following files: