From 7b6b53ab8cdd7783953301c5ed20bad9a3e9549c Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 3 Apr 2020 11:40:51 +0200 Subject: [PATCH] [calamares] Re-do building the main layout - follow branding settings, taking the panel-sides into account - drop fixed width and height for QML parts - give panels a minimum appropriate-dimension if they don't have one This allows, for instance, putting both Widget sidebar and QML navigation on the left-hand side of the window. --- src/calamares/CalamaresWindow.cpp | 72 +++++++++++++++++++++---------- 1 file changed, 49 insertions(+), 23 deletions(-) diff --git a/src/calamares/CalamaresWindow.cpp b/src/calamares/CalamaresWindow.cpp index 5d4565406..0e8ac1421 100644 --- a/src/calamares/CalamaresWindow.cpp +++ b/src/calamares/CalamaresWindow.cpp @@ -132,11 +132,10 @@ CalamaresWindow::getWidgetSidebar( int desiredWidth ) } QWidget* -CalamaresWindow::getQmlSidebar( int desiredWidth ) +CalamaresWindow::getQmlSidebar( int ) { CalamaresUtils::registerCalamaresModels(); QQuickWidget* w = new QQuickWidget( this ); - w->setFixedWidth( desiredWidth ); w->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); w->setResizeMode( QQuickWidget::SizeRootObjectToView ); w->setSource( QUrl( @@ -217,7 +216,6 @@ CalamaresWindow::getQmlNavigation() { CalamaresUtils::registerCalamaresModels(); QQuickWidget* w = new QQuickWidget( this ); - w->setFixedHeight( 64 ); w->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); w->setResizeMode( QQuickWidget::SizeRootObjectToView ); w->setSource( QUrl( @@ -251,6 +249,28 @@ flavoredWidget( Calamares::Branding::PanelFlavor flavor, NOTREACHED return nullptr; // All enum values handled above } +/** @brief Adds widgets to @p layout if they belong on this @p side + */ +static inline void +insertIf( QBoxLayout* layout, + Calamares::Branding::PanelSide side, + QWidget* first, + Calamares::Branding::PanelSide firstSide ) +{ + if ( first && side == firstSide ) + { + if ( ( side == Calamares::Branding::PanelSide::Left ) || ( side == Calamares::Branding::PanelSide::Right ) ) + { + first->setMinimumWidth( qMax( first->minimumWidth(), 64 ) ); + } + else + { + first->setMinimumHeight( qMax( first->minimumHeight(), 64 ) ); + } + layout->addWidget( first ); + } +} + CalamaresWindow::CalamaresWindow( QWidget* parent ) : QWidget( parent ) , m_debugWindow( nullptr ) @@ -273,6 +293,8 @@ CalamaresWindow::CalamaresWindow( QWidget* parent ) using CalamaresUtils::windowPreferredHeight; using CalamaresUtils::windowPreferredWidth; + using PanelSide = Calamares::Branding::PanelSide; + // Needs to match what's checked in DebugWindow this->setObjectName( "mainApp" ); @@ -292,21 +314,6 @@ CalamaresWindow::CalamaresWindow( QWidget* parent ) resize( w, h ); m_viewManager = Calamares::ViewManager::instance( this ); - - QBoxLayout* mainLayout = new QHBoxLayout; - setLayout( mainLayout ); - - QWidget* sideBox = flavoredWidget( - branding->sidebarFlavor(), - this, - &CalamaresWindow::getWidgetSidebar, - &CalamaresWindow::getQmlSidebar, - qBound( 100, CalamaresUtils::defaultFontHeight() * 12, w < windowPreferredWidth ? 100 : 190 ) ); - if ( sideBox ) - { - mainLayout->addWidget( sideBox ); - } - if ( branding->windowExpands() ) { connect( m_viewManager, &Calamares::ViewManager::enlarge, this, &CalamaresWindow::enlarge ); @@ -319,16 +326,35 @@ 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* mainLayout = new QHBoxLayout; QBoxLayout* contentsLayout = new QVBoxLayout; - contentsLayout->addWidget( m_viewManager->centralWidget() ); + + setLayout( mainLayout ); + + QWidget* sideBox = flavoredWidget( + branding->sidebarFlavor(), + this, + &CalamaresWindow::getWidgetSidebar, + &CalamaresWindow::getQmlSidebar, + qBound( 100, CalamaresUtils::defaultFontHeight() * 12, w < windowPreferredWidth ? 100 : 190 ) ); QWidget* navigation = flavoredWidget( branding->navigationFlavor(), this, &CalamaresWindow::getWidgetNavigation, &CalamaresWindow::getQmlNavigation ); - if ( navigation ) - { - contentsLayout->addWidget( navigation ); - } + // Build up the contentsLayout (a VBox) top-to-bottom + // .. note that the bottom is mirrored wrt. the top + insertIf( contentsLayout, PanelSide::Top, sideBox, branding->sidebarSide() ); + insertIf( contentsLayout, PanelSide::Top, navigation, branding->navigationSide() ); + contentsLayout->addWidget( m_viewManager->centralWidget() ); + insertIf( contentsLayout, PanelSide::Bottom, navigation, branding->navigationSide() ); + insertIf( contentsLayout, PanelSide::Bottom, sideBox, branding->sidebarSide() ); + + // .. and then the mainLayout left-to-right + insertIf( mainLayout, PanelSide::Left, sideBox, branding->sidebarSide() ); + insertIf( mainLayout, PanelSide::Left, navigation, branding->navigationSide() ); mainLayout->addLayout( contentsLayout ); + insertIf( mainLayout, PanelSide::Right, navigation, branding->navigationSide() ); + insertIf( mainLayout, PanelSide::Right, sideBox, branding->sidebarSide() ); CalamaresUtils::unmarginLayout( mainLayout ); CalamaresUtils::unmarginLayout( contentsLayout );