From d4083c9bbbe8324b950f6a5fa4c521b976e193ad Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 1 Apr 2020 11:07:23 +0200 Subject: [PATCH 01/17] [libcalamaresui] Add "hidden" as alias for "none" in sidebar settings --- src/libcalamaresui/Branding.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libcalamaresui/Branding.cpp b/src/libcalamaresui/Branding.cpp index 5c41f5ea2..a1634520b 100644 --- a/src/libcalamaresui/Branding.cpp +++ b/src/libcalamaresui/Branding.cpp @@ -422,6 +422,7 @@ Branding::initSimpleSettings( const YAML::Node& doc ) static const NamedEnumTable< SidebarFlavor > sidebarFlavorNames { { QStringLiteral( "widget" ), SidebarFlavor::Widget }, { QStringLiteral( "none" ), SidebarFlavor::None }, + { QStringLiteral( "hidden" ), SidebarFlavor::None }, { QStringLiteral( "qml" ), SidebarFlavor::Qml } }; // clang-format on From 57e6864902329c25565c0a856536079bd5d5e341 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 1 Apr 2020 11:13:41 +0200 Subject: [PATCH 02/17] [libcalamaresui] Add panel flavor - rename enum to more general PanelFlavor - introduce branding settings for navigation (e.g. for switching the navigation buttons off, or using QML) --- src/branding/default/branding.desc | 8 +++++++- src/calamares/CalamaresWindow.cpp | 6 +++--- src/libcalamaresui/Branding.cpp | 16 +++++++++++----- src/libcalamaresui/Branding.h | 11 +++++++---- 4 files changed, 28 insertions(+), 13 deletions(-) diff --git a/src/branding/default/branding.desc b/src/branding/default/branding.desc index e7b9d9898..365af30e9 100644 --- a/src/branding/default/branding.desc +++ b/src/branding/default/branding.desc @@ -44,9 +44,15 @@ windowPlacement: center # Kind of sidebar (panel on the left, showing progress). # - "widget" or unset, use traditional sidebar (logo, items) # - "none", hide it entirely -# - "qml", use sidebar.qml from branding folder +# - "qml", use calamares-sidebar.qml from branding folder sidebar: widget +# Kind of navigation (button panel on the bottom). +# - "widget" or unset, use traditional navigation +# - "none", hide it entirely +# - "qml", use calamares-navigation.qml from branding folder +navigation: widget + # These are strings shown to the user in the user interface. # There is no provision for translating them -- since they # are names, the string is included as-is. diff --git a/src/calamares/CalamaresWindow.cpp b/src/calamares/CalamaresWindow.cpp index f2ff42aa8..f05bdc7d4 100644 --- a/src/calamares/CalamaresWindow.cpp +++ b/src/calamares/CalamaresWindow.cpp @@ -191,15 +191,15 @@ CalamaresWindow::CalamaresWindow( QWidget* parent ) QWidget* sideBox = nullptr; switch ( branding->sidebarFlavor() ) { - case Calamares::Branding::SidebarFlavor::Widget: + case Calamares::Branding::PanelFlavor::Widget: sideBox = getWidgetSidebar( qBound( 100, CalamaresUtils::defaultFontHeight() * 12, w < windowPreferredWidth ? 100 : 190 ) ); break; - case Calamares::Branding::SidebarFlavor::Qml: + case Calamares::Branding::PanelFlavor::Qml: sideBox = getQmlSidebar( qBound( 100, CalamaresUtils::defaultFontHeight() * 12, w < windowPreferredWidth ? 100 : 190 ) ); break; - case Calamares::Branding::SidebarFlavor::None: + case Calamares::Branding::PanelFlavor::None: sideBox = nullptr; } if ( sideBox ) diff --git a/src/libcalamaresui/Branding.cpp b/src/libcalamaresui/Branding.cpp index a1634520b..25fab307e 100644 --- a/src/libcalamaresui/Branding.cpp +++ b/src/libcalamaresui/Branding.cpp @@ -419,11 +419,11 @@ Branding::initSimpleSettings( const YAML::Node& doc ) { QStringLiteral( "free" ), WindowPlacement::Free }, { QStringLiteral( "center" ), WindowPlacement::Center } }; - static const NamedEnumTable< SidebarFlavor > sidebarFlavorNames { - { QStringLiteral( "widget" ), SidebarFlavor::Widget }, - { QStringLiteral( "none" ), SidebarFlavor::None }, - { QStringLiteral( "hidden" ), SidebarFlavor::None }, - { QStringLiteral( "qml" ), SidebarFlavor::Qml } + static const NamedEnumTable< PanelFlavor > sidebarFlavorNames { + { QStringLiteral( "widget" ), PanelFlavor::Widget }, + { QStringLiteral( "none" ), PanelFlavor::None }, + { QStringLiteral( "hidden" ), PanelFlavor::None }, + { QStringLiteral( "qml" ), PanelFlavor::Qml } }; // clang-format on // *INDENT-ON* @@ -449,6 +449,12 @@ Branding::initSimpleSettings( const YAML::Node& doc ) cWarning() << "Branding module-setting *sidebar* interpreted as" << sidebarFlavorNames.find( m_sidebarFlavor, ok ); } + m_navigationFlavor = sidebarFlavorNames.find( getString( doc, "navigation" ), ok); + if ( !ok ) + { + cWarning() << "Branding module-setting *navigation* interpreted as" + << sidebarFlavorNames.find( m_navigationFlavor, ok ); + } QString windowSize = getString( doc, "windowSize" ); if ( !windowSize.isEmpty() ) diff --git a/src/libcalamaresui/Branding.h b/src/libcalamaresui/Branding.h index 88f658473..b7ba637d6 100644 --- a/src/libcalamaresui/Branding.h +++ b/src/libcalamaresui/Branding.h @@ -124,13 +124,13 @@ public: }; Q_ENUM( WindowPlacement ) ///@brief What kind of sidebar to use in the main window - enum class SidebarFlavor + enum class PanelFlavor { None, Widget, Qml }; - Q_ENUM( SidebarFlavor ) + Q_ENUM( PanelFlavor ) static Branding* instance(); @@ -185,7 +185,9 @@ public: bool windowPlacementCentered() const { return m_windowPlacement == WindowPlacement::Center; } ///@brief Which sidebar flavor is configured - SidebarFlavor sidebarFlavor() const { return m_sidebarFlavor; } + PanelFlavor sidebarFlavor() const { return m_sidebarFlavor; } + ///@brief Which navigation flavor is configured + PanelFlavor navigationFlavor() const { return m_navigationFlavor; } /** * Creates a map called "branding" in the global storage, and inserts an @@ -227,7 +229,8 @@ private: WindowDimension m_windowHeight, m_windowWidth; WindowPlacement m_windowPlacement; - SidebarFlavor m_sidebarFlavor = SidebarFlavor::Widget; + PanelFlavor m_sidebarFlavor = PanelFlavor::Widget; + PanelFlavor m_navigationFlavor = PanelFlavor::Widget; }; template < typename U > From 6c8aa5da63839cadc5e3f697c7aa732d6b7485e1 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 1 Apr 2020 11:26:09 +0200 Subject: [PATCH 03/17] [libcalamaresui] Remove commented-out code --- src/libcalamaresui/ViewManager.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/libcalamaresui/ViewManager.cpp b/src/libcalamaresui/ViewManager.cpp index 93f23bd2f..dda757fda 100644 --- a/src/libcalamaresui/ViewManager.cpp +++ b/src/libcalamaresui/ViewManager.cpp @@ -123,8 +123,6 @@ ViewManager::ViewManager( QObject* parent ) { m_quit->setVisible( false ); } - - // onInstallationFailed( "Title of Failure", "Body of Failure"); // for testing paste functionality } From d4f903b95ce3e78a316d07eb8f5d0a55f228f0f4 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 1 Apr 2020 11:35:27 +0200 Subject: [PATCH 04/17] [calamares] Create navigation panel in CalamaresWindow - this is a non-functional duplicate panel, so it looks funny --- src/calamares/CalamaresWindow.cpp | 59 ++++++++++++++++++++++++++++++- src/calamares/CalamaresWindow.h | 5 +++ 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/src/calamares/CalamaresWindow.cpp b/src/calamares/CalamaresWindow.cpp index f05bdc7d4..054fb8639 100644 --- a/src/calamares/CalamaresWindow.cpp +++ b/src/calamares/CalamaresWindow.cpp @@ -143,6 +143,43 @@ CalamaresWindow::getQmlSidebar( int desiredWidth ) return w; } +/** @brief Get a button-sized icon. */ +static inline QPixmap +getButtonIcon( const QString& name ) +{ + return Calamares::Branding::instance()->image( name, QSize( 22, 22 ) ); +} + +QWidget* +CalamaresWindow::getWidgetNavigation() +{ + QWidget* navigation = new QWidget( this ); + + // Create buttons and sets an initial icon; the icons may change + auto* back = new QPushButton( getButtonIcon( QStringLiteral( "go-previous" ) ), tr( "&Back" ), navigation ); + back->setObjectName( "view-button-back" ); + auto* next = new QPushButton( getButtonIcon( QStringLiteral( "go-next" ) ), tr( "&Next" ), navigation ); + next->setObjectName( "view-button-next" ); + auto* quit = new QPushButton( getButtonIcon( QStringLiteral( "dialog-cancel" ) ), tr( "&Cancel" ), navigation ); + quit->setObjectName( "view-button-cancel" ); + + QBoxLayout* bottomLayout = new QHBoxLayout; + bottomLayout->addStretch(); + bottomLayout->addWidget( back ); + bottomLayout->addWidget( next ); + bottomLayout->addSpacing( 12 ); + bottomLayout->addWidget( quit ); + + navigation->setLayout( bottomLayout ); + return navigation; +} + +QWidget* +CalamaresWindow::getQmlNavigation() +{ + return nullptr; +} + CalamaresWindow::CalamaresWindow( QWidget* parent ) : QWidget( parent ) , m_debugWindow( nullptr ) @@ -219,9 +256,29 @@ CalamaresWindow::CalamaresWindow( QWidget* parent ) // and requires an extra show() (at least with KWin/X11) which // is too annoying. Instead, leave it up to ignoring-the-quit- // event, which is also the ViewManager's responsibility. + QBoxLayout* contentsLayout = new QVBoxLayout; + contentsLayout->addWidget( m_viewManager->centralWidget() ); + QWidget* navigation = nullptr; + switch ( branding->navigationFlavor() ) + { + case Calamares::Branding::PanelFlavor::Widget: + navigation = getWidgetNavigation(); + break; + case Calamares::Branding::PanelFlavor::Qml: + navigation = getQmlNavigation(); + break; + case Calamares::Branding::PanelFlavor::None: + navigation = nullptr; + } + if ( navigation ) + { + contentsLayout->addWidget( navigation ); + } + + mainLayout->addLayout( contentsLayout ); - mainLayout->addWidget( m_viewManager->centralWidget() ); CalamaresUtils::unmarginLayout( mainLayout ); + CalamaresUtils::unmarginLayout( contentsLayout ); setStyleSheet( Calamares::Branding::instance()->stylesheet() ); } diff --git a/src/calamares/CalamaresWindow.h b/src/calamares/CalamaresWindow.h index 5cbbdfca6..d6592c99a 100644 --- a/src/calamares/CalamaresWindow.h +++ b/src/calamares/CalamaresWindow.h @@ -51,9 +51,14 @@ protected: virtual void closeEvent( QCloseEvent* e ) override; private: + // Two variations on sidebar (the progress view) QWidget* getWidgetSidebar( int desiredWidth ); QWidget* getQmlSidebar( int desiredWidth ); + // Two variations on navigation (buttons at bottom) + QWidget* getWidgetNavigation(); + QWidget* getQmlNavigation(); + QPointer< Calamares::DebugWindow > m_debugWindow; // Managed by self Calamares::ViewManager* m_viewManager; }; From 02fc4ce806fcdeeb8157f39fbb8b7a1190e00b21 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 1 Apr 2020 15:06:11 +0200 Subject: [PATCH 05/17] [calamares] Load QML navigation --- src/calamares/CalamaresWindow.cpp | 6 +++- src/calamares/calamares-navigation.qml | 47 ++++++++++++++++++++++++++ src/calamares/calamares.qrc | 1 + 3 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 src/calamares/calamares-navigation.qml diff --git a/src/calamares/CalamaresWindow.cpp b/src/calamares/CalamaresWindow.cpp index 054fb8639..9c6626a3e 100644 --- a/src/calamares/CalamaresWindow.cpp +++ b/src/calamares/CalamaresWindow.cpp @@ -177,7 +177,11 @@ CalamaresWindow::getWidgetNavigation() QWidget* CalamaresWindow::getQmlNavigation() { - return nullptr; + CalamaresUtils::registerCalamaresModels(); + QQuickWidget* w = new QQuickWidget( this ); + w->setSource( QUrl( + CalamaresUtils::searchQmlFile( CalamaresUtils::QmlSearch::Both, QStringLiteral( "calamares-navigation" ) ) ) ); + return w; } CalamaresWindow::CalamaresWindow( QWidget* parent ) diff --git a/src/calamares/calamares-navigation.qml b/src/calamares/calamares-navigation.qml new file mode 100644 index 000000000..0831a9b6a --- /dev/null +++ b/src/calamares/calamares-navigation.qml @@ -0,0 +1,47 @@ +import io.calamares.ui 1.0 +import io.calamares.core 1.0 + +import QtQuick 2.3 +import QtQuick.Controls 2.10 +import QtQuick.Layouts 1.3 +import org.kde.kirigami 2.7 as Kirigami + +Row { + id: buttonBar + height: 64 + + Button + { + Layout.fillWidth: true + text: qsTr("Back") + icon.name: "next" + Kirigami.Theme.backgroundColor: Qt.rgba(Kirigami.Theme.backgroundColor.r, Kirigami.Theme.backgroundColor.g, Kirigami.Theme.backgroundColor.b, 0.4) + Kirigami.Theme.textColor: Kirigami.Theme.textColor + + visible: true + onClicked: { } + } + Button + { + Layout.fillWidth: true + text: qsTr("Next") + icon.name: "next" + Kirigami.Theme.backgroundColor: Qt.rgba(Kirigami.Theme.backgroundColor.r, Kirigami.Theme.backgroundColor.g, Kirigami.Theme.backgroundColor.b, 0.4) + Kirigami.Theme.textColor: Kirigami.Theme.textColor + + visible: true + onClicked: { } + } + Button + { + Layout.fillWidth: true + text: qsTr("Quit") + icon.name: "quit" + Kirigami.Theme.backgroundColor: Qt.rgba(Kirigami.Theme.backgroundColor.r, Kirigami.Theme.backgroundColor.g, Kirigami.Theme.backgroundColor.b, 0.4) + Kirigami.Theme.textColor: Kirigami.Theme.textColor + + visible: true + onClicked: { } + } + +} diff --git a/src/calamares/calamares.qrc b/src/calamares/calamares.qrc index fdcd5e05d..17db2e08a 100644 --- a/src/calamares/calamares.qrc +++ b/src/calamares/calamares.qrc @@ -1,5 +1,6 @@ calamares-sidebar.qml + calamares-navigation.qml From 2dcf265c408804d516d84c2f95c66bcb4825078a Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 1 Apr 2020 15:13:08 +0200 Subject: [PATCH 06/17] [calamares] Give QML navigation bar a fixed height --- src/calamares/CalamaresWindow.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/calamares/CalamaresWindow.cpp b/src/calamares/CalamaresWindow.cpp index 9c6626a3e..f29485ea9 100644 --- a/src/calamares/CalamaresWindow.cpp +++ b/src/calamares/CalamaresWindow.cpp @@ -179,6 +179,8 @@ CalamaresWindow::getQmlNavigation() { CalamaresUtils::registerCalamaresModels(); QQuickWidget* w = new QQuickWidget( this ); + w->setFixedHeight( 64 ); + w->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); w->setSource( QUrl( CalamaresUtils::searchQmlFile( CalamaresUtils::QmlSearch::Both, QStringLiteral( "calamares-navigation" ) ) ) ); return w; From 9f66b63c00fa997bc6052ff89034b3ec1abc00f1 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 1 Apr 2020 15:30:47 +0200 Subject: [PATCH 07/17] [calamares] Indulge in template-fu to refactor - since we've got two blocks of code copy-pasted, which both decide to call one or the other of two member functions based on a flavor value, turn that into a templated function. - passing member functions looks a bit weird, and calling them is syntactically surprising, but it cuts down the code a lot. --- src/calamares/CalamaresWindow.cpp | 59 +++++++++++++++++-------------- 1 file changed, 33 insertions(+), 26 deletions(-) diff --git a/src/calamares/CalamaresWindow.cpp b/src/calamares/CalamaresWindow.cpp index f29485ea9..9ec5a7405 100644 --- a/src/calamares/CalamaresWindow.cpp +++ b/src/calamares/CalamaresWindow.cpp @@ -186,6 +186,31 @@ CalamaresWindow::getQmlNavigation() return w; } +/**@brief Picks one of two methods to call + * + * Calls method (member function) @p widget or @p qml with arguments @p a + * on the given window, based on the flavor. + */ +template < typename widgetMaker, typename... args > +QWidget* +flavoredWidget( Calamares::Branding::PanelFlavor flavor, + CalamaresWindow* w, + widgetMaker widget, + widgetMaker qml, + args... a ) +{ + // Member-function calling syntax is (object.*member)(args) + switch ( flavor ) + { + case Calamares::Branding::PanelFlavor::Widget: + return ( w->*widget )( a... ); + case Calamares::Branding::PanelFlavor::Qml: + return ( w->*qml )( a... ); + case Calamares::Branding::PanelFlavor::None: + return nullptr; + } +} + CalamaresWindow::CalamaresWindow( QWidget* parent ) : QWidget( parent ) , m_debugWindow( nullptr ) @@ -231,20 +256,12 @@ CalamaresWindow::CalamaresWindow( QWidget* parent ) QBoxLayout* mainLayout = new QHBoxLayout; setLayout( mainLayout ); - QWidget* sideBox = nullptr; - switch ( branding->sidebarFlavor() ) - { - case Calamares::Branding::PanelFlavor::Widget: - sideBox = getWidgetSidebar( - qBound( 100, CalamaresUtils::defaultFontHeight() * 12, w < windowPreferredWidth ? 100 : 190 ) ); - break; - case Calamares::Branding::PanelFlavor::Qml: - sideBox = getQmlSidebar( - qBound( 100, CalamaresUtils::defaultFontHeight() * 12, w < windowPreferredWidth ? 100 : 190 ) ); - break; - case Calamares::Branding::PanelFlavor::None: - sideBox = nullptr; - } + QWidget* sideBox = flavoredWidget( + branding->sidebarFlavor(), + this, + &CalamaresWindow::getWidgetSidebar, + &CalamaresWindow::getQmlSidebar, + qBound( 100, CalamaresUtils::defaultFontHeight() * 12, w < windowPreferredWidth ? 100 : 190 ) ); if ( sideBox ) { mainLayout->addWidget( sideBox ); @@ -264,18 +281,8 @@ CalamaresWindow::CalamaresWindow( QWidget* parent ) // event, which is also the ViewManager's responsibility. QBoxLayout* contentsLayout = new QVBoxLayout; contentsLayout->addWidget( m_viewManager->centralWidget() ); - QWidget* navigation = nullptr; - switch ( branding->navigationFlavor() ) - { - case Calamares::Branding::PanelFlavor::Widget: - navigation = getWidgetNavigation(); - break; - case Calamares::Branding::PanelFlavor::Qml: - navigation = getQmlNavigation(); - break; - case Calamares::Branding::PanelFlavor::None: - navigation = nullptr; - } + QWidget* navigation = flavoredWidget( + branding->navigationFlavor(), this, &CalamaresWindow::getWidgetNavigation, &CalamaresWindow::getQmlNavigation ); if ( navigation ) { contentsLayout->addWidget( navigation ); From c638343c189de9b3e41b2428875630c7a8cf4c72 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 1 Apr 2020 18:45:25 +0200 Subject: [PATCH 08/17] [libcalamares] Give ViewManager a real quit() slot - instead of creating a lambda, give ViewManager a real slot - hook up the new navigation buttons to the next, back, quit slots --- src/calamares/CalamaresWindow.cpp | 3 +++ src/libcalamaresui/ViewManager.cpp | 17 +++++++++++------ src/libcalamaresui/ViewManager.h | 9 ++++++++- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/calamares/CalamaresWindow.cpp b/src/calamares/CalamaresWindow.cpp index 9ec5a7405..22025dccb 100644 --- a/src/calamares/CalamaresWindow.cpp +++ b/src/calamares/CalamaresWindow.cpp @@ -158,10 +158,13 @@ CalamaresWindow::getWidgetNavigation() // Create buttons and sets an initial icon; the icons may change auto* back = new QPushButton( getButtonIcon( QStringLiteral( "go-previous" ) ), tr( "&Back" ), navigation ); back->setObjectName( "view-button-back" ); + connect( back, &QPushButton::clicked, m_viewManager, &Calamares::ViewManager::back ); auto* next = new QPushButton( getButtonIcon( QStringLiteral( "go-next" ) ), tr( "&Next" ), navigation ); next->setObjectName( "view-button-next" ); + connect( next, &QPushButton::clicked, m_viewManager, &Calamares::ViewManager::next ); auto* quit = new QPushButton( getButtonIcon( QStringLiteral( "dialog-cancel" ) ), tr( "&Cancel" ), navigation ); quit->setObjectName( "view-button-cancel" ); + connect( quit, &QPushButton::clicked, m_viewManager, &Calamares::ViewManager::quit ); QBoxLayout* bottomLayout = new QHBoxLayout; bottomLayout->addStretch(); diff --git a/src/libcalamaresui/ViewManager.cpp b/src/libcalamaresui/ViewManager.cpp index dda757fda..2b0c59e49 100644 --- a/src/libcalamaresui/ViewManager.cpp +++ b/src/libcalamaresui/ViewManager.cpp @@ -108,14 +108,9 @@ ViewManager::ViewManager( QObject* parent ) connect( m_next, &QPushButton::clicked, this, &ViewManager::next ); connect( m_back, &QPushButton::clicked, this, &ViewManager::back ); + connect( m_quit, &QPushButton::clicked, this, &ViewManager::quit ); m_back->setEnabled( false ); - 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, this, &ViewManager::next ); @@ -476,6 +471,16 @@ ViewManager::back() updateButtonLabels(); } + +void +ViewManager::quit() +{ + if ( confirmCancelInstallation() ) + { + qApp->quit(); + } +} + bool ViewManager::confirmCancelInstallation() { diff --git a/src/libcalamaresui/ViewManager.h b/src/libcalamaresui/ViewManager.h index f16419dcd..a3f1918e5 100644 --- a/src/libcalamaresui/ViewManager.h +++ b/src/libcalamaresui/ViewManager.h @@ -92,7 +92,7 @@ public: */ bool confirmCancelInstallation(); -public slots: +public Q_SLOTS: /** * @brief next moves forward to the next page of the current ViewStep (if any), * or to the first page of the next ViewStep if the current ViewStep doesn't @@ -107,6 +107,13 @@ public slots: */ void back(); + /** + * @brief Probably quit + * + * Asks for confirmation if necessary. Terminates the application. + */ + void quit(); + /** * @brief onInstallationFailed displays an error message when a fatal failure * happens in a ViewStep. From 8920be6bca003448085cd5ca5d3910b7002d3149 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 2 Apr 2020 12:04:24 +0200 Subject: [PATCH 09/17] [libcalamaresui] Remove *next* button from ViewManager - add properties for the next button (enabled, label, icon...) - update those properties as normal - connect to the properties in the UI implementation --- src/calamares/CalamaresWindow.cpp | 14 +++++++++++++ src/libcalamaresui/ViewManager.cpp | 32 ++++++++++++++++++------------ src/libcalamaresui/ViewManager.h | 24 +++++++++++++++++++++- 3 files changed, 56 insertions(+), 14 deletions(-) diff --git a/src/calamares/CalamaresWindow.cpp b/src/calamares/CalamaresWindow.cpp index 22025dccb..a3bdf2683 100644 --- a/src/calamares/CalamaresWindow.cpp +++ b/src/calamares/CalamaresWindow.cpp @@ -150,6 +150,16 @@ getButtonIcon( const QString& name ) return Calamares::Branding::instance()->image( name, QSize( 22, 22 ) ); } +static inline void +setButtonIcon( QPushButton* button, const QString& name ) +{ + auto icon = getButtonIcon( name ); + if ( button && !icon.isNull() ) + { + button->setIcon( icon ); + } +} + QWidget* CalamaresWindow::getWidgetNavigation() { @@ -162,6 +172,10 @@ CalamaresWindow::getWidgetNavigation() auto* next = new QPushButton( getButtonIcon( QStringLiteral( "go-next" ) ), tr( "&Next" ), navigation ); next->setObjectName( "view-button-next" ); connect( next, &QPushButton::clicked, m_viewManager, &Calamares::ViewManager::next ); + connect( m_viewManager, &Calamares::ViewManager::nextEnabledChanged, next, &QPushButton::setEnabled ); + connect( m_viewManager, &Calamares::ViewManager::nextLabelChanged, next, &QPushButton::setText ); + connect( + m_viewManager, &Calamares::ViewManager::nextIconChanged, this, [=]( QString n ) { setButtonIcon( next, n ); } ); auto* quit = new QPushButton( getButtonIcon( QStringLiteral( "dialog-cancel" ) ), tr( "&Cancel" ), navigation ); quit->setObjectName( "view-button-cancel" ); connect( quit, &QPushButton::clicked, m_viewManager, &Calamares::ViewManager::quit ); diff --git a/src/libcalamaresui/ViewManager.cpp b/src/libcalamaresui/ViewManager.cpp index 2b0c59e49..74a1b6bee 100644 --- a/src/libcalamaresui/ViewManager.cpp +++ b/src/libcalamaresui/ViewManager.cpp @@ -91,8 +91,6 @@ ViewManager::ViewManager( QObject* parent ) // Create buttons and sets an initial icon; the icons may change m_back = new QPushButton( getButtonIcon( QStringLiteral( "go-previous" ) ), tr( "&Back" ), m_widget ); m_back->setObjectName( "view-button-back" ); - m_next = new QPushButton( getButtonIcon( QStringLiteral( "go-next" ) ), tr( "&Next" ), m_widget ); - m_next->setObjectName( "view-button-next" ); m_quit = new QPushButton( getButtonIcon( QStringLiteral( "dialog-cancel" ) ), tr( "&Cancel" ), m_widget ); m_quit->setObjectName( "view-button-cancel" ); @@ -102,11 +100,9 @@ ViewManager::ViewManager( QObject* parent ) mainLayout->addLayout( bottomLayout ); bottomLayout->addStretch(); bottomLayout->addWidget( m_back ); - bottomLayout->addWidget( m_next ); bottomLayout->addSpacing( 12 ); bottomLayout->addWidget( m_quit ); - connect( m_next, &QPushButton::clicked, this, &ViewManager::next ); connect( m_back, &QPushButton::clicked, this, &ViewManager::back ); connect( m_quit, &QPushButton::clicked, this, &ViewManager::quit ); m_back->setEnabled( false ); @@ -142,7 +138,8 @@ ViewManager::addViewStep( ViewStep* step ) // If this is the first inserted view step, update status of "Next" button if ( m_steps.count() == 1 ) { - m_next->setEnabled( step->isNextEnabled() ); + m_nextEnabled = step->isNextEnabled(); + emit nextEnabledChanged( m_nextEnabled ); } } @@ -153,13 +150,15 @@ ViewManager::insertViewStep( int before, ViewStep* step ) emit beginInsertRows( QModelIndex(), before, before ); m_steps.insert( before, step ); connect( step, &ViewStep::enlarge, this, &ViewManager::enlarge ); + // TODO: this can be a regular slot connect( step, &ViewStep::nextStatusChanged, this, [this]( bool status ) { ViewStep* vs = qobject_cast< ViewStep* >( sender() ); if ( vs ) { if ( vs == m_steps.at( m_currentStep ) ) { - m_next->setEnabled( status ); + m_nextEnabled = status; + emit nextEnabledChanged( m_nextEnabled ); } } } ); @@ -364,7 +363,8 @@ ViewManager::next() { // Reached the end in a weird state (e.g. no finished step after an exec) executing = false; - m_next->setEnabled( false ); + m_nextEnabled = false; + emit nextEnabledChanged( m_nextEnabled ); m_back->setEnabled( false ); } updateCancelEnabled( !settings->disableCancel() && !( executing && settings->disableCancelDuringExec() ) ); @@ -376,7 +376,8 @@ ViewManager::next() if ( m_currentStep < m_steps.count() ) { - m_next->setEnabled( !executing && m_steps.at( m_currentStep )->isNextEnabled() ); + m_nextEnabled = !executing && m_steps.at( m_currentStep )->isNextEnabled(); + emit nextEnabledChanged( m_nextEnabled ); m_back->setEnabled( !executing && m_steps.at( m_currentStep )->isBackEnabled() ); } @@ -399,13 +400,17 @@ ViewManager::updateButtonLabels() // If we're going into the execution step / install phase, other message if ( stepIsExecute( m_steps, m_currentStep + 1 ) ) { - m_next->setText( nextIsInstallationStep ); - setButtonIcon( m_next, "run-install" ); + m_nextLabel = nextIsInstallationStep; + m_nextIcon = "run-install"; + emit nextLabelChanged( m_nextLabel ); + emit nextIconChanged( m_nextIcon ); } else { - m_next->setText( tr( "&Next" ) ); - setButtonIcon( m_next, "go-next" ); + m_nextLabel = tr( "&Next" ); + m_nextIcon = "go-next"; + emit nextLabelChanged( m_nextLabel ); + emit nextIconChanged( m_nextIcon ); } // Going back is always simple @@ -460,7 +465,8 @@ ViewManager::back() return; } - m_next->setEnabled( m_steps.at( m_currentStep )->isNextEnabled() ); + m_nextEnabled = m_steps.at( m_currentStep )->isNextEnabled(); + emit nextEnabledChanged( m_nextEnabled ); m_back->setEnabled( m_steps.at( m_currentStep )->isBackEnabled() ); if ( m_currentStep == 0 && m_steps.first()->isAtBeginning() ) diff --git a/src/libcalamaresui/ViewManager.h b/src/libcalamaresui/ViewManager.h index a3f1918e5..4e2d5e9e0 100644 --- a/src/libcalamaresui/ViewManager.h +++ b/src/libcalamaresui/ViewManager.h @@ -38,6 +38,9 @@ class UIDLLEXPORT ViewManager : public QAbstractListModel { Q_OBJECT Q_PROPERTY( int currentStepIndex READ currentStepIndex NOTIFY currentStepChanged FINAL ) + Q_PROPERTY( bool nextEnabled READ nextEnabled NOTIFY nextEnabledChanged FINAL ) + Q_PROPERTY( QString nextLabel READ nextLabel NOTIFY nextLabelChanged FINAL ) + Q_PROPERTY( QString nextIcon READ nextIcon NOTIFY nextIconChanged FINAL ) public: /** @@ -99,6 +102,18 @@ public Q_SLOTS: * have any more pages. */ void next(); + bool nextEnabled() const + { + return m_nextEnabled; ///< Is the next-button to be enabled + } + QString nextLabel() const + { + return m_nextLabel; ///< What should be displayed on the next-button + } + QString nextIcon() const + { + return m_nextIcon; ///< Name of the icon to show + } /** * @brief back moves backward to the previous page of the current ViewStep (if any), @@ -133,6 +148,10 @@ signals: void enlarge( QSize enlarge ) const; // See ViewStep::enlarge() void cancelEnabled( bool enabled ) const; + void nextEnabledChanged( bool ) const; + void nextLabelChanged( QString ) const; + void nextIconChanged( QString ) const; + private: explicit ViewManager( QObject* parent = nullptr ); virtual ~ViewManager() override; @@ -149,9 +168,12 @@ private: QWidget* m_widget; QStackedWidget* m_stack; QPushButton* m_back; - QPushButton* m_next; QPushButton* m_quit; + bool m_nextEnabled = false; + QString m_nextLabel; + QString m_nextIcon; ///< Name of icon to show on button + public: /** @section Model * From 38deb66e42a1481f7eec72d51efea1ac85875731 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 2 Apr 2020 12:31:14 +0200 Subject: [PATCH 10/17] [libcalamaresui] Remove *back* button from ViewManager - Now the back button should be done by clients as well - Refactor in CalamaresWindow to avoid leaking local button pointers to surrounding code. - Add macro UPDATE_BUTTON_PROPERTY for convenience in ViewManager (ugh, macro) to change a value and emit corresponding update signal. --- src/calamares/CalamaresWindow.cpp | 49 ++++++++++++++++++------------ src/libcalamaresui/ViewManager.cpp | 49 ++++++++++++------------------ src/libcalamaresui/ViewManager.h | 26 +++++++++++++++- 3 files changed, 75 insertions(+), 49 deletions(-) diff --git a/src/calamares/CalamaresWindow.cpp b/src/calamares/CalamaresWindow.cpp index a3bdf2683..991d81dd3 100644 --- a/src/calamares/CalamaresWindow.cpp +++ b/src/calamares/CalamaresWindow.cpp @@ -164,28 +164,39 @@ QWidget* CalamaresWindow::getWidgetNavigation() { QWidget* navigation = new QWidget( this ); - - // Create buttons and sets an initial icon; the icons may change - auto* back = new QPushButton( getButtonIcon( QStringLiteral( "go-previous" ) ), tr( "&Back" ), navigation ); - back->setObjectName( "view-button-back" ); - connect( back, &QPushButton::clicked, m_viewManager, &Calamares::ViewManager::back ); - auto* next = new QPushButton( getButtonIcon( QStringLiteral( "go-next" ) ), tr( "&Next" ), navigation ); - next->setObjectName( "view-button-next" ); - connect( next, &QPushButton::clicked, m_viewManager, &Calamares::ViewManager::next ); - connect( m_viewManager, &Calamares::ViewManager::nextEnabledChanged, next, &QPushButton::setEnabled ); - connect( m_viewManager, &Calamares::ViewManager::nextLabelChanged, next, &QPushButton::setText ); - connect( - m_viewManager, &Calamares::ViewManager::nextIconChanged, this, [=]( QString n ) { setButtonIcon( next, n ); } ); - auto* quit = new QPushButton( getButtonIcon( QStringLiteral( "dialog-cancel" ) ), tr( "&Cancel" ), navigation ); - quit->setObjectName( "view-button-cancel" ); - connect( quit, &QPushButton::clicked, m_viewManager, &Calamares::ViewManager::quit ); - QBoxLayout* bottomLayout = new QHBoxLayout; bottomLayout->addStretch(); - bottomLayout->addWidget( back ); - bottomLayout->addWidget( next ); + + // Create buttons and sets an initial icon; the icons may change + { + auto* back = new QPushButton( getButtonIcon( QStringLiteral( "go-previous" ) ), tr( "&Back" ), navigation ); + back->setObjectName( "view-button-back" ); + connect( back, &QPushButton::clicked, m_viewManager, &Calamares::ViewManager::back ); + connect( m_viewManager, &Calamares::ViewManager::backEnabledChanged, back, &QPushButton::setEnabled ); + connect( m_viewManager, &Calamares::ViewManager::backLabelChanged, back, &QPushButton::setText ); + connect( m_viewManager, &Calamares::ViewManager::backIconChanged, this, [=]( QString n ) { + setButtonIcon( back, n ); + } ); + bottomLayout->addWidget( back ); + } + { + auto* next = new QPushButton( getButtonIcon( QStringLiteral( "go-next" ) ), tr( "&Next" ), navigation ); + next->setObjectName( "view-button-next" ); + connect( next, &QPushButton::clicked, m_viewManager, &Calamares::ViewManager::next ); + connect( m_viewManager, &Calamares::ViewManager::nextEnabledChanged, next, &QPushButton::setEnabled ); + connect( m_viewManager, &Calamares::ViewManager::nextLabelChanged, next, &QPushButton::setText ); + connect( m_viewManager, &Calamares::ViewManager::nextIconChanged, this, [=]( QString n ) { + setButtonIcon( next, n ); + } ); + bottomLayout->addWidget( next ); + } bottomLayout->addSpacing( 12 ); - bottomLayout->addWidget( quit ); + { + auto* quit = new QPushButton( getButtonIcon( QStringLiteral( "dialog-cancel" ) ), tr( "&Cancel" ), navigation ); + quit->setObjectName( "view-button-cancel" ); + connect( quit, &QPushButton::clicked, m_viewManager, &Calamares::ViewManager::quit ); + bottomLayout->addWidget( quit ); + } navigation->setLayout( bottomLayout ); return navigation; diff --git a/src/libcalamaresui/ViewManager.cpp b/src/libcalamaresui/ViewManager.cpp index 74a1b6bee..a73580fa9 100644 --- a/src/libcalamaresui/ViewManager.cpp +++ b/src/libcalamaresui/ViewManager.cpp @@ -38,6 +38,12 @@ #include #include +#define UPDATE_BUTTON_PROPERTY( name, value ) \ + { \ + m_##name = value; \ + emit name##Changed( m_##name ); \ + } + namespace Calamares { @@ -89,8 +95,6 @@ ViewManager::ViewManager( QObject* parent ) mainLayout->addWidget( m_stack ); // Create buttons and sets an initial icon; the icons may change - m_back = new QPushButton( getButtonIcon( QStringLiteral( "go-previous" ) ), tr( "&Back" ), m_widget ); - m_back->setObjectName( "view-button-back" ); m_quit = new QPushButton( getButtonIcon( QStringLiteral( "dialog-cancel" ) ), tr( "&Cancel" ), m_widget ); m_quit->setObjectName( "view-button-cancel" ); @@ -99,13 +103,9 @@ ViewManager::ViewManager( QObject* parent ) QBoxLayout* bottomLayout = new QHBoxLayout; mainLayout->addLayout( bottomLayout ); bottomLayout->addStretch(); - bottomLayout->addWidget( m_back ); - bottomLayout->addSpacing( 12 ); bottomLayout->addWidget( m_quit ); - connect( m_back, &QPushButton::clicked, this, &ViewManager::back ); connect( m_quit, &QPushButton::clicked, this, &ViewManager::quit ); - m_back->setEnabled( false ); connect( JobQueue::instance(), &JobQueue::failed, this, &ViewManager::onInstallationFailed ); connect( JobQueue::instance(), &JobQueue::finished, this, &ViewManager::next ); @@ -363,9 +363,8 @@ ViewManager::next() { // Reached the end in a weird state (e.g. no finished step after an exec) executing = false; - m_nextEnabled = false; - emit nextEnabledChanged( m_nextEnabled ); - m_back->setEnabled( false ); + UPDATE_BUTTON_PROPERTY( nextEnabled, false ) + UPDATE_BUTTON_PROPERTY( backEnabled, false ) } updateCancelEnabled( !settings->disableCancel() && !( executing && settings->disableCancelDuringExec() ) ); } @@ -376,9 +375,8 @@ ViewManager::next() if ( m_currentStep < m_steps.count() ) { - m_nextEnabled = !executing && m_steps.at( m_currentStep )->isNextEnabled(); - emit nextEnabledChanged( m_nextEnabled ); - m_back->setEnabled( !executing && m_steps.at( m_currentStep )->isBackEnabled() ); + UPDATE_BUTTON_PROPERTY( nextEnabled, !executing && m_steps.at( m_currentStep )->isNextEnabled() ) + UPDATE_BUTTON_PROPERTY( backEnabled, !executing && m_steps.at( m_currentStep )->isBackEnabled() ) } updateButtonLabels(); @@ -400,21 +398,17 @@ ViewManager::updateButtonLabels() // If we're going into the execution step / install phase, other message if ( stepIsExecute( m_steps, m_currentStep + 1 ) ) { - m_nextLabel = nextIsInstallationStep; - m_nextIcon = "run-install"; - emit nextLabelChanged( m_nextLabel ); - emit nextIconChanged( m_nextIcon ); + UPDATE_BUTTON_PROPERTY( nextLabel, nextIsInstallationStep ) + UPDATE_BUTTON_PROPERTY( nextIcon, "run-install" ) } else { - m_nextLabel = tr( "&Next" ); - m_nextIcon = "go-next"; - emit nextLabelChanged( m_nextLabel ); - emit nextIconChanged( m_nextIcon ); + UPDATE_BUTTON_PROPERTY( nextLabel, tr( "&Next" ) ) + UPDATE_BUTTON_PROPERTY( nextIcon, "go-next" ) } // Going back is always simple - m_back->setText( tr( "&Back" ) ); + UPDATE_BUTTON_PROPERTY( backLabel, tr( "&Back" ) ) // Cancel button changes label at the end if ( isAtVeryEnd( m_steps, m_currentStep ) ) @@ -465,14 +459,11 @@ ViewManager::back() return; } - m_nextEnabled = m_steps.at( m_currentStep )->isNextEnabled(); - emit nextEnabledChanged( m_nextEnabled ); - m_back->setEnabled( m_steps.at( m_currentStep )->isBackEnabled() ); - - if ( m_currentStep == 0 && m_steps.first()->isAtBeginning() ) - { - m_back->setEnabled( false ); - } + UPDATE_BUTTON_PROPERTY( nextEnabled, m_steps.at( m_currentStep )->isNextEnabled() ) + UPDATE_BUTTON_PROPERTY( backEnabled, + ( m_currentStep == 0 && m_steps.first()->isAtBeginning() ) + ? false + : m_steps.at( m_currentStep )->isBackEnabled() ) updateButtonLabels(); } diff --git a/src/libcalamaresui/ViewManager.h b/src/libcalamaresui/ViewManager.h index 4e2d5e9e0..00a7509bb 100644 --- a/src/libcalamaresui/ViewManager.h +++ b/src/libcalamaresui/ViewManager.h @@ -38,10 +38,15 @@ class UIDLLEXPORT ViewManager : public QAbstractListModel { Q_OBJECT Q_PROPERTY( int currentStepIndex READ currentStepIndex NOTIFY currentStepChanged FINAL ) + Q_PROPERTY( bool nextEnabled READ nextEnabled NOTIFY nextEnabledChanged FINAL ) Q_PROPERTY( QString nextLabel READ nextLabel NOTIFY nextLabelChanged FINAL ) Q_PROPERTY( QString nextIcon READ nextIcon NOTIFY nextIconChanged FINAL ) + Q_PROPERTY( bool backEnabled READ backEnabled NOTIFY backEnabledChanged FINAL ) + Q_PROPERTY( QString backLabel READ backLabel NOTIFY backLabelChanged FINAL ) + Q_PROPERTY( QString backIcon READ backIcon NOTIFY backIconChanged FINAL ) + public: /** * @brief instance access to the ViewManager singleton. @@ -121,6 +126,18 @@ public Q_SLOTS: * have any pages before the current one. */ void back(); + bool backEnabled() const + { + return m_backEnabled; ///< Is the back-button to be enabled + } + QString backLabel() const + { + return m_backLabel; ///< What should be displayed on the back-button + } + QString backIcon() const + { + return m_backIcon; ///< Name of the icon to show + } /** * @brief Probably quit @@ -152,6 +169,10 @@ signals: void nextLabelChanged( QString ) const; void nextIconChanged( QString ) const; + void backEnabledChanged( bool ) const; + void backLabelChanged( QString ) const; + void backIconChanged( QString ) const; + private: explicit ViewManager( QObject* parent = nullptr ); virtual ~ViewManager() override; @@ -167,13 +188,16 @@ private: QWidget* m_widget; QStackedWidget* m_stack; - QPushButton* m_back; QPushButton* m_quit; bool m_nextEnabled = false; QString m_nextLabel; QString m_nextIcon; ///< Name of icon to show on button + bool m_backEnabled = false; + QString m_backLabel; + QString m_backIcon; + public: /** @section Model * From 0c71c7c23ff5a11867c840d751b0dde925077410 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 2 Apr 2020 12:36:45 +0200 Subject: [PATCH 11/17] [calamares] Set initial states of next, back buttons --- src/calamares/CalamaresWindow.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/calamares/CalamaresWindow.cpp b/src/calamares/CalamaresWindow.cpp index 991d81dd3..9f35fbdf1 100644 --- a/src/calamares/CalamaresWindow.cpp +++ b/src/calamares/CalamaresWindow.cpp @@ -171,6 +171,7 @@ CalamaresWindow::getWidgetNavigation() { auto* back = new QPushButton( getButtonIcon( QStringLiteral( "go-previous" ) ), tr( "&Back" ), navigation ); back->setObjectName( "view-button-back" ); + back->setEnabled( m_viewManager->backEnabled() ); connect( back, &QPushButton::clicked, m_viewManager, &Calamares::ViewManager::back ); connect( m_viewManager, &Calamares::ViewManager::backEnabledChanged, back, &QPushButton::setEnabled ); connect( m_viewManager, &Calamares::ViewManager::backLabelChanged, back, &QPushButton::setText ); @@ -182,6 +183,7 @@ CalamaresWindow::getWidgetNavigation() { auto* next = new QPushButton( getButtonIcon( QStringLiteral( "go-next" ) ), tr( "&Next" ), navigation ); next->setObjectName( "view-button-next" ); + next->setEnabled( m_viewManager->nextEnabled() ); connect( next, &QPushButton::clicked, m_viewManager, &Calamares::ViewManager::next ); connect( m_viewManager, &Calamares::ViewManager::nextEnabledChanged, next, &QPushButton::setEnabled ); connect( m_viewManager, &Calamares::ViewManager::nextLabelChanged, next, &QPushButton::setText ); From 91d0ba1007035f2286d5356f16d80f85d359d66d Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 2 Apr 2020 13:44:49 +0200 Subject: [PATCH 12/17] [libcalamaresui] Remove *quit* button from ViewManager - Mostly like the other buttons - Also show/hide the button and set tooltip --- src/calamares/CalamaresWindow.cpp | 7 ++++++ src/libcalamaresui/ViewManager.cpp | 37 +++++++++++------------------- src/libcalamaresui/ViewManager.h | 37 +++++++++++++++++++++++++++++- 3 files changed, 56 insertions(+), 25 deletions(-) diff --git a/src/calamares/CalamaresWindow.cpp b/src/calamares/CalamaresWindow.cpp index 9f35fbdf1..eadf56f16 100644 --- a/src/calamares/CalamaresWindow.cpp +++ b/src/calamares/CalamaresWindow.cpp @@ -197,6 +197,13 @@ CalamaresWindow::getWidgetNavigation() auto* quit = new QPushButton( getButtonIcon( QStringLiteral( "dialog-cancel" ) ), tr( "&Cancel" ), navigation ); quit->setObjectName( "view-button-cancel" ); connect( quit, &QPushButton::clicked, m_viewManager, &Calamares::ViewManager::quit ); + connect( m_viewManager, &Calamares::ViewManager::quitEnabledChanged, quit, &QPushButton::setEnabled ); + connect( m_viewManager, &Calamares::ViewManager::quitLabelChanged, quit, &QPushButton::setText ); + connect( m_viewManager, &Calamares::ViewManager::quitIconChanged, this, [=]( QString n ) { + setButtonIcon( quit, n ); + } ); + connect( m_viewManager, &Calamares::ViewManager::quitTooltipChanged, quit, &QPushButton::setToolTip ); + connect( m_viewManager, &Calamares::ViewManager::quitVisibleChanged, quit, &QPushButton::setVisible ); bottomLayout->addWidget( quit ); } diff --git a/src/libcalamaresui/ViewManager.cpp b/src/libcalamaresui/ViewManager.cpp index a73580fa9..4aaa56b35 100644 --- a/src/libcalamaresui/ViewManager.cpp +++ b/src/libcalamaresui/ViewManager.cpp @@ -94,26 +94,12 @@ ViewManager::ViewManager( QObject* parent ) m_stack->setContentsMargins( 0, 0, 0, 0 ); mainLayout->addWidget( m_stack ); - // Create buttons and sets an initial icon; the icons may change - m_quit = new QPushButton( getButtonIcon( QStringLiteral( "dialog-cancel" ) ), tr( "&Cancel" ), m_widget ); - m_quit->setObjectName( "view-button-cancel" ); - CALAMARES_RETRANSLATE_SLOT( &ViewManager::updateButtonLabels ) - QBoxLayout* bottomLayout = new QHBoxLayout; - mainLayout->addLayout( bottomLayout ); - bottomLayout->addStretch(); - bottomLayout->addWidget( m_quit ); - - connect( m_quit, &QPushButton::clicked, this, &ViewManager::quit ); - connect( JobQueue::instance(), &JobQueue::failed, this, &ViewManager::onInstallationFailed ); connect( JobQueue::instance(), &JobQueue::finished, this, &ViewManager::next ); - if ( Calamares::Settings::instance()->disableCancel() ) - { - m_quit->setVisible( false ); - } + UPDATE_BUTTON_PROPERTY( quitVisible, !Calamares::Settings::instance()->disableCancel() ) } @@ -413,28 +399,31 @@ ViewManager::updateButtonLabels() // Cancel button changes label at the end if ( isAtVeryEnd( m_steps, m_currentStep ) ) { - m_quit->setText( tr( "&Done" ) ); - m_quit->setToolTip( quitOnCompleteTooltip ); - m_quit->setVisible( true ); // At end, always visible and enabled. - setButtonIcon( m_quit, "dialog-ok-apply" ); + UPDATE_BUTTON_PROPERTY( quitLabel, tr( "&Done" ) ) + UPDATE_BUTTON_PROPERTY( quitTooltip, quitOnCompleteTooltip ) + UPDATE_BUTTON_PROPERTY( quitVisible, true ) + UPDATE_BUTTON_PROPERTY( quitIcon, "dialog-ok-apply" ) updateCancelEnabled( true ); + // FIXME +#if 0 if ( settings->quitAtEnd() ) { m_quit->click(); } +#endif } else { if ( settings->disableCancel() ) { - m_quit->setVisible( false ); // In case we went back from final + UPDATE_BUTTON_PROPERTY( quitVisible, false ) } updateCancelEnabled( !settings->disableCancel() && !( stepIsExecute( m_steps, m_currentStep ) && settings->disableCancelDuringExec() ) ); - m_quit->setText( tr( "&Cancel" ) ); - m_quit->setToolTip( cancelBeforeInstallationTooltip ); - setButtonIcon( m_quit, "dialog-cancel" ); + UPDATE_BUTTON_PROPERTY( quitLabel, tr( "&Cancel" ) ) + UPDATE_BUTTON_PROPERTY( quitTooltip, cancelBeforeInstallationTooltip ) + UPDATE_BUTTON_PROPERTY( quitIcon, "dialog-cancel" ) } } @@ -516,7 +505,7 @@ ViewManager::confirmCancelInstallation() void ViewManager::updateCancelEnabled( bool enabled ) { - m_quit->setEnabled( enabled ); + UPDATE_BUTTON_PROPERTY( quitEnabled, enabled ) emit cancelEnabled( enabled ); } diff --git a/src/libcalamaresui/ViewManager.h b/src/libcalamaresui/ViewManager.h index 00a7509bb..ad9376f1a 100644 --- a/src/libcalamaresui/ViewManager.h +++ b/src/libcalamaresui/ViewManager.h @@ -47,6 +47,13 @@ class UIDLLEXPORT ViewManager : public QAbstractListModel Q_PROPERTY( QString backLabel READ backLabel NOTIFY backLabelChanged FINAL ) Q_PROPERTY( QString backIcon READ backIcon NOTIFY backIconChanged FINAL ) + Q_PROPERTY( bool quitEnabled READ quitEnabled NOTIFY quitEnabledChanged FINAL ) + Q_PROPERTY( QString quitLabel READ quitLabel NOTIFY quitLabelChanged FINAL ) + Q_PROPERTY( QString quitIcon READ quitIcon NOTIFY quitIconChanged FINAL ) + Q_PROPERTY( QString quitTooltip READ quitTooltip NOTIFY quitTooltipChanged FINAL ) + + Q_PROPERTY( bool quitVisible READ quitVisible NOTIFY quitVisibleChanged FINAL ) + public: /** * @brief instance access to the ViewManager singleton. @@ -145,6 +152,23 @@ public Q_SLOTS: * Asks for confirmation if necessary. Terminates the application. */ void quit(); + bool quitEnabled() const + { + return m_quitEnabled; ///< Is the quit-button to be enabled + } + QString quitLabel() const + { + return m_quitLabel; ///< What should be displayed on the quit-button + } + QString quitIcon() const + { + return m_quitIcon; ///< Name of the icon to show + } + bool quitVisible() const + { + return m_quitVisible; ///< Should the quit-button be visible + } + QString quitTooltip() const { return m_quitTooltip; } /** * @brief onInstallationFailed displays an error message when a fatal failure @@ -173,6 +197,12 @@ signals: void backLabelChanged( QString ) const; void backIconChanged( QString ) const; + void quitEnabledChanged( bool ) const; + void quitLabelChanged( QString ) const; + void quitIconChanged( QString ) const; + void quitVisibleChanged( bool ) const; + void quitTooltipChanged( QString ) const; + private: explicit ViewManager( QObject* parent = nullptr ); virtual ~ViewManager() override; @@ -188,7 +218,6 @@ private: QWidget* m_widget; QStackedWidget* m_stack; - QPushButton* m_quit; bool m_nextEnabled = false; QString m_nextLabel; @@ -198,6 +227,12 @@ private: QString m_backLabel; QString m_backIcon; + bool m_quitEnabled = false; + QString m_quitLabel; + QString m_quitIcon; + QString m_quitTooltip; + bool m_quitVisible = true; + public: /** @section Model * From c755c7ed98fd612f15d284bf05cfa357cd9e15cf Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 2 Apr 2020 13:54:14 +0200 Subject: [PATCH 13/17] [libcalamaresui] restore quit-at-very-end functionality - This doesn't need to go indirectly through a button --- src/libcalamaresui/ViewManager.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/libcalamaresui/ViewManager.cpp b/src/libcalamaresui/ViewManager.cpp index 4aaa56b35..79b4a244f 100644 --- a/src/libcalamaresui/ViewManager.cpp +++ b/src/libcalamaresui/ViewManager.cpp @@ -404,13 +404,10 @@ ViewManager::updateButtonLabels() UPDATE_BUTTON_PROPERTY( quitVisible, true ) UPDATE_BUTTON_PROPERTY( quitIcon, "dialog-ok-apply" ) updateCancelEnabled( true ); - // FIXME -#if 0 if ( settings->quitAtEnd() ) { - m_quit->click(); + quit(); } -#endif } else { From 476a576ddaa51892ac4dd10a01b315f7102af54b Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 2 Apr 2020 15:48:43 +0200 Subject: [PATCH 14/17] [libcalamaresui] Ensure all button labels are accurate - since lots of state is updated when the labels change, call that in the constructor so that any QML bindings get current values. --- src/libcalamaresui/ViewManager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libcalamaresui/ViewManager.cpp b/src/libcalamaresui/ViewManager.cpp index 79b4a244f..e80d4afd8 100644 --- a/src/libcalamaresui/ViewManager.cpp +++ b/src/libcalamaresui/ViewManager.cpp @@ -94,12 +94,12 @@ ViewManager::ViewManager( QObject* parent ) m_stack->setContentsMargins( 0, 0, 0, 0 ); mainLayout->addWidget( m_stack ); - CALAMARES_RETRANSLATE_SLOT( &ViewManager::updateButtonLabels ) + updateButtonLabels(); connect( JobQueue::instance(), &JobQueue::failed, this, &ViewManager::onInstallationFailed ); connect( JobQueue::instance(), &JobQueue::finished, this, &ViewManager::next ); - UPDATE_BUTTON_PROPERTY( quitVisible, !Calamares::Settings::instance()->disableCancel() ) + CALAMARES_RETRANSLATE_SLOT( &ViewManager::updateButtonLabels ) } From ff37792dc95b24b63663b5beebf572653d539adf Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 2 Apr 2020 15:49:27 +0200 Subject: [PATCH 15/17] [calamares] Resize QML to width of parent window --- src/calamares/CalamaresWindow.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/calamares/CalamaresWindow.cpp b/src/calamares/CalamaresWindow.cpp index eadf56f16..a97d2dccf 100644 --- a/src/calamares/CalamaresWindow.cpp +++ b/src/calamares/CalamaresWindow.cpp @@ -138,6 +138,7 @@ CalamaresWindow::getQmlSidebar( int desiredWidth ) QQuickWidget* w = new QQuickWidget( this ); w->setFixedWidth( desiredWidth ); w->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); + w->setResizeMode( QQuickWidget::SizeRootObjectToView ); w->setSource( QUrl( CalamaresUtils::searchQmlFile( CalamaresUtils::QmlSearch::Both, QStringLiteral( "calamares-sidebar" ) ) ) ); return w; @@ -218,6 +219,7 @@ CalamaresWindow::getQmlNavigation() QQuickWidget* w = new QQuickWidget( this ); w->setFixedHeight( 64 ); w->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); + w->setResizeMode( QQuickWidget::SizeRootObjectToView ); w->setSource( QUrl( CalamaresUtils::searchQmlFile( CalamaresUtils::QmlSearch::Both, QStringLiteral( "calamares-navigation" ) ) ) ); return w; From 1038de899b3ce2661e243b8ab541f97e929e8812 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 2 Apr 2020 16:22:39 +0200 Subject: [PATCH 16/17] [calamares] Update sidebar and navigation QML - use the right colors (from branding, not from desktop theme) - apply branding logo --- src/calamares/calamares-navigation.qml | 78 +++++++++++++++----------- src/calamares/calamares-sidebar.qml | 56 ++++++++++-------- 2 files changed, 76 insertions(+), 58 deletions(-) diff --git a/src/calamares/calamares-navigation.qml b/src/calamares/calamares-navigation.qml index 0831a9b6a..c7cd91835 100644 --- a/src/calamares/calamares-navigation.qml +++ b/src/calamares/calamares-navigation.qml @@ -4,44 +4,54 @@ import io.calamares.core 1.0 import QtQuick 2.3 import QtQuick.Controls 2.10 import QtQuick.Layouts 1.3 -import org.kde.kirigami 2.7 as Kirigami -Row { - id: buttonBar - height: 64 +Rectangle { + id: navigationBar; + color: Branding.styleString( Branding.SidebarBackground ); - Button - { - Layout.fillWidth: true - text: qsTr("Back") - icon.name: "next" - Kirigami.Theme.backgroundColor: Qt.rgba(Kirigami.Theme.backgroundColor.r, Kirigami.Theme.backgroundColor.g, Kirigami.Theme.backgroundColor.b, 0.4) - Kirigami.Theme.textColor: Kirigami.Theme.textColor + RowLayout { + id: buttonBar + height: 64; + anchors.fill: parent; - visible: true - onClicked: { } - } - Button - { - Layout.fillWidth: true - text: qsTr("Next") - icon.name: "next" - Kirigami.Theme.backgroundColor: Qt.rgba(Kirigami.Theme.backgroundColor.r, Kirigami.Theme.backgroundColor.g, Kirigami.Theme.backgroundColor.b, 0.4) - Kirigami.Theme.textColor: Kirigami.Theme.textColor + Item + { + Layout.fillWidth: true; + } - visible: true - onClicked: { } - } - Button - { - Layout.fillWidth: true - text: qsTr("Quit") - icon.name: "quit" - Kirigami.Theme.backgroundColor: Qt.rgba(Kirigami.Theme.backgroundColor.r, Kirigami.Theme.backgroundColor.g, Kirigami.Theme.backgroundColor.b, 0.4) - Kirigami.Theme.textColor: Kirigami.Theme.textColor + Button + { + text: ViewManager.backLabel; + icon.name: ViewManager.backIcon; - visible: true - onClicked: { } - } + enabled: ViewManager.backEnabled; + visible: true; + onClicked: { ViewManager.back(); } + } + Button + { + text: ViewManager.nextLabel; + icon.name: ViewManager.nextIcon; + enabled: ViewManager.nextEnabled; + visible: true; + onClicked: { ViewManager.next(); } + } + Button + { + Layout.leftMargin: 3 * buttonBar.spacing; // little gap from back/next + Layout.rightMargin: 2 * buttonBar.spacing + text: ViewManager.quitLabel; + icon.name: ViewManager.quitIcon; + + ToolTip.visible: hovered + ToolTip.timeout: 5000 + ToolTip.delay: 1000 + ToolTip.text: ViewManager.quitTooltip; + + enabled: ViewManager.quitEnabled; + visible: ViewManager.quitVisible; + onClicked: { ViewManager.quit(); } + } + } } diff --git a/src/calamares/calamares-sidebar.qml b/src/calamares/calamares-sidebar.qml index aa794e94a..e57cd3323 100644 --- a/src/calamares/calamares-sidebar.qml +++ b/src/calamares/calamares-sidebar.qml @@ -1,36 +1,44 @@ -import QtQuick 2.3 import io.calamares.ui 1.0 import io.calamares.core 1.0 -Column { +import QtQuick 2.3 +import QtQuick.Layouts 1.3 Rectangle { - id: hello - width: 200 - height: 100 - color: "red" + id: sideBar; + color: Branding.styleString( Branding.SidebarBackground ); - Text { - anchors.centerIn: parent - text: Branding.string(Branding.VersionedName) - } -} + ColumnLayout { + anchors.fill: parent; + spacing: 0; -/* perhaps we could show a branding image here */ + Image { + id: logo + width: 80; + height: width; // square + anchors.horizontalCenter: parent.horizontalCenter; + source: "file:/" + Branding.imagePath(Branding.ProductLogo); + sourceSize.width: width; + sourceSize.height: height; + } -Repeater { - model: ViewManager - Rectangle { - width: 200 - height: 75 - color: "black" + Repeater { + model: ViewManager + Rectangle { + width: 200; + height: 75; + color: Branding.styleString( index == ViewManager.currentStepIndex ? Branding.SidebarTextHighlight : Branding.SidebarBackground ); - Text { - anchors.centerIn: parent - color: index == ViewManager.currentStepIndex ? "green" : "yellow" - text: display + Text { + anchors.centerIn: parent; + color: Branding.styleString( index == ViewManager.currentStepIndex ? Branding.SidebarTextSelect : Branding.SidebarText ); + text: display; + } + } + } + + Item { + Layout.fillHeight: true; } } } - -} From 510f9352e7aaaf50568900ff30b28f7874608510 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 2 Apr 2020 16:45:04 +0200 Subject: [PATCH 17/17] [calamares] Tweak QML sidebar - some margins and extra space - left-align text - progress lozenges instead of pointy rectangles --- src/calamares/calamares-sidebar.qml | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/calamares/calamares-sidebar.qml b/src/calamares/calamares-sidebar.qml index e57cd3323..183a9acb2 100644 --- a/src/calamares/calamares-sidebar.qml +++ b/src/calamares/calamares-sidebar.qml @@ -13,10 +13,12 @@ Rectangle { spacing: 0; Image { - id: logo + Layout.topMargin: 12; + Layout.bottomMargin: 12; + Layout.alignment: Qt.AlignHCenter | Qt.AlignTop + id: logo; width: 80; height: width; // square - anchors.horizontalCenter: parent.horizontalCenter; source: "file:/" + Branding.imagePath(Branding.ProductLogo); sourceSize.width: width; sourceSize.height: height; @@ -25,12 +27,15 @@ Rectangle { Repeater { model: ViewManager Rectangle { - width: 200; - height: 75; + Layout.leftMargin: 12; + width: parent.width - 24; + height: 35; + radius: 6; color: Branding.styleString( index == ViewManager.currentStepIndex ? Branding.SidebarTextHighlight : Branding.SidebarBackground ); Text { - anchors.centerIn: parent; + anchors.verticalCenter: parent.verticalCenter; + x: parent.x + 12; color: Branding.styleString( index == ViewManager.currentStepIndex ? Branding.SidebarTextSelect : Branding.SidebarText ); text: display; }