From 0b487cd3a146cf1867f938fd7b7c7c2901536386 Mon Sep 17 00:00:00 2001 From: DavidXanatos Date: Sat, 14 May 2022 15:42:10 +0200 Subject: [PATCH] wizard --- SandboxiePlus/SandMan/Resources/SandMan.qrc | 1 + SandboxiePlus/SandMan/Resources/SideLogo.png | Bin 0 -> 20825 bytes SandboxiePlus/SandMan/SandMan.cpp | 30 +- SandboxiePlus/SandMan/SandMan.h | 1 + SandboxiePlus/SandMan/SandMan.pri | 6 +- SandboxiePlus/SandMan/SandMan.vcxproj | 3 + SandboxiePlus/SandMan/SandMan.vcxproj.filters | 12 + .../SandMan/Windows/SettingsWindow.cpp | 144 ++++---- .../SandMan/Windows/SettingsWindow.h | 3 + SandboxiePlus/SandMan/Wizards/SetupWizard.cpp | 327 ++++++++++++++++++ SandboxiePlus/SandMan/Wizards/SetupWizard.h | 107 ++++++ 11 files changed, 568 insertions(+), 66 deletions(-) create mode 100644 SandboxiePlus/SandMan/Resources/SideLogo.png create mode 100644 SandboxiePlus/SandMan/Wizards/SetupWizard.cpp create mode 100644 SandboxiePlus/SandMan/Wizards/SetupWizard.h diff --git a/SandboxiePlus/SandMan/Resources/SandMan.qrc b/SandboxiePlus/SandMan/Resources/SandMan.qrc index 903d6c2f..cd129313 100644 --- a/SandboxiePlus/SandMan/Resources/SandMan.qrc +++ b/SandboxiePlus/SandMan/Resources/SandMan.qrc @@ -68,6 +68,7 @@ IconOffC.png IconOffCx.png Actions/Monitor.png + SideLogo.png Boxes/sandbox-b-empty.png diff --git a/SandboxiePlus/SandMan/Resources/SideLogo.png b/SandboxiePlus/SandMan/Resources/SideLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..a96ef8ef6e5216c71f51f3cd417f15ce5a4dbd5e GIT binary patch literal 20825 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 literal 0 HcmV?d00001 diff --git a/SandboxiePlus/SandMan/SandMan.cpp b/SandboxiePlus/SandMan/SandMan.cpp index 172c55e8..df0f41ee 100644 --- a/SandboxiePlus/SandMan/SandMan.cpp +++ b/SandboxiePlus/SandMan/SandMan.cpp @@ -21,6 +21,8 @@ #include "Views/TraceView.h" #include "Windows/SelectBoxWindow.h" #include "../UGlobalHotkey/uglobalhotkeys.h" +#include "Wizards/SetupWizard.h" +#include "Helpers/WinAdmin.h" CSbiePlusAPI* theAPI = NULL; @@ -354,6 +356,7 @@ void CSandMan::CreateMenus() m_pStopSvc = m_pMaintenanceItems->addAction(tr("Stop Service"), this, SLOT(OnMaintenance())); m_pUninstallSvc = m_pMaintenanceItems->addAction(tr("Uninstall Service"), this, SLOT(OnMaintenance())); m_pMaintenance->addSeparator(); + m_pSetupWizard = m_pMaintenance->addAction(CSandMan::GetIcon("Software"), tr("Setup Wizard"), this, SLOT(OnMaintenance())); if(IsFullyPortable()) m_pUninstallAll = m_pMaintenance->addAction(CSandMan::GetIcon("Uninstall"), tr("Uninstall All"), this, SLOT(OnMaintenance())); @@ -1172,6 +1175,18 @@ void CSandMan::OnStatusChanged() OnLogMessage(tr("Default sandbox not found; creating: %1").arg("DefaultBox")); theAPI->CreateBox("DefaultBox"); } + + int BusinessUse = theConf->GetInt("Options/BusinessUse", 2); + if (g_CertInfo.business && BusinessUse == 0) // if we have a Business cert switch to that use case + theConf->SetValue("Options/BusinessUse", 1); + + int WizardLevel = theConf->GetBool("Options/WizardLevel", 0); + if (WizardLevel == 0) { + if (CSetupWizard::ShowWizard()) + UpdateSettings(); + else // if user canceled mark that and not show again + theConf->SetValue("Options/WizardLevel", -1); + } } else { @@ -1716,9 +1731,22 @@ void CSandMan::OnMaintenance() Status = CSbieUtils::Uninstall(CSbieUtils::eService); // uninstall - else if (sender() == m_pUninstallAll) + else if (sender() == m_pUninstallAll) { + Status = StopSbie(true); + AutorunEnable(false); + + CSbieUtils::RemoveContextMenu(); + CSbieUtils::RemoveContextMenu2(); + } + + else if (sender() == m_pSetupWizard) { + if (CSetupWizard::ShowWizard()) + UpdateSettings(); + return; + } + HandleMaintenance(Status); } diff --git a/SandboxiePlus/SandMan/SandMan.h b/SandboxiePlus/SandMan/SandMan.h index b3fda0e9..edd9a1c6 100644 --- a/SandboxiePlus/SandMan/SandMan.h +++ b/SandboxiePlus/SandMan/SandMan.h @@ -258,6 +258,7 @@ private: QAction* m_pUninstallSvc; QAction* m_pStopAll; QAction* m_pUninstallAll; + QAction* m_pSetupWizard; QAction* m_pExit; QMenu* m_pMenuView; diff --git a/SandboxiePlus/SandMan/SandMan.pri b/SandboxiePlus/SandMan/SandMan.pri index 45e1d5b2..595a1a52 100644 --- a/SandboxiePlus/SandMan/SandMan.pri +++ b/SandboxiePlus/SandMan/SandMan.pri @@ -23,7 +23,8 @@ HEADERS += ./stdafx.h \ ./Windows/SettingsWindow.h \ ./Windows/OptionsWindow.h \ ./Windows/SelectBoxWindow.h \ - ./Windows/FileBrowserWindow.h + ./Windows/FileBrowserWindow.h\ + ./Wizards/SetupWizard.h SOURCES += ./main.cpp \ ./stdafx.cpp \ @@ -57,7 +58,8 @@ SOURCES += ./main.cpp \ ./Windows/SettingsWindow.cpp \ ./Windows/SnapshotsWindow.cpp \ ./Windows/SelectBoxWindow.cpp \ - ./Windows/FileBrowserWindow.cpp + ./Windows/FileBrowserWindow.cpp\ + ./Wizards/SetupWizard.cpp FORMS += ./Forms/NewBoxWindow.ui \ ./Forms/OptionsWindow.ui \ diff --git a/SandboxiePlus/SandMan/SandMan.vcxproj b/SandboxiePlus/SandMan/SandMan.vcxproj index c8731649..d801dcc4 100644 --- a/SandboxiePlus/SandMan/SandMan.vcxproj +++ b/SandboxiePlus/SandMan/SandMan.vcxproj @@ -233,8 +233,10 @@ + + @@ -250,6 +252,7 @@ + diff --git a/SandboxiePlus/SandMan/SandMan.vcxproj.filters b/SandboxiePlus/SandMan/SandMan.vcxproj.filters index f528c821..d17ae05d 100644 --- a/SandboxiePlus/SandMan/SandMan.vcxproj.filters +++ b/SandboxiePlus/SandMan/SandMan.vcxproj.filters @@ -46,6 +46,9 @@ ts false + + {4bf40c7e-2ce4-4528-813c-3b48b8c56155} + @@ -147,6 +150,9 @@ Models + + Wizards + @@ -161,6 +167,9 @@ Resource Files + + Header Files + @@ -217,6 +226,9 @@ Models + + Wizards + diff --git a/SandboxiePlus/SandMan/Windows/SettingsWindow.cpp b/SandboxiePlus/SandMan/Windows/SettingsWindow.cpp index 81678720..4dbe8e43 100644 --- a/SandboxiePlus/SandMan/Windows/SettingsWindow.cpp +++ b/SandboxiePlus/SandMan/Windows/SettingsWindow.cpp @@ -230,6 +230,13 @@ void CSettingsWindow__AddContextMenu() QApplication::applicationDirPath().replace("/", "\\") + "\\Start.exe"); } +void CSettingsWindow__AddBrowserIcon() +{ + QString Path = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation).replace("/", "\\"); + Path += "\\" + CSettingsWindow::tr("Sandboxed Web Browser") + ".lnk"; + CSbieUtils::CreateShortcut(theAPI, Path, "", "", "default_browser"); +} + void CSettingsWindow::LoadSettings() { ui.uiLang->setCurrentIndex(ui.uiLang->findData(theConf->GetString("Options/UiLanguage"))); @@ -535,80 +542,26 @@ void CSettingsWindow::SaveSettings() { QByteArray Certificate = ui.txtCertificate->toPlainText().toUtf8(); if (g_Certificate != Certificate) { - + QPalette palette = QApplication::palette(); - QString CertPath = theAPI->GetSbiePath() + "\\Certificate.dat"; - if (!Certificate.isEmpty()) { - - auto Args = GetArguments(Certificate, L'\n', L':'); - - bool bLooksOk = true; - if (Args.value("NAME").isEmpty()) // mandatory - bLooksOk = false; - //if (Args.value("UPDATEKEY").isEmpty()) - // bLooksOk = false; - if (Args.value("SIGNATURE").isEmpty()) // absolutely mandatory - bLooksOk = false; - - if (bLooksOk) { - QString TempPath = QDir::tempPath() + "/Sbie+Certificate.dat"; - QFile CertFile(TempPath); - if (CertFile.open(QFile::WriteOnly)) { - CertFile.write(Certificate); - CertFile.close(); - } - - WindowsMoveFile(TempPath.replace("/", "\\"), CertPath.replace("/", "\\")); - } - else { - Certificate.clear(); - QMessageBox::critical(this, "Sandboxie-Plus", tr("This does not look like a certificate, please enter the entire certificate not just a portion of it.")); - } - } - else if(!g_Certificate.isEmpty()){ - WindowsMoveFile(CertPath.replace("/", "\\"), ""); - } - if (theGUI->m_DarkTheme) palette.setColor(QPalette::Text, Qt::black); ui.lblCertExp->setVisible(false); + bool bRet = ApplyCertificate(Certificate, this); + if (Certificate.isEmpty()) - { palette.setColor(QPalette::Base, Qt::white); - } - else if (!theAPI->ReloadCert().IsError()) - { - g_FeatureFlags = theAPI->GetFeatureFlags(); - theGUI->UpdateCertState(); - - if (g_CertInfo.expired || g_CertInfo.outdated) { - if(g_CertInfo.expired) - QMessageBox::information(this, "Sandboxie-Plus", tr("This certificate is unfortunately expired.")); - else - QMessageBox::information(this, "Sandboxie-Plus", tr("This certificate is unfortunately outdated.")); - - palette.setColor(QPalette::Base, QColor(255, 255, 192)); - ui.lblCertExp->setVisible(true); - } - else { - QMessageBox::information(this, "Sandboxie-Plus", tr("Thank you for supporting the development of Sandboxie-Plus.")); - - palette.setColor(QPalette::Base, QColor(192, 255, 192)); - } + else if (!bRet) + palette.setColor(QPalette::Base, QColor(255, 192, 192)); + else if (g_CertInfo.expired || g_CertInfo.outdated) { + palette.setColor(QPalette::Base, QColor(255, 255, 192)); + ui.lblCertExp->setVisible(true); } else - { - QMessageBox::critical(this, "Sandboxie-Plus", tr("This support certificate is not valid.")); - - palette.setColor(QPalette::Base, QColor(255, 192, 192)); - Certificate.clear(); - g_CertInfo.State = 0; - } - - g_Certificate = Certificate; + palette.setColor(QPalette::Base, QColor(192, 255, 192)); ui.txtCertificate->setPalette(palette); } @@ -625,6 +578,71 @@ void CSettingsWindow::SaveSettings() emit OptionsChanged(); } +bool CSettingsWindow::ApplyCertificate(const QByteArray &Certificate, QWidget* widget) +{ + QString CertPath = theAPI->GetSbiePath() + "\\Certificate.dat"; + if (!Certificate.isEmpty()) { + + auto Args = GetArguments(Certificate, L'\n', L':'); + + bool bLooksOk = true; + if (Args.value("NAME").isEmpty()) // mandatory + bLooksOk = false; + //if (Args.value("UPDATEKEY").isEmpty()) + // bLooksOk = false; + if (Args.value("SIGNATURE").isEmpty()) // absolutely mandatory + bLooksOk = false; + + if (bLooksOk) { + QString TempPath = QDir::tempPath() + "/Sbie+Certificate.dat"; + QFile CertFile(TempPath); + if (CertFile.open(QFile::WriteOnly)) { + CertFile.write(Certificate); + CertFile.close(); + } + + WindowsMoveFile(TempPath.replace("/", "\\"), CertPath.replace("/", "\\")); + } + else { + QMessageBox::critical(widget, "Sandboxie-Plus", tr("This does not look like a certificate, please enter the entire certificate not just a portion of it.")); + return false; + } + } + else if(!g_Certificate.isEmpty()){ + WindowsMoveFile(CertPath.replace("/", "\\"), ""); + } + + if (Certificate.isEmpty()) + return false; + + if (!theAPI->ReloadCert().IsError()) + { + g_FeatureFlags = theAPI->GetFeatureFlags(); + theGUI->UpdateCertState(); + + if (g_CertInfo.expired || g_CertInfo.outdated) { + if(g_CertInfo.expired) + QMessageBox::information(widget, "Sandboxie-Plus", tr("This certificate is unfortunately expired.")); + else + QMessageBox::information(widget, "Sandboxie-Plus", tr("This certificate is unfortunately outdated.")); + } + else { + QMessageBox::information(widget, "Sandboxie-Plus", tr("Thank you for supporting the development of Sandboxie-Plus.")); + } + + g_Certificate = Certificate; + return true; + } + else + { + QMessageBox::critical(widget, "Sandboxie-Plus", tr("This support certificate is not valid.")); + + g_CertInfo.State = 0; + g_Certificate.clear(); + return false; + } +} + void CSettingsWindow::apply() { if (!ui.btnEditIni->isEnabled()) diff --git a/SandboxiePlus/SandMan/Windows/SettingsWindow.h b/SandboxiePlus/SandMan/Windows/SettingsWindow.h index 7377fab3..db22691f 100644 --- a/SandboxiePlus/SandMan/Windows/SettingsWindow.h +++ b/SandboxiePlus/SandMan/Windows/SettingsWindow.h @@ -24,6 +24,8 @@ public: virtual void accept() {} virtual void reject(); + static bool ApplyCertificate(const QByteArray &Certificate, QWidget* widget); + static void LoadCertificate(); signals: @@ -88,6 +90,7 @@ private: }; void CSettingsWindow__AddContextMenu(); +void CSettingsWindow__AddBrowserIcon(); void WindowsMoveFile(const QString& from, const QString& to); diff --git a/SandboxiePlus/SandMan/Wizards/SetupWizard.cpp b/SandboxiePlus/SandMan/Wizards/SetupWizard.cpp new file mode 100644 index 00000000..dbacd4b6 --- /dev/null +++ b/SandboxiePlus/SandMan/Wizards/SetupWizard.cpp @@ -0,0 +1,327 @@ +#include "stdafx.h" + +#include "SetupWizard.h" +#include "../MiscHelpers/Common/Common.h" +#include "../Windows/SettingsWindow.h" +#include "../SandMan.h" +#include "Helpers/WinAdmin.h" + +QString emailRegExp = QStringLiteral(".+@.+"); + +CSetupWizard::CSetupWizard(QWidget *parent) + : QWizard(parent) +{ + setPage(Page_Intro, new CIntroPage); + setPage(Page_Certificate, new CCertificatePage); + setPage(Page_Shell, new CShellPage); + setPage(Page_Finish, new CFinishPage); + + setWizardStyle(ModernStyle); + //setOption(HaveHelpButton, true); + setPixmap(QWizard::LogoPixmap, QPixmap(":/SandMan.png").scaled(64, 64, Qt::KeepAspectRatio, Qt::SmoothTransformation)); + + connect(this, &QWizard::helpRequested, this, &CSetupWizard::showHelp); + + setWindowTitle(tr("Setup Wizard")); +} + +void CSetupWizard::showHelp() +{ + static QString lastHelpMessage; + + QString message; + + switch (currentId()) { + case Page_Intro: + message = tr("The decision you make here will affect which page you get to see next."); + break; + default: + message = tr("This help is likely not to be of any help."); + } + + if (lastHelpMessage == message) + message = tr("Sorry, I already gave what help I could."); + + QMessageBox::information(this, tr("Setup Wizard Help"), message); + + lastHelpMessage = message; +} + +bool CSetupWizard::ShowWizard() +{ + CSetupWizard wizard; + if (!wizard.exec()) + return false; + + //bool useBusiness = wizard.field("useBusiness").toBool(); + //QString Certificate = wizard.field("useCertificate").toString(); + //bool isEvaluate = wizard.field("isEvaluate").toBool(); + + AutorunEnable(wizard.field("isAutoStart").toBool()); + + if (wizard.field("useContecxtMenu").toBool()) + CSettingsWindow__AddContextMenu(); + + if (wizard.field("useBrowserIcon").toBool()) + CSettingsWindow__AddBrowserIcon(); + + if (wizard.field("isUpdate").toBool()) { + theConf->SetValue("Options/CheckForUpdates", 1); + theConf->SetValue("Options/DownloadUpdates", 1); + theConf->SetValue("Options/InstallUpdates", 1); + } + + theConf->SetValue("Options/WizardLevel", 1); + + return true; +} + +////////////////////////////////////////////////////////////////////////////////////////// +// CIntroPage +// + +CIntroPage::CIntroPage(QWidget *parent) + : QWizardPage(parent) +{ + setTitle(tr("Introduction")); + setPixmap(QWizard::WatermarkPixmap, QPixmap(":/SideLogo.png")); + + QVBoxLayout *layout = new QVBoxLayout; + QLabel* pTopLabel = new QLabel(tr("Welcome to the Setup Wizard. This wizard will help you to configure your copy of Sandboxie-Plus. " + "You can start this wizard at any time from the Box->Maintenance if you do not wish to complete it now.")); + pTopLabel->setWordWrap(true); + layout->addWidget(pTopLabel); + + QWidget* pSpace = new QWidget(); + pSpace->setMinimumHeight(16); + layout->addWidget(pSpace); + + int BusinessUse = theConf->GetInt("Options/BusinessUse", 2); + + m_pLabel = new QLabel(tr("Select how you would like to use Sandboxie-Plus")); + layout->addWidget(m_pLabel); + + m_pPersonalRadio = new QRadioButton(tr("&Personally for private non comertial use")); + layout->addWidget(m_pPersonalRadio); + connect(m_pPersonalRadio, SIGNAL(toggled(bool)), this, SIGNAL(completeChanged())); + registerField("usePersonal", m_pPersonalRadio); + + m_pBusinessRadio = new QRadioButton(tr("&Commercially for business or enterprise use")); + layout->addWidget(m_pBusinessRadio); + connect(m_pBusinessRadio, SIGNAL(toggled(bool)), this, SIGNAL(completeChanged())); + registerField("useBusiness", m_pBusinessRadio); + + if (BusinessUse != 2) { + m_pLabel->setEnabled(false); + m_pPersonalRadio->setChecked(BusinessUse == 0); + m_pPersonalRadio->setEnabled(false); + m_pBusinessRadio->setChecked(BusinessUse == 1); + m_pBusinessRadio->setEnabled(false); + } + + setLayout(layout); +} + +int CIntroPage::nextId() const +{ + if(g_Certificate.isEmpty()) + return CSetupWizard::Page_Certificate; + return CSetupWizard::Page_Shell; +} + +bool CIntroPage::isComplete() const +{ + if (m_pLabel->isEnabled() && !m_pPersonalRadio->isChecked() && !m_pBusinessRadio->isChecked()) + return false; + return QWizardPage::isComplete(); +} + +////////////////////////////////////////////////////////////////////////////////////////// +// CCertificatePage +// + +CCertificatePage::CCertificatePage(QWidget *parent) + : QWizardPage(parent) +{ + setTitle(tr("Install your Sandboxie-Plus support certificate")); + setSubTitle(tr("If you have a supporter certificate, please fill it into the field below.")); + + QGridLayout *layout = new QGridLayout; + + m_pTopLabel = new QLabel(); + m_pTopLabel->setWordWrap(true); + layout->addWidget(m_pTopLabel); + + m_pCertificate = new QPlainTextEdit(); + m_pCertificate->setMaximumSize(QSize(16777215, 73)); + m_pCertificate->setPlaceholderText( + "NAME: User Name\n" + "LEVEL: ULTIMATE\n" + "DATE: dd.mm.yyyy\n" + "UPDATEKEY: 00000000000000000000000000000000\n" + "SIGNATURE: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" + ); + //layout->addWidget(m_pCertificate); // we dont show this page when there already is a certificat present + connect(m_pCertificate, SIGNAL(textChanged()), this, SIGNAL(completeChanged())); + registerField("useCertificate", m_pCertificate, "plainText"); + + m_pEvaluate = new QCheckBox(tr("Start evaluation without a certificate for a limited periode of time.")); + layout->addWidget(m_pEvaluate); + connect(m_pEvaluate, SIGNAL(toggled(bool)), this, SIGNAL(completeChanged())); + registerField("isEvaluate", m_pEvaluate); + + layout->addWidget(new QWidget()); + + setLayout(layout); +} + +void CCertificatePage::initializePage() +{ + m_pCertificate->setPlainText(g_Certificate); + + if (field("useBusiness").toBool()) + { + theConf->SetValue("Options/BusinessUse", 1); + + m_pTopLabel->setText( + tr("To use Sandboxie-Plus in a business setting an apropriate business use support certificate is required. " + "If you do not yet have the required certificate(s) you can get those from the xanasoft.com web shop.") + ); + + m_pEvaluate->setVisible(true); + } + else + { + theConf->SetValue("Options/BusinessUse", 0); + + m_pTopLabel->setText( + tr("Sandboxie-Plus provides additional features and box types exclusively to project supporters. " + "Boxes like the Privacy Enhanced boxes protect user data from illicit access by the sandboxed programs. " + "If you are not yet a supporter then please consider supporting the project " + "to to ensure furtehr developement of sandboxie and to receive a supporter certificate.") + ); + + m_pEvaluate->setVisible(false); + } +} + +int CCertificatePage::nextId() const +{ + return CSetupWizard::Page_Shell; +} + +bool CCertificatePage::isComplete() const +{ + if (field("useBusiness").toBool()) + { + m_pCertificate->setEnabled(!m_pEvaluate->isChecked()); + if (m_pCertificate->toPlainText().isEmpty() && !m_pEvaluate->isChecked()) + return false; + } + return QWizardPage::isComplete(); +} + +bool CCertificatePage::validatePage() +{ + QByteArray Certificate = m_pCertificate->toPlainText().toLatin1(); + if (!m_pEvaluate->isChecked() && !Certificate.isEmpty() && g_Certificate != Certificate) { + return CSettingsWindow::ApplyCertificate(Certificate, this); + } + return true; +} + +////////////////////////////////////////////////////////////////////////////////////////// +// CShellPage +// + +CShellPage::CShellPage(QWidget *parent) + : QWizardPage(parent) +{ + setTitle(tr("Configure Sandboxie-Plus shell integration")); + setSubTitle(tr("Configure how Sandboxie-Plus should integrate with your system.")); + + QVBoxLayout *layout = new QVBoxLayout; + + m_pAutoStart = new QCheckBox(tr("Start UI with Windows")); + m_pAutoStart->setChecked(true); + layout->addWidget(m_pAutoStart); + registerField("isAutoStart", m_pAutoStart); + + m_pContecxtMenu = new QCheckBox(tr("Add 'Run Sandboxed' to the explorer context menu")); + m_pContecxtMenu->setChecked(true); + layout->addWidget(m_pContecxtMenu); + registerField("useContecxtMenu", m_pContecxtMenu); + + m_pBrowserIcon = new QCheckBox(tr("Add desktop shortcut for starting Web browser under Sandboxie")); + m_pBrowserIcon->setChecked(true); + layout->addWidget(m_pBrowserIcon); + registerField("useBrowserIcon", m_pBrowserIcon); + + setLayout(layout); +} + +int CShellPage::nextId() const +{ + return CSetupWizard::Page_Finish; +} + +////////////////////////////////////////////////////////////////////////////////////////// +// CFinishPage +// + +CFinishPage::CFinishPage(QWidget *parent) + : QWizardPage(parent) +{ + setTitle(tr("Complete Your Configuration")); + setPixmap(QWizard::WatermarkPixmap, QPixmap(":/SideLogo.png")); + + QVBoxLayout *layout = new QVBoxLayout; + + m_pLabel = new QLabel; + m_pLabel->setWordWrap(true); + m_pLabel->setText(tr("Almost complete, click Finish to apply all selected options and finisch the wizard.")); + layout->addWidget(m_pLabel); + + QWidget* pSpacer = new QWidget(); + pSpacer->setMinimumHeight(16); + layout->addWidget(pSpacer); + + //QLabel* pLabel = new QLabel; + //pLabel->setWordWrap(true); + //pLabel->setText(tr("Like with any other security product it's important to keep your Sandboxie-Plus up to date.")); + //layout->addWidget(pLabel); + + m_pUpdate = new QCheckBox(tr("Keep Sandboxie-Plus up to date.")); + m_pUpdate->setChecked(true); + layout->addWidget(m_pUpdate); + registerField("isUpdate", m_pUpdate); + + setLayout(layout); +} + +int CFinishPage::nextId() const +{ + return -1; +} + +void CFinishPage::initializePage() +{ + +} + + +//void ConclusionPage::setVisible(bool visible) +//{ +// QWizardPage::setVisible(visible); +// +// if (visible) { +// wizard()->setButtonText(QWizard::CustomButton1, tr("&Print")); +// wizard()->setOption(QWizard::HaveCustomButton1, true); +// connect(wizard(), &QWizard::customButtonClicked, +// this, &ConclusionPage::printButtonClicked); +// } else { +// wizard()->setOption(QWizard::HaveCustomButton1, false); +// disconnect(wizard(), &QWizard::customButtonClicked, +// this, &ConclusionPage::printButtonClicked); +// } +//} diff --git a/SandboxiePlus/SandMan/Wizards/SetupWizard.h b/SandboxiePlus/SandMan/Wizards/SetupWizard.h new file mode 100644 index 00000000..474dc542 --- /dev/null +++ b/SandboxiePlus/SandMan/Wizards/SetupWizard.h @@ -0,0 +1,107 @@ +#pragma once + +#include + +QT_BEGIN_NAMESPACE +class QCheckBox; +class QLabel; +class QLineEdit; +class QRadioButton; +QT_END_NAMESPACE + +class CSetupWizard : public QWizard +{ + Q_OBJECT + +public: + enum { Page_Intro, Page_Certificate, Page_Shell, Page_Finish }; + + CSetupWizard(QWidget *parent = nullptr); + + static bool ShowWizard(); + +private slots: + void showHelp(); +}; + +////////////////////////////////////////////////////////////////////////////////////////// +// CIntroPage +// + +class CIntroPage : public QWizardPage +{ + Q_OBJECT + +public: + CIntroPage(QWidget *parent = nullptr); + + int nextId() const override; + bool isComplete() const override; + +private: + QLabel* m_pLabel; + QRadioButton *m_pPersonalRadio; + QRadioButton *m_pBusinessRadio; +}; + +////////////////////////////////////////////////////////////////////////////////////////// +// CCertificatePage +// + +class CCertificatePage : public QWizardPage +{ + Q_OBJECT + +public: + CCertificatePage(QWidget *parent = nullptr); + + void initializePage() override; + int nextId() const override; + bool isComplete() const override; + bool validatePage() override; + +private: + QLabel* m_pTopLabel; + QPlainTextEdit* m_pCertificate; + QCheckBox* m_pEvaluate; +}; + +////////////////////////////////////////////////////////////////////////////////////////// +// CShellPage +// + +class CShellPage : public QWizardPage +{ + Q_OBJECT + +public: + CShellPage(QWidget *parent = nullptr); + + int nextId() const override; + +private: + QCheckBox *m_pAutoStart; + QCheckBox *m_pContecxtMenu; + QCheckBox *m_pBrowserIcon; +}; + +////////////////////////////////////////////////////////////////////////////////////////// +// CFinishPage +// + +class CFinishPage : public QWizardPage +{ + Q_OBJECT + +public: + CFinishPage(QWidget *parent = nullptr); + + void initializePage() override; + int nextId() const override; + //void setVisible(bool visible) override; + +private: + QLabel *m_pLabel; + QCheckBox *m_pUpdate; +}; +