Merge branch 'master' of https://github.com/calamares/calamares into development

This commit is contained in:
Philip Müller 2019-08-17 04:04:38 -04:00
commit 43820c920e
64 changed files with 714 additions and 862 deletions

14
CHANGES
View File

@ -6,6 +6,8 @@ website will have to do for older versions.
# 3.2.13 (unreleased) #
This release contains contributions from (alphabetically by first name):
- Arnaud Ferraris
- Arnaud Rebillout
## Core ##
@ -13,9 +15,21 @@ This release contains contributions from (alphabetically by first name):
has had a few updates and has now been consistently applied across
the core codebase (e.g. libcalamares, libcalamaresui, calamares, but
not the modules).
- *KCoreAddons* is now a required dependency. This lets us drop a chunk
of code that was copied from KCoreAddons years ago, and use the
(maintained!) upstream version instead. It also gives us KMacroExpander
everywhere, which will simplify code for handling substitutions
in configuration files.
## Modules ##
- The *partition* module now understands the units *KB*, *MB*, *GB* which
are powers-of-ten sizes, alongside the powers-of-two sizes that it already
used. (thanks to Arnaud)
- The *welcome* module now supports a *Donate* button if *showDonateUrl*
is set to a non-empty URL. #1197
- The *welcome* module can have URLs for the various buttons configured
directly in the module configuration (rather than in `branding.desc`).
# 3.2.12 (2019-08-07) #

View File

@ -261,6 +261,8 @@ if( Qt5_VERSION VERSION_GREATER 5.12.1 )
list( APPEND _tx_ok "eo" )
endif()
endif()
# Optional Qt parts
find_package( Qt5DBus CONFIG )
find_package( YAMLCPP ${YAMLCPP_VERSION} REQUIRED )
if( INSTALL_POLKIT )
@ -291,7 +293,14 @@ if( ECM_FOUND )
include(KDEInstallDirs)
endif()
find_package( KF5 COMPONENTS CoreAddons Crash )
find_package( KF5 QUIET COMPONENTS CoreAddons Crash )
set_package_properties(
KF5::CoreAddons PROPERTIES
TYPE REQUIRED
DESCRIPTION "Classes built on QtCore for About Data"
URL "https://api.kde.org/frameworks/kcoreaddons/"
PURPOSE "About Calamares"
)
if( NOT KF5Crash_FOUND )
set( WITH_KF5Crash OFF )
endif()
@ -590,10 +599,25 @@ add_custom_target( uninstall
### CMAKE SUMMARY REPORT
#
feature_summary(WHAT ALL)
get_directory_property( SKIPPED_MODULES
DIRECTORY src/modules
DEFINITION LIST_SKIPPED_MODULES
)
calamares_explain_skipped_modules( ${SKIPPED_MODULES} )
feature_summary(
WHAT DISABLED_FEATURES
DESCRIPTION "The following features have been disabled:"
QUIET_ON_EMPTY
)
feature_summary(
WHAT OPTIONAL_PACKAGES_NOT_FOUND
DESCRIPTION "The following OPTIONAL packages were not found:"
QUIET_ON_EMPTY
)
feature_summary(
WHAT REQUIRED_PACKAGES_NOT_FOUND
FATAL_ON_MISSING_REQUIRED_PACKAGES
DESCRIPTION "The following REQUIRED packages were not found:"
QUIET_ON_EMPTY
)

View File

@ -13,28 +13,23 @@
### Dependencies
Main:
* Compiler with C++11 support: GCC >= 4.9.0 or Clang >= 3.5.1
* CMake >= 3.2
* Qt >= 5.7
* Compiler with C++14 support: GCC >= 5 or Clang >= 3.5.1
* CMake >= 3.3
* Qt >= 5.9
* yaml-cpp >= 0.5.1
* Python >= 3.3 (required for some modules)
* Boost.Python >= 1.55.0 (recommended, or PythonQt; one is required for some modules)
* PythonQt (recommended, or Boost.Python; one is required for some modules)
* extra-cmake-modules >= 5.18 (recommended; required for some modules)
* Boost.Python >= 1.55.0 (required for some modules)
* KDE extra-cmake-modules >= 5.18 (recommended; required for some modules;
required for some tests)
* KDE Frameworks KCoreAddons (>= 5.58 recommended)
* PythonQt (optional, deprecated)
Modules:
* welcome:
* NetworkManager
* UPower (optional, runtime)
* partition:
* extra-cmake-modules
* KF5: KCoreAddons, KConfig, KI18n, KService, KWidgetsAddons
* KPMcore >= 3.3
* bootloader:
* systemd-boot or GRUB
* unpackfs:
* squashfs-tools
* rsync
* Individual modules may have their own requirements;
these are listed in CMake output. Particular requirements (not complete):
* *fsresizer* KPMCore >= 3.3
* *partition* KPMCore >= 3.3
* *users* LibPWQuality (optional)
### Building

View File

@ -0,0 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
<defs
id="defs3051">
<style
type="text/css"
id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d;
}
</style>
</defs>
<path
style="fill:currentColor;fill-opacity:1;stroke:none"
d="m 5,9 0,1 -1,0 0,12 1,0 0,1 22,0 0,-1 1,0 0,-12 -1,0 0,-1 z m 1,1 20,0 a 1,1 0 0 0 1,1 l 0,10 a 1,1 0 0 0 -1,1 L 6,22 A 1,1 0 0 0 5,21 L 5,11 a 1,1 0 0 0 1,-1 m 10,2 a 4,4 0 0 0 -4,4 4,4 0 0 0 4,4 4,4 0 0 0 4,-4 4,4 0 0 0 -4,-4 m 0,1 a 3,3 0 0 1 3,3 3,3 0 0 1 -3,3 3,3 0 0 1 -3,-3 3,3 0 0 1 3,-3"
id="path76"
class="ColorScheme-Text"
/>
</svg>

After

Width:  |  Height:  |  Size: 675 B

View File

@ -56,6 +56,10 @@ windowSize: 800px,520px
# Note that ANSI_COLOR and CPE_NAME don't make sense here, and
# are not supported (the rest are). Remember to quote the string
# if it contains substitutions, or you'll get YAML exceptions.
#
# The *Url* entries are used on the welcome page, and they
# are visible as buttons there if the corresponding *show* keys
# are set to "true" (they can also be overridden).
strings:
productName: "@{NAME}"
shortProductName: Generic
@ -84,7 +88,7 @@ strings:
# the window. Use `welcomeExpandingLogo` to make it non-scaled.
# Recommended size is 320x150.
#
# These strings can also use substitutions from os-release (see above).
# These filenames can also use substitutions from os-release (see above).
images:
productLogo: "squid.png"
productIcon: "squid.png"

View File

@ -46,11 +46,11 @@ target_link_libraries( calamares_bin
calamaresui
Qt5::Core
Qt5::Widgets
KF5::CoreAddons
)
if( WITH_KF5Crash )
target_link_libraries( calamares_bin
PRIVATE
KF5::CoreAddons
KF5::Crash
)
target_compile_definitions( calamares_bin PRIVATE WITH_KF5Crash )

View File

@ -14,4 +14,4 @@
#cmakedefine CALAMARES_TRANSLATION_LANGUAGES "${CALAMARES_TRANSLATION_LANGUAGES}"
#endif // CALAMARES_VERSION_H
#endif // CALAMARES_VERSION_H

View File

@ -26,8 +26,8 @@
#include "3rdparty/kdsingleapplicationguard/kdsingleapplicationguard.h"
#ifdef WITH_KF5Crash
#include <KF5/KCoreAddons/KAboutData>
#ifdef WITH_KF5Crash
#include <KF5/KCrash/KCrash>
#endif
@ -93,7 +93,6 @@ main( int argc, char* argv[] )
{
CalamaresApplication a( argc, argv );
#ifdef WITH_KF5Crash
KAboutData aboutData( "calamares",
"Calamares",
a.applicationVersion(),
@ -104,12 +103,14 @@ main( int argc, char* argv[] )
"https://calamares.io",
"https://github.com/calamares/calamares/issues" );
KAboutData::setApplicationData( aboutData );
a.setApplicationDisplayName( QString() ); // To avoid putting an extra "Calamares/" into the log-file
#ifdef WITH_KF5Crash
KCrash::initialize();
// KCrash::setCrashHandler();
KCrash::setDrKonqiEnabled( true );
KCrash::setFlags( KCrash::SaferDialog | KCrash::AlwaysDirectly );
// TODO: umount anything in /tmp/calamares-... as an emergency save function
a.setApplicationDisplayName( QString() );
#endif
handle_args( a );

View File

@ -76,10 +76,9 @@ ProgressTreeView::setModel( QAbstractItemModel* model )
QTreeView::setModel( model );
expandAll();
connect(
Calamares::ViewManager::instance(),
&Calamares::ViewManager::currentStepChanged,
this,
[this]() { viewport()->update(); },
Qt::UniqueConnection );
connect( Calamares::ViewManager::instance(),
&Calamares::ViewManager::currentStepChanged,
this,
[this]() { viewport()->update(); },
Qt::UniqueConnection );
}

View File

@ -120,6 +120,7 @@ target_link_libraries( calamares
LINK_PUBLIC
${YAMLCPP_LIBRARY}
Qt5::Core
KF5::CoreAddons
${OPTIONAL_PUBLIC_LIBRARIES}
)

View File

@ -52,6 +52,9 @@ variantToPyObject( const QVariant& variant )
case QVariant::Int:
return bp::object( variant.toInt() );
case QVariant::LongLong:
return bp::object( variant.toLongLong() );
case QVariant::Double:
return bp::object( variant.toDouble() );

View File

@ -29,12 +29,22 @@ namespace Partition
static const NamedEnumTable< SizeUnit >&
unitSuffixes()
{
// *INDENT-OFF*
// clang-format off
static const NamedEnumTable< SizeUnit > names {
{ QStringLiteral( "%" ), SizeUnit::Percent }, { QStringLiteral( "K" ), SizeUnit::KiB },
{ QStringLiteral( "KiB" ), SizeUnit::KiB }, { QStringLiteral( "M" ), SizeUnit::MiB },
{ QStringLiteral( "MiB" ), SizeUnit::MiB }, { QStringLiteral( "G" ), SizeUnit::GiB },
{ QStringLiteral( "GiB" ), SizeUnit::GiB }
{ QStringLiteral( "%" ), SizeUnit::Percent },
{ QStringLiteral( "K" ), SizeUnit::KiB },
{ QStringLiteral( "KiB" ), SizeUnit::KiB },
{ QStringLiteral( "M" ), SizeUnit::MiB },
{ QStringLiteral( "MiB" ), SizeUnit::MiB },
{ QStringLiteral( "G" ), SizeUnit::GiB },
{ QStringLiteral( "GiB" ), SizeUnit::GiB },
{ QStringLiteral( "KB" ), SizeUnit::KB },
{ QStringLiteral( "MB" ), SizeUnit::MB },
{ QStringLiteral( "GB" ), SizeUnit::GB }
};
// clang-format on
// *INDENT-ON*
return names;
}
@ -50,7 +60,7 @@ PartitionSize::PartitionSize( const QString& s )
if ( m_unit == SizeUnit::None )
{
m_value = s.toInt();
m_value = s.toLongLong();
if ( m_value > 0 )
{
m_unit = SizeUnit::Byte;
@ -90,8 +100,11 @@ PartitionSize::toSectors( qint64 totalSectors, qint64 sectorSize ) const
return totalSectors * value() / 100;
}
case SizeUnit::Byte:
case SizeUnit::KB:
case SizeUnit::KiB:
case SizeUnit::MB:
case SizeUnit::MiB:
case SizeUnit::GB:
case SizeUnit::GiB:
return CalamaresUtils::bytesToSectors( toBytes(), sectorSize );
}
@ -125,8 +138,11 @@ PartitionSize::toBytes( qint64 totalSectors, qint64 sectorSize ) const
return totalSectors * value() / 100;
}
case SizeUnit::Byte:
case SizeUnit::KB:
case SizeUnit::KiB:
case SizeUnit::MB:
case SizeUnit::MiB:
case SizeUnit::GB:
case SizeUnit::GiB:
return toBytes();
}
@ -161,8 +177,11 @@ PartitionSize::toBytes( qint64 totalBytes ) const
return totalBytes * value() / 100;
}
case SizeUnit::Byte:
case SizeUnit::KB:
case SizeUnit::KiB:
case SizeUnit::MB:
case SizeUnit::MiB:
case SizeUnit::GB:
case SizeUnit::GiB:
return toBytes();
}
@ -186,10 +205,16 @@ PartitionSize::toBytes() const
return -1;
case SizeUnit::Byte:
return value();
case SizeUnit::KB:
return CalamaresUtils::KBtoBytes( static_cast< unsigned long long >( value() ) );
case SizeUnit::KiB:
return CalamaresUtils::KiBtoBytes( static_cast< unsigned long long >( value() ) );
case SizeUnit::MB:
return CalamaresUtils::MBtoBytes( static_cast< unsigned long long >( value() ) );
case SizeUnit::MiB:
return CalamaresUtils::MiBtoBytes( static_cast< unsigned long long >( value() ) );
case SizeUnit::GB:
return CalamaresUtils::GBtoBytes( static_cast< unsigned long long >( value() ) );
case SizeUnit::GiB:
return CalamaresUtils::GiBtoBytes( static_cast< unsigned long long >( value() ) );
}
@ -211,8 +236,11 @@ PartitionSize::operator<( const PartitionSize& other ) const
case SizeUnit::Percent:
return ( m_value < other.m_value );
case SizeUnit::Byte:
case SizeUnit::KB:
case SizeUnit::KiB:
case SizeUnit::MB:
case SizeUnit::MiB:
case SizeUnit::GB:
case SizeUnit::GiB:
return ( toBytes() < other.toBytes() );
}
@ -234,8 +262,11 @@ PartitionSize::operator>( const PartitionSize& other ) const
case SizeUnit::Percent:
return ( m_value > other.m_value );
case SizeUnit::Byte:
case SizeUnit::KB:
case SizeUnit::KiB:
case SizeUnit::MB:
case SizeUnit::MiB:
case SizeUnit::GB:
case SizeUnit::GiB:
return ( toBytes() > other.toBytes() );
}
@ -257,8 +288,11 @@ PartitionSize::operator==( const PartitionSize& other ) const
case SizeUnit::Percent:
return ( m_value == other.m_value );
case SizeUnit::Byte:
case SizeUnit::KB:
case SizeUnit::KiB:
case SizeUnit::MB:
case SizeUnit::MiB:
case SizeUnit::GB:
case SizeUnit::GiB:
return ( toBytes() == other.toBytes() );
}

View File

@ -36,8 +36,11 @@ enum class SizeUnit
None,
Percent,
Byte,
KB,
KiB,
MB,
MiB,
GB,
GiB
};

View File

@ -58,7 +58,7 @@ public:
}
/** @brief Specific value and unit. */
NamedSuffix( int value, unit_t unit )
NamedSuffix( qint64 value, unit_t unit )
: m_value( value )
, m_unit( unit )
{
@ -75,7 +75,7 @@ public:
for ( const auto& suffix : table.table )
if ( s.endsWith( suffix.first ) )
{
m_value = s.left( s.length() - suffix.first.length() ).toInt();
m_value = s.left( s.length() - suffix.first.length() ).toLongLong();
m_unit = suffix.second;
break;
}
@ -89,7 +89,7 @@ public:
*/
NamedSuffix( const QString& s );
int value() const { return m_value; }
qint64 value() const { return m_value; }
unit_t unit() const { return m_unit; }
/** @brief Check that a value-unit combination is valid.
@ -100,7 +100,7 @@ public:
bool isValid() const;
protected:
int m_value;
qint64 m_value;
unit_t m_unit;
};

View File

@ -1,127 +1,9 @@
/* === This file is part of Calamares - <https://github.com/calamares> ===
*
* Copyright 2015, Teo Mrnjavac <teo@kde.org>
* Copyright 2017-2018, Adriaan de Groot <groot@kde.org>
* Copyright 2019, Adriaan de Groot <groot@kde.org>
*
* Based on KPluginFactory from KCoreAddons, KDE project
* Copyright 2007, Matthias Kretz <kretz@kde.org>
* Copyright 2007, Bernhard Loos <nhuh.put@web.de>
*
* 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 "PluginFactory.h"
#include "PluginFactory_p.h"
#include <QDebug>
#include <QObjectCleanupHandler>
// *INDENT-OFF*
// clang-format off
Q_GLOBAL_STATIC( QObjectCleanupHandler, factorycleanup )
namespace Calamares
{
PluginFactory::PluginFactory()
: pd_ptr( new PluginFactoryPrivate )
{
pd_ptr->q_ptr = this;
factorycleanup()->add( this );
}
PluginFactory::PluginFactory( PluginFactoryPrivate& d )
: pd_ptr( &d )
{
factorycleanup()->add( this );
}
PluginFactory::~PluginFactory()
{
delete pd_ptr;
}
void PluginFactory::doRegisterPlugin( const QString& keyword, const QMetaObject* metaObject, CreateInstanceFunction instanceFunction )
{
Q_ASSERT( metaObject );
// we allow different interfaces to be registered without keyword
if ( !keyword.isEmpty() )
{
if ( pd_ptr->createInstanceHash.contains( keyword ) )
qWarning() << "A plugin with the keyword" << keyword << "was already registered. A keyword must be unique!";
pd_ptr->createInstanceHash.insert( keyword, PluginFactoryPrivate::Plugin( metaObject, instanceFunction ) );
}
else
{
const QList<PluginFactoryPrivate::Plugin> clashes( pd_ptr->createInstanceHash.values( keyword ) );
const QMetaObject* superClass = metaObject->superClass();
if ( superClass )
{
for ( const PluginFactoryPrivate::Plugin& plugin : clashes )
{
for ( const QMetaObject* otherSuper = plugin.first->superClass(); otherSuper;
otherSuper = otherSuper->superClass() )
{
if ( superClass == otherSuper )
qWarning() << "Two plugins with the same interface(" << superClass->className() << ") were registered. Use keywords to identify the plugins.";
}
}
}
for ( const PluginFactoryPrivate::Plugin& plugin : clashes )
{
superClass = plugin.first->superClass();
if ( superClass )
{
for ( const QMetaObject* otherSuper = metaObject->superClass(); otherSuper;
otherSuper = otherSuper->superClass() )
{
if ( superClass == otherSuper )
qWarning() << "Two plugins with the same interface(" << superClass->className() << ") were registered. Use keywords to identify the plugins.";
}
}
}
pd_ptr->createInstanceHash.insertMulti( keyword, PluginFactoryPrivate::Plugin( metaObject, instanceFunction ) );
}
}
QObject* PluginFactory::create( const char* iface, QWidget* parentWidget, QObject* parent, const QString& keyword )
{
QObject* obj = nullptr;
const QList<PluginFactoryPrivate::Plugin> candidates( pd_ptr->createInstanceHash.values( keyword ) );
// for !keyword.isEmpty() candidates.count() is 0 or 1
for ( const PluginFactoryPrivate::Plugin& plugin : candidates )
{
for ( const QMetaObject* current = plugin.first; current; current = current->superClass() )
{
if ( 0 == qstrcmp( iface, current->className() ) )
{
if ( obj )
qWarning() << "ambiguous interface requested from a DSO containing more than one plugin";
obj = plugin.second( parentWidget, parent );
break;
}
}
}
if ( obj )
emit objectCreated( obj );
return obj;
}
}
CalamaresPluginFactory::~CalamaresPluginFactory() {}

View File

@ -24,298 +24,84 @@
#ifndef UTILS_PLUGINFACTORY_H
#define UTILS_PLUGINFACTORY_H
#include "DllMacro.h"
#include <QtCore/QObject>
#include <QtCore/QStringList>
#include <QtCore/QVariant>
// *INDENT-OFF*
// clang-format off
namespace Calamares
{
class PluginFactoryPrivate;
}
#include <KF5/KCoreAddons/KPluginFactory>
#define CalamaresPluginFactory_iid "io.calamares.PluginFactory"
/**
* \relates PluginFactory
/** @brief Plugin factory for Calamares
*
* CALAMARES_PLUGIN_FACTORY_DECLARATION declares the PluginFactory subclass. This macro
* can be used in a header file.
* Try to re-use KPluginFactory as much as possible (since the
* old code for PluginFactory was a fork of an old version of
* exactly that).
*
* \param name The name of the PluginFactory derived class.
*
* \see CALAMARES_PLUGIN_FACTORY
* \see CALAMARES_PLUGIN_FACTORY_DEFINITION
* The current createInstance() method passes more arguments
* to the job and viewstep constructors than we want; chasing
* that change means modifying each Calamares module. This class
* implements a version of createInstance() with fewer arguments
* and overloads registerPlugin() to use that.
*/
#define CALAMARES_PLUGIN_FACTORY_DECLARATION(name) \
class name : public Calamares::PluginFactory \
{ \
Q_OBJECT \
Q_INTERFACES(Calamares::PluginFactory) \
Q_PLUGIN_METADATA(IID CalamaresPluginFactory_iid) \
public: \
explicit name(); \
~name(); \
private: \
void init(); \
};
/**
* \relates PluginFactory
* CALAMARES_PLUGIN_FACTORY_DEFINITION defines the PluginFactory subclass. This macro
* can <b>not</b> be used in a header file.
*
* \param name The name of the PluginFactory derived class.
*
* \param pluginRegistrations Code to be inserted into the constructor of the
* class. Usually a series of registerPlugin() calls.
*
* \see CALAMARES_PLUGIN_FACTORY
* \see CALAMARES_PLUGIN_FACTORY_DECLARATION
*/
#define CALAMARES_PLUGIN_FACTORY_DEFINITION(name, pluginRegistrations) \
name::name() \
{ \
pluginRegistrations \
} \
name::~name() {}
namespace Calamares
{
/**
* \class PluginFactory PluginFactory.h <PluginFactory.h>
*
* PluginFactory provides a convenient way to provide factory-style plugins.
* Qt plugins provide a singleton object, but a common pattern is for plugins
* to generate as many objects of a particular type as the application requires.
* By using PluginFactory, you can avoid implementing the factory pattern
* yourself.
*
* PluginFactory also allows plugins to provide multiple different object
* types, indexed by keywords.
*
* The objects created by PluginFactory must inherit QObject, and must have a
* standard constructor pattern:
* \li if the object is a KPart::Part, it must be of the form
* \code
* T(QWidget *parentWidget, QObject *parent, const QVariantList &args)
* \endcode
* \li if it is a QWidget, it must be of the form
* \code
* T(QWidget *parent, const QVariantList &args)
* \endcode
* \li otherwise it must be of the form
* \code
* T(QObject *parent, const QVariantList &args)
* \endcode
*
* You should typically use CALAMARES_PLUGIN_FACTORY_DEFINITION() in your plugin code to
* create the factory. The pattern is
*
* \code
* #include "utils/PluginFactory.h"
*
* class MyPlugin : public PluginInterface
* {
* public:
* MyPlugin(QObject *parent, const QVariantList &args)
* : PluginInterface(parent)
* {}
* };
*
* CALAMARES_PLUGIN_FACTORY_DEFINITION(MyPluginFactory,
* registerPlugin<MyPlugin>();
* )
* \endcode
*
* If you want to load a library use KPluginLoader.
* The application that wants to instantiate plugin classes can do the following:
* \code
* PluginFactory *factory = KPluginLoader("libraryname").factory();
* if (factory) {
* PluginInterface *p1 = factory->create<PluginInterface>(parent);
* OtherInterface *p2 = factory->create<OtherInterface>(parent);
* NextInterface *p3 = factory->create<NextInterface>("keyword1", parent);
* NextInterface *p3 = factory->create<NextInterface>("keyword2", parent);
* }
* \endcode
*
* \author Matthias Kretz <kretz\@kde.org>
* \author Bernhard Loos <nhuh.put\@web.de>
*/
class DLLEXPORT PluginFactory : public QObject
class CalamaresPluginFactory : public KPluginFactory
{
Q_OBJECT
friend class PluginFactoryPrivate;
public:
/**
* This constructor creates a factory for a plugin.
*/
explicit PluginFactory();
/**
* This destroys the PluginFactory.
*/
virtual ~PluginFactory();
/**
* Use this method to create an object. It will try to create an object which inherits
* \p T. If it has multiple choices, you will get a fatal error (kFatal()), so be careful
* to request a unique interface or use keywords.
*
* \tparam T The interface for which an object should be created. The object will inherit \p T.
* \param parent The parent of the object. If \p parent is a widget type, it will also passed
* to the parentWidget argument of the CreateInstanceFunction for the object.
* \returns A pointer to the created object is returned, or 0 if an error occurred.
*/
template<typename T>
T* create( QObject* parent = nullptr );
/**
* Use this method to create an object. It will try to create an object which inherits
* \p T and was registered with \p keyword.
*
* \tparam T The interface for which an object should be created. The object will inherit \p T.
* \param keyword The keyword of the object.
* \param parent The parent of the object. If \p parent is a widget type, it will also passed
* to the parentWidget argument of the CreateInstanceFunction for the object.
* \returns A pointer to the created object is returned, or 0 if an error occurred.
*/
template<typename T>
T* create( const QString& keyword, QObject* parent = nullptr );
Q_SIGNALS:
void objectCreated( QObject* object );
protected:
/**
* Function pointer type to a function that instantiates a plugin.
*/
typedef QObject* ( *CreateInstanceFunction )( QWidget*, QObject* );
/**
* This is used to detect the arguments need for the constructor of plugin classes.
* You can inherit it, if you want to add new classes and still keep support for the old ones.
*/
template<class impl>
struct InheritanceChecker
explicit CalamaresPluginFactory()
: KPluginFactory()
{
CreateInstanceFunction createInstanceFunction( QWidget* )
{
return &createInstance<impl, QWidget>;
}
CreateInstanceFunction createInstanceFunction( ... )
{
return &createInstance<impl, QObject>;
}
};
explicit PluginFactory( PluginFactoryPrivate& dd );
/**
* Registers a plugin with the factory. Call this function from the constructor of the
* PluginFactory subclass to make the create function able to instantiate the plugin when asked
* for an interface the plugin implements.
*
* \tparam T the name of the plugin class
*
* \param keyword An optional keyword as unique identifier for the plugin. This allows you to
* put more than one plugin with the same interface into the same library using the same
* factory. X-KDE-PluginKeyword is a convenient way to specify the keyword in a desktop file.
*
* \param instanceFunction A function pointer to a function that creates an instance of the
* plugin. The default function that will be used depends on the type of interface. If the
* interface inherits from
* \li \c KParts::Part the function will call
* \code
* new T(QWidget *parentWidget, QObject *parent)
* \endcode
* \li \c QWidget the function will call
* \code
* new T(QWidget *parent)
* \endcode
* \li else the function will call
* \code
* new T(QObject *parent)
* \endcode
*/
template<class T>
void registerPlugin( const QString& keyword = QString(),
CreateInstanceFunction instanceFunction
= InheritanceChecker<T>().createInstanceFunction( reinterpret_cast<T*>( 0 ) ) )
{
doRegisterPlugin( keyword, &T::staticMetaObject, instanceFunction );
}
~CalamaresPluginFactory() override;
PluginFactoryPrivate* const pd_ptr;
/**
* This function is called when the factory asked to create an Object.
/** @brief Create an object from the factory.
*
* You may reimplement it to provide a very flexible factory. This is especially useful to
* provide generic factories for plugins implemeted using a scripting language.
*
* \param iface The staticMetaObject::className() string identifying the plugin interface that
* was requested. E.g. for KCModule plugins this string will be "KCModule".
* \param parentWidget Only used if the requested plugin is a KPart.
* \param parent The parent object for the plugin object.
* \param keyword A string that uniquely identifies the plugin. If a KService is used this
* keyword is read from the X-KDE-PluginKeyword entry in the .desktop file.
* Ignores all the @p args since they are not used. Calls
* Calamares constructors for the Jobs and ViewSteps.
*/
virtual QObject* create( const char* iface, QWidget* parentWidget, QObject* parent, const QString& keyword );
template<class impl, class ParentType>
static QObject* createInstance( QWidget* parentWidget, QObject* parent )
template < class impl, class ParentType >
static QObject* createInstance( QWidget* parentWidget, QObject* parent, const QVariantList& args )
{
Q_UNUSED( parentWidget )
Q_UNUSED( parentWidget );
Q_UNUSED( args );
ParentType* p = nullptr;
if ( parent )
{
p = qobject_cast<ParentType*>( parent );
p = qobject_cast< ParentType* >( parent );
Q_ASSERT( p );
}
return new impl( p );
}
private:
void doRegisterPlugin( const QString& keyword, const QMetaObject* metaObject, CreateInstanceFunction instanceFunction );
/** @brief register a plugin
*
* The Calamares version doesn't accept keywords, and uses
* the Calamares createInstance() version which ignores
* the QVariantList of arguments.
*/
template < class T >
void registerPlugin()
{
KPluginFactory::registerPlugin< T >( QString(), &createInstance< T, QObject > );
}
};
template<typename T>
inline T* PluginFactory::create( QObject* parent )
{
QObject* o = create( T::staticMetaObject.className(),
parent && parent->isWidgetType() ? reinterpret_cast<QWidget*>( parent ) : nullptr,
parent,
QString() );
/** @brief declare a Calamares Plugin Factory
*
* This would be defined as K_PLUGIN_FACTORY_DECLARATION_WITH_BASEFACTORY,
* except that does not actually use the base factory class that is
* passed in.
*/
#define CALAMARES_PLUGIN_FACTORY_DECLARATION( name ) \
class name : public CalamaresPluginFactory \
{ \
Q_OBJECT \
Q_INTERFACES( KPluginFactory ) \
Q_PLUGIN_METADATA( IID CalamaresPluginFactory_iid ) \
public: \
explicit name(); \
~name(); \
};
#define CALAMARES_PLUGIN_FACTORY_DEFINITION( name, pluginRegistrations ) \
K_PLUGIN_FACTORY_DEFINITION_WITH_BASEFACTORY( name, CalamaresPluginFactory, pluginRegistrations )
T* t = qobject_cast<T*>( o );
if ( !t )
delete o;
return t;
}
template<typename T>
inline T* PluginFactory::create( const QString& keyword, QObject* parent )
{
QObject* o = create( T::staticMetaObject.className(),
parent && parent->isWidgetType() ? reinterpret_cast<QWidget*>( parent ) : nullptr,
parent,
keyword );
T* t = qobject_cast<T*>( o );
if ( !t )
delete o;
return t;
}
} // namespace
Q_DECLARE_INTERFACE( Calamares::PluginFactory, CalamaresPluginFactory_iid )
// Q_DECLARE_INTERFACE( Calamares::PluginFactory, CalamaresPluginFactory_iid )
#endif

View File

@ -1,55 +0,0 @@
/* === This file is part of Calamares - <https://github.com/calamares> ===
*
* Copyright 2015, Teo Mrnjavac <teo@kde.org>
*
* Based on KPluginFactory from KCoreAddons, KDE project
* Copyright 2007, Matthias Kretz <kretz@kde.org>
* Copyright 2007, Bernhard Loos <nhuh.put@web.de>
*
* 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 UTILS_PLUGINFACTORY_P_H
#define UTILS_PLUGINFACTORY_P_H
#include "PluginFactory.h"
#include <QtCore/QHash>
namespace Calamares
{
class PluginFactoryPrivate
{
Q_DECLARE_PUBLIC( PluginFactory )
protected:
typedef QPair< const QMetaObject*, PluginFactory::CreateInstanceFunction > Plugin;
PluginFactoryPrivate()
: catalogInitialized( false )
, q_ptr( nullptr )
{
}
~PluginFactoryPrivate() {}
QHash< QString, Plugin > createInstanceHash;
QString catalogName;
bool catalogInitialized;
PluginFactory* q_ptr;
};
} // namespace Calamares
#endif

View File

@ -25,54 +25,108 @@
namespace CalamaresUtils
{
/** User defined literals, 1_KB is 1 KiloByte (= 10^3 bytes) */
constexpr qint64 operator""_KB( unsigned long long m )
{
return qint64( m ) * 1000;
}
/** User defined literals, 1_KiB is 1 KibiByte (= 2^10 bytes) */
constexpr qint64 operator""_KiB( unsigned long long m )
{
return qint64( m ) * 1024;
}
/** User defined literals, 1_MB is 1 MegaByte (= 10^6 bytes) */
constexpr qint64 operator""_MB( unsigned long long m )
{
return operator""_KB(m)*1000;
}
/** User defined literals, 1_MiB is 1 MibiByte (= 2^20 bytes) */
constexpr qint64 operator""_MiB( unsigned long long m )
{
return operator""_KiB(m)*1024;
}
/** User defined literals, 1_GB is 1 GigaByte (= 10^9 bytes) */
constexpr qint64 operator""_GB( unsigned long long m )
{
return operator""_MB(m)*1000;
}
/** User defined literals, 1_GiB is 1 GibiByte (= 2^30 bytes) */
constexpr qint64 operator""_GiB( unsigned long long m )
{
return operator""_MiB(m)*1024;
}
constexpr qint64
KBtoBytes( unsigned long long m )
{
return operator""_KB( m );
}
constexpr qint64
KiBtoBytes( unsigned long long m )
{
return operator""_KiB( m );
}
constexpr qint64
MBtoBytes( unsigned long long m )
{
return operator""_MB( m );
}
constexpr qint64
MiBtoBytes( unsigned long long m )
{
return operator""_MiB( m );
}
constexpr qint64
GBtoBytes( unsigned long long m )
{
return operator""_GB( m );
}
constexpr qint64
GiBtoBytes( unsigned long long m )
{
return operator""_GiB( m );
}
constexpr qint64
KBtoBytes( double m )
{
return qint64( m * 1000 );
}
constexpr qint64
KiBtoBytes( double m )
{
return qint64( m * 1024 );
}
constexpr qint64
MBtoBytes( double m )
{
return qint64( m * 1000 * 1000 );
}
constexpr qint64
MiBtoBytes( double m )
{
return qint64( m * 1024 * 1024 );
}
constexpr qint64
GBtoBytes( double m )
{
return qint64( m * 1000 * 1000 * 1000 );
}
constexpr qint64
GiBtoBytes( double m )
{

View File

@ -61,10 +61,10 @@ getString( const QVariantMap& map, const QString& key )
return QString();
}
int
getInteger( const QVariantMap& map, const QString& key, int d )
qint64
getInteger( const QVariantMap& map, const QString& key, qint64 d )
{
int result = d;
qint64 result = d;
if ( map.contains( key ) )
{
auto v = map.value( key );
@ -72,6 +72,10 @@ getInteger( const QVariantMap& map, const QString& key, int d )
{
result = v.toInt();
}
else if ( v.type() == QVariant::LongLong )
{
result = v.toLongLong();
}
}
return result;

View File

@ -41,7 +41,7 @@ DLLEXPORT QString getString( const QVariantMap& map, const QString& key );
/**
* Get an integer value from a mapping; returns @p d if no value.
*/
DLLEXPORT int getInteger( const QVariantMap& map, const QString& key, int d );
DLLEXPORT qint64 getInteger( const QVariantMap& map, const QString& key, qint64 d );
/**
* Get a double value from a mapping (integers are converted); returns @p d if no value.

View File

@ -79,7 +79,7 @@ yamlScalarToVariant( const YAML::Node& scalarNode )
}
if ( QRegExp( "[-+]?\\d+" ).exactMatch( scalarString ) )
{
return QVariant( scalarString.toInt() );
return QVariant( scalarString.toLongLong() );
}
if ( QRegExp( "[-+]?\\d*\\.?\\d+" ).exactMatch( scalarString ) )
{

View File

@ -52,6 +52,8 @@ Branding::instance()
}
// *INDENT-OFF*
// clang-format off
const QStringList Branding::s_stringEntryStrings =
{
"productName",
@ -82,15 +84,21 @@ const QStringList Branding::s_styleEntryStrings =
"sidebarTextSelect",
"sidebarTextHighlight"
};
// clang-format on
// *INDENT-ON*
const NamedEnumTable<Branding::WindowDimensionUnit>&
Branding::WindowDimension::suffixes()
{
using Unit = Branding::WindowDimensionUnit;
// *INDENT-OFF*
// clang-format off
static const NamedEnumTable<Unit> names{
{"px", Unit::Pixies},
{"em", Unit::Fonties}
};
// clang-format on
// *INDENT-ON*
return names;
}

View File

@ -25,13 +25,13 @@
#include "utils/NamedSuffix.h"
#include <QMap>
#include <QObject>
#include <QStringList>
#include <QMap>
namespace YAML
{
class Node;
class Node;
}
namespace Calamares
@ -79,27 +79,39 @@ public:
};
/** @brief Setting for how much the main window may expand. */
enum class WindowExpansion { Normal, Fullscreen, Fixed } ;
enum class WindowExpansion
{
Normal,
Fullscreen,
Fixed
};
/** @brief Setting for the main window size.
*
* The units are pixels (Pixies) or something-based-on-fontsize (Fonties), which
* we suffix as "em", e.g. "600px" or "32em".
*/
enum class WindowDimensionUnit { None, Pixies, Fonties };
class WindowDimension : public NamedSuffix<WindowDimensionUnit, WindowDimensionUnit::None>
enum class WindowDimensionUnit
{
None,
Pixies,
Fonties
};
class WindowDimension : public NamedSuffix< WindowDimensionUnit, WindowDimensionUnit::None >
{
public:
static const NamedEnumTable< WindowDimensionUnit >& suffixes();
static const NamedEnumTable< WindowDimensionUnit >& suffixes();
bool isValid() const;
using NamedSuffix::NamedSuffix;
WindowDimension( const QString& s ) : NamedSuffix( suffixes(), s ) {}
} ;
WindowDimension( const QString& s )
: NamedSuffix( suffixes(), s )
{
}
};
static Branding* instance();
explicit Branding( const QString& brandingFilePath,
QObject* parent = nullptr );
explicit Branding( const QString& brandingFilePath, QObject* parent = nullptr );
/** @brief Complete path of the branding descriptor file. */
QString descriptorPath() const { return m_descriptorPath; }
@ -184,11 +196,14 @@ private:
WindowExpansion m_windowExpansion;
WindowDimension m_windowHeight, m_windowWidth;
};
template<typename U> inline QString operator*(U e) { return Branding::instance()->string( e ); }
template < typename U >
inline QString operator*( U e )
{
return Branding::instance()->string( e );
}
#endif // BRANDING_H
} // namespace Calamares
#endif // BRANDING_H

View File

@ -75,8 +75,6 @@ calamares_add_library( calamaresui
VERSION ${CALAMARES_VERSION_SHORT}
)
find_package( KF5CoreAddons 5.58 QUIET ) # If it's really new
if ( KF5CoreAddons_FOUND )
if ( KF5CoreAddons_FOUND AND KF5CoreAddons_VERSION VERSION_GREATER_EQUAL 5.58 )
target_compile_definitions( calamaresui PRIVATE WITH_KOSRelease )
target_link_libraries( calamaresui PRIVATE KF5::CoreAddons )
endif()

View File

@ -23,10 +23,10 @@
#include "Branding.h"
#include "Job.h"
#include "JobQueue.h"
#include "modulesystem/Module.h"
#include "modulesystem/ModuleManager.h"
#include "Settings.h"
#include "ViewManager.h"
#include "modulesystem/Module.h"
#include "modulesystem/ModuleManager.h"
#include "utils/CalamaresUtilsGui.h"
#include "utils/Dirs.h"
@ -56,7 +56,7 @@ callQMLFunction( QQuickItem* qmlObject, const char* method )
QByteArray methodSignature( method );
methodSignature.append( "()" );
if ( qmlObject && qmlObject->metaObject()->indexOfMethod( methodSignature ) >= 0 )
if ( qmlObject && qmlObject->metaObject()->indexOfMethod( methodSignature ) >= 0 )
{
QVariant returnValue;
QMetaObject::invokeMethod( qmlObject, method, Q_RETURN_ARG( QVariant, returnValue ) );
@ -117,9 +117,7 @@ ExecutionViewStep::ExecutionViewStep( QObject* parent )
QString
ExecutionViewStep::prettyName() const
{
return Calamares::Settings::instance()->isSetupMode()
? tr( "Set up" )
: tr( "Install" );
return Calamares::Settings::instance()->isSetupMode() ? tr( "Set up" ) : tr( "Install" );
}
@ -176,8 +174,7 @@ ExecutionViewStep::loadQmlV2()
{
m_qmlComponent = new QQmlComponent( m_qmlShow->engine(),
QUrl::fromLocalFile( Calamares::Branding::instance()->slideshowPath() ),
QQmlComponent::CompilationMode::Asynchronous
);
QQmlComponent::CompilationMode::Asynchronous );
connect( m_qmlComponent, &QQmlComponent::statusChanged, this, &ExecutionViewStep::loadQmlV2Complete );
}
}
@ -194,14 +191,17 @@ ExecutionViewStep::loadQmlV2Complete()
QObject* o = m_qmlComponent->create();
m_qmlObject = qobject_cast< QQuickItem* >( o );
if ( !m_qmlObject )
{
delete o;
}
else
{
// setContent() is public API, but not documented publicly.
// It is marked \internal in the Qt sources, but does exactly
// what is needed: sets up visual parent by replacing the root
// item, and handling resizes.
m_qmlShow->setContent( QUrl::fromLocalFile( Calamares::Branding::instance()->slideshowPath() ), m_qmlComponent, m_qmlObject );
m_qmlShow->setContent(
QUrl::fromLocalFile( Calamares::Branding::instance()->slideshowPath() ), m_qmlComponent, m_qmlObject );
if ( ViewManager::instance()->currentStep() == this )
{
// We're alreay visible! Must have been slow QML loading, and we
@ -235,8 +235,10 @@ ExecutionViewStep::onActivate()
auto jl = module->jobs();
if ( module->isEmergency() )
{
for( auto& j : jl )
for ( auto& j : jl )
{
j->setEmergency( true );
}
}
queue->enqueue( jl );
}
@ -279,4 +281,4 @@ ExecutionViewStep::onLeave()
}
}
} // namespace
} // namespace Calamares

View File

@ -77,6 +77,6 @@ private:
void updateFromJobQueue( qreal percent, const QString& message );
};
}
} // namespace Calamares
#endif /* EXECUTIONVIEWSTEP_H */

View File

@ -22,11 +22,11 @@
#include <QtCore/qglobal.h>
#ifndef UIDLLEXPORT
# if defined (UIDLLEXPORT_PRO)
# define UIDLLEXPORT Q_DECL_EXPORT
# else
# define UIDLLEXPORT Q_DECL_IMPORT
# endif
#if defined( UIDLLEXPORT_PRO )
#define UIDLLEXPORT Q_DECL_EXPORT
#else
#define UIDLLEXPORT Q_DECL_IMPORT
#endif
#endif
#endif

View File

@ -7,6 +7,7 @@
<file alias="images/bugs.svg">../../data/images/bugs.svg</file>
<file alias="images/help.svg">../../data/images/help.svg</file>
<file alias="images/release.svg">../../data/images/release.svg</file>
<file alias="images/donate.svg">../../data/images/help-donate.svg</file>
<file alias="images/partition-disk.svg">../../data/images/partition-disk.svg</file>
<file alias="images/partition-partition.svg">../../data/images/partition-partition.svg</file>
<file alias="images/partition-alongside.svg">../../data/images/partition-alongside.svg</file>

View File

@ -49,7 +49,7 @@ CppJobModule::loadSelf()
{
if ( m_loader )
{
PluginFactory* pf = qobject_cast< PluginFactory* >( m_loader->instance() );
CalamaresPluginFactory* pf = qobject_cast< CalamaresPluginFactory* >( m_loader->instance() );
if ( !pf )
{
cDebug() << Q_FUNC_INFO << m_loader->errorString();

View File

@ -77,7 +77,9 @@ ProcessJobModule::initFrom( const QVariantMap& moduleDescriptor )
{
int sec = moduleDescriptor.value( "timeout" ).toInt();
if ( sec < 0 )
{
sec = 0;
}
m_secondsTimeout = std::chrono::seconds( sec );
}

View File

@ -151,8 +151,7 @@ RequirementsChecker::reportProgress()
m_progressTimeouts++;
QStringList remainingNames;
auto remaining = std::count_if( m_watchers.cbegin(), m_watchers.cend(),
[&]( const Watcher* w ) {
auto remaining = std::count_if( m_watchers.cbegin(), m_watchers.cend(), [&]( const Watcher* w ) {
if ( w && !w->isFinished() )
{
remainingNames << w->objectName();

View File

@ -50,7 +50,7 @@ ViewModule::loadSelf()
{
if ( m_loader )
{
PluginFactory* pf = qobject_cast< PluginFactory* >( m_loader->instance() );
CalamaresPluginFactory* pf = qobject_cast< CalamaresPluginFactory* >( m_loader->instance() );
if ( !pf )
{
cWarning() << Q_FUNC_INFO << "No factory:" << m_loader->errorString();

View File

@ -34,11 +34,10 @@
namespace CalamaresUtils
{
static int s_defaultFontSize = 0;
static int s_defaultFontSize = 0;
static int s_defaultFontHeight = 0;
QPixmap
defaultPixmap( ImageType type, ImageMode mode, const QSize& size )
{
@ -75,6 +74,10 @@ defaultPixmap( ImageType type, ImageMode mode, const QSize& size )
pixmap = ImageRegistry::instance()->pixmap( RESPATH "images/release.svg", size );
break;
case Donate:
pixmap = ImageRegistry::instance()->pixmap( RESPATH "images/donate.svg", size );
break;
case PartitionDisk:
pixmap = ImageRegistry::instance()->pixmap( RESPATH "images/partition-disk.svg", size );
break;
@ -152,11 +155,15 @@ createRoundedImage( const QPixmap& pixmap, const QSize& size, float frameWidthPc
}
if ( !height || !width )
{
return QPixmap();
}
QPixmap scaledAvatar = pixmap.scaled( width, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation );
if ( frameWidthPct == 0.00f )
{
return scaledAvatar;
}
QPixmap frame( width, height );
frame.fill( Qt::transparent );
@ -172,7 +179,8 @@ createRoundedImage( const QPixmap& pixmap, const QSize& size, float frameWidthPc
painter.setBrush( brush );
painter.setPen( pen );
painter.drawRoundedRect( outerRect, qreal( frameWidthPct ) * 100.0, qreal( frameWidthPct ) * 100.0, Qt::RelativeSize );
painter.drawRoundedRect(
outerRect, qreal( frameWidthPct ) * 100.0, qreal( frameWidthPct ) * 100.0, Qt::RelativeSize );
return frame;
}
@ -189,7 +197,9 @@ unmarginLayout( QLayout* layout )
{
QLayout* childLayout = layout->itemAt( i )->layout();
if ( childLayout )
{
unmarginLayout( childLayout );
}
}
}
@ -255,13 +265,17 @@ clearLayout( QLayout* layout )
while ( QLayoutItem* item = layout->takeAt( 0 ) )
{
if ( QWidget* widget = item->widget() )
{
widget->deleteLater();
}
if ( QLayout* childLayout = item->layout() )
{
clearLayout( childLayout );
}
delete item;
}
}
} // namespace
} // namespace CalamaresUtils

View File

@ -47,6 +47,7 @@ enum ImageType : int
Bugs,
Help,
Release,
Donate,
PartitionDisk,
PartitionPartition,
PartitionAlongside,
@ -56,7 +57,7 @@ enum ImageType : int
PartitionTable,
BootEnvironment,
Squid,
StatusOk, // Icons for the requirements checker
StatusOk, // Icons for the requirements checker
StatusWarning,
StatusError
};
@ -94,9 +95,7 @@ UIDLLEXPORT QPixmap defaultPixmap( ImageType type,
* @return the transformed pixmap.
* This one is currently unused.
*/
UIDLLEXPORT QPixmap createRoundedImage( const QPixmap& avatar,
const QSize& size,
float frameWidthPct = 0.20f );
UIDLLEXPORT QPixmap createRoundedImage( const QPixmap& avatar, const QSize& size, float frameWidthPct = 0.20f );
/**
* @brief unmarginLayout recursively walks the QLayout tree and removes all margins.
@ -112,8 +111,8 @@ UIDLLEXPORT void unmarginLayout( QLayout* layout );
UIDLLEXPORT void clearLayout( QLayout* layout );
UIDLLEXPORT void setDefaultFontSize( int points );
UIDLLEXPORT int defaultFontSize(); // in points
UIDLLEXPORT int defaultFontHeight(); // in pixels, DPI-specific
UIDLLEXPORT int defaultFontSize(); // in points
UIDLLEXPORT int defaultFontHeight(); // in pixels, DPI-specific
UIDLLEXPORT QFont defaultFont();
UIDLLEXPORT QFont largeFont();
UIDLLEXPORT QSize defaultIconSize();
@ -128,4 +127,4 @@ constexpr int windowPreferredHeight = 520;
} // namespace CalamaresUtils
#endif // CALAMARESUTILSGUI_H
#endif // CALAMARESUTILSGUI_H

View File

@ -2,7 +2,7 @@
*
* SPDX-License-Identifier: GPLv3+
* License-Filename: LICENSES/GPLv3+-ImageRegistry
*
*
* Copyright 2019, Adriaan de Groot <groot@kde.org>
*/

View File

@ -2,7 +2,7 @@
*
* SPDX-License-Identifier: GPLv3+
* License-Filename: LICENSES/GPLv3+-ImageRegistry
*
*
* Copyright 2019, Adriaan de Groot <groot@kde.org>
*/

View File

@ -34,11 +34,13 @@ lookupAndCall( PyObject* object,
{
PythonQtObjectPtr callable = PythonQt::self()->lookupCallable( object, name );
if ( callable )
{
return callable.call( args, kwargs );
}
}
// If we haven't found a callable with the given names, we force an error:
return PythonQt::self()->call( object, candidateNames.first(), args, kwargs );
}
}
} // namespace CalamaresUtils

View File

@ -33,6 +33,6 @@ QVariant lookupAndCall( PyObject* object,
const QVariantList& args = QVariantList(),
const QVariantMap& kwargs = QVariantMap() );
} //ns
} // namespace CalamaresUtils
#endif // PYTHONQTUTILS_H
#endif // PYTHONQTUTILS_H

View File

@ -26,7 +26,10 @@
namespace Calamares
{
BlankViewStep::BlankViewStep( const QString& title, const QString& description, const QString& details, QObject* parent)
BlankViewStep::BlankViewStep( const QString& title,
const QString& description,
const QString& details,
QObject* parent )
: Calamares::ViewStep( parent )
, m_widget( new QWidget() )
{
@ -54,14 +57,12 @@ BlankViewStep::BlankViewStep( const QString& title, const QString& description,
layout->addWidget( label );
}
layout->addStretch( 1 ); // Push the rest to the top
layout->addStretch( 1 ); // Push the rest to the top
m_widget->setLayout( layout );
}
BlankViewStep::~BlankViewStep()
{
}
BlankViewStep::~BlankViewStep() {}
QString
BlankViewStep::prettyName() const
@ -115,4 +116,4 @@ BlankViewStep::jobs() const
return JobList();
}
} // namespace
} // namespace Calamares

View File

@ -39,7 +39,10 @@ class BlankViewStep : public Calamares::ViewStep
Q_OBJECT
public:
explicit BlankViewStep( const QString& title, const QString& description, const QString& details = QString(), QObject* parent = nullptr );
explicit BlankViewStep( const QString& title,
const QString& description,
const QString& details = QString(),
QObject* parent = nullptr );
virtual ~BlankViewStep() override;
QString prettyName() const override;
@ -61,5 +64,5 @@ private:
QWidget* m_widget;
};
} // namespace
} // namespace Calamares
#endif // BLANKVIEWSTEP_H

View File

@ -24,7 +24,8 @@
GlobalStorage::GlobalStorage( Calamares::GlobalStorage* gs )
: QObject( gs )
, m_gs( gs )
{}
{
}
bool

View File

@ -54,4 +54,4 @@ private:
Calamares::GlobalStorage* m_gs;
};
#endif // PYTHONQTGLOBALSTORAGEWRAPPER_H
#endif // PYTHONQTGLOBALSTORAGEWRAPPER_H

View File

@ -20,34 +20,26 @@
#include "utils/PythonQtUtils.h"
PythonQtJob::PythonQtJob( PythonQtObjectPtr cxt,
PythonQtObjectPtr pyJob,
QObject* parent )
PythonQtJob::PythonQtJob( PythonQtObjectPtr cxt, PythonQtObjectPtr pyJob, QObject* parent )
: Calamares::Job( parent )
, m_cxt( cxt )
, m_pyJob( pyJob )
{
}
QString
PythonQtJob::prettyName() const
{
return CalamaresUtils::lookupAndCall( m_pyJob,
{ "prettyName",
"prettyname",
"pretty_name" } ).toString();
return CalamaresUtils::lookupAndCall( m_pyJob, { "prettyName", "prettyname", "pretty_name" } ).toString();
}
QString
PythonQtJob::prettyDescription() const
{
return CalamaresUtils::lookupAndCall( m_pyJob,
{ "prettyDescription",
"prettydescription",
"pretty_description" } ).toString();
return CalamaresUtils::lookupAndCall( m_pyJob, { "prettyDescription", "prettydescription", "pretty_description" } )
.toString();
}
@ -55,9 +47,8 @@ QString
PythonQtJob::prettyStatusMessage() const
{
return CalamaresUtils::lookupAndCall( m_pyJob,
{ "prettyStatusMessage",
"prettystatusmessage",
"pretty_status_message" } ).toString();
{ "prettyStatusMessage", "prettystatusmessage", "pretty_status_message" } )
.toString();
}
@ -66,12 +57,15 @@ PythonQtJob::exec()
{
QVariant response = m_pyJob.call( "exec" );
if ( response.isNull() )
{
return Calamares::JobResult::ok();
}
QVariantMap map = response.toMap();
if ( map.isEmpty() || map.value( "ok" ).toBool() )
{
return Calamares::JobResult::ok();
}
return Calamares::JobResult::error( map.value( "message" ).toString(),
map.value( "details" ).toString() );
return Calamares::JobResult::error( map.value( "message" ).toString(), map.value( "details" ).toString() );
}

View File

@ -32,12 +32,11 @@ class PythonQtJobResult : public QObject, public Calamares::JobResult
{
Q_OBJECT
public:
explicit PythonQtJobResult( bool ok,
const QString& message,
const QString& details )
explicit PythonQtJobResult( bool ok, const QString& message, const QString& details )
: QObject( nullptr )
, Calamares::JobResult( message, details, ok ? 0 : Calamares::JobResult::GenericError )
{}
{
}
};
@ -53,13 +52,11 @@ public:
Calamares::JobResult exec() override;
private:
explicit PythonQtJob( PythonQtObjectPtr cxt,
PythonQtObjectPtr pyJob,
QObject* parent = nullptr );
friend class Calamares::PythonQtViewStep; // only this one can call the ctor
explicit PythonQtJob( PythonQtObjectPtr cxt, PythonQtObjectPtr pyJob, QObject* parent = nullptr );
friend class Calamares::PythonQtViewStep; // only this one can call the ctor
PythonQtObjectPtr m_cxt;
PythonQtObjectPtr m_pyJob;
};
#endif // PYTHONQTJOB_H
#endif // PYTHONQTJOB_H

View File

@ -25,7 +25,7 @@
#include <PythonQt.h>
Utils::Utils(QObject* parent)
Utils::Utils( QObject* parent )
: QObject( parent )
, m_exceptionCxt( PythonQt::self()->createUniqueModule() )
{
@ -34,7 +34,7 @@ Utils::Utils(QObject* parent)
void
Utils::debug(const QString& s) const
Utils::debug( const QString& s ) const
{
cDebug() << "PythonQt DBG>" << s;
}
@ -46,35 +46,28 @@ Utils::mount( const QString& device_path,
const QString& filesystem_name,
const QString& options ) const
{
return CalamaresUtils::System::instance()->
mount( device_path, mount_point, filesystem_name, options );
return CalamaresUtils::System::instance()->mount( device_path, mount_point, filesystem_name, options );
}
int
Utils::target_env_call( const QString& command,
const QString& stdin,
int timeout ) const
Utils::target_env_call( const QString& command, const QString& stdin, int timeout ) const
{
return CalamaresUtils::System::instance()->
targetEnvCall( command, QString(), stdin, std::chrono::seconds( timeout > 0 ? timeout : 0 ) );
return CalamaresUtils::System::instance()->targetEnvCall(
command, QString(), stdin, std::chrono::seconds( timeout > 0 ? timeout : 0 ) );
}
int
Utils::target_env_call( const QStringList& args,
const QString& stdin,
int timeout ) const
Utils::target_env_call( const QStringList& args, const QString& stdin, int timeout ) const
{
return CalamaresUtils::System::instance()->
targetEnvCall( args, QString(), stdin, std::chrono::seconds( timeout > 0 ? timeout : 0 ) );
return CalamaresUtils::System::instance()->targetEnvCall(
args, QString(), stdin, std::chrono::seconds( timeout > 0 ? timeout : 0 ) );
}
int
Utils::check_target_env_call( const QString& command,
const QString& stdin,
int timeout ) const
Utils::check_target_env_call( const QString& command, const QString& stdin, int timeout ) const
{
int ec = target_env_call( command, stdin, timeout );
return _handle_check_target_env_call_error( ec, command );
@ -82,9 +75,7 @@ Utils::check_target_env_call( const QString& command,
int
Utils::check_target_env_call( const QStringList& args,
const QString& stdin,
int timeout) const
Utils::check_target_env_call( const QStringList& args, const QString& stdin, int timeout ) const
{
int ec = target_env_call( args, stdin, timeout );
return _handle_check_target_env_call_error( ec, args.join( ' ' ) );
@ -92,34 +83,22 @@ Utils::check_target_env_call( const QStringList& args,
QString
Utils::check_target_env_output( const QString& command,
const QString& stdin,
int timeout ) const
Utils::check_target_env_output( const QString& command, const QString& stdin, int timeout ) const
{
QString output;
int ec = CalamaresUtils::System::instance()->
targetEnvOutput( command,
output,
QString(),
stdin,
std::chrono::seconds( timeout > 0 ? timeout : 0 ) );
int ec = CalamaresUtils::System::instance()->targetEnvOutput(
command, output, QString(), stdin, std::chrono::seconds( timeout > 0 ? timeout : 0 ) );
_handle_check_target_env_call_error( ec, command );
return output;
}
QString
Utils::check_target_env_output( const QStringList& args,
const QString& stdin,
int timeout ) const
Utils::check_target_env_output( const QStringList& args, const QString& stdin, int timeout ) const
{
QString output;
int ec = CalamaresUtils::System::instance()->
targetEnvOutput( args,
output,
QString(),
stdin,
std::chrono::seconds( timeout > 0 ? timeout : 0 ) );
int ec = CalamaresUtils::System::instance()->targetEnvOutput(
args, output, QString(), stdin, std::chrono::seconds( timeout > 0 ? timeout : 0 ) );
_handle_check_target_env_call_error( ec, args.join( ' ' ) );
return output;
}
@ -133,13 +112,11 @@ Utils::obscure( const QString& string ) const
int
Utils::_handle_check_target_env_call_error( int ec, const QString& cmd) const
Utils::_handle_check_target_env_call_error( int ec, const QString& cmd ) const
{
if ( ec )
{
QString raise = QString( "raise subprocess.CalledProcessError(%1,\"%2\")" )
.arg( ec )
.arg( cmd );
QString raise = QString( "raise subprocess.CalledProcessError(%1,\"%2\")" ).arg( ec ).arg( cmd );
PythonQt::self()->evalScript( m_exceptionCxt, raise );
}
return ec;

View File

@ -43,29 +43,17 @@ public slots:
const QString& filesystem_name,
const QString& options ) const;
int target_env_call( const QString& command,
const QString& stdin = QString(),
int timeout = 0 ) const;
int target_env_call( const QString& command, const QString& stdin = QString(), int timeout = 0 ) const;
int target_env_call( const QStringList& args,
const QString& stdin = QString(),
int timeout = 0 ) const;
int target_env_call( const QStringList& args, const QString& stdin = QString(), int timeout = 0 ) const;
int check_target_env_call( const QString& command,
const QString& stdin = QString(),
int timeout = 0 ) const;
int check_target_env_call( const QString& command, const QString& stdin = QString(), int timeout = 0 ) const;
int check_target_env_call( const QStringList& args,
const QString& stdin = QString(),
int timeout = 0 ) const;
int check_target_env_call( const QStringList& args, const QString& stdin = QString(), int timeout = 0 ) const;
QString check_target_env_output( const QString& command,
const QString& stdin = QString(),
int timeout = 0 ) const;
QString check_target_env_output( const QString& command, const QString& stdin = QString(), int timeout = 0 ) const;
QString check_target_env_output( const QStringList& args,
const QString& stdin = QString(),
int timeout = 0 ) const;
QString check_target_env_output( const QStringList& args, const QString& stdin = QString(), int timeout = 0 ) const;
QString obscure( const QString& string ) const;
@ -75,4 +63,4 @@ private:
PythonQtObjectPtr m_exceptionCxt;
};
#endif // PYTHONQTUTILSWRAPPER_H
#endif // PYTHONQTUTILSWRAPPER_H

View File

@ -18,8 +18,8 @@
*/
#include "PythonQtViewStep.h"
#include "utils/Logger.h"
#include "utils/CalamaresUtilsGui.h"
#include "utils/Logger.h"
#include "utils/PythonQtUtils.h"
#include "utils/Retranslator.h"
#include "viewpages/PythonQtJob.h"
@ -33,8 +33,7 @@
namespace Calamares
{
PythonQtViewStep::PythonQtViewStep( PythonQtObjectPtr cxt,
QObject* parent )
PythonQtViewStep::PythonQtViewStep( PythonQtObjectPtr cxt, QObject* parent )
: ViewStep( parent )
, m_widget( new QWidget() )
, m_cxt( cxt )
@ -48,32 +47,26 @@ PythonQtViewStep::PythonQtViewStep( PythonQtObjectPtr cxt,
// Instantiate an object of the class marked with @calamares_module and
// store it as _calamares_module.
pq->evalScript( m_cxt, QString( "_calamares_module = %1()" )
.arg( className ) );
pq->evalScript( m_cxt, QString( "_calamares_module = %1()" ).arg( className ) );
m_obj = pq->lookupObject( m_cxt, "_calamares_module" );
Q_ASSERT( !m_obj.isNull() ); // no entry point, no party
Q_ASSERT( !m_obj.isNull() ); // no entry point, no party
// Prepare the base widget for the module's pages
m_widget->setLayout( new QVBoxLayout );
CalamaresUtils::unmarginLayout( m_widget->layout() );
m_cxt.addObject( "_calamares_module_basewidget", m_widget );
CALAMARES_RETRANSLATE_WIDGET( m_widget,
CalamaresUtils::lookupAndCall( m_obj,
{ "retranslate" },
{ CalamaresUtils::translatorLocaleName() } );
)
CALAMARES_RETRANSLATE_WIDGET(
m_widget,
CalamaresUtils::lookupAndCall( m_obj, { "retranslate" }, { CalamaresUtils::translatorLocaleName() } ); )
}
QString
PythonQtViewStep::prettyName() const
{
return CalamaresUtils::lookupAndCall( m_obj,
{ "prettyName",
"prettyname",
"pretty_name" } ).toString();
return CalamaresUtils::lookupAndCall( m_obj, { "prettyName", "prettyname", "pretty_name" } ).toString();
}
@ -82,12 +75,14 @@ PythonQtViewStep::widget()
{
if ( m_widget->layout()->count() > 1 )
cWarning() << "PythonQtViewStep wrapper widget has more than 1 child. "
"This should never happen.";
"This should never happen.";
bool nothingChanged = m_cxt.evalScript(
"_calamares_module.widget() in _calamares_module_basewidget.children()" ).toBool();
bool nothingChanged
= m_cxt.evalScript( "_calamares_module.widget() in _calamares_module_basewidget.children()" ).toBool();
if ( nothingChanged )
{
return m_widget;
}
// Else, we either don't have a child widget, or we have a child widget that
// was previously set and doesn't apply any more since the Python module
@ -97,10 +92,11 @@ PythonQtViewStep::widget()
// We only remove from the layout and not delete because Python is in charge
// of memory management for these widgets.
while ( m_widget->layout()->itemAt( 0 ) )
{
m_widget->layout()->takeAt( 0 );
}
m_cxt.evalScript(
"_calamares_module_basewidget.layout().addWidget(_calamares_module.widget())" );
m_cxt.evalScript( "_calamares_module_basewidget.layout().addWidget(_calamares_module.widget())" );
return m_widget;
}
@ -123,58 +119,40 @@ PythonQtViewStep::back()
bool
PythonQtViewStep::isNextEnabled() const
{
return CalamaresUtils::lookupAndCall( m_obj,
{ "isNextEnabled",
"isnextenabled",
"is_next_enabled" } ).toBool();
return CalamaresUtils::lookupAndCall( m_obj, { "isNextEnabled", "isnextenabled", "is_next_enabled" } ).toBool();
}
bool
PythonQtViewStep::isBackEnabled() const
{
return CalamaresUtils::lookupAndCall( m_obj,
{ "isBackEnabled",
"isbackenabled",
"is_back_enabled" } ).toBool();
return CalamaresUtils::lookupAndCall( m_obj, { "isBackEnabled", "isbackenabled", "is_back_enabled" } ).toBool();
}
bool
PythonQtViewStep::isAtBeginning() const
{
return CalamaresUtils::lookupAndCall( m_obj,
{ "isAtBeginning",
"isatbeginning",
"is_at_beginning" } ).toBool();
return CalamaresUtils::lookupAndCall( m_obj, { "isAtBeginning", "isatbeginning", "is_at_beginning" } ).toBool();
}
bool
PythonQtViewStep::isAtEnd() const
{
return CalamaresUtils::lookupAndCall( m_obj,
{ "isAtEnd",
"isatend",
"is_at_end" } ).toBool();
return CalamaresUtils::lookupAndCall( m_obj, { "isAtEnd", "isatend", "is_at_end" } ).toBool();
}
void
PythonQtViewStep::onActivate()
PythonQtViewStep::onActivate()
{
CalamaresUtils::lookupAndCall( m_obj,
{ "onActivate",
"onactivate",
"on_activate" });
CalamaresUtils::lookupAndCall( m_obj, { "onActivate", "onactivate", "on_activate" } );
}
void
PythonQtViewStep::onLeave()
{
CalamaresUtils::lookupAndCall( m_obj,
{ "onLeave",
"onleave",
"on_leave" });
CalamaresUtils::lookupAndCall( m_obj, { "onLeave", "onleave", "on_leave" } );
}
@ -185,21 +163,29 @@ PythonQtViewStep::jobs() const
PythonQtObjectPtr jobsCallable = PythonQt::self()->lookupCallable( m_obj, "jobs" );
if ( jobsCallable.isNull() )
{
return jobs;
}
PythonQtObjectPtr response = PythonQt::self()->callAndReturnPyObject( jobsCallable );
if ( response.isNull() )
{
return jobs;
}
PythonQtObjectPtr listPopCallable = PythonQt::self()->lookupCallable( response, "pop" );
if ( listPopCallable.isNull() )
{
return jobs;
}
forever
{
PythonQtObjectPtr aJob = PythonQt::self()->callAndReturnPyObject( listPopCallable, { 0 } );
if ( aJob.isNull() )
{
break;
}
jobs.append( Calamares::job_ptr( new PythonQtJob( m_cxt, aJob ) ) );
}
@ -219,9 +205,8 @@ QWidget*
PythonQtViewStep::createScriptingConsole()
{
PythonQtScriptingConsole* console = new PythonQtScriptingConsole( nullptr, m_cxt );
console->setProperty( "classname",
m_cxt.getVariable( "_calamares_module_typename" ).toString() );
console->setProperty( "classname", m_cxt.getVariable( "_calamares_module_typename" ).toString() );
return console;
}
}
} // namespace Calamares

View File

@ -30,8 +30,7 @@ class PythonQtViewStep : public Calamares::ViewStep
{
Q_OBJECT
public:
PythonQtViewStep( PythonQtObjectPtr cxt,
QObject* parent = nullptr );
PythonQtViewStep( PythonQtObjectPtr cxt, QObject* parent = nullptr );
QString prettyName() const override;
@ -62,6 +61,6 @@ private:
PythonQtObjectPtr m_obj;
};
}
} // namespace Calamares
#endif // PYTHONQTVIEWSTEP_H
#endif // PYTHONQTVIEWSTEP_H

View File

@ -24,11 +24,11 @@ namespace Calamares
ViewStep::ViewStep( QObject* parent )
: QObject( parent )
{}
{
}
ViewStep::~ViewStep()
{}
ViewStep::~ViewStep() {}
QString
@ -45,20 +45,24 @@ ViewStep::createSummaryWidget() const
void
ViewStep::onActivate()
{}
{
}
void
ViewStep::onLeave()
{}
{
}
void
ViewStep::next()
{}
{
}
void
ViewStep::back()
{}
{
}
void
@ -69,10 +73,7 @@ ViewStep::setModuleInstanceKey( const QString& instanceKey )
void
ViewStep::setConfigurationMap( const QVariantMap& configurationMap )
{
Q_UNUSED( configurationMap )
}
ViewStep::setConfigurationMap( const QVariantMap& configurationMap ) { Q_UNUSED( configurationMap ) }
RequirementsList ViewStep::checkRequirements()
@ -80,4 +81,4 @@ RequirementsList ViewStep::checkRequirements()
return RequirementsList();
}
}
} // namespace Calamares

View File

@ -130,10 +130,7 @@ public:
virtual JobList jobs() const = 0;
void setModuleInstanceKey( const QString& instanceKey );
QString moduleInstanceKey() const
{
return m_instanceKey;
}
QString moduleInstanceKey() const { return m_instanceKey; }
virtual void setConfigurationMap( const QVariantMap& configurationMap );
@ -161,6 +158,6 @@ protected:
};
using ViewStepList = QList< ViewStep* >;
}
} // namespace Calamares
#endif // VIEWSTEP_H
#endif // VIEWSTEP_H

View File

@ -23,16 +23,17 @@
ClickableLabel::ClickableLabel( QWidget* parent )
: QLabel( parent )
{}
{
}
ClickableLabel::ClickableLabel( const QString& text, QWidget* parent )
: QLabel( text, parent )
{}
{
}
ClickableLabel::~ClickableLabel()
{}
ClickableLabel::~ClickableLabel() {}
void
@ -48,5 +49,7 @@ ClickableLabel::mouseReleaseEvent( QMouseEvent* event )
{
QLabel::mouseReleaseEvent( event );
if ( m_time.elapsed() < qApp->doubleClickInterval() )
{
emit clicked();
}
}

View File

@ -42,4 +42,4 @@ private:
QTime m_time;
};
#endif // CLICKABLELABEL_H
#endif // CLICKABLELABEL_H

View File

@ -22,21 +22,18 @@
FixedAspectRatioLabel::FixedAspectRatioLabel( QWidget* parent )
: QLabel( parent )
{}
{
}
FixedAspectRatioLabel::~FixedAspectRatioLabel()
{}
FixedAspectRatioLabel::~FixedAspectRatioLabel() {}
void
FixedAspectRatioLabel::setPixmap( const QPixmap& pixmap )
{
m_pixmap = pixmap;
QLabel::setPixmap( pixmap.scaled(
contentsRect().size(),
Qt::KeepAspectRatio,
Qt::SmoothTransformation ) );
QLabel::setPixmap( pixmap.scaled( contentsRect().size(), Qt::KeepAspectRatio, Qt::SmoothTransformation ) );
}
@ -44,9 +41,5 @@ void
FixedAspectRatioLabel::resizeEvent( QResizeEvent* event )
{
Q_UNUSED( event )
QLabel::setPixmap( m_pixmap.scaled(
contentsRect().size(),
Qt::KeepAspectRatio,
Qt::SmoothTransformation ) );
QLabel::setPixmap( m_pixmap.scaled( contentsRect().size(), Qt::KeepAspectRatio, Qt::SmoothTransformation ) );
}

View File

@ -31,11 +31,11 @@ public:
virtual ~FixedAspectRatioLabel() override;
public slots:
void setPixmap( const QPixmap &pixmap );
void setPixmap( const QPixmap& pixmap );
void resizeEvent( QResizeEvent* event ) override;
private:
QPixmap m_pixmap;
};
#endif // FIXEDASPECTRATIOLABEL_H
#endif // FIXEDASPECTRATIOLABEL_H

View File

@ -35,4 +35,4 @@ private:
QLabel* m_waitingLabel;
};
#endif // WAITINGWIDGET_H
#endif // WAITINGWIDGET_H

View File

@ -1,11 +1,11 @@
find_package( KPMcore 3.3 )
find_package( KF5Config CONFIG )
find_package( KF5I18n CONFIG )
find_package( KF5WidgetsAddons CONFIG )
set( _partition_defs "" )
if ( KPMcore_FOUND )
find_package( Qt5 REQUIRED DBus ) # Needed for KPMCore
find_package( KF5 REQUIRED I18n WidgetsAddons ) # Needed for KPMCore
if ( KPMcore_FOUND AND Qt5DBus_FOUND AND KF5CoreAddons_FOUND AND KF5Config_FOUND )
include_directories( ${KPMCORE_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/src/modules/partition )
if ( KPMcore_VERSION VERSION_GREATER "3.3.0")
@ -48,5 +48,9 @@ if ( KPMcore_FOUND )
target_compile_definitions( fsresizertest PRIVATE ${_partition_defs} )
endif()
else()
calamares_skip_module( "fsresizer (missing suitable KPMcore)" )
if ( NOT KPMcore_FOUND )
calamares_skip_module( "fsresizer (missing suitable KPMcore)" )
else()
calamares_skip_module( "fsresizer (missing dependencies for KPMcore)" )
endif()
endif()

View File

@ -22,11 +22,11 @@ set_package_properties(
KPMcore PROPERTIES
PURPOSE "For partitioning module"
)
find_package( KF5Config CONFIG )
find_package( KF5I18n CONFIG )
find_package( KF5WidgetsAddons CONFIG )
if ( KPMcore_FOUND )
find_package( Qt5 REQUIRED DBus )
find_package( KF5 REQUIRED Config CoreAddons I18n WidgetsAddons )
if ( KPMcore_FOUND AND Qt5DBus_FOUND AND KF5CoreAddons_FOUND AND KF5Config_FOUND )
if ( KPMcore_VERSION VERSION_GREATER "3.3.0")
list( APPEND _partition_defs WITH_KPMCORE331API) # kpmcore > 3.3.0 with deprecations
endif()
@ -106,5 +106,9 @@ if ( KPMcore_FOUND )
SHARED_LIB
)
else()
calamares_skip_module( "partition (missing suitable KPMcore)" )
if ( NOT KPMcore_FOUND )
calamares_skip_module( "partition (missing suitable KPMcore)" )
else()
calamares_skip_module( "partition (missing dependencies for KPMcore)" )
endif()
endif()

View File

@ -103,6 +103,7 @@ def file_copy(source, dest, progress_cb):
if not source.endswith("/"):
source += "/"
num_files_total_local = 0
num_files_copied = 0 # Gets updated through rsync output
args = ['rsync', '-aHAXr']

View File

@ -20,8 +20,8 @@
#include "WelcomePage.h"
#include "ui_WelcomePage.h"
#include "checker/CheckerContainer.h"
#include "ui_WelcomePage.h"
#include "Branding.h"
#include "CalamaresVersion.h"
@ -32,6 +32,7 @@
#include "modulesystem/ModuleManager.h"
#include "utils/CalamaresUtilsGui.h"
#include "utils/Logger.h"
#include "utils/NamedEnum.h"
#include "utils/Retranslator.h"
#include <QApplication>
@ -48,9 +49,18 @@ WelcomePage::WelcomePage( QWidget* parent )
, m_checkingWidget( new CheckerContainer( this ) )
, m_languages( nullptr )
{
connect( Calamares::ModuleManager::instance(), &Calamares::ModuleManager::requirementsResult, m_checkingWidget, &CheckerContainer::requirementsChecked );
connect( Calamares::ModuleManager::instance(), &Calamares::ModuleManager::requirementsComplete, m_checkingWidget, &CheckerContainer::requirementsComplete );
connect( Calamares::ModuleManager::instance(), &Calamares::ModuleManager::requirementsProgress, m_checkingWidget, &CheckerContainer::requirementsProgress );
connect( Calamares::ModuleManager::instance(),
&Calamares::ModuleManager::requirementsResult,
m_checkingWidget,
&CheckerContainer::requirementsChecked );
connect( Calamares::ModuleManager::instance(),
&Calamares::ModuleManager::requirementsComplete,
m_checkingWidget,
&CheckerContainer::requirementsComplete );
connect( Calamares::ModuleManager::instance(),
&Calamares::ModuleManager::requirementsProgress,
m_checkingWidget,
&CheckerContainer::requirementsProgress );
ui->setupUi( this );
ui->verticalLayout->insertSpacing( 1, CalamaresUtils::defaultFontHeight() * 2 );
@ -61,38 +71,33 @@ WelcomePage::WelcomePage( QWidget* parent )
ui->mainText->setOpenExternalLinks( true );
cDebug() << "Welcome string" << Calamares::Branding::instance()->welcomeStyleCalamares()
<< *Calamares::Branding::VersionedName;
<< *Calamares::Branding::VersionedName;
CALAMARES_RETRANSLATE(
QString message;
if ( Calamares::Settings::instance()->isSetupMode() )
message = Calamares::Branding::instance()->welcomeStyleCalamares()
? tr( "<h1>Welcome to the Calamares setup program for %1.</h1>" )
: tr( "<h1>Welcome to %1 setup.</h1>" );
else
message = Calamares::Branding::instance()->welcomeStyleCalamares()
? tr( "<h1>Welcome to the Calamares installer for %1.</h1>" )
: tr( "<h1>Welcome to the %1 installer.</h1>" );
if ( Calamares::Settings::instance()->isSetupMode() ) message
= Calamares::Branding::instance()->welcomeStyleCalamares()
? tr( "<h1>Welcome to the Calamares setup program for %1.</h1>" )
: tr( "<h1>Welcome to %1 setup.</h1>" );
else message = Calamares::Branding::instance()->welcomeStyleCalamares()
? tr( "<h1>Welcome to the Calamares installer for %1.</h1>" )
: tr( "<h1>Welcome to the %1 installer.</h1>" );
ui->mainText->setText( message.arg( *Calamares::Branding::VersionedName ) );
ui->retranslateUi( this );
)
ui->supportButton->setText( tr( "%1 support" ).arg( *Calamares::Branding::ShortProductName ) ); )
ui->aboutButton->setIcon( CalamaresUtils::defaultPixmap( CalamaresUtils::Information,
CalamaresUtils::Original,
2*QSize( CalamaresUtils::defaultFontHeight(),
CalamaresUtils::defaultFontHeight() ) ) );
connect( ui->aboutButton, &QPushButton::clicked,
this, [ this ]
{
QString title = Calamares::Settings::instance()->isSetupMode()
? tr( "About %1 setup" )
: tr( "About %1 installer" );
ui->aboutButton->setIcon( CalamaresUtils::defaultPixmap(
CalamaresUtils::Information,
CalamaresUtils::Original,
2 * QSize( CalamaresUtils::defaultFontHeight(), CalamaresUtils::defaultFontHeight() ) ) );
connect( ui->aboutButton, &QPushButton::clicked, this, [this] {
QString title
= Calamares::Settings::instance()->isSetupMode() ? tr( "About %1 setup" ) : tr( "About %1 installer" );
QMessageBox mb( QMessageBox::Information,
title.arg( CALAMARES_APPLICATION_NAME ),
tr(
"<h1>%1</h1><br/>"
tr( "<h1>%1</h1><br/>"
"<strong>%2<br/>"
"for %3</strong><br/><br/>"
"Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>"
@ -103,24 +108,23 @@ WelcomePage::WelcomePage( QWidget* parent )
"<a href=\"https://calamares.io/\">Calamares</a> "
"development is sponsored by <br/>"
"<a href=\"http://www.blue-systems.com/\">Blue Systems</a> - "
"Liberating Software."
)
.arg( CALAMARES_APPLICATION_NAME )
.arg( CALAMARES_VERSION )
.arg( *Calamares::Branding::VersionedName ),
"Liberating Software." )
.arg( CALAMARES_APPLICATION_NAME )
.arg( CALAMARES_VERSION )
.arg( *Calamares::Branding::VersionedName ),
QMessageBox::Ok,
this );
mb.setIconPixmap( CalamaresUtils::defaultPixmap( CalamaresUtils::Squid,
CalamaresUtils::Original,
QSize( CalamaresUtils::defaultFontHeight() * 6,
CalamaresUtils::defaultFontHeight() * 6 ) ) );
QGridLayout* layout = reinterpret_cast<QGridLayout *>( mb.layout() );
mb.setIconPixmap( CalamaresUtils::defaultPixmap(
CalamaresUtils::Squid,
CalamaresUtils::Original,
QSize( CalamaresUtils::defaultFontHeight() * 6, CalamaresUtils::defaultFontHeight() * 6 ) ) );
QGridLayout* layout = reinterpret_cast< QGridLayout* >( mb.layout() );
if ( layout )
layout->setColumnMinimumWidth( 2, CalamaresUtils::defaultFontHeight() * 24 );
mb.exec();
} );
ui->verticalLayout->insertWidget( 3, m_checkingWidget);
ui->verticalLayout->insertWidget( 3, m_checkingWidget );
}
@ -139,15 +143,16 @@ WelcomePage::initLanguages()
QLocale defaultLocale = QLocale( QLocale::system().name() );
cDebug() << "Matching locale" << defaultLocale;
int matchedLocaleIndex = m_languages->find(
[&](const QLocale& x){ return x.language() == defaultLocale.language() && x.country() == defaultLocale.country(); } );
int matchedLocaleIndex = m_languages->find( [&]( const QLocale& x ) {
return x.language() == defaultLocale.language() && x.country() == defaultLocale.country();
} );
if ( matchedLocaleIndex < 0 )
{
cDebug() << Logger::SubEntry << "Matching approximate locale" << defaultLocale.language();
matchedLocaleIndex = m_languages->find(
[&](const QLocale& x){ return x.language() == defaultLocale.language(); } );
matchedLocaleIndex
= m_languages->find( [&]( const QLocale& x ) { return x.language() == defaultLocale.language(); } );
}
if ( matchedLocaleIndex < 0 )
@ -159,7 +164,9 @@ WelcomePage::initLanguages()
// Now, if it matched, because we didn't match the system locale, switch to the one found
if ( matchedLocaleIndex >= 0 )
{
QLocale::setDefault( m_languages->locale( matchedLocaleIndex ).locale() );
}
}
if ( matchedLocaleIndex >= 0 )
@ -171,89 +178,82 @@ WelcomePage::initLanguages()
ui->languageWidget->setCurrentIndex( matchedLocaleIndex );
}
else
{
cWarning() << "No available translation matched" << defaultLocale;
}
connect( ui->languageWidget,
static_cast< void ( QComboBox::* )( int ) >( &QComboBox::currentIndexChanged ),
this,
[&]( int newIndex )
{
[&]( int newIndex ) {
const auto& selectedLocale = m_languages->locale( newIndex ).locale();
cDebug() << "Selected locale" << selectedLocale;
QLocale::setDefault( selectedLocale );
CalamaresUtils::installTranslator( selectedLocale,
Calamares::Branding::instance()->translationsDirectory(),
qApp );
CalamaresUtils::installTranslator(
selectedLocale, Calamares::Branding::instance()->translationsDirectory(), qApp );
} );
}
void
WelcomePage::setUpLinks( bool showSupportUrl,
bool showKnownIssuesUrl,
bool showReleaseNotesUrl )
WelcomePage::setupButton( Button role, const QString& url )
{
using namespace Calamares;
if ( showSupportUrl && !( *Branding::SupportUrl ).isEmpty() )
QPushButton* button = nullptr;
CalamaresUtils::ImageType icon = CalamaresUtils::Information;
switch ( role )
{
CALAMARES_RETRANSLATE(
ui->supportButton->setText( tr( "%1 support" )
.arg( *Branding::ShortProductName ) );
)
ui->supportButton->setIcon( CalamaresUtils::defaultPixmap( CalamaresUtils::Help,
CalamaresUtils::Original,
2*QSize( CalamaresUtils::defaultFontHeight(),
CalamaresUtils::defaultFontHeight() ) ) );
connect( ui->supportButton, &QPushButton::clicked, []
{
QDesktopServices::openUrl( *Branding::SupportUrl );
} );
case Button::Donate:
button = ui->donateButton;
icon = CalamaresUtils::Donate;
break;
case Button::KnownIssues:
button = ui->knownIssuesButton;
icon = CalamaresUtils::Bugs;
break;
case Button::ReleaseNotes:
button = ui->releaseNotesButton;
icon = CalamaresUtils::Release;
break;
case Button::Support:
button = ui->supportButton;
icon = CalamaresUtils::Help;
break;
}
else
if ( !button )
{
ui->supportButton->hide();
qWarning() << "Unknown button role" << smash( role );
return;
}
if ( showKnownIssuesUrl && !( *Branding::KnownIssuesUrl ).isEmpty() )
if ( url.isEmpty() )
{
ui->knownIssuesButton->setIcon( CalamaresUtils::defaultPixmap( CalamaresUtils::Bugs,
CalamaresUtils::Original,
2*QSize( CalamaresUtils::defaultFontHeight(),
CalamaresUtils::defaultFontHeight() ) ) );
connect( ui->knownIssuesButton, &QPushButton::clicked, []
{
QDesktopServices::openUrl( *Branding::KnownIssuesUrl );
} );
}
else
{
ui->knownIssuesButton->hide();
button->hide();
return;
}
if ( showReleaseNotesUrl && !( *Branding::ReleaseNotesUrl ).isEmpty() )
QUrl u( url );
if ( u.isValid() )
{
ui->releaseNotesButton->setIcon( CalamaresUtils::defaultPixmap( CalamaresUtils::Release,
CalamaresUtils::Original,
2*QSize( CalamaresUtils::defaultFontHeight(),
CalamaresUtils::defaultFontHeight() ) ) );
connect( ui->releaseNotesButton, &QPushButton::clicked, []
{
QDesktopServices::openUrl( *Branding::ReleaseNotesUrl );
} );
auto size = 2 * QSize( CalamaresUtils::defaultFontHeight(), CalamaresUtils::defaultFontHeight() );
button->setIcon( CalamaresUtils::defaultPixmap( icon, CalamaresUtils::Original, size ) );
connect( button, &QPushButton::clicked, [u]() { QDesktopServices::openUrl( u ); } );
}
else
{
ui->releaseNotesButton->hide();
qWarning() << "Welcome button" << smash( role ) << "URL" << url << "is invalid.";
button->hide();
}
}
void
WelcomePage::focusInEvent( QFocusEvent* e )
{
if ( ui->languageWidget )
{
ui->languageWidget->setFocus();
}
e->accept();
}
@ -267,7 +267,9 @@ void
WelcomePage::externallySelectedLanguage( int row )
{
if ( ( row >= 0 ) && ( row < ui->languageWidget->count() ) )
{
ui->languageWidget->setCurrentIndex( row );
}
}
void
@ -278,8 +280,14 @@ WelcomePage::setLanguageIcon( QPixmap i )
void
LocaleTwoColumnDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
LocaleTwoColumnDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const
{
QStyledItemDelegate::paint( painter, option, index );
option.widget->style()->drawItemText( painter, option.rect, Qt::AlignRight | Qt::AlignVCenter, option.palette, false, index.data( CalamaresUtils::Locale::LabelModel::EnglishLabelRole ).toString() );
option.widget->style()->drawItemText(
painter,
option.rect,
Qt::AlignRight | Qt::AlignVCenter,
option.palette,
false,
index.data( CalamaresUtils::Locale::LabelModel::EnglishLabelRole ).toString() );
}

View File

@ -38,10 +38,17 @@ class WelcomePage : public QWidget
public:
explicit WelcomePage( QWidget* parent = nullptr );
/// @brief Configure the buttons for URLs from the branding configuration
void setUpLinks( bool showSupportUrl,
bool showKnownIssuesUrl,
bool showReleaseNotesUrl );
enum class Button
{
Support,
Donate,
KnownIssues,
ReleaseNotes
};
/// @brief Configure the button @p n, to open @p url
void setupButton( Button b, const QString& url );
/// @brief Set international language-selector icon
void setLanguageIcon( QPixmap );
@ -50,8 +57,9 @@ public:
/// @brief Change the language from an external source.
void externallySelectedLanguage( int row );
protected:
void focusInEvent( QFocusEvent* e ) override; //choose the child widget to focus
void focusInEvent( QFocusEvent* e ) override; //choose the child widget to focus
private:
/// @brief Fill the list of languages with the available translations
@ -59,7 +67,7 @@ private:
Ui::WelcomePage* ui;
CheckerContainer* m_checkingWidget;
CalamaresUtils::Locale::LabelModel *m_languages;
CalamaresUtils::Locale::LabelModel* m_languages;
};
/** @brief Delegate to display language information in two columns.
@ -72,6 +80,6 @@ public:
using QStyledItemDelegate::QStyledItemDelegate;
void paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const override;
} ;
};
#endif // WELCOMEPAGE_H
#endif // WELCOMEPAGE_H

View File

@ -13,9 +13,6 @@
<property name="windowTitle">
<string>Form</string>
</property>
<property name="toolTip">
<string>Select language</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<layout class="QVBoxLayout" name="verticalLayout" stretch="0,0,0,0,0">
@ -69,7 +66,7 @@
<item>
<widget class="QLabel" name="languageIcon">
<property name="toolTip">
<string>Select language</string>
<string>Select application and system language</string>
</property>
<property name="text">
<string/>
@ -81,6 +78,9 @@
</item>
<item>
<widget class="QComboBox" name="languageWidget">
<property name="toolTip">
<string>Select application and system language</string>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>2</horstretch>
@ -134,8 +134,24 @@
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="donateButton">
<property name="toolTip">
<string>Open donations website</string>
</property>
<property name="text">
<string>&amp;Donate</string>
</property>
<property name="flat">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="supportButton">
<property name="toolTip">
<string>Open help and support website</string>
</property>
<property name="text">
<string>&amp;Support</string>
</property>
@ -146,6 +162,9 @@
</item>
<item>
<widget class="QPushButton" name="knownIssuesButton">
<property name="toolTip">
<string>Open issues and bug-tracking website</string>
</property>
<property name="text">
<string>&amp;Known issues</string>
</property>
@ -156,6 +175,9 @@
</item>
<item>
<widget class="QPushButton" name="releaseNotesButton">
<property name="toolTip">
<string>Open relead notes website</string>
</property>
<property name="text">
<string>&amp;Release notes</string>
</property>

View File

@ -33,13 +33,16 @@
#include <QFutureWatcher>
#include <QVariant>
CALAMARES_PLUGIN_FACTORY_DEFINITION( WelcomeViewStepFactory, registerPlugin<WelcomeViewStep>(); )
CALAMARES_PLUGIN_FACTORY_DEFINITION( WelcomeViewStepFactory, registerPlugin< WelcomeViewStep >(); )
WelcomeViewStep::WelcomeViewStep( QObject* parent )
: Calamares::ViewStep( parent )
, m_requirementsChecker( new GeneralRequirements( this ) )
{
connect( Calamares::ModuleManager::instance(), &Calamares::ModuleManager::requirementsComplete, this, &WelcomeViewStep::nextStatusChanged );
connect( Calamares::ModuleManager::instance(),
&Calamares::ModuleManager::requirementsComplete,
this,
&WelcomeViewStep::nextStatusChanged );
m_widget = new WelcomePage();
}
@ -47,7 +50,9 @@ WelcomeViewStep::WelcomeViewStep( QObject* parent )
WelcomeViewStep::~WelcomeViewStep()
{
if ( m_widget && m_widget->parent() == nullptr )
{
m_widget->deleteLater();
}
}
@ -100,23 +105,59 @@ WelcomeViewStep::jobs() const
}
/** @brief Look up a URL for a button
*
* Looks up @p key in @p map; if it is a *boolean* value, then
* assume an old-style configuration, and fetch the string from
* the branding settings @p e. If it is a string, not a boolean,
* use it as-is. If not found, or a weird type, returns empty.
*
* This allows switching the showKnownIssuesUrl and similar settings
* in welcome.conf from a boolean (deferring to branding) to an
* actual string for immediate use. Empty strings, as well as
* "false" as a setting, will hide the buttons as before.
*/
static QString
jobOrBrandingSetting( Calamares::Branding::StringEntry e, const QVariantMap& map, const QString& key )
{
if ( !map.contains( key ) )
{
return QString();
}
auto v = map.value( key );
if ( v.type() == QVariant::Bool )
{
return v.toBool() ? ( *e ) : QString();
}
if ( v.type() == QVariant::String )
{
return v.toString();
}
return QString();
}
void
WelcomeViewStep::setConfigurationMap( const QVariantMap& configurationMap )
{
bool showSupportUrl = CalamaresUtils::getBool( configurationMap, "showSupportUrl", false );
bool showKnownIssuesUrl = CalamaresUtils::getBool( configurationMap, "showKnownIssuesUrl", false );
bool showReleaseNotesUrl = CalamaresUtils::getBool( configurationMap, "showReleaseNotesUrl", false );
using Calamares::Branding;
m_widget->setUpLinks( showSupportUrl,
showKnownIssuesUrl,
showReleaseNotesUrl );
m_widget->setupButton( WelcomePage::Button::Support,
jobOrBrandingSetting( Branding::SupportUrl, configurationMap, "showSupportUrl" ) );
m_widget->setupButton( WelcomePage::Button::KnownIssues,
jobOrBrandingSetting( Branding::KnownIssuesUrl, configurationMap, "showKnownIssuesUrl" ) );
m_widget->setupButton( WelcomePage::Button::ReleaseNotes,
jobOrBrandingSetting( Branding::ReleaseNotesUrl, configurationMap, "showReleaseNotesUrl" ) );
m_widget->setupButton( WelcomePage::Button::Donate, CalamaresUtils::getString( configurationMap, "showDonateUrl" ) );
if ( configurationMap.contains( "requirements" ) &&
configurationMap.value( "requirements" ).type() == QVariant::Map )
if ( configurationMap.contains( "requirements" )
&& configurationMap.value( "requirements" ).type() == QVariant::Map )
{
m_requirementsChecker->setConfigurationMap( configurationMap.value( "requirements" ).toMap() );
}
else
cWarning() << "no valid requirements map found in welcome "
"module configuration.";
"module configuration.";
bool ok = false;
QVariantMap geoip = CalamaresUtils::getSubMap( configurationMap, "geoip", ok );
@ -124,15 +165,13 @@ WelcomeViewStep::setConfigurationMap( const QVariantMap& configurationMap )
{
using FWString = QFutureWatcher< QString >;
auto* handler = new CalamaresUtils::GeoIP::Handler(
CalamaresUtils::getString( geoip, "style" ),
CalamaresUtils::getString( geoip, "url" ),
CalamaresUtils::getString( geoip, "selector" ) );
auto* handler = new CalamaresUtils::GeoIP::Handler( CalamaresUtils::getString( geoip, "style" ),
CalamaresUtils::getString( geoip, "url" ),
CalamaresUtils::getString( geoip, "selector" ) );
if ( handler->type() != CalamaresUtils::GeoIP::Handler::Type::None )
{
auto* future = new FWString();
connect( future, &FWString::finished, [view=this, f=future, h=handler]()
{
connect( future, &FWString::finished, [view = this, f = future, h = handler]() {
QString countryResult = f->future().result();
cDebug() << "GeoIP result for welcome=" << countryResult;
view->setCountry( countryResult, h );
@ -154,7 +193,9 @@ WelcomeViewStep::setConfigurationMap( const QVariantMap& configurationMap )
{
auto icon = Calamares::Branding::instance()->image( language, QSize( 48, 48 ) );
if ( !icon.isNull() )
{
m_widget->setLanguageIcon( icon );
}
}
}
@ -169,7 +210,8 @@ logGeoIPHandler( CalamaresUtils::GeoIP::Handler* handler )
{
if ( handler )
{
cDebug() << Logger::SubEntry << "Obtained from" << handler->url() << " (" << static_cast<int>( handler->type() ) << handler->selector() << ')';
cDebug() << Logger::SubEntry << "Obtained from" << handler->url() << " ("
<< static_cast< int >( handler->type() ) << handler->selector() << ')';
}
}
@ -194,8 +236,12 @@ WelcomeViewStep::setCountry( const QString& countryCode, CalamaresUtils::GeoIP::
{
int r = CalamaresUtils::Locale::availableTranslations()->find( countryCode );
if ( r < 0 )
{
cDebug() << "Unusable country code" << countryCode << "(no suitable translation)";
}
if ( ( r >= 0 ) && m_widget )
{
m_widget->externallySelectedLanguage( r );
}
}
}

View File

@ -206,7 +206,7 @@ GeneralRequirements::setConfigurationMap( const QVariantMap& configurationMap )
if ( configurationMap.contains( "requiredStorage" ) &&
( configurationMap.value( "requiredStorage" ).type() == QVariant::Double ||
configurationMap.value( "requiredStorage" ).type() == QVariant::Int ) )
configurationMap.value( "requiredStorage" ).type() == QVariant::LongLong ) )
{
bool ok = false;
m_requiredStorageGiB = configurationMap.value( "requiredStorage" ).toDouble( &ok );
@ -227,7 +227,7 @@ GeneralRequirements::setConfigurationMap( const QVariantMap& configurationMap )
if ( configurationMap.contains( "requiredRam" ) &&
( configurationMap.value( "requiredRam" ).type() == QVariant::Double ||
configurationMap.value( "requiredRam" ).type() == QVariant::Int ) )
configurationMap.value( "requiredRam" ).type() == QVariant::LongLong ) )
{
bool ok = false;
m_requiredRamGiB = configurationMap.value( "requiredRam" ).toDouble( &ok );

View File

@ -7,10 +7,23 @@
# can check requirements for installation.
---
# Display settings for various buttons on the welcome page.
# The URLs themselves come from branding.desc is the setting
# here is "true". If the setting is false, the button is hidden.
# The setting can also be a full URL which will then be used
# instead of the one from the branding file, or empty or not-set
# which will hide the button.
showSupportUrl: true
showKnownIssuesUrl: true
showReleaseNotesUrl: true
# If this Url is set to something non-empty, a "donate"
# button is added to the welcome page alongside the
# others (see settings, above). Clicking the button opens
# the corresponding link. (This button has no corresponding
# branding.desc string)
#
# showDonateUrl: https://kde.org/community/donations/
# Requirements checking. These are general, generic, things
# that are checked. They may not match with the actual requirements
# imposed by other modules in the system.