[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.
main
Adriaan de Groot 5 years ago
parent e15e7d1dc5
commit 7b6b53ab8c

@ -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 );

Loading…
Cancel
Save