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 00000000..a96ef8ef Binary files /dev/null and b/SandboxiePlus/SandMan/Resources/SideLogo.png differ 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; +}; +