1
0
Fork 0
mirror of https://git.jami.net/savoirfairelinux/jami-client-qt.git synced 2025-08-04 14:55:43 +02:00

misc: better dpi scaling performance

Gitlab: #302

On X11 based,
https://bugreports.qt.io/browse/QTBUG-84082

Change-Id: Id775a6a31fc9f6f9493556fca458555c5962727e
This commit is contained in:
Ming Rui Zhang 2021-02-23 16:22:00 -05:00
parent 2a9e624007
commit 637b7d6480
6 changed files with 111 additions and 34 deletions

View file

@ -18,9 +18,10 @@
import QtQuick 2.14 import QtQuick 2.14
import QtQuick.Controls 2.14 import QtQuick.Controls 2.14
import QtQuick.Window 2.14
import net.jami.Adapters 1.0 import net.jami.Adapters 1.0
import net.jami.Constants 1.0 import net.jami.Constants 1.0
import net.jami.Models 1.0
Item { Item {
id: root id: root
@ -98,6 +99,16 @@ Item {
saveAvatarToConfig() saveAvatarToConfig()
} }
function reloadImageSource() {
var tempEnableAnimation = enableAnimation
var tempImageSource = rootImage.source
enableAnimation = false
rootImage.source = ""
rootImage.source = tempImageSource
enableAnimation = tempEnableAnimation
}
Image { Image {
id: rootImage id: rootImage
@ -208,4 +219,12 @@ Item {
radius: 30 radius: 30
color: JamiTheme.notificationRed color: JamiTheme.notificationRed
} }
Connections {
target: ScreenInfo
function onDevicePixelRatioChanged(){
reloadImageSource()
}
}
} }

View file

@ -19,7 +19,8 @@
import QtQuick 2.14 import QtQuick 2.14
import QtQuick.Controls 2.14 import QtQuick.Controls 2.14
import QtGraphicalEffects 1.14 import QtGraphicalEffects 1.14
import QtQuick.Window 2.14
import net.jami.Models 1.0
Image { Image {
id: root id: root
@ -34,7 +35,6 @@ Image {
property string checkedSource property string checkedSource
property string color: "transparent" property string color: "transparent"
property real pixelDensity: Screen.pixelDensity
property bool isSvg: { property bool isSvg: {
var match = /[^.]+$/.exec(source) var match = /[^.]+$/.exec(source)
return match !== null && match[0] === 'svg' return match !== null && match[0] === 'svg'
@ -62,12 +62,20 @@ Image {
function setSourceSize() { function setSourceSize() {
if (isSvg) { if (isSvg) {
sourceSize.width = width sourceSize = Qt.size(0, 0)
sourceSize.height = height sourceSize = Qt.size(width, height)
} else }
else
sourceSize = undefined sourceSize = undefined
} }
onPixelDensityChanged: setSourceSize() Connections {
target: ScreenInfo
function onDevicePixelRatioChanged(){
setSourceSize()
}
}
Component.onCompleted: setSourceSize() Component.onCompleted: setSourceSize()
} }

View file

@ -36,7 +36,6 @@
#include <QFontDatabase> #include <QFontDatabase>
#include <QMenu> #include <QMenu>
#include <QQmlContext> #include <QQmlContext>
#include <QWindow>
#include <locale.h> #include <locale.h>
@ -120,6 +119,29 @@ fileDebug(QFile* debugFile)
}); });
} }
void
ScreenInfo::setCurrentFocusWindow(QWindow* window)
{
if (window && !currentFocusWindow_) {
currentFocusWindow_ = window;
setDevicePixelRatio(currentFocusWindow_->screen()->devicePixelRatio());
disconnect(devicePixelRatioConnection_);
disconnect(currentFocusWindowScreenConnection_);
currentFocusWindowScreenConnection_
= connect(currentFocusWindow_, &QWindow::screenChanged, [this] {
currentFocusWindowScreen_ = currentFocusWindow_->screen();
setDevicePixelRatio(currentFocusWindowScreen_->devicePixelRatio());
devicePixelRatioConnection_ = connect(
currentFocusWindowScreen_, &QScreen::physicalDotsPerInchChanged, [this] {
setDevicePixelRatio(currentFocusWindowScreen_->devicePixelRatio());
});
});
}
}
MainApplication::MainApplication(int& argc, char** argv) MainApplication::MainApplication(int& argc, char** argv)
: QApplication(argc, argv) : QApplication(argc, argv)
, engine_(new QQmlApplicationEngine()) , engine_(new QQmlApplicationEngine())
@ -185,11 +207,14 @@ MainApplication::init()
} }
#endif #endif
connect(connectivityMonitor_, &ConnectivityMonitor::connectivityChanged, [] { connect(connectivityMonitor_, &ConnectivityMonitor::connectivityChanged, [] {
LRCInstance::connectivityChanged(); LRCInstance::connectivityChanged();
}); });
connect(this, &QGuiApplication::focusWindowChanged, [this] {
screenInfo_.setCurrentFocusWindow(this->focusWindow());
});
QObject::connect( QObject::connect(
&LRCInstance::instance(), &LRCInstance::instance(),
&LRCInstance::quitEngineRequested, &LRCInstance::quitEngineRequested,
@ -241,37 +266,27 @@ MainApplication::loadTranslations()
QTranslator* lrcTranslator_lang = new QTranslator(this); QTranslator* lrcTranslator_lang = new QTranslator(this);
QTranslator* lrcTranslator_name = new QTranslator(this); QTranslator* lrcTranslator_name = new QTranslator(this);
if (locale_name != locale_lang) { if (locale_name != locale_lang) {
if (lrcTranslator_lang->load(appDir if (lrcTranslator_lang->load(appDir + QDir::separator() + "libringclient" + QDir::separator()
+ QDir::separator() + "libringclient" + "translations" + QDir::separator() + "lrc_" + locale_lang)) {
+ QDir::separator() + "translations"
+ QDir::separator() + "lrc_"
+ locale_lang)) {
installTranslator(lrcTranslator_lang); installTranslator(lrcTranslator_lang);
} }
} }
if (lrcTranslator_name->load(appDir if (lrcTranslator_name->load(appDir + QDir::separator() + "libringclient" + QDir::separator()
+ QDir::separator() + "libringclient" + "translations" + QDir::separator() + "lrc_" + locale_name)) {
+ QDir::separator() + "translations"
+ QDir::separator() + "lrc_"
+ locale_name)) {
installTranslator(lrcTranslator_name); installTranslator(lrcTranslator_name);
} }
QTranslator* mainTranslator_lang = new QTranslator(this); QTranslator* mainTranslator_lang = new QTranslator(this);
QTranslator* mainTranslator_name = new QTranslator(this); QTranslator* mainTranslator_name = new QTranslator(this);
if (locale_name != locale_lang) { if (locale_name != locale_lang) {
if (mainTranslator_lang->load(appDir if (mainTranslator_lang->load(appDir + QDir::separator() + "ring" + QDir::separator()
+ QDir::separator() + "ring" + "translations" + QDir::separator() + "ring_client_windows_"
+ QDir::separator() + "translations"
+ QDir::separator() + "ring_client_windows_"
+ locale_lang)) { + locale_lang)) {
installTranslator(mainTranslator_lang); installTranslator(mainTranslator_lang);
} }
} }
if (mainTranslator_name->load(appDir if (mainTranslator_name->load(appDir + QDir::separator() + "ring" + QDir::separator()
+ QDir::separator() + "ring" + "translations" + QDir::separator() + "ring_client_windows_"
+ QDir::separator() + "translations"
+ QDir::separator() + "ring_client_windows_"
+ locale_name)) { + locale_name)) {
installTranslator(mainTranslator_name); installTranslator(mainTranslator_name);
} }
@ -381,6 +396,8 @@ MainApplication::initQmlEngine()
engine_->addImageProvider(QLatin1String("tintedPixmap"), new TintedButtonImageProvider()); engine_->addImageProvider(QLatin1String("tintedPixmap"), new TintedButtonImageProvider());
engine_->addImageProvider(QLatin1String("avatarImage"), new AvatarImageProvider()); engine_->addImageProvider(QLatin1String("avatarImage"), new AvatarImageProvider());
engine_->rootContext()->setContextProperty("ScreenInfo", &screenInfo_);
engine_->setObjectOwnership(&LRCInstance::avModel(), QQmlEngine::CppOwnership); engine_->setObjectOwnership(&LRCInstance::avModel(), QQmlEngine::CppOwnership);
engine_->setObjectOwnership(&LRCInstance::pluginModel(), QQmlEngine::CppOwnership); engine_->setObjectOwnership(&LRCInstance::pluginModel(), QQmlEngine::CppOwnership);
engine_->setObjectOwnership(LRCInstance::getUpdateManager(), QQmlEngine::CppOwnership); engine_->setObjectOwnership(LRCInstance::getUpdateManager(), QQmlEngine::CppOwnership);

View file

@ -1,4 +1,4 @@
/*! /*!
* Copyright (C) 2020 by Savoir-faire Linux * Copyright (C) 2020 by Savoir-faire Linux
* Author: Edric Ladent Milaret <edric.ladent-milaret@savoirfairelinux.com> * Author: Edric Ladent Milaret <edric.ladent-milaret@savoirfairelinux.com>
* Author: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com> * Author: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com>
@ -24,11 +24,42 @@
#include <QApplication> #include <QApplication>
#include <QQmlApplicationEngine> #include <QQmlApplicationEngine>
#include <QQmlEngine> #include <QQmlEngine>
#include <QScreen>
#include <QWindow>
#include <memory> #include <memory>
class ConnectivityMonitor; class ConnectivityMonitor;
// Provides information about the screen the app is displayed on
class ScreenInfo : public QObject
{
Q_OBJECT
Q_PROPERTY(double devicePixelRatio MEMBER devicePixelRatio_ NOTIFY devicePixelRatioChanged)
public:
void setCurrentFocusWindow(QWindow* window);
void setDevicePixelRatio(double ratio)
{
if (ratio != devicePixelRatio_) {
devicePixelRatio_ = ratio;
emit devicePixelRatioChanged();
}
}
signals:
void devicePixelRatioChanged();
private:
double devicePixelRatio_ {0.0};
QMetaObject::Connection currentFocusWindowScreenConnection_;
QMetaObject::Connection devicePixelRatioConnection_;
QWindow* currentFocusWindow_ {nullptr};
QScreen* currentFocusWindowScreen_ {nullptr};
};
class MainApplication : public QApplication class MainApplication : public QApplication
{ {
Q_OBJECT Q_OBJECT
@ -52,5 +83,7 @@ private:
private: private:
QScopedPointer<QFile> debugFile_; QScopedPointer<QFile> debugFile_;
QScopedPointer<QQmlApplicationEngine> engine_; QScopedPointer<QQmlApplicationEngine> engine_;
ConnectivityMonitor* connectivityMonitor_; ConnectivityMonitor* connectivityMonitor_ {nullptr};
ScreenInfo screenInfo_;
}; };

View file

@ -49,8 +49,8 @@ Rectangle {
id: jamiLogoImage id: jamiLogoImage
Layout.alignment: Qt.AlignCenter Layout.alignment: Qt.AlignCenter
Layout.preferredWidth: welcomePageColumnLayout.width Layout.preferredWidth: Math.min(welcomePageColumnLayout.width, 330)
Layout.preferredHeight: 100 Layout.preferredHeight: Math.min(welcomePageColumnLayout.width / 3, 110)
Layout.bottomMargin: 10 Layout.bottomMargin: 10
smooth: true smooth: true

View file

@ -65,8 +65,8 @@ Rectangle {
id: welcomeLogo id: welcomeLogo
Layout.alignment: Qt.AlignCenter Layout.alignment: Qt.AlignCenter
Layout.preferredWidth: 300 Layout.preferredWidth: 330
Layout.preferredHeight: 150 Layout.preferredHeight: 110
smooth: true smooth: true
antialiasing: true antialiasing: true