/**************************************************************************
**
** Copyright (C) 2011 - 2013 Research In Motion
**
** Contact: Research In Motion (blackberry-qt@qnx.com)
** Contact: KDAB (info@kdab.com)
**
** 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 Digia. For licensing terms and
** conditions see http://qt.digia.com/licensing. For further information
** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Digia gives you certain additional
** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
****************************************************************************/
#include "bardescriptorfileimagewizardpage.h"
#include "ui_bardescriptorfileimagewizardpage.h"
using namespace Qnx;
using namespace Qnx::Internal;
namespace {
// image sizes are likely device specific.
// those are the ones for the upcoming BB10 devices which this plugin is mainly targetted at.
enum {
// Application icon sizes.
AppIconMinWidth = 1,
AppIconMinHeight = 1,
AppIconMaxWidth = 150,
AppIconMaxHeight = 150,
// Landscape splashscreen sizes
LandscapeSplashMinWidth = 1,
LandscapeSplashMinHeight = 1,
LandscapeSplashMaxWidth = 1280,
LandscapeSplashMaxHeight = 768,
// Portrait splashscreen sizes
PortraitSplashMinWidth = 1,
PortraitSplashMinHeight = 1,
PortraitSplashMaxWidth = 768,
PortraitSplashMaxHeight = 1280
};
}
BarDescriptorFileImageWizardPage::BarDescriptorFileImageWizardPage(QWidget *parent)
: QWizardPage(parent)
, m_ui(new Ui::BarDescriptorFileImageWizardPage)
, m_iconValidationResult(Valid)
, m_landscapeSplashScreenValidationResult(Valid)
, m_portraitSplashScreenValidationResult(Valid)
{
m_ui->setupUi(this);
setTitle(tr("Images"));
const QString dialogFilter = tr("Images (*.jpg *.png)");
m_ui->icon->setExpectedKind(Utils::PathChooser::File);
m_ui->icon->setPromptDialogFilter(dialogFilter);
connect(m_ui->icon, SIGNAL(changed(QString)), this, SLOT(validateIcon(QString)));
m_ui->landscapeSplashScreen->setExpectedKind(Utils::PathChooser::File);
m_ui->landscapeSplashScreen->setPromptDialogFilter(dialogFilter);
connect(m_ui->landscapeSplashScreen, SIGNAL(changed(QString)), this, SLOT(validateLandscapeSplashScreen(QString)));
m_ui->portraitSplashScreen->setExpectedKind(Utils::PathChooser::File);
m_ui->portraitSplashScreen->setPromptDialogFilter(dialogFilter);
connect(m_ui->portraitSplashScreen, SIGNAL(changed(QString)), this, SLOT(validatePortraitSplashScreen(QString)));
}
BarDescriptorFileImageWizardPage::~BarDescriptorFileImageWizardPage()
{
delete m_ui;
}
bool BarDescriptorFileImageWizardPage::isComplete() const
{
return m_iconValidationResult == Valid
&& m_landscapeSplashScreenValidationResult == Valid
&& m_portraitSplashScreenValidationResult == Valid;
}
QString BarDescriptorFileImageWizardPage::icon() const
{
return m_ui->icon->path();
}
QString BarDescriptorFileImageWizardPage::landscapeSplashScreen() const
{
return m_ui->landscapeSplashScreen->path();
}
QString BarDescriptorFileImageWizardPage::portraitSplashScreen() const
{
return m_ui->portraitSplashScreen->path();
}
void BarDescriptorFileImageWizardPage::validateIcon(const QString &path)
{
m_iconValidationResult = validateImage(path, QSize(AppIconMinWidth, AppIconMinHeight), QSize(AppIconMaxWidth, AppIconMaxHeight));
switch (m_iconValidationResult) {
case Valid:
m_ui->iconValidationLabel->clear();
break;
case CouldNotLoad:
m_ui->iconValidationLabel->setText(tr("Could not open '%1' for reading.").arg(path));
break;
case IncorrectSize: {
const QSize size = imageSize(path);
m_ui->iconValidationLabel->setText(tr("Incorrect icon size (%1x%2). The maximum size is "
"%3x%4 pixels.")
.arg(size.width()).arg(size.height())
.arg(AppIconMaxWidth).arg(AppIconMaxHeight));
break;
}
default:
break;
}
emit completeChanged();
}
void BarDescriptorFileImageWizardPage::validateLandscapeSplashScreen(const QString &path)
{
m_landscapeSplashScreenValidationResult = validateImage(path, QSize(LandscapeSplashMinWidth, LandscapeSplashMinHeight), QSize(LandscapeSplashMaxWidth, LandscapeSplashMaxHeight));
updateSplashScreenValidationLabel();
emit completeChanged();
}
void BarDescriptorFileImageWizardPage::validatePortraitSplashScreen(const QString &path)
{
m_portraitSplashScreenValidationResult = validateImage(path, QSize(PortraitSplashMinWidth, PortraitSplashMinHeight), QSize(PortraitSplashMaxWidth, PortraitSplashMaxHeight));
updateSplashScreenValidationLabel();
emit completeChanged();
}
void BarDescriptorFileImageWizardPage::updateSplashScreenValidationLabel()
{
if (m_landscapeSplashScreenValidationResult == Valid
&& m_portraitSplashScreenValidationResult == Valid) {
m_ui->splashScreenValidationLabel->clear();
return;
}
switch (m_landscapeSplashScreenValidationResult) {
case CouldNotLoad:
m_ui->splashScreenValidationLabel->setText(tr("Could not open '%1' for reading.")
.arg(m_ui->landscapeSplashScreen->fileName().toString()));
break;
case IncorrectSize: {
const QSize size = imageSize(m_ui->landscapeSplashScreen->fileName().toString());
m_ui->splashScreenValidationLabel->setText(tr("Incorrect landscape splash screen size (%1x%2). The maximum "
"size is %3x%4 pixels.")
.arg(size.width()).arg(size.height())
.arg(LandscapeSplashMaxWidth).arg(LandscapeSplashMaxHeight));
break;
}
case Valid:
default:
break;
}
switch (m_portraitSplashScreenValidationResult) {
case CouldNotLoad:
m_ui->splashScreenValidationLabel->setText(tr("Could not open '%1' for reading.")
.arg(m_ui->portraitSplashScreen->fileName().toString()));
break;
case IncorrectSize: {
const QSize size = imageSize(m_ui->portraitSplashScreen->fileName().toString());
m_ui->splashScreenValidationLabel->setText(tr("Incorrect portrait splash screen size (%1x%2). The maximum "
"size is %3x%4 pixels.")
.arg(size.width()).arg(size.height())
.arg(PortraitSplashMaxWidth).arg(PortraitSplashMaxHeight));
break;
}
case Valid:
default:
break;
}
}
BarDescriptorFileImageWizardPage::ImageValidationResult BarDescriptorFileImageWizardPage::validateImage(const QString &path, const QSize &minimumSize, const QSize &maximumSize)
{
if (path.isEmpty())
return Valid; // Empty is ok, since and entries are optional
QImage img(path);
if (img.isNull())
return CouldNotLoad;
const QSize imgSize = img.size();
if (imgSize.width() < minimumSize.width() || imgSize.height() < minimumSize.height()
|| imgSize.width() > maximumSize.width() || imgSize.height() > maximumSize.height())
return IncorrectSize;
return Valid;
}
QSize BarDescriptorFileImageWizardPage::imageSize(const QString &path)
{
QImage img(path);
if (img.isNull())
return QSize();
return img.size();
}