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 KisAndroidScalinginstance ()
 

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: