Merge pull request #1977 from calamares/issue-1974
[welcome] Show welcome-image when all requirements are satisfied
This commit is contained in:
commit
57d978b82d
@ -283,16 +283,16 @@
|
|||||||
<location filename="../src/libcalamares/modulesystem/RequirementsChecker.cpp" line="118"/>
|
<location filename="../src/libcalamares/modulesystem/RequirementsChecker.cpp" line="118"/>
|
||||||
<source>Waiting for %n module(s).</source>
|
<source>Waiting for %n module(s).</source>
|
||||||
<translation>
|
<translation>
|
||||||
<numerusform>Waiting for %n module(s).</numerusform>
|
<numerusform>Waiting for %n module.</numerusform>
|
||||||
<numerusform>Waiting for %n module(s).</numerusform>
|
<numerusform>Waiting for %n modules.</numerusform>
|
||||||
</translation>
|
</translation>
|
||||||
</message>
|
</message>
|
||||||
<message numerus="yes">
|
<message numerus="yes">
|
||||||
<location filename="../src/libcalamares/modulesystem/RequirementsChecker.cpp" line="119"/>
|
<location filename="../src/libcalamares/modulesystem/RequirementsChecker.cpp" line="119"/>
|
||||||
<source>(%n second(s))</source>
|
<source>(%n second(s))</source>
|
||||||
<translation>
|
<translation>
|
||||||
<numerusform>(%n second(s))</numerusform>
|
<numerusform>(%n second)</numerusform>
|
||||||
<numerusform>(%n second(s))</numerusform>
|
<numerusform>(%n seconds)</numerusform>
|
||||||
</translation>
|
</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
|
@ -91,7 +91,7 @@ RequirementsChecker::addCheckedRequirements( Module* m )
|
|||||||
m_model->addRequirementsList( l );
|
m_model->addRequirementsList( l );
|
||||||
}
|
}
|
||||||
|
|
||||||
requirementsProgress( tr( "Requirements checking for module <i>%1</i> is complete." ).arg( m->name() ) );
|
Q_EMIT requirementsProgress( tr( "Requirements checking for module '%1' is complete." ).arg( m->name() ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -117,11 +117,11 @@ RequirementsChecker::reportProgress()
|
|||||||
unsigned int posInterval = ( m_progressTimer->interval() < 0 ) ? 1000 : uint( m_progressTimer->interval() );
|
unsigned int posInterval = ( m_progressTimer->interval() < 0 ) ? 1000 : uint( m_progressTimer->interval() );
|
||||||
QString waiting = tr( "Waiting for %n module(s).", "", remaining );
|
QString waiting = tr( "Waiting for %n module(s).", "", remaining );
|
||||||
QString elapsed = tr( "(%n second(s))", "", m_progressTimeouts * posInterval / 1000 );
|
QString elapsed = tr( "(%n second(s))", "", m_progressTimeouts * posInterval / 1000 );
|
||||||
emit requirementsProgress( waiting + QString( " " ) + elapsed );
|
Q_EMIT requirementsProgress( waiting + QString( " " ) + elapsed );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
emit requirementsProgress( tr( "System-requirements checking is complete." ) );
|
Q_EMIT requirementsProgress( tr( "System-requirements checking is complete." ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,10 +32,10 @@ public:
|
|||||||
~WaitingWidget() override;
|
~WaitingWidget() override;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** @brief A spinner and a countdown next to it
|
/** @brief A spinner and a countdown inside it
|
||||||
*
|
*
|
||||||
* The spinner is sized to the text-height and displays a
|
* The spinner is sized to the text-height and displays a
|
||||||
* numeric countdown next to it. The countdown is updated
|
* numeric countdown iside the spinner. The countdown is updated
|
||||||
* every second. The signal timeout() is sent every time
|
* every second. The signal timeout() is sent every time
|
||||||
* the countdown reaches 0.
|
* the countdown reaches 0.
|
||||||
*/
|
*/
|
||||||
|
@ -81,6 +81,10 @@ public:
|
|||||||
* With AlignBottom, the text is displayed below the spinner,
|
* With AlignBottom, the text is displayed below the spinner,
|
||||||
* centered horizontally relative to the spinner; any other alignment
|
* centered horizontally relative to the spinner; any other alignment
|
||||||
* will put the text in the middle of the spinner itself.
|
* will put the text in the middle of the spinner itself.
|
||||||
|
*
|
||||||
|
* TODO: this does not support rich text. Rich text could be done
|
||||||
|
* through a QStaticText, or an HTML document. However, then
|
||||||
|
* we need to do more alignment calculations ourselves.
|
||||||
*/
|
*/
|
||||||
void setText( const QString& text );
|
void setText( const QString& text );
|
||||||
/** @brief Sets the alignment of text for the spinner
|
/** @brief Sets the alignment of text for the spinner
|
||||||
|
@ -77,6 +77,7 @@ CheckerContainer::requirementsComplete( bool ok )
|
|||||||
m_checkerWidget->setObjectName( "requirementsChecker" );
|
m_checkerWidget->setObjectName( "requirementsChecker" );
|
||||||
layout()->addWidget( m_checkerWidget );
|
layout()->addWidget( m_checkerWidget );
|
||||||
}
|
}
|
||||||
|
m_checkerWidget->requirementsComplete();
|
||||||
|
|
||||||
m_verdict = ok;
|
m_verdict = ok;
|
||||||
}
|
}
|
||||||
|
@ -228,6 +228,15 @@ GeneralRequirements::checkRequirements()
|
|||||||
false,
|
false,
|
||||||
required } );
|
required } );
|
||||||
}
|
}
|
||||||
|
if ( entry == "slow-false" )
|
||||||
|
{
|
||||||
|
sleep(3);
|
||||||
|
checkEntries.append( { entry,
|
||||||
|
[] { return tr( "is always false (slowly)" ); },
|
||||||
|
[] { return tr( "The computer says no (slowly)." ); },
|
||||||
|
false,
|
||||||
|
required } );
|
||||||
|
}
|
||||||
if ( entry == "true" )
|
if ( entry == "true" )
|
||||||
{
|
{
|
||||||
checkEntries.append( { entry,
|
checkEntries.append( { entry,
|
||||||
@ -236,6 +245,15 @@ GeneralRequirements::checkRequirements()
|
|||||||
true,
|
true,
|
||||||
required } );
|
required } );
|
||||||
}
|
}
|
||||||
|
if ( entry == "slow-true" )
|
||||||
|
{
|
||||||
|
sleep(3);
|
||||||
|
checkEntries.append( { entry,
|
||||||
|
[] { return tr( "is always true (slowly)" ); },
|
||||||
|
[] { return tr( "The computer says yes (slowly)." ); },
|
||||||
|
true,
|
||||||
|
required } );
|
||||||
|
}
|
||||||
if ( entry == "snark" )
|
if ( entry == "snark" )
|
||||||
{
|
{
|
||||||
static unsigned int snark_count = 0;
|
static unsigned int snark_count = 0;
|
||||||
|
@ -67,18 +67,25 @@ ResultsListWidget::ResultsListWidget( Config* config, QWidget* parent )
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ResultsListWidget::requirementsChanged()
|
ResultsListWidget::requirementsComplete()
|
||||||
{
|
{
|
||||||
// Check that all are satisfied (gives warnings if not) and
|
// Check that the satisfaction of the requirements:
|
||||||
// all *mandatory* entries are satisfied (gives errors if not).
|
// - if everything is satisfied, show the welcome image
|
||||||
|
// - otherwise, if all the mandatory ones are satisfied,
|
||||||
|
// we won't be re-checking (see ModuleManager::checkRequirements)
|
||||||
|
// so hide the countdown,
|
||||||
|
// - otherwise we have unsatisfied mandatory requirements,
|
||||||
|
// so keep the countdown and the list of problems.
|
||||||
const bool requirementsSatisfied = m_config->requirementsModel()->satisfiedRequirements();
|
const bool requirementsSatisfied = m_config->requirementsModel()->satisfiedRequirements();
|
||||||
|
const bool mandatoryRequirementsSatisfied = m_config->requirementsModel()->satisfiedMandatory();
|
||||||
|
|
||||||
if ( requirementsSatisfied )
|
if ( mandatoryRequirementsSatisfied )
|
||||||
{
|
{
|
||||||
m_countdown->stop();
|
m_countdown->stop();
|
||||||
m_countdown->hide();
|
m_countdown->hide();
|
||||||
|
}
|
||||||
|
if ( requirementsSatisfied )
|
||||||
|
{
|
||||||
delete m_centralWidget;
|
delete m_centralWidget;
|
||||||
m_centralWidget = nullptr;
|
m_centralWidget = nullptr;
|
||||||
|
|
||||||
|
@ -26,10 +26,10 @@ class ResultsListWidget : public QWidget
|
|||||||
public:
|
public:
|
||||||
explicit ResultsListWidget( Config* config, QWidget* parent );
|
explicit ResultsListWidget( Config* config, QWidget* parent );
|
||||||
|
|
||||||
private:
|
/// @brief The model of requirements has finished a round of checking
|
||||||
/// @brief The model of requirements changed
|
void requirementsComplete();
|
||||||
void requirementsChanged();
|
|
||||||
|
|
||||||
|
private:
|
||||||
Config* m_config = nullptr;
|
Config* m_config = nullptr;
|
||||||
|
|
||||||
// UI parts, which need updating when the model changes
|
// UI parts, which need updating when the model changes
|
||||||
|
@ -67,9 +67,13 @@ requirements:
|
|||||||
#
|
#
|
||||||
# Note that the last three checks are for testing-purposes only,
|
# Note that the last three checks are for testing-purposes only,
|
||||||
# and shouldn't be used in production (they are only available
|
# and shouldn't be used in production (they are only available
|
||||||
# when building Calamares in development mode):
|
# when building Calamares in development mode). There are five
|
||||||
|
# special checks:
|
||||||
# - *false* is a check that is always false (unsatisfied)
|
# - *false* is a check that is always false (unsatisfied)
|
||||||
# - *true* is a check that is always true (satisfied)
|
# - *true* is a check that is always true (satisfied)
|
||||||
|
# - *slow-false* takes 3 seconds, and then is false; use this one to
|
||||||
|
# show off the waiting-spinner before the first results come in
|
||||||
|
# - *slow-true* takes 3 seconds, and then is true
|
||||||
# - *snark* is a check that is only satisfied once it has been checked
|
# - *snark* is a check that is only satisfied once it has been checked
|
||||||
# at least three times ("what I tell you three times is true").
|
# at least three times ("what I tell you three times is true").
|
||||||
check:
|
check:
|
||||||
|
@ -21,10 +21,10 @@ properties:
|
|||||||
internetCheckUrl: { type: string }
|
internetCheckUrl: { type: string }
|
||||||
check:
|
check:
|
||||||
type: array
|
type: array
|
||||||
items: { type: string, enum: [storage, ram, power, internet, root, screen], unique: true }
|
items: { type: string, enum: [storage, ram, power, internet, root, screen, "false", "true", "slow-false", "slow-true", snark], unique: true }
|
||||||
required: # Key-name in the config-file
|
required: # Key-name in the config-file
|
||||||
type: array
|
type: array
|
||||||
items: { type: string, enum: [storage, ram, power, internet, root, screen], unique: true }
|
items: { type: string, enum: [storage, ram, power, internet, root, screen, "false", "true", "slow-false", "slow-true", snark], unique: true }
|
||||||
required: [ requiredStorage, requiredRam, check ] # Schema keyword
|
required: [ requiredStorage, requiredRam, check ] # Schema keyword
|
||||||
|
|
||||||
# TODO: refactor, this is reused in locale
|
# TODO: refactor, this is reused in locale
|
||||||
|
Loading…
Reference in New Issue
Block a user