From b6456965287933303a70cc2367a6e6396e4a978a Mon Sep 17 00:00:00 2001 From: Julien Wadel Date: Wed, 13 Mar 2024 11:29:24 +0100 Subject: [PATCH] Upgrade icons quality. CMake: Automatic load for images. --- Linphone/data/CMakeLists.txt | 81 ++--------------------- Linphone/tool/providers/ImageProvider.cpp | 40 ++++++++++- Linphone/view/Item/VerticalTabBar.qml | 2 - Linphone/view/Page/Main/CallPage.qml | 2 - 4 files changed, 42 insertions(+), 83 deletions(-) diff --git a/Linphone/data/CMakeLists.txt b/Linphone/data/CMakeLists.txt index b1ad8b2fb..a95c3d007 100644 --- a/Linphone/data/CMakeLists.txt +++ b/Linphone/data/CMakeLists.txt @@ -1,84 +1,13 @@ list(APPEND _LINPHONEAPP_RC_FILES data/assistant/use-app-sip-account.rc data/assistant/create-app-sip-account.rc data/assistant/use-other-sip-account.rc - "data/image/info.svg" - "data/image/belledonne.svg" - "data/image/user-circle.svg" - "data/image/user-circle-gear.svg" - "data/image/logo.svg" - "data/image/login_image.svg" - "data/image/eye-slash.svg" - "data/image/linphone.svg" - "data/image/secured.svg" - "data/image/open_source.svg" - "data/image/eye.svg" - "data/image/caret-down.svg" - "data/image/caret-left.svg" - "data/image/caret-right.svg" - "data/image/caret-up.svg" - "data/image/verif_page_image.svg" - "data/image/check.svg" - "data/image/dialer.svg" - "data/image/dialer-selected.svg" - "data/image/chiffrement.svg" - "data/image/interoperable.svg" - "data/image/phone.svg" - "data/image/phone-selected.svg" - "data/image/phone-plus.svg" - "data/image/phone-disconnect.svg" - "data/image/phone-list.svg" - "data/image/phone-transfer.svg" - "data/image/address-book.svg" - "data/image/address-book-selected.svg" - "data/image/chat-teardrop-text.svg" - "data/image/chat-teardrop-text-selected.svg" - "data/image/users-three.svg" - "data/image/users-three-selected.svg" - "data/image/noItemImage.svg" - "data/image/dots-three-vertical.svg" - "data/image/more.svg" - "data/image/plus-circle.svg" - "data/image/microphone-stage.svg" - "data/image/group-call.svg" - "data/image/magnifying-glass.svg" - "data/image/backspace-fill.svg" - "data/image/x.svg" - "data/image/play.svg" - "data/image/incoming_call.svg" - "data/image/incoming_call_missed.svg" - "data/image/incoming_call_rejected.svg" - "data/image/outgoing_call.svg" - "data/image/outgoing_call_missed.svg" - "data/image/outgoing_call_rejected.svg" - "data/image/microphone.svg" - "data/image/microphone-slash.svg" - "data/image/camera.svg" - "data/image/video-camera.svg" - "data/image/video-camera-slash.svg" - "data/image/speaker-high.svg" - "data/image/speaker-slash.svg" - "data/image/trusted.svg" - "data/image/randomAvatar.png" - "data/image/pause.svg" - "data/image/smiley.svg" - "data/image/trash-simple.svg" - "data/image/copy.svg" - "data/image/empty.svg" - "data/image/heart.svg" - "data/image/heart-fill.svg" - "data/image/record-fill.svg" - "data/image/pencil-simple.svg" - "data/image/share-network.svg" - "data/image/bell-simple.svg" - "data/image/bell-simple-slash.svg" - "data/image/media_encryption_zrtp_pq.svg" - "data/image/question.svg" - "data/image/settings.svg" - "data/image/user-plus.svg" - data/shaders/roundEffect.vert.qsb data/shaders/roundEffect.frag.qsb - ) +file(GLOB files LIST_DIRECTORIES false image/*) +foreach(f ${files}) + get_filename_component(filename ${f} NAME) + list(APPEND _LINPHONEAPP_RC_FILES data/image/${filename}) +endforeach() set(_LINPHONEAPP_RC_FILES ${_LINPHONEAPP_RC_FILES} PARENT_SCOPE) diff --git a/Linphone/tool/providers/ImageProvider.cpp b/Linphone/tool/providers/ImageProvider.cpp index 54c0e5dbd..7eb294d38 100644 --- a/Linphone/tool/providers/ImageProvider.cpp +++ b/Linphone/tool/providers/ImageProvider.cpp @@ -49,11 +49,14 @@ ImageAsyncImageResponse::ImageAsyncImageResponse(const QString &id, const QSize QDir imageDir(path); if (!imageDir.exists()) { qDebug() << QStringLiteral("[ImageProvider] Dir doesn't exist: `%1`.").arg(path); + emit imageGrabbed(QImage(":/data/image/warning-circle.svg")); return; } QFileInfoList files = QDir(path).entryInfoList(filters, QDir::Files, QDir::Name); + QFileInfo fileInfo; for (QFileInfo file : files) { if (file.fileName() == id) { + fileInfo = file; mPath = file.absoluteFilePath(); break; } @@ -63,13 +66,44 @@ ImageAsyncImageResponse::ImageAsyncImageResponse(const QString &id, const QSize if (!file.exists()) { qDebug() << QStringLiteral("[ImageProvider] File doesn't exist: `%1`.").arg(path + id); + emit imageGrabbed(QImage(":/data/image/warning-circle.svg")); return; } - QImage originalImage(mPath); - if (!originalImage.isNull()) { - emit imageGrabbed(originalImage); + if (Q_UNLIKELY(!file.open(QIODevice::ReadOnly))) { + qWarning() << QStringLiteral("[ImageProvider] Unable to open file: `%1`.").arg(path); + emit imageGrabbed(QImage(":/data/image/warning-circle.svg")); + return; } + + QImage image; + + if (fileInfo.suffix() == "svg") { + QSvgRenderer renderer(mPath); + if (Q_UNLIKELY(!renderer.isValid())) { + qWarning() << QStringLiteral("Invalid svg file: `%1`.").arg(path); + image = QImage(mPath); // Fallback to QImage + } else { + renderer.setAspectRatioMode(Qt::KeepAspectRatio); + QSize askedSize = !requestedSize.isEmpty() + ? requestedSize + : renderer.defaultSize() * QGuiApplication::primaryScreen()->devicePixelRatio(); + // 3. Create image. + image = QImage(askedSize, QImage::Format_ARGB32_Premultiplied); + if (Q_UNLIKELY(image.isNull())) { + qWarning() << QStringLiteral("Unable to create image from path: `%1`.").arg(path); + image = QImage(mPath); // Fallback to QImage + } else { + image.fill(Qt::transparent); // Fill with transparent to set alpha channel + // 4. Paint! + QPainter painter(&image); + renderer.render(&painter); + } + } + } else image = QImage(mPath); + + if (!image.isNull()) emit imageGrabbed(image); + else emit imageGrabbed(QImage(":/data/image/warning-circle.svg")); } void ImageAsyncImageResponse::imageGrabbed(QImage image) { diff --git a/Linphone/view/Item/VerticalTabBar.qml b/Linphone/view/Item/VerticalTabBar.qml index f24a24fe6..af3f7e0bc 100644 --- a/Linphone/view/Item/VerticalTabBar.qml +++ b/Linphone/view/Item/VerticalTabBar.qml @@ -68,8 +68,6 @@ Control.TabBar { imageSource: mainItem.currentIndex === index ? modelData.selectedIcon : modelData.icon Layout.preferredWidth: buttonSize Layout.preferredHeight: buttonSize - width: buttonSize - height: buttonSize Layout.alignment: Qt.AlignHCenter fillMode: Image.PreserveAspectFit colorizationColor: DefaultStyle.grey_0 diff --git a/Linphone/view/Page/Main/CallPage.qml b/Linphone/view/Page/Main/CallPage.qml index ae4820a9c..41babd5bc 100644 --- a/Linphone/view/Page/Main/CallPage.qml +++ b/Linphone/view/Page/Main/CallPage.qml @@ -534,8 +534,6 @@ AbstractMainPage { property color colorizationColor: DefaultStyle.main2_500main EffectImage { imageSource: iconLabel.iconSource - width: 24 * DefaultStyle.dp - height: 24 * DefaultStyle.dp Layout.preferredWidth: 24 * DefaultStyle.dp Layout.preferredHeight: 24 * DefaultStyle.dp fillMode: Image.PreserveAspectFit