diff --git a/CMakeLists.txt b/CMakeLists.txt index 2a43d3205..5da78c5b3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -176,7 +176,7 @@ set( CALAMARES_TRANSLATION_LANGUAGES ar ast bg ca cs_CZ da de el en en_GB es_MX ### Bump version here set( CALAMARES_VERSION_MAJOR 3 ) set( CALAMARES_VERSION_MINOR 1 ) -set( CALAMARES_VERSION_PATCH 11 ) +set( CALAMARES_VERSION_PATCH 12 ) set( CALAMARES_VERSION_RC 0 ) set( CALAMARES_VERSION ${CALAMARES_VERSION_MAJOR}.${CALAMARES_VERSION_MINOR}.${CALAMARES_VERSION_PATCH} ) diff --git a/CMakeModules/CalamaresAddModuleSubdirectory.cmake b/CMakeModules/CalamaresAddModuleSubdirectory.cmake index caf1b707e..12aad380f 100644 --- a/CMakeModules/CalamaresAddModuleSubdirectory.cmake +++ b/CMakeModules/CalamaresAddModuleSubdirectory.cmake @@ -3,15 +3,27 @@ include( CalamaresAddTranslations ) set( MODULE_DATA_DESTINATION share/calamares/modules ) +# Convenience function to indicate that a module has been skipped +# (optionally also why). Call this in the module's CMakeLists.txt +macro( calamares_skip_module ) + set( SKIPPED_MODULES ${SKIPPED_MODULES} ${ARGV} PARENT_SCOPE ) +endmacro() + function( calamares_add_module_subdirectory ) set( SUBDIRECTORY ${ARGV0} ) + set( SKIPPED_MODULES ) set( MODULE_CONFIG_FILES "" ) # If this subdirectory has a CMakeLists.txt, we add_subdirectory it... if( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY}/CMakeLists.txt" ) add_subdirectory( ${SUBDIRECTORY} ) file( GLOB MODULE_CONFIG_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY} "${SUBDIRECTORY}/*.conf" ) + # Module has indicated it should be skipped, show that in + # the calling CMakeLists (which is src/modules/CMakeLists.txt normally). + if ( SKIPPED_MODULES ) + set( SKIPPED_MODULES ${SKIPPED_MODULES} PARENT_SCOPE ) + endif() # ...otherwise, we look for a module.desc. elseif( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY}/module.desc" ) set( MODULES_DIR ${CMAKE_INSTALL_LIBDIR}/calamares/modules ) diff --git a/src/calamares/CalamaresApplication.cpp b/src/calamares/CalamaresApplication.cpp index 6389a2806..f1062e942 100644 --- a/src/calamares/CalamaresApplication.cpp +++ b/src/calamares/CalamaresApplication.cpp @@ -55,14 +55,7 @@ CalamaresApplication::CalamaresApplication( int& argc, char* argv[] ) QFont f = font(); - cDebug() << "Default font =====" - << "\nPixel size: " << f.pixelSize() - << "\nPoint size: " << f.pointSize() - << "\nPoint sizeF: " << f.pointSizeF() - << "\nFont family: " << f.family() - << "\nMetric height:" << QFontMetrics( f ).height(); - // The following line blocks for 15s on Qt 5.1.0 - cDebug() << "Font height:" << QFontMetrics( f ).height(); + cDebug() << "Default font size" << f.pointSize() << ';' << f.pixelSize() << "px"; CalamaresUtils::setDefaultFontSize( f.pointSize() ); cDebug() << "Available languages:" << QString( CALAMARES_TRANSLATION_LANGUAGES ).split( ';' ); diff --git a/src/calamares/CalamaresWindow.cpp b/src/calamares/CalamaresWindow.cpp index ab24b6db2..df5274598 100644 --- a/src/calamares/CalamaresWindow.cpp +++ b/src/calamares/CalamaresWindow.cpp @@ -1,7 +1,7 @@ /* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac - * Copyright 2017, Adriaan de Groot + * Copyright 2017-2018, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -30,6 +30,7 @@ #include #include +#include #include #include #include @@ -37,10 +38,8 @@ CalamaresWindow::CalamaresWindow( QWidget* parent ) : QWidget( parent ) , m_debugWindow( nullptr ) + , m_viewManager( nullptr ) { - // Hide close button - setWindowFlags( Qt::Window | Qt::WindowTitleHint | Qt::CustomizeWindowHint ); - CALAMARES_RETRANSLATE( setWindowTitle( tr( "%1 Installer" ) .arg( *Calamares::Branding::ProductName ) ); @@ -139,10 +138,10 @@ CalamaresWindow::CalamaresWindow( QWidget* parent ) CalamaresUtils::unmarginLayout( sideLayout ); CalamaresUtils::unmarginLayout( mainLayout ); - Calamares::ViewManager* vm = Calamares::ViewManager::instance( this ); - connect( vm, &Calamares::ViewManager::enlarge, this, &CalamaresWindow::enlarge ); + m_viewManager = Calamares::ViewManager::instance( this ); + connect( m_viewManager, &Calamares::ViewManager::enlarge, this, &CalamaresWindow::enlarge ); - mainLayout->addWidget( vm->centralWidget() ); + mainLayout->addWidget( m_viewManager->centralWidget() ); } void @@ -156,3 +155,15 @@ CalamaresWindow::enlarge( QSize enlarge ) resize( w, h ); } + +void +CalamaresWindow::closeEvent( QCloseEvent* event ) +{ + if ( ( !m_viewManager ) || m_viewManager->confirmCancelInstallation() ) + { + event->accept(); + qApp->quit(); + } + else + event->ignore(); +} diff --git a/src/calamares/CalamaresWindow.h b/src/calamares/CalamaresWindow.h index 00f790f5a..92b6da834 100644 --- a/src/calamares/CalamaresWindow.h +++ b/src/calamares/CalamaresWindow.h @@ -1,7 +1,7 @@ /* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac - * Copyright 2017, Adriaan de Groot + * Copyright 2017-2018, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,6 +26,7 @@ namespace Calamares { class DebugWindow; +class ViewManager; } /** @@ -46,8 +47,12 @@ public slots: */ void enlarge( QSize enlarge ); +protected: + virtual void closeEvent( QCloseEvent* e ) override; + private: - QPointer< Calamares::DebugWindow > m_debugWindow; + QPointer< Calamares::DebugWindow > m_debugWindow; // Managed by self + Calamares::ViewManager* m_viewManager; }; #endif //CALAMARESWINDOW_H diff --git a/src/libcalamaresui/ViewManager.cpp b/src/libcalamaresui/ViewManager.cpp index 7b5df155b..7b5921f6b 100644 --- a/src/libcalamaresui/ViewManager.cpp +++ b/src/libcalamaresui/ViewManager.cpp @@ -1,7 +1,7 @@ /* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac - * Copyright 2017, Adriaan de Groot + * Copyright 2017-2018, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -88,30 +88,8 @@ ViewManager::ViewManager( QObject* parent ) connect( m_back, &QPushButton::clicked, this, &ViewManager::back ); m_back->setEnabled( false ); - connect( m_quit, &QPushButton::clicked, - this, [this]() - { - // If it's NOT the last page of the last step, we ask for confirmation - if ( !( m_currentStep == m_steps.count() -1 && - m_steps.last()->isAtEnd() ) ) - { - QMessageBox mb( QMessageBox::Question, - tr( "Cancel installation?" ), - tr( "Do you really want to cancel the current install process?\n" - "The installer will quit and all changes will be lost." ), - QMessageBox::Yes | QMessageBox::No, - m_widget ); - mb.setDefaultButton( QMessageBox::No ); - mb.button( QMessageBox::Yes )->setText( tr( "&Yes" ) ); - mb.button( QMessageBox::No )->setText( tr( "&No" ) ); - int response = mb.exec(); - if ( response == QMessageBox::Yes ) - qApp->quit(); - } - else // Means we're at the end, no need to confirm. - qApp->quit(); - } ); - + connect( m_quit, &QPushButton::clicked, this, + [this]() { if ( this->confirmCancelInstallation() ) qApp->quit(); } ); connect( JobQueue::instance(), &JobQueue::failed, this, &ViewManager::onInstallationFailed ); connect( JobQueue::instance(), &JobQueue::finished, @@ -302,4 +280,26 @@ ViewManager::back() } } +bool ViewManager::confirmCancelInstallation() +{ + // If it's NOT the last page of the last step, we ask for confirmation + if ( !( m_currentStep == m_steps.count() -1 && + m_steps.last()->isAtEnd() ) ) + { + QMessageBox mb( QMessageBox::Question, + tr( "Cancel installation?" ), + tr( "Do you really want to cancel the current install process?\n" + "The installer will quit and all changes will be lost." ), + QMessageBox::Yes | QMessageBox::No, + m_widget ); + mb.setDefaultButton( QMessageBox::No ); + mb.button( QMessageBox::Yes )->setText( tr( "&Yes" ) ); + mb.button( QMessageBox::No )->setText( tr( "&No" ) ); + int response = mb.exec(); + return response == QMessageBox::Yes; + } + else // Means we're at the end, no need to confirm. + return true; } + +} // namespace diff --git a/src/libcalamaresui/ViewManager.h b/src/libcalamaresui/ViewManager.h index 38ddda70a..fe56509c0 100644 --- a/src/libcalamaresui/ViewManager.h +++ b/src/libcalamaresui/ViewManager.h @@ -1,7 +1,7 @@ /* === This file is part of Calamares - === * * Copyright 2014-2015, Teo Mrnjavac - * Copyright 2017, Adriaan de Groot + * Copyright 2017-2018, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -86,6 +86,13 @@ public: */ int currentStepIndex() const; + /** + * @ brief Called when "Cancel" is clicked; asks for confirmation. + * Other means of closing Calamares also call this method, e.g. alt-F4. + * At the end of installation, no confirmation is asked. Returns true + * if the user confirms closing the window. + */ + bool confirmCancelInstallation(); public slots: /** diff --git a/src/modules/CMakeLists.txt b/src/modules/CMakeLists.txt index d48ecd29f..dceaef8dd 100644 --- a/src/modules/CMakeLists.txt +++ b/src/modules/CMakeLists.txt @@ -1,5 +1,11 @@ include( CMakeColors ) +# The variable SKIP_MODULES can be set to skip particular modules; +# individual modules can also decide they must be skipped (e.g. OS-specific +# modules, or ones with unmet dependencies). Collect the skipped modules +# in this list. +set( LIST_SKIPPED_MODULES "" ) + if( BUILD_TESTING ) add_executable( test_conf test_conf.cpp ) target_link_libraries( test_conf ${YAMLCPP_LIBRARY} ) @@ -13,11 +19,24 @@ foreach( SUBDIRECTORY ${SUBDIRECTORIES} ) if( NOT DO_SKIP EQUAL -1 ) message( "${ColorReset}-- Skipping module ${BoldRed}${SUBDIRECTORY}${ColorReset}." ) message( "" ) + list( APPEND LIST_SKIPPED_MODULES "${SUBDIRECTORY} (user request)" ) elseif( ( IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY}" ) AND ( DO_SKIP EQUAL -1 ) ) + set( SKIPPED_MODULES ) calamares_add_module_subdirectory( ${SUBDIRECTORY} ) + if ( SKIPPED_MODULES ) + list( APPEND LIST_SKIPPED_MODULES "${SKIPPED_MODULES}" ) + endif() endif() endforeach() +if ( LIST_SKIPPED_MODULES ) + message( "${ColorReset}-- Skipped modules:" ) + foreach( SUBDIRECTORY ${LIST_SKIPPED_MODULES} ) + message( "${ColorReset}-- Skipped ${BoldRed}${SUBDIRECTORY}${ColorReset}." ) + endforeach() + message( "" ) +endif() + include( CalamaresAddTranslations ) add_calamares_python_translations( ${CALAMARES_TRANSLATION_LANGUAGES} ) diff --git a/src/modules/plasmalnf/CMakeLists.txt b/src/modules/plasmalnf/CMakeLists.txt index 8148a80e9..15897f98c 100644 --- a/src/modules/plasmalnf/CMakeLists.txt +++ b/src/modules/plasmalnf/CMakeLists.txt @@ -1,22 +1,41 @@ find_package(ECM ${ECM_VERSION} REQUIRED NO_MODULE) -find_package( KF5 5.29 REQUIRED CoreAddons Plasma Package ) +# Requires a sufficiently recent Plasma framework, but also +# needs a runtime support component (which we don't test for). +set( lnf_ver 5.41 ) -calamares_add_plugin( plasmalnf - TYPE viewmodule - EXPORT_MACRO PLUGINDLLEXPORT_PRO - SOURCES - PlasmaLnfViewStep.cpp - PlasmaLnfPage.cpp - PlasmaLnfJob.cpp - ThemeWidget.cpp - RESOURCES - page_plasmalnf.qrc - UI - page_plasmalnf.ui - LINK_PRIVATE_LIBRARIES - calamaresui - KF5::Package - KF5::Plasma - SHARED_LIB +find_package( KF5Plasma ${lnf_ver} ) +find_package( KF5Package ${lnf_ver} ) +set_package_properties( + KF5Plasma PROPERTIES + PURPOSE "For Plasma Look-and-Feel selection" ) +set_package_properties( + KF5Package PROPERTIES + PURPOSE "For Plasma Look-and-Feel selection" +) + +if ( KF5Plasma_FOUND AND KF5Package_FOUND ) + find_package( KF5 ${lnf_ver} REQUIRED CoreAddons Plasma Package ) + + calamares_add_plugin( plasmalnf + TYPE viewmodule + EXPORT_MACRO PLUGINDLLEXPORT_PRO + SOURCES + PlasmaLnfViewStep.cpp + PlasmaLnfPage.cpp + PlasmaLnfJob.cpp + ThemeWidget.cpp + RESOURCES + page_plasmalnf.qrc + UI + page_plasmalnf.ui + LINK_PRIVATE_LIBRARIES + calamaresui + KF5::Package + KF5::Plasma + SHARED_LIB + ) +else() + calamares_skip_module( "plasmalnf (missing requirements)" ) +endif()