/**************************************************************************** ** ** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of Qt Creator. ** ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 as published by the Free Software ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ****************************************************************************/ #include "splashscreenwidget.h" #include #include #include #include #include #include #include #include #include #include #include using namespace Utils; namespace Android { namespace Internal { static Q_LOGGING_CATEGORY(androidManifestEditorLog, "qtc.android.splashScreenWidget", QtWarningMsg) FilePath manifestDir(TextEditor::TextEditorWidget *textEditorWidget) { // Get the manifest file's directory from its filepath. return textEditorWidget->textDocument()->filePath().absolutePath(); } SplashScreenWidget::SplashScreenWidget(QWidget *parent) : QWidget(parent) { } SplashScreenWidget::SplashScreenWidget( QWidget *parent, const QSize &size, const QSize &screenSize, const QString &title, const QString &tooltip, const QString &imagePath, int scalingRatio, int maxScalingRatio, TextEditor::TextEditorWidget *textEditorWidget) : QWidget(parent), m_textEditorWidget(textEditorWidget), m_scalingRatio(scalingRatio), m_maxScalingRatio(maxScalingRatio), m_imagePath(imagePath), m_screenSize(screenSize) { auto splashLayout = new QVBoxLayout(this); auto splashTitle = new QLabel(title, this); auto splashButtonLayout = new QGridLayout(); m_splashScreenButton = new SplashScreenButton(this); m_splashScreenButton->setMinimumSize(size); m_splashScreenButton->setMaximumSize(size); m_splashScreenButton->setToolTip(tooltip); QSize clearAndWarningSize(16, 16); QToolButton *clearButton = nullptr; if (textEditorWidget) { clearButton = new QToolButton(this); clearButton->setMinimumSize(clearAndWarningSize); clearButton->setMaximumSize(clearAndWarningSize); clearButton->setIcon(Utils::Icons::CLOSE_FOREGROUND.icon()); } if (textEditorWidget) { m_scaleWarningLabel = new QLabel(this); m_scaleWarningLabel->setMinimumSize(clearAndWarningSize); m_scaleWarningLabel->setMaximumSize(clearAndWarningSize); m_scaleWarningLabel->setPixmap(Utils::Icons::WARNING.icon().pixmap(clearAndWarningSize)); m_scaleWarningLabel->setToolTip(tr("Icon scaled up.")); m_scaleWarningLabel->setVisible(false); } auto label = new QLabel(tr("Click to select..."), parent); splashLayout->addWidget(splashTitle); splashLayout->setAlignment(splashTitle, Qt::AlignHCenter); splashButtonLayout->setColumnMinimumWidth(0, 16); splashButtonLayout->addWidget(m_splashScreenButton, 0, 1, 1, 3); splashButtonLayout->setAlignment(m_splashScreenButton, Qt::AlignVCenter); if (textEditorWidget) { splashButtonLayout->addWidget(clearButton, 0, 4, 1, 1); splashButtonLayout->setAlignment(clearButton, Qt::AlignTop); } if (textEditorWidget) { splashButtonLayout->addWidget(m_scaleWarningLabel, 0, 0, 1, 1); splashButtonLayout->setAlignment(m_scaleWarningLabel, Qt::AlignTop); } splashLayout->addLayout(splashButtonLayout); splashLayout->setAlignment(splashButtonLayout, Qt::AlignHCenter); splashLayout->addWidget(label); splashLayout->setAlignment(label, Qt::AlignHCenter); this->setLayout(splashLayout); connect(m_splashScreenButton, &QAbstractButton::clicked, this, &SplashScreenWidget::selectImage); if (clearButton) connect(clearButton, &QAbstractButton::clicked, this, &SplashScreenWidget::removeImage); m_imageSelectionText = tooltip; } SplashScreenWidget::SplashScreenButton::SplashScreenButton(SplashScreenWidget *parent) : QToolButton(parent), m_parentWidget(parent) { } void SplashScreenWidget::SplashScreenButton::paintEvent(QPaintEvent *event) { Q_UNUSED(event); QPainter painter(this); painter.setPen(QPen(Qt::gray, 1)); painter.setBrush(QBrush(m_parentWidget->m_backgroundColor)); painter.drawRect(0, 0, width()-1, height()-1); if (!m_parentWidget->m_image.isNull()) painter.drawImage(m_parentWidget->m_imagePosition, m_parentWidget->m_image); } void SplashScreenWidget::setBackgroundColor(const QColor &backgroundColor) { m_backgroundColor = backgroundColor; m_splashScreenButton->update(); emit imageChanged(); } void SplashScreenWidget::showImageFullScreen(bool fullScreen) { m_showImageFullScreen = fullScreen; loadImage(); } void SplashScreenWidget::setImageFromPath(const FilePath &imagePath, bool resize) { if (!m_textEditorWidget) return; const FilePath baseDir = manifestDir(m_textEditorWidget); const FilePath targetPath = baseDir / m_imagePath / m_imageFileName; if (targetPath.isEmpty()) { qCDebug(androidManifestEditorLog) << "Image target path is empty, cannot set image."; return; } QImage image = QImage(imagePath.toString()); if (image.isNull()) { qCDebug(androidManifestEditorLog) << "Image '" << imagePath << "' not found or invalid format."; return; } if (!targetPath.absolutePath().ensureWritableDir()) { qCDebug(androidManifestEditorLog) << "Cannot create image target path."; return; } if (resize == true && m_scalingRatio < m_maxScalingRatio) { const QSize size = QSize((float(image.width()) / float(m_maxScalingRatio)) * float(m_scalingRatio), (float(image.height()) / float(m_maxScalingRatio)) * float(m_scalingRatio)); image = image.scaled(size); } QFile file(targetPath.toString()); if (file.open(QIODevice::WriteOnly | QIODevice::Truncate)) { image.save(&file, "PNG"); file.close(); loadImage(); emit imageChanged(); } else { qCDebug(androidManifestEditorLog) << "Cannot save image."; } } void SplashScreenWidget::selectImage() { const FilePath file = FileUtils::getOpenFilePath(this, m_imageSelectionText, FileUtils::homePath(), QStringLiteral("%1 (*.png *.jpg *.jpeg)") .arg(tr("Images"))); if (file.isEmpty()) return; setImageFromPath(file, false); emit imageChanged(); } void SplashScreenWidget::removeImage() { const FilePath baseDir = manifestDir(m_textEditorWidget); const FilePath targetPath = baseDir / m_imagePath / m_imageFileName; if (targetPath.isEmpty()) { qCDebug(androidManifestEditorLog) << "Image target path empty, cannot remove image."; return; } targetPath.removeFile(); m_image = QImage(); m_splashScreenButton->update(); setScaleWarningLabelVisible(false); } void SplashScreenWidget::clearImage() { removeImage(); emit imageChanged(); } void SplashScreenWidget::loadImage() { if (m_imageFileName.isEmpty()) { qCDebug(androidManifestEditorLog) << "Image name not set, cannot load image."; return; } const FilePath baseDir = manifestDir(m_textEditorWidget); const FilePath targetPath = baseDir / m_imagePath / m_imageFileName; if (targetPath.isEmpty()) { qCDebug(androidManifestEditorLog) << "Image target path empty, cannot load image."; return; } QImage image = QImage(targetPath.toString()); if (image.isNull()) { qCDebug(androidManifestEditorLog) << "Cannot load image."; return; } if (m_showImageFullScreen) { m_image = image.scaled(m_splashScreenButton->size()); m_imagePosition = QPoint(0,0); } else { QSize scaledSize = QSize((m_splashScreenButton->width() * image.width()) / m_screenSize.width(), (m_splashScreenButton->height() * image.height()) / m_screenSize.height()); m_image = image.scaled(scaledSize, Qt::KeepAspectRatio); m_imagePosition = QPoint((m_splashScreenButton->width() - m_image.width()) / 2, (m_splashScreenButton->height() - m_image.height()) / 2); } m_splashScreenButton->update(); } bool SplashScreenWidget::hasImage() const { return !m_image.isNull(); } void SplashScreenWidget::setScaleWarningLabelVisible(bool visible) { if (m_scaleWarningLabel) m_scaleWarningLabel->setVisible(visible); } void SplashScreenWidget::setImageFileName(const QString &imageFileName) { m_imageFileName = imageFileName; } } // namespace Internal } // namespace Android