source: calamares/trunk/fuentes/src/modules/welcome/checker/CheckerWidget.cpp @ 7538

Last change on this file since 7538 was 7538, checked in by kbut, 13 months ago

sync with github

File size: 7.4 KB
Line 
1/* === This file is part of Calamares - <https://github.com/calamares> ===
2 *
3 *   Copyright 2014-2015, Teo Mrnjavac <teo@kde.org>
4 *   Copyright 2017, Adriaan de Groot <groot@kde.org>
5 *
6 *   Calamares is free software: you can redistribute it and/or modify
7 *   it under the terms of the GNU General Public License as published by
8 *   the Free Software Foundation, either version 3 of the License, or
9 *   (at your option) any later version.
10 *
11 *   Calamares is distributed in the hope that it will be useful,
12 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
13 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 *   GNU General Public License for more details.
15 *
16 *   You should have received a copy of the GNU General Public License
17 *   along with Calamares. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20#include "CheckerWidget.h"
21
22#include "CheckItemWidget.h"
23
24#include "Branding.h"
25#include "utils/CalamaresUtilsGui.h"
26#include "utils/Retranslator.h"
27#include "widgets/FixedAspectRatioLabel.h"
28
29#include <QAbstractButton>
30#include <QBoxLayout>
31#include <QDialog>
32#include <QDialogButtonBox>
33#include <QLabel>
34
35
36CheckerWidget::CheckerWidget( QWidget* parent )
37    : QWidget( parent )
38{
39    setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
40
41    m_mainLayout = new QVBoxLayout;
42    setLayout( m_mainLayout );
43
44    QHBoxLayout* spacerLayout = new QHBoxLayout;
45    m_mainLayout->addLayout( spacerLayout );
46    m_paddingSize = qBound( 32, CalamaresUtils::defaultFontHeight() * 4, 128 );
47    spacerLayout->addSpacing( m_paddingSize );
48    m_entriesLayout = new QVBoxLayout;
49    spacerLayout->addLayout( m_entriesLayout );
50    spacerLayout->addSpacing( m_paddingSize );
51    CalamaresUtils::unmarginLayout( spacerLayout );
52}
53
54
55void
56CheckerWidget::init( const QList< PrepareEntry >& checkEntries )
57{
58    bool allChecked = true;
59    bool requirementsSatisfied = true;
60
61    for ( const PrepareEntry& entry : checkEntries )
62    {
63        if ( !entry.checked )
64        {
65            CheckItemWidget* ciw = new CheckItemWidget( entry.checked, entry.required );
66            CALAMARES_RETRANSLATE( ciw->setText( entry.negatedText() ); )
67            m_entriesLayout->addWidget( ciw );
68            ciw->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred );
69
70            allChecked = false;
71            if ( entry.required )
72            {
73                requirementsSatisfied = false;
74            }
75            ciw->setAutoFillBackground( true );
76            QPalette pal( ciw->palette() );
77            pal.setColor( QPalette::Background, Qt::white );
78            ciw->setPalette( pal );
79
80        }
81    }
82
83    QLabel* textLabel = new QLabel;
84
85    textLabel->setWordWrap( true );
86    m_entriesLayout->insertWidget( 0, textLabel );
87    textLabel->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred );
88
89    if ( !allChecked )
90    {
91        m_entriesLayout->insertSpacing( 1, CalamaresUtils::defaultFontHeight() / 2 );
92
93        if ( !requirementsSatisfied )
94        {
95            CALAMARES_RETRANSLATE(
96                textLabel->setText( tr( "This computer does not satisfy the minimum "
97                                        "requirements for installing %1.<br/>"
98                                        "Installation cannot continue. "
99                                        "<a href=\"#details\">Details...</a>" )
100                                        .arg( *Calamares::Branding::ShortVersionedName ) );
101            )
102            textLabel->setOpenExternalLinks( false );
103            connect( textLabel, &QLabel::linkActivated,
104                     this, [ this, checkEntries ]( const QString& link )
105            {
106                if ( link == "#details" )
107                    showDetailsDialog( checkEntries );
108            } );
109        }
110        else
111        {
112            CALAMARES_RETRANSLATE(
113                textLabel->setText( tr( "This computer does not satisfy some of the "
114                                        "recommended requirements for installing %1.<br/>"
115                                        "Installation can continue, but some features "
116                                        "might be disabled." )
117                                        .arg( *Calamares::Branding::ShortVersionedName ) );
118            )
119        }
120    }
121
122    if ( allChecked && requirementsSatisfied )
123    {
124        if ( !Calamares::Branding::instance()->
125             imagePath( Calamares::Branding::ProductWelcome ).isEmpty() )
126        {
127            QPixmap theImage = QPixmap( Calamares::Branding::instance()->
128                               imagePath( Calamares::Branding::ProductWelcome ) );
129            if ( !theImage.isNull() )
130            {
131                QLabel* imageLabel;
132                if ( Calamares::Branding::instance()->welcomeExpandingLogo() )
133                {
134                    FixedAspectRatioLabel *p = new FixedAspectRatioLabel;
135                    p->setPixmap( theImage );
136                    imageLabel = p;
137                }
138                else
139                {
140                    imageLabel = new QLabel;
141                    imageLabel->setPixmap( theImage );
142                }
143
144                imageLabel->setContentsMargins( 4, CalamaresUtils::defaultFontHeight() * 3 / 4, 4, 4 );
145                m_mainLayout->addWidget( imageLabel );
146                imageLabel->setAlignment( Qt::AlignCenter );
147                imageLabel->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
148            }
149        }
150        CALAMARES_RETRANSLATE(
151            textLabel->setText( tr( "This program will ask you some questions and "
152                                    "set up %2 on your computer." )
153                                .arg( *Calamares::Branding::ProductName ) );
154            textLabel->setAlignment( Qt::AlignCenter );
155        )
156    }
157    else
158    {
159        m_mainLayout->addStretch();
160    }
161}
162
163
164void
165CheckerWidget::showDetailsDialog( const QList< PrepareEntry >& checkEntries )
166{
167    QDialog* detailsDialog = new QDialog( this );
168    QBoxLayout* mainLayout = new QVBoxLayout;
169    detailsDialog->setLayout( mainLayout );
170
171    QLabel* textLabel = new QLabel;
172    mainLayout->addWidget( textLabel );
173    CALAMARES_RETRANSLATE(
174        textLabel->setText( tr( "For best results, please ensure that this computer:" ) );
175    )
176    QBoxLayout* entriesLayout = new QVBoxLayout;
177    CalamaresUtils::unmarginLayout( entriesLayout );
178    mainLayout->addLayout( entriesLayout );
179
180    for ( const PrepareEntry& entry : checkEntries )
181    {
182        if ( entry.enumerationText().isEmpty() )
183            continue;
184
185        CheckItemWidget* ciw = new CheckItemWidget( entry.checked, entry.required );
186        CALAMARES_RETRANSLATE( ciw->setText( entry.enumerationText() ); )
187        entriesLayout->addWidget( ciw );
188        ciw->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred );
189
190        ciw->setAutoFillBackground( true );
191        QPalette pal( ciw->palette() );
192        pal.setColor( QPalette::Background, Qt::white );
193        ciw->setPalette( pal );
194    }
195
196    QDialogButtonBox* buttonBox = new QDialogButtonBox( QDialogButtonBox::Close,
197                                                        Qt::Horizontal,
198                                                        this );
199    mainLayout->addWidget( buttonBox );
200
201    detailsDialog->setModal( true );
202    detailsDialog->setWindowTitle( tr( "System requirements" ) );
203
204    connect( buttonBox, &QDialogButtonBox::clicked,
205             detailsDialog, &QDialog::close );
206    detailsDialog->exec();
207    detailsDialog->deleteLater();
208}
Note: See TracBrowser for help on using the repository browser.