Add proper QResrouce system to libcalamaresui, finish up prepare checks

This also adds ImageRegistry, a SVG cache, a bunch of utility functions
for shared pixmaps in CalamaresUtilsGui and renames several qrc files
in viewmodules.
This commit is contained in:
Teo Mrnjavac 2014-08-26 15:18:30 +02:00
parent 0404413b05
commit d97bb47f09
26 changed files with 470 additions and 16 deletions

View File

@ -27,7 +27,7 @@ include( MacroLogFeature )
set( QT_VERSION 5.3.0 )
find_package( Qt5 ${QT_VERSION} CONFIG REQUIRED Core Gui Widgets LinguistTools )
find_package( Qt5 ${QT_VERSION} CONFIG REQUIRED Core Gui Widgets LinguistTools Svg )
find_package( YamlCpp 0.5.1 REQUIRED )
option( WITH_PYTHON "Enable Python modules support." ON )

View File

@ -4,7 +4,7 @@ function(calamares_add_library)
# parse arguments (name needs to be saved before passing ARGN into the macro)
set(NAME ${ARGV0})
set(options NO_INSTALL NO_VERSION)
set(oneValueArgs NAME TYPE EXPORT_MACRO TARGET TARGET_TYPE EXPORT VERSION SOVERSION INSTALL_BINDIR)
set(oneValueArgs NAME TYPE EXPORT_MACRO TARGET TARGET_TYPE EXPORT VERSION SOVERSION INSTALL_BINDIR RESOURCES)
set(multiValueArgs SOURCES UI LINK_LIBRARIES LINK_PRIVATE_LIBRARIES COMPILE_DEFINITIONS QT5_MODULES)
cmake_parse_arguments(LIBRARY "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
set(LIBRARY_NAME ${NAME})
@ -30,8 +30,8 @@ function(calamares_add_library)
endif()
# add resources from current dir
if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/resources.qrc")
qt5_add_resources(LIBRARY_RC_SOURCES "resources.qrc")
if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/${LIBRARY_RESOURCES}")
qt5_add_resources(LIBRARY_RC_SOURCES "${LIBRARY_RESOURCES}")
list(APPEND LIBRARY_SOURCES ${LIBRARY_RC_SOURCES})
unset(LIBRARY_RC_SOURCES)
endif()

View File

@ -5,7 +5,7 @@ function( calamares_add_plugin )
# parse arguments ( name needs to be saved before passing ARGN into the macro )
set( NAME ${ARGV0} )
set( options NO_INSTALL SHARED_LIB )
set( oneValueArgs NAME TYPE EXPORT_MACRO )
set( oneValueArgs NAME TYPE EXPORT_MACRO RESOURCES )
set( multiValueArgs SOURCES UI LINK_LIBRARIES COMPILE_DEFINITIONS )
cmake_parse_arguments( PLUGIN "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
set( PLUGIN_NAME ${NAME} )
@ -30,6 +30,9 @@ function( calamares_add_plugin )
if( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${PLUGIN_CONFIG_FILE}" )
message( " ${Green}CONFIGURATION_FILE:${ColorReset} ${PLUGIN_CONFIG_FILE} => ${PLUGIN_DATA_DESTINATION}" )
endif()
if( PLUGIN_RESOURCES )
message( " ${Green}RESOURCES:${ColorReset} ${PLUGIN_RESOURCES}" )
endif()
message( "" )
endif()
# create target name once for convenience
@ -65,6 +68,10 @@ function( calamares_add_plugin )
list( APPEND calamares_add_library_args "INSTALL_BINDIR" "${PLUGIN_DESTINATION}" )
if( PLUGIN_RESOURCES )
list( APPEND calamares_add_library_args "RESOURCES" "${PLUGIN_RESOURCES}" )
endif()
calamares_add_library( ${calamares_add_library_args} )
configure_file( ${PLUGIN_DESC_FILE} ${PLUGIN_DESC_FILE} COPYONLY )

BIN
data/images/no.svgz Normal file

Binary file not shown.

View File

Before

Width:  |  Height:  |  Size: 149 KiB

After

Width:  |  Height:  |  Size: 149 KiB

View File

Before

Width:  |  Height:  |  Size: 122 KiB

After

Width:  |  Height:  |  Size: 122 KiB

BIN
data/images/yes.svgz Normal file

Binary file not shown.

View File

@ -26,6 +26,8 @@
#include "DllMacro.h"
#define RESPATH ":/data/"
class QDir;
class QObject;

View File

@ -7,6 +7,7 @@ list( APPEND ${CALAMARESUI_LIBRARY_TARGET}_SOURCES
modulesystem/ViewModule.cpp
utils/CalamaresUtilsGui.cpp
utils/ImageRegistry.cpp
utils/YamlUtils.cpp
viewpages/AbstractPage.cpp
@ -35,6 +36,8 @@ calamares_add_library( ${CALAMARESUI_LIBRARY_TARGET}
EXPORT_MACRO UIDLLEXPORT_PRO
LINK_LIBRARIES
yaml-cpp
Qt5::Svg
RESOURCES libcalamaresui.qrc
EXPORT CalamaresLibraryDepends
VERSION ${CALAMARES_VERSION_SHORT}
)

View File

@ -0,0 +1,6 @@
<RCC>
<qresource prefix="/data">
<file alias="images/yes.svgz">../../data/images/yes.svgz</file>
<file alias="images/no.svgz">../../data/images/no.svgz</file>
</qresource>
</RCC>

View File

@ -18,9 +18,14 @@
#include "CalamaresUtilsGui.h"
#include "ImageRegistry.h"
#include <QBrush>
#include <QFont>
#include <QFontMetrics>
#include <QLayout>
#include <QPainter>
#include <QPen>
namespace CalamaresUtils
{
@ -29,6 +34,84 @@ static int s_defaultFontSize = 0;
static int s_defaultFontHeight = 0;
QPixmap
defaultPixmap( ImageType type, ImageMode mode, const QSize& size )
{
QPixmap pixmap;
switch ( type )
{
case Yes:
pixmap = ImageRegistry::instance()->pixmap( RESPATH "images/yes.svgz", size );
break;
case No:
pixmap = ImageRegistry::instance()->pixmap( RESPATH "images/no.svgz", size );
break;
default:
break;
}
if ( pixmap.isNull() )
{
Q_ASSERT( false );
return QPixmap();
}
return pixmap;
}
QPixmap
createRoundedImage( const QPixmap& pixmap, const QSize& size, float frameWidthPct )
{
int height;
int width;
if ( !size.isEmpty() )
{
height = size.height();
width = size.width();
}
else
{
height = pixmap.height();
width = pixmap.width();
}
if ( !height || !width )
return QPixmap();
QPixmap scaledAvatar = pixmap.scaled( width, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation );
if ( frameWidthPct == 0.00 )
return scaledAvatar;
QPixmap frame( width, height );
frame.fill( Qt::transparent );
QPainter painter( &frame );
painter.setRenderHint( QPainter::Antialiasing );
QRect outerRect( 0, 0, width, height );
QBrush brush( scaledAvatar );
QPen pen;
pen.setColor( Qt::transparent );
pen.setJoinStyle( Qt::RoundJoin );
painter.setBrush( brush );
painter.setPen( pen );
painter.drawRoundedRect( outerRect, frameWidthPct * 100.0, frameWidthPct * 100.0, Qt::RelativeSize );
/* painter.setBrush( Qt::transparent );
painter.setPen( Qt::white );
painter.drawRoundedRect( outerRect, frameWidthPct, frameWidthPct, Qt::RelativeSize ); */
return frame;
}
void
unmarginLayout( QLayout* layout )
{

View File

@ -22,19 +22,37 @@
#include "utils/CalamaresUtils.h"
#include "UiDllMacro.h"
#include <QPixmap>
#include <QSize>
class QLayout;
namespace CalamaresUtils
{
enum ImageType
{
Yes,
No
};
enum ImageMode
{
Original,
CoverInCase,
Grid,
DropShadow,
RoundedCorners
};
UIDLLEXPORT QPixmap defaultPixmap( ImageType type, ImageMode mode = CalamaresUtils::Original, const QSize& size = QSize( 0, 0 ) );
UIDLLEXPORT QPixmap createRoundedImage( const QPixmap& avatar, const QSize& size, float frameWidthPct = 0.20 );
UIDLLEXPORT void unmarginLayout( QLayout* layout );
DLLEXPORT void setDefaultFontSize( int points );
DLLEXPORT int defaultFontSize();
DLLEXPORT int defaultFontHeight();
DLLEXPORT QSize defaultIconSize();
UIDLLEXPORT void setDefaultFontSize( int points );
UIDLLEXPORT int defaultFontSize();
UIDLLEXPORT int defaultFontHeight();
UIDLLEXPORT QSize defaultIconSize();
}

View File

@ -0,0 +1,163 @@
/* === This file is part of Calamares - <http://github.com/calamares> ===
*
* Copyright 2014, Teo Mrnjavac <teo@kde.org>
*
* Originally from Tomahawk,
* Copyright 2012, Christian Muehlhaeuser <muesli@tomahawk-player.org>
*
* Calamares is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Calamares is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Calamares. If not, see <http://www.gnu.org/licenses/>.
*/
#include "ImageRegistry.h"
#include <QSvgRenderer>
#include <QPainter>
#include <QIcon>
#include "utils/Logger.h"
static QHash< QString, QHash< int, QHash< qint64, QPixmap > > > s_cache;
ImageRegistry* ImageRegistry::s_instance = 0;
ImageRegistry*
ImageRegistry::instance()
{
return s_instance;
}
ImageRegistry::ImageRegistry()
{
s_instance = this;
}
QIcon
ImageRegistry::icon( const QString& image, CalamaresUtils::ImageMode mode )
{
return pixmap( image, CalamaresUtils::defaultIconSize(), mode );
}
qint64
ImageRegistry::cacheKey( const QSize& size, float opacity, QColor tint )
{
return size.width() * 100 + size.height() * 10 + ( opacity * 100.0 ) + tint.value();
}
QPixmap
ImageRegistry::pixmap( const QString& image, const QSize& size, CalamaresUtils::ImageMode mode, float opacity, QColor tint )
{
QHash< qint64, QPixmap > subsubcache;
QHash< int, QHash< qint64, QPixmap > > subcache;
if ( s_cache.contains( image ) )
{
subcache = s_cache.value( image );
if ( subcache.contains( mode ) )
{
subsubcache = subcache.value( mode );
const qint64 ck = cacheKey( size, opacity, tint );
if ( subsubcache.contains( ck ) )
{
return subsubcache.value( ck );
}
}
}
// Image not found in cache. Let's load it.
QPixmap pixmap;
if ( image.toLower().endsWith( ".svg" ) ||
image.toLower().endsWith( ".svgz" ) )
{
QSvgRenderer svgRenderer( image );
QPixmap p( size.isNull() ? svgRenderer.defaultSize() : size );
p.fill( Qt::transparent );
QPainter pixPainter( &p );
pixPainter.setOpacity( opacity );
svgRenderer.render( &pixPainter );
pixPainter.end();
if ( tint.alpha() > 0 )
{
QImage resultImage( p.size(), QImage::Format_ARGB32_Premultiplied );
QPainter painter( &resultImage );
painter.drawPixmap( 0, 0, p );
painter.setCompositionMode( QPainter::CompositionMode_Screen );
painter.fillRect( resultImage.rect(), tint );
painter.end();
resultImage.setAlphaChannel( p.toImage().alphaChannel() );
p = QPixmap::fromImage( resultImage );
}
pixmap = p;
}
else
pixmap = QPixmap( image );
if ( !pixmap.isNull() )
{
switch ( mode )
{
case CalamaresUtils::RoundedCorners:
pixmap = CalamaresUtils::createRoundedImage( pixmap, size );
break;
default:
break;
}
if ( !size.isNull() && pixmap.size() != size )
pixmap = pixmap.scaled( size, Qt::IgnoreAspectRatio, Qt::SmoothTransformation );
putInCache( image, size, mode, opacity, pixmap, tint );
}
return pixmap;
}
void
ImageRegistry::putInCache( const QString& image, const QSize& size, CalamaresUtils::ImageMode mode, float opacity, const QPixmap& pixmap, QColor tint )
{
cDebug( LOGVERBOSE ) << Q_FUNC_INFO << "Adding to image cache:" << image << size << mode;
QHash< qint64, QPixmap > subsubcache;
QHash< int, QHash< qint64, QPixmap > > subcache;
if ( s_cache.contains( image ) )
{
subcache = s_cache.value( image );
if ( subcache.contains( mode ) )
{
subsubcache = subcache.value( mode );
/* if ( subsubcache.contains( size.width() * size.height() ) )
{
Q_ASSERT( false );
}*/
}
}
subsubcache.insert( cacheKey( size, opacity, tint ), pixmap );
subcache.insert( mode, subsubcache );
s_cache.insert( image, subcache );
}

View File

@ -0,0 +1,47 @@
/* === This file is part of Calamares - <http://github.com/calamares> ===
*
* Copyright 2014, Teo Mrnjavac <teo@kde.org>
*
* Originally from Tomahawk,
* Copyright 2012, Christian Muehlhaeuser <muesli@tomahawk-player.org>
*
* Calamares is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Calamares is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Calamares. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef IMAGE_REGISTRY_H
#define IMAGE_REGISTRY_H
#include <QPixmap>
#include "utils/CalamaresUtilsGui.h"
#include "UiDllMacro.h"
class UIDLLEXPORT ImageRegistry
{
public:
static ImageRegistry* instance();
explicit ImageRegistry();
QIcon icon( const QString& image, CalamaresUtils::ImageMode mode = CalamaresUtils::Original );
QPixmap pixmap( const QString& image, const QSize& size, CalamaresUtils::ImageMode mode = CalamaresUtils::Original, float opacity = 1.0, QColor tint = QColor( 0, 0, 0, 0 ) );
private:
qint64 cacheKey( const QSize& size, float opacity, QColor tint );
void putInCache( const QString& image, const QSize& size, CalamaresUtils::ImageMode mode, float opacity, const QPixmap& pixmap, QColor tint );
static ImageRegistry* s_instance;
};
#endif // IMAGE_REGISTRY_H

View File

@ -10,6 +10,8 @@ calamares_add_plugin( keyboard
keyboardwidget/keyboardpreview.cpp
UI
KeyboardPage.ui
RESOURCES
keyboard.qrc
LINK_LIBRARIES
calamaresui
SHARED_LIB

View File

@ -10,6 +10,8 @@ calamares_add_plugin( locale
timezonewidget/timezonewidget.cpp
timezonewidget/localeglobal.cpp
UI
RESOURCES
locale.qrc
LINK_LIBRARIES
calamaresui
SHARED_LIB

View File

@ -9,8 +9,9 @@ calamares_add_plugin( prepare
TYPE viewmodule
EXPORT_MACRO PLUGINDLLEXPORT_PRO
SOURCES
PrepareViewStep.cpp
PrepareCheckWidget.cpp
PreparePage.cpp
PrepareViewStep.cpp
partman_devices.c
UI
LINK_LIBRARIES

View File

@ -0,0 +1,50 @@
/* === This file is part of Calamares - <http://github.com/calamares> ===
*
* Copyright 2014, Teo Mrnjavac <teo@kde.org>
*
* Calamares is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Calamares is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Calamares. If not, see <http://www.gnu.org/licenses/>.
*/
#include "PrepareCheckWidget.h"
#include "utils/CalamaresUtilsGui.h"
#include "utils/Logger.h"
#include <QBoxLayout>
PrepareCheckWidget::PrepareCheckWidget( const QString &text,
bool checked,
QWidget* parent )
: QWidget( parent )
{
QBoxLayout* mainLayout = new QHBoxLayout;
setLayout( mainLayout );
m_iconLabel = new QLabel( this );
mainLayout->addWidget( m_iconLabel );
m_textLabel = new QLabel( text, this );
mainLayout->addWidget( m_textLabel );
m_textLabel->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred );
if ( checked )
m_iconLabel->setPixmap( CalamaresUtils::defaultPixmap( CalamaresUtils::Yes,
CalamaresUtils::Original,
QSize( m_iconLabel->height(),
m_iconLabel->height() ) ) );
else
m_iconLabel->setPixmap( CalamaresUtils::defaultPixmap( CalamaresUtils::No,
CalamaresUtils::Original,
QSize( m_iconLabel->height(),
m_iconLabel->height() ) ) );
}

View File

@ -0,0 +1,36 @@
/* === This file is part of Calamares - <http://github.com/calamares> ===
*
* Copyright 2014, Teo Mrnjavac <teo@kde.org>
*
* Calamares is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Calamares is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Calamares. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef PREPARECHECKWIDGET_H
#define PREPARECHECKWIDGET_H
#include <QLabel>
class PrepareCheckWidget : public QWidget
{
Q_OBJECT
public:
explicit PrepareCheckWidget( const QString &text,
bool checked,
QWidget* parent = nullptr );
private:
QLabel* m_textLabel;
QLabel* m_iconLabel;
};
#endif // PREPARECHECKWIDGET_H

View File

@ -18,6 +18,10 @@
#include "PreparePage.h"
#include "PrepareCheckWidget.h"
#include "utils/CalamaresUtilsGui.h"
#include <QBoxLayout>
#include <QLabel>
@ -30,16 +34,25 @@ PreparePage::PreparePage( QWidget* parent )
QLabel* text = new QLabel( tr( "For best results, please ensure that this "
"computer:" ), this );
text->setAlignment( Qt::AlignCenter );
mainLayout->addStretch();
mainLayout->addWidget( text );
QHBoxLayout* spacerLayout = new QHBoxLayout;
mainLayout->addLayout( spacerLayout );
spacerLayout->addSpacing( CalamaresUtils::defaultFontHeight() * 2 );
m_entriesLayout = new QVBoxLayout;
spacerLayout->addLayout( m_entriesLayout );
CalamaresUtils::unmarginLayout( spacerLayout );
mainLayout->addStretch();
}
void
PreparePage::init()
PreparePage::init( const QList< QPair< QString, bool > > &checkEntries )
{
for ( const QPair< QString, bool >& entry : checkEntries )
{
PrepareCheckWidget* pcw = new PrepareCheckWidget( entry.first, entry.second );
m_entriesLayout->addWidget( pcw );
pcw->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred );
}
}

View File

@ -19,6 +19,7 @@
#ifndef PREPAREPAGE_H
#define PREPAREPAGE_H
#include <QBoxLayout>
#include <QWidget>
class PreparePage : public QWidget
@ -27,8 +28,10 @@ class PreparePage : public QWidget
public:
explicit PreparePage( QWidget* parent = nullptr );
void init();
void init( const QList< QPair< QString, bool > >& checkEntries );
private:
QBoxLayout* m_entriesLayout;
};
#endif // PREPAREPAGE_H

View File

@ -97,7 +97,23 @@ PrepareViewStep::PrepareViewStep( QObject* parent )
cDebug() << "enoughStorage, enoughRam, hasPower, hasInternet: "
<< enoughStorage << enoughRam << hasPower << hasInternet;
m_actualWidget->init();
QList< QPair< QString, bool > > checkEntries;
checkEntries.append( qMakePair(
tr( "has at least %1 GB available drive space" )
.arg( m_requiredStorageGB ),
enoughStorage ) );
checkEntries.append( qMakePair(
tr( "has at least %1 GB working memory" )
.arg( m_requiredRamGB ),
enoughRam ) );
checkEntries.append( qMakePair(
tr( "is plugged in to a power source" ),
hasPower ) );
checkEntries.append( qMakePair(
tr( "is connected to the Internet" ),
hasInternet ) );
m_actualWidget->init( checkEntries );
m_widget->layout()->removeWidget( waitingWidget );
waitingWidget->deleteLater();
m_widget->layout()->addWidget( m_actualWidget );

View File

@ -13,6 +13,8 @@ calamares_add_plugin( users
UsersPage.cpp
UI
page_usersetup.ui
RESOURCES
users.qrc
LINK_LIBRARIES
calamaresui
${CRYPT_LIBRARIES}