--- a/src/calamares/CalamaresWindow.cpp +++ b/src/calamares/CalamaresWindow.cpp @@ -24,6 +24,7 @@ #include "utils/Logger.h" #include "utils/Qml.h" #include "utils/Retranslator.h" +#include "viewpages/ExecutionViewStep.h" #include "viewpages/ViewStep.h" #include @@ -34,7 +35,10 @@ #endif #include #include +#include #include +#include +#include #ifdef WITH_QML #include #include @@ -207,6 +211,38 @@ return sideBox; } +/** @brief RaveOS: localized confirm dialog for the global restart button. */ +static bool +raveosConfirmRestart( QWidget* parent ) +{ + QDialog dialog( parent ); + dialog.setObjectName( QStringLiteral( "raveosDialog" ) ); + dialog.setWindowTitle( QStringLiteral( "RaveOS" ) ); + dialog.setMinimumWidth( 420 ); + + auto* layout = new QVBoxLayout( &dialog ); + auto* label = new QLabel( QCoreApplication::translate( "raveos", "Restart the computer?" ), &dialog ); + label->setObjectName( QStringLiteral( "raveosDialogLabel" ) ); + label->setWordWrap( true ); + layout->addWidget( label ); + layout->addSpacing( 10 ); + + auto* buttons = new QHBoxLayout; + buttons->addStretch(); + auto* cancel = new QPushButton( QCoreApplication::translate( "raveos", "Cancel" ), &dialog ); + cancel->setObjectName( QStringLiteral( "raveosDialogCancel" ) ); + auto* ok = new QPushButton( QCoreApplication::translate( "raveos", "Restart" ), &dialog ); + ok->setObjectName( QStringLiteral( "raveosDialogOk" ) ); + buttons->addWidget( cancel ); + buttons->addWidget( ok ); + layout->addLayout( buttons ); + + QObject::connect( cancel, &QPushButton::clicked, &dialog, &QDialog::reject ); + QObject::connect( ok, &QPushButton::clicked, &dialog, &QDialog::accept ); + + return dialog.exec() == QDialog::Accepted; +} + static QWidget* getWidgetNavigation( Calamares::DebugWindowManager*, Calamares::ViewManager* viewManager, @@ -216,6 +252,45 @@ { QWidget* navigation = new QWidget( parent ); QBoxLayout* bottomLayout = new QHBoxLayout; + + // RaveOS: globalis ujrainditas gomb a bal also sarokban. + // Telepites kozben (exec) es a finish oldalon NEM latszik. + { + auto* restart = new QPushButton( navigation ); + restart->setObjectName( "restartButton" ); + restart->setIcon( getButtonIcon( QStringLiteral( "view-refresh" ) ) ); + CALAMARES_RETRANSLATE_FOR( + restart, + restart->setText( QCoreApplication::translate( CalamaresWindow::staticMetaObject.className(), + "&Restart", + "@button" ) ); + restart->setToolTip( QCoreApplication::translate( CalamaresWindow::staticMetaObject.className(), + "Restart the computer", + "@tooltip" ) ); ); + QObject::connect( restart, + &QPushButton::clicked, + restart, + [restart]() + { + if ( raveosConfirmRestart( restart ) ) + { + QProcess::startDetached( QStringLiteral( "systemctl" ), + { QStringLiteral( "-i" ), QStringLiteral( "reboot" ) } ); + } + } ); + bottomLayout->addWidget( restart ); + + auto updateVisibility = [restart, viewManager]() + { + auto* step = viewManager->currentStep(); + const bool inExec = qobject_cast< Calamares::ExecutionViewStep* >( step ) != nullptr; + const bool onFinish = step && step->isAtEnd() && !step->isNextEnabled(); + restart->setVisible( !inExec && !onFinish ); + }; + QObject::connect( viewManager, &Calamares::ViewManager::currentStepChanged, restart, updateVisibility ); + updateVisibility(); + } + bottomLayout->addStretch(); // Create buttons and sets an initial icon; the icons may change @@ -272,7 +347,7 @@ bottomLayout->addWidget( quit ); } - bottomLayout->setContentsMargins( 0, 0, 6, 6 ); + bottomLayout->setContentsMargins( 6, 0, 6, 6 ); navigation->setLayout( bottomLayout ); return navigation; }