2021-10-16 16:19:51 +01:00
# include "stdafx.h"
# include "SettingsWindow.h"
# include "SandMan.h"
# include "../MiscHelpers/Common/Settings.h"
# include "../MiscHelpers/Common/Common.h"
2022-11-20 16:23:15 +00:00
# include "../MiscHelpers/Common/OtherFunctions.h"
2021-10-16 16:19:51 +01:00
# include "Helpers/WinAdmin.h"
# include "../QSbieAPI/Sandboxie/SbieTemplates.h"
# include "../QSbieAPI/SbieUtils.h"
2022-05-29 07:07:17 +01:00
# include "OptionsWindow.h"
2022-08-11 23:09:35 +01:00
# include "../OnlineUpdater.h"
2022-11-20 16:23:15 +00:00
# include "../MiscHelpers/Archive/ArchiveFS.h"
# include <QJsonDocument>
2023-10-19 17:34:09 +01:00
# include "../Helpers/StorageInfo.h"
2023-04-13 18:46:51 +01:00
# include "../Wizards/TemplateWizard.h"
2023-07-01 17:54:53 +01:00
# include "../AddonManager.h"
2023-06-09 09:47:09 +01:00
# include <qfontdialog.h>
2023-07-19 20:15:18 +01:00
# include <QJsonDocument>
# include <QJsonObject>
2021-10-16 16:19:51 +01:00
2022-09-29 17:28:48 +01:00
# include <windows.h>
# include <shellapi.h>
2021-10-16 16:19:51 +01:00
2022-08-10 19:14:37 +01:00
void FixTriStateBoxPallete ( QWidget * pWidget )
{
if ( QApplication : : style ( ) - > objectName ( ) = = " windows " ) {
//
2022-12-07 16:32:40 +00:00
// the built in "windows" theme of Qt does not properly rendered PartiallyChecked
2022-08-10 19:14:37 +01:00
// checkboxes, to remedi this issue we connect to the stateChanged slot
// and change the pattern to improve the rendering.
//
foreach ( QCheckBox * pCheck , pWidget - > findChildren < QCheckBox * > ( ) ) {
QObject : : connect ( pCheck , & QCheckBox : : stateChanged , [ pCheck ] ( int state ) {
if ( pCheck - > isTristate ( ) ) {
QPalette palette = QApplication : : palette ( ) ;
if ( state = = Qt : : PartiallyChecked )
palette . setColor ( QPalette : : Base , Qt : : darkGray ) ;
pCheck - > setPalette ( palette ) ;
}
} ) ;
}
}
}
2022-09-29 17:28:48 +01:00
void AddIconToLabel ( QLabel * pLabel , const QPixmap & Pixmap )
{
2024-03-23 11:14:25 +00:00
if ( pLabel - > property ( " hidden " ) . toBool ( ) ) return ;
2022-09-29 17:28:48 +01:00
QWidget * pParent = pLabel - > parentWidget ( ) ;
QWidget * pWidget = new QWidget ( pParent ) ;
pParent - > layout ( ) - > replaceWidget ( pLabel , pWidget ) ;
QHBoxLayout * pLayout = new QHBoxLayout ( pWidget ) ;
pLayout - > setContentsMargins ( 0 , 0 , 0 , 0 ) ;
pLayout - > setAlignment ( Qt : : AlignLeft | Qt : : AlignVCenter ) ;
pLayout - > setSpacing ( 1 ) ;
QLabel * pIcon = new QLabel ( ) ;
pIcon = new QLabel ( ) ;
pIcon - > setPixmap ( Pixmap ) ;
pLayout - > addWidget ( pIcon ) ;
pLayout - > addWidget ( pLabel ) ;
}
2021-10-16 16:19:51 +01:00
int CSettingsWindow__Chk2Int ( Qt : : CheckState state )
{
switch ( state ) {
case Qt : : Unchecked : return 0 ;
case Qt : : Checked : return 1 ;
default :
case Qt : : PartiallyChecked : return 2 ;
}
}
Qt : : CheckState CSettingsWindow__Int2Chk ( int state )
{
switch ( state ) {
case 0 : return Qt : : Unchecked ;
case 1 : return Qt : : Checked ;
default :
case 2 : return Qt : : PartiallyChecked ;
}
}
quint32 g_FeatureFlags = 0 ;
2022-01-13 22:52:58 +00:00
QByteArray g_Certificate ;
SCertInfo g_CertInfo = { 0 } ;
2023-08-24 17:39:00 +01:00
void COptionsWindow__AddCertIcon ( QWidget * pOriginalWidget , bool bAdvanced = false ) ;
2023-07-01 17:54:53 +01:00
2022-08-15 12:18:26 +01:00
CSettingsWindow : : CSettingsWindow ( QWidget * parent )
: CConfigDialog ( parent )
2021-10-16 16:19:51 +01:00
{
Qt : : WindowFlags flags = windowFlags ( ) ;
flags | = Qt : : CustomizeWindowHint ;
//flags &= ~Qt::WindowContextHelpButtonHint;
//flags &= ~Qt::WindowSystemMenuHint;
//flags &= ~Qt::WindowMinMaxButtonsHint;
flags | = Qt : : WindowMinimizeButtonHint ;
//flags &= ~Qt::WindowCloseButtonHint;
setWindowFlags ( flags ) ;
2023-10-21 21:15:07 +01:00
this - > setWindowFlag ( Qt : : WindowStaysOnTopHint , theGUI - > IsAlwaysOnTop ( ) ) ;
2021-10-16 16:19:51 +01:00
2022-07-29 09:24:32 +01:00
ui . setupUi ( this ) ;
2022-07-30 09:18:55 +01:00
this - > setWindowTitle ( tr ( " Sandboxie Plus - Global Settings " ) ) ;
2022-07-29 09:24:32 +01:00
if ( theConf - > GetBool ( " Options/AltRowColors " , false ) ) {
2023-04-13 18:46:51 +01:00
foreach ( QTreeWidget * pTree , this - > findChildren < QTreeWidget * > ( ) )
pTree - > setAlternatingRowColors ( true ) ;
2022-07-29 09:24:32 +01:00
}
2021-10-16 16:19:51 +01:00
2022-08-10 19:14:37 +01:00
FixTriStateBoxPallete ( this ) ;
2021-10-16 16:19:51 +01:00
ui . tabs - > setTabPosition ( QTabWidget : : West ) ;
2023-04-13 18:46:51 +01:00
ui . tabs - > setCurrentIndex ( 0 ) ;
2022-09-29 17:28:48 +01:00
ui . tabs - > setTabIcon ( 0 , CSandMan : : GetIcon ( " Config " ) ) ;
ui . tabs - > setTabIcon ( 1 , CSandMan : : GetIcon ( " Shell " ) ) ;
2022-11-29 17:26:51 +00:00
ui . tabs - > setTabIcon ( 2 , CSandMan : : GetIcon ( " Design " ) ) ;
2023-07-01 17:54:53 +01:00
ui . tabs - > setTabIcon ( 3 , CSandMan : : GetIcon ( " Plugins " ) ) ;
ui . tabs - > setTabIcon ( 4 , CSandMan : : GetIcon ( " Support " ) ) ;
ui . tabs - > setTabIcon ( 5 , CSandMan : : GetIcon ( " Advanced " ) ) ;
ui . tabs - > setTabIcon ( 6 , CSandMan : : GetIcon ( " Control " ) ) ;
ui . tabs - > setTabIcon ( 7 , CSandMan : : GetIcon ( " Compatibility " ) ) ;
ui . tabs - > setTabIcon ( 8 , CSandMan : : GetIcon ( " Editor " ) ) ;
2022-09-29 17:28:48 +01:00
2023-04-13 18:46:51 +01:00
ui . tabsGeneral - > setCurrentIndex ( 0 ) ;
ui . tabsGeneral - > setTabIcon ( 0 , CSandMan : : GetIcon ( " Presets " ) ) ;
ui . tabsGeneral - > setTabIcon ( 1 , CSandMan : : GetIcon ( " Notification " ) ) ;
ui . tabsShell - > setCurrentIndex ( 0 ) ;
ui . tabsShell - > setTabIcon ( 0 , CSandMan : : GetIcon ( " Windows " ) ) ;
2023-09-02 09:50:25 +01:00
ui . tabsShell - > setTabIcon ( 1 , CSandMan : : GetIcon ( " TaskBar " ) ) ;
ui . tabsShell - > setTabIcon ( 2 , CSandMan : : GetIcon ( " Run " ) ) ;
2023-04-13 18:46:51 +01:00
ui . tabsGUI - > setCurrentIndex ( 0 ) ;
ui . tabsGUI - > setTabIcon ( 0 , CSandMan : : GetIcon ( " Interface " ) ) ;
ui . tabsGUI - > setTabIcon ( 1 , CSandMan : : GetIcon ( " Monitor " ) ) ;
2022-11-29 17:26:51 +00:00
2023-07-01 17:54:53 +01:00
ui . tabsAddons - > setCurrentIndex ( 0 ) ;
ui . tabsAddons - > setTabIcon ( 0 , CSandMan : : GetIcon ( " Plugin " ) ) ;
2023-08-24 17:39:00 +01:00
ui . tabsAddons - > setTabIcon ( 1 , CSandMan : : GetIcon ( " Qube " ) ) ;
2023-07-01 17:54:53 +01:00
ui . tabsSupport - > setCurrentIndex ( 0 ) ;
ui . tabsSupport - > setTabIcon ( 0 , CSandMan : : GetIcon ( " Cert " ) ) ;
ui . tabsSupport - > setTabIcon ( 1 , CSandMan : : GetIcon ( " ReloadIni " ) ) ;
2023-04-13 18:46:51 +01:00
ui . tabsAdvanced - > setCurrentIndex ( 0 ) ;
2022-11-29 17:26:51 +00:00
ui . tabsAdvanced - > setTabIcon ( 0 , CSandMan : : GetIcon ( " Options " ) ) ;
2022-12-15 13:45:37 +00:00
ui . tabsAdvanced - > setTabIcon ( 1 , CSandMan : : GetIcon ( " EditIni " ) ) ;
2022-11-29 17:26:51 +00:00
2023-04-13 18:46:51 +01:00
ui . tabsControl - > setCurrentIndex ( 0 ) ;
ui . tabsControl - > setTabIcon ( 0 , CSandMan : : GetIcon ( " Alarm " ) ) ;
2023-10-19 17:34:09 +01:00
ui . tabsControl - > setTabIcon ( 1 , CSandMan : : GetIcon ( " USB " ) ) ;
2023-04-13 18:46:51 +01:00
ui . tabsTemplates - > setCurrentIndex ( 0 ) ;
ui . tabsTemplates - > setTabIcon ( 0 , CSandMan : : GetIcon ( " Program " ) ) ;
ui . tabsTemplates - > setTabIcon ( 1 , CSandMan : : GetIcon ( " Template " ) ) ;
2022-09-29 17:28:48 +01:00
int size = 16.0 ;
# if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
size * = ( QApplication : : desktop ( ) - > logicalDpiX ( ) / 96.0 ) ; // todo Qt6
# endif
AddIconToLabel ( ui . lblGeneral , CSandMan : : GetIcon ( " Options " ) . pixmap ( size , size ) ) ;
AddIconToLabel ( ui . lblRecovery , CSandMan : : GetIcon ( " Recover " ) . pixmap ( size , size ) ) ;
2023-04-13 18:46:51 +01:00
AddIconToLabel ( ui . lblNotify , CSandMan : : GetIcon ( " Notification " ) . pixmap ( size , size ) ) ;
AddIconToLabel ( ui . lblMessages , CSandMan : : GetIcon ( " Email " ) . pixmap ( size , size ) ) ;
//AddIconToLabel(ui.lblMessages, CSandMan::GetIcon("Filter").pixmap(size,size));
2022-09-29 17:28:48 +01:00
AddIconToLabel ( ui . lblStartUp , CSandMan : : GetIcon ( " Start " ) . pixmap ( size , size ) ) ;
AddIconToLabel ( ui . lblRunBoxed , CSandMan : : GetIcon ( " Run " ) . pixmap ( size , size ) ) ;
AddIconToLabel ( ui . lblStartMenu , CSandMan : : GetIcon ( " StartMenu " ) . pixmap ( size , size ) ) ;
AddIconToLabel ( ui . lblSysTray , CSandMan : : GetIcon ( " Maintenance " ) . pixmap ( size , size ) ) ;
AddIconToLabel ( ui . lblInterface , CSandMan : : GetIcon ( " GUI " ) . pixmap ( size , size ) ) ;
2023-04-13 18:46:51 +01:00
AddIconToLabel ( ui . lblDisplay , CSandMan : : GetIcon ( " Advanced " ) . pixmap ( size , size ) ) ;
2023-07-20 18:46:18 +01:00
AddIconToLabel ( ui . lblIni , CSandMan : : GetIcon ( " EditIni " ) . pixmap ( size , size ) ) ;
2023-04-13 18:46:51 +01:00
2023-08-24 17:39:00 +01:00
AddIconToLabel ( ui . lblDiskImage , CSandMan : : GetIcon ( " Disk " ) . pixmap ( size , size ) ) ;
2022-09-29 17:28:48 +01:00
AddIconToLabel ( ui . lblBoxRoot , CSandMan : : GetIcon ( " Sandbox " ) . pixmap ( size , size ) ) ;
AddIconToLabel ( ui . lblBoxFeatures , CSandMan : : GetIcon ( " Miscellaneous " ) . pixmap ( size , size ) ) ;
2021-10-16 16:19:51 +01:00
2022-09-29 17:28:48 +01:00
AddIconToLabel ( ui . lblProtection , CSandMan : : GetIcon ( " Lock " ) . pixmap ( size , size ) ) ;
AddIconToLabel ( ui . lblUpdates , CSandMan : : GetIcon ( " Update " ) . pixmap ( size , size ) ) ;
int iViewMode = theConf - > GetInt ( " Options/ViewMode " , 1 ) ;
/*if (iViewMode == 0)
{
if ( iOptionLayout = = 1 )
ui . tabs - > removeTab ( 6 ) ; // ini edit
else
ui . tabs - > removeTab ( 7 ) ; // ini edit
} */
2021-10-16 16:19:51 +01:00
ui . tabs - > setCurrentIndex ( 0 ) ;
{
2022-11-20 16:23:15 +00:00
ui . uiLang - > addItem ( tr ( " Auto Detection " ) , " " ) ;
ui . uiLang - > addItem ( tr ( " No Translation " ) , " native " ) ;
QString langDir ;
2023-07-01 17:54:53 +01:00
C7zFileEngineHandler LangFS ( " lang " , this ) ;
if ( LangFS . Open ( QApplication : : applicationDirPath ( ) + " /translations.7z " ) )
2022-11-20 16:23:15 +00:00
langDir = LangFS . Prefix ( ) + " / " ;
else
langDir = QApplication : : applicationDirPath ( ) + " /translations/ " ;
foreach ( const QString & langFile , QDir ( langDir ) . entryList ( QStringList ( " sandman_*.qm " ) , QDir : : Files ) )
{
QString Code = langFile . mid ( 8 , langFile . length ( ) - 8 - 3 ) ;
QLocale Locale ( Code ) ;
QString Lang = Locale . nativeLanguageName ( ) ;
ui . uiLang - > addItem ( Lang , Code ) ;
}
ui . uiLang - > setCurrentIndex ( ui . uiLang - > findData ( theConf - > GetString ( " Options/UiLanguage " ) ) ) ;
2021-10-16 16:19:51 +01:00
}
2022-09-29 17:28:48 +01:00
ui . cmbIntegrateMenu - > addItem ( tr ( " Don't integrate links " ) ) ;
ui . cmbIntegrateMenu - > addItem ( tr ( " As sub group " ) ) ;
ui . cmbIntegrateMenu - > addItem ( tr ( " Fully integrate " ) ) ;
2023-09-02 11:42:08 +01:00
ui . cmbIntegrateDesk - > addItem ( tr ( " Don't integrate links " ) ) ;
ui . cmbIntegrateDesk - > addItem ( tr ( " As sub group " ) ) ;
ui . cmbIntegrateDesk - > addItem ( tr ( " Fully integrate " ) ) ;
2021-10-16 16:19:51 +01:00
ui . cmbSysTray - > addItem ( tr ( " Don't show any icon " ) ) ;
ui . cmbSysTray - > addItem ( tr ( " Show Plus icon " ) ) ;
ui . cmbSysTray - > addItem ( tr ( " Show Classic icon " ) ) ;
2022-02-05 14:09:53 +00:00
ui . cmbTrayBoxes - > addItem ( tr ( " All Boxes " ) ) ;
ui . cmbTrayBoxes - > addItem ( tr ( " Active + Pinned " ) ) ;
ui . cmbTrayBoxes - > addItem ( tr ( " Pinned Only " ) ) ;
2023-09-02 09:50:25 +01:00
ui . cmbOnClose - > addItem ( tr ( " Close to Tray " ) , " ToTray " ) ;
ui . cmbOnClose - > addItem ( tr ( " Prompt before Close " ) , " Prompt " ) ;
ui . cmbOnClose - > addItem ( tr ( " Close " ) , " Close " ) ;
2022-07-09 10:46:07 +01:00
ui . cmbDPI - > addItem ( tr ( " None " ) , 0 ) ;
ui . cmbDPI - > addItem ( tr ( " Native " ) , 1 ) ;
ui . cmbDPI - > addItem ( tr ( " Qt " ) , 2 ) ;
2023-07-02 09:22:38 +01:00
ui . cmbInterval - > addItem ( tr ( " Every Day " ) , 1 * 24 * 60 * 60 ) ;
ui . cmbInterval - > addItem ( tr ( " Every Week " ) , 7 * 24 * 60 * 60 ) ;
ui . cmbInterval - > addItem ( tr ( " Every 2 Weeks " ) , 14 * 24 * 60 * 60 ) ;
ui . cmbInterval - > addItem ( tr ( " Every 30 days " ) , 30 * 24 * 60 * 60 ) ;
2022-12-03 19:25:04 +00:00
ui . cmbUpdate - > addItem ( tr ( " Ignore " ) , " ignore " ) ;
2022-11-27 10:29:36 +00:00
ui . cmbUpdate - > addItem ( tr ( " Notify " ) , " notify " ) ;
ui . cmbUpdate - > addItem ( tr ( " Download & Notify " ) , " download " ) ;
ui . cmbUpdate - > addItem ( tr ( " Download & Install " ) , " install " ) ;
2022-12-03 19:25:04 +00:00
//ui.cmbRelease->addItem(tr("Ignore"), "ignore");
2022-11-27 10:29:36 +00:00
ui . cmbRelease - > addItem ( tr ( " Notify " ) , " notify " ) ;
ui . cmbRelease - > addItem ( tr ( " Download & Notify " ) , " download " ) ;
ui . cmbRelease - > addItem ( tr ( " Download & Install " ) , " install " ) ;
2022-07-09 10:46:07 +01:00
int FontScales [ ] = { 75 , 100 , 125 , 150 , 175 , 200 , 225 , 250 , 275 , 300 , 350 , 400 , 0 } ;
2022-09-29 17:28:48 +01:00
for ( int * pFontScales = FontScales ; * pFontScales ! = 0 ; pFontScales + + )
2022-07-20 19:54:09 +01:00
ui . cmbFontScale - > addItem ( tr ( " %1 " ) . arg ( * pFontScales ) , * pFontScales ) ;
2021-10-16 16:19:51 +01:00
2022-09-29 17:28:48 +01:00
QSettings CurrentVersion ( " HKEY_LOCAL_MACHINE \\ SOFTWARE \\ Microsoft \\ Windows NT \\ CurrentVersion " , QSettings : : NativeFormat ) ;
if ( CurrentVersion . value ( " CurrentBuild " ) . toInt ( ) > = 22000 ) { // Windows 11
2022-07-01 07:19:30 +01:00
QCheckBox * SecretCheckBox = new CSecretCheckBox ( ui . chkShellMenu - > text ( ) ) ;
( ( QGridLayout * ) ( ( QWidget * ) ui . chkShellMenu - > parent ( ) ) - > layout ( ) ) - > replaceWidget ( ui . chkShellMenu , SecretCheckBox ) ;
ui . chkShellMenu - > deleteLater ( ) ;
ui . chkShellMenu = SecretCheckBox ;
}
2023-04-13 18:46:51 +01:00
m_HoldChange = false ;
2024-04-13 18:12:40 +01:00
DWORD logical_drives = GetLogicalDrives ( ) ;
for ( CHAR search = ' D ' ; search < = ' Z ' ; search + + ) {
if ( ( logical_drives & ( 1 < < ( search - ' A ' ) ) ) = = 0 )
ui . cmbRamLetter - > addItem ( QString ( " %1: \\ " ) . arg ( QChar ( search ) ) ) ;
}
2023-07-20 18:46:18 +01:00
CPathEdit * pEditor = new CPathEdit ( ) ;
ui . txtEditor - > parentWidget ( ) - > layout ( ) - > replaceWidget ( ui . txtEditor , pEditor ) ;
ui . txtEditor - > deleteLater ( ) ;
ui . txtEditor = pEditor - > GetEdit ( ) ;
2021-10-16 16:19:51 +01:00
LoadSettings ( ) ;
2022-07-01 07:19:30 +01:00
2023-04-13 18:46:51 +01:00
ui . buttonBox - > button ( QDialogButtonBox : : Apply ) - > setEnabled ( false ) ;
connect ( theGUI , SIGNAL ( DrivesChanged ( ) ) , this , SLOT ( UpdateDrives ( ) ) ) ;
// General Config
2022-07-09 10:46:07 +01:00
connect ( ui . uiLang , SIGNAL ( currentIndexChanged ( int ) ) , this , SLOT ( OnChangeGUI ( ) ) ) ;
2023-04-13 18:46:51 +01:00
connect ( ui . chkSandboxUrls , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
2024-08-26 12:50:33 +01:00
connect ( ui . chkAutoTerminate , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
2023-04-13 18:46:51 +01:00
connect ( ui . chkMonitorSize , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
connect ( ui . chkPanic , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
connect ( ui . keyPanic , SIGNAL ( keySequenceChanged ( const QKeySequence & ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
2023-10-21 20:50:56 +01:00
connect ( ui . chkTop , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
connect ( ui . keyTop , SIGNAL ( keySequenceChanged ( const QKeySequence & ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
2023-10-22 12:47:36 +01:00
connect ( ui . chkPauseForce , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
connect ( ui . keyPauseForce , SIGNAL ( keySequenceChanged ( const QKeySequence & ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
2024-02-25 08:50:07 +00:00
connect ( ui . chkSuspend , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
connect ( ui . keySuspend , SIGNAL ( keySequenceChanged ( const QKeySequence & ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
2023-04-13 18:46:51 +01:00
connect ( ui . chkAsyncBoxOps , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
connect ( ui . chkSilentMode , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
connect ( ui . chkCopyProgress , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
connect ( ui . chkNoMessages , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
connect ( ui . btnAddMessage , SIGNAL ( clicked ( bool ) ) , this , SLOT ( OnAddMessage ( ) ) ) ;
connect ( ui . btnDelMessage , SIGNAL ( clicked ( bool ) ) , this , SLOT ( OnDelMessage ( ) ) ) ;
connect ( ui . treeMessages , SIGNAL ( itemChanged ( QTreeWidgetItem * , int ) ) , this , SLOT ( OnMessageChanged ( ) ) ) ;
m_MessagesChanged = false ;
connect ( ui . chkNotifyRecovery , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
connect ( ui . chkShowRecovery , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
2024-03-01 11:19:45 +00:00
connect ( ui . chkCheckDelete , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
2023-04-13 18:46:51 +01:00
connect ( ui . chkRecoveryTop , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
//
// Shell Integration
connect ( ui . chkAutoStart , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
connect ( ui . chkSvcStart , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnGeneralChanged ( ) ) ) ;
connect ( ui . chkShellMenu , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
connect ( ui . chkAlwaysDefault , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
connect ( ui . chkShellMenu2 , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
2024-07-01 11:43:06 +01:00
connect ( ui . chkShellMenu3 , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
2024-07-18 14:16:53 +01:00
connect ( ui . chkShellMenu4 , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
2024-07-01 11:43:06 +01:00
2023-09-02 11:42:08 +01:00
connect ( ui . chkScanMenu , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
connect ( ui . cmbIntegrateMenu , SIGNAL ( currentIndexChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
connect ( ui . cmbIntegrateDesk , SIGNAL ( currentIndexChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
2023-04-13 18:46:51 +01:00
connect ( ui . cmbSysTray , SIGNAL ( currentIndexChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
connect ( ui . cmbTrayBoxes , SIGNAL ( currentIndexChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
connect ( ui . chkCompactTray , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnChangeGUI ( ) ) ) ;
2023-09-02 09:50:25 +01:00
connect ( ui . cmbOnClose , SIGNAL ( currentIndexChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
2023-04-13 18:46:51 +01:00
connect ( ui . chkBoxOpsNotify , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
2023-09-02 09:50:25 +01:00
connect ( ui . chkMinimize , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
connect ( ui . chkSingleShow , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
2023-04-13 18:46:51 +01:00
//
// Interface Config
2022-07-09 10:46:07 +01:00
connect ( ui . cmbDPI , SIGNAL ( currentIndexChanged ( int ) ) , this , SLOT ( OnChangeGUI ( ) ) ) ;
connect ( ui . chkDarkTheme , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnChangeGUI ( ) ) ) ;
2022-08-10 19:14:37 +01:00
connect ( ui . chkFusionTheme , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnChangeGUI ( ) ) ) ;
2022-07-29 09:24:32 +01:00
connect ( ui . chkAltRows , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnChangeGUI ( ) ) ) ;
2022-07-09 10:46:07 +01:00
connect ( ui . chkBackground , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnChangeGUI ( ) ) ) ;
connect ( ui . chkLargeIcons , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnChangeGUI ( ) ) ) ;
connect ( ui . chkNoIcons , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnChangeGUI ( ) ) ) ;
2023-04-13 18:46:51 +01:00
connect ( ui . chkOptTree , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
connect ( ui . chkNewLayout , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
2022-07-10 17:28:10 +01:00
connect ( ui . chkColorIcons , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnChangeGUI ( ) ) ) ;
2023-04-29 10:55:43 +01:00
connect ( ui . chkOverlayIcons , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnChangeGUI ( ) ) ) ;
2023-07-06 20:12:22 +01:00
connect ( ui . chkHideCore , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
2023-04-29 10:55:43 +01:00
2022-07-09 10:46:07 +01:00
connect ( ui . cmbFontScale , SIGNAL ( currentIndexChanged ( int ) ) , this , SLOT ( OnChangeGUI ( ) ) ) ;
2022-07-20 19:54:09 +01:00
connect ( ui . cmbFontScale , SIGNAL ( currentTextChanged ( const QString & ) ) , this , SLOT ( OnChangeGUI ( ) ) ) ;
2024-04-20 13:32:15 +01:00
connect ( ui . chkHide , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
2023-07-20 18:46:18 +01:00
connect ( ui . txtEditor , SIGNAL ( textChanged ( const QString & ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
2022-07-09 10:46:07 +01:00
m_bRebuildUI = false ;
2023-04-13 18:46:51 +01:00
//
2022-07-01 07:19:30 +01:00
2023-04-13 18:46:51 +01:00
// Run tab
2022-11-29 17:26:51 +00:00
connect ( ui . btnAddCmd , SIGNAL ( clicked ( bool ) ) , this , SLOT ( OnAddCommand ( ) ) ) ;
QMenu * pRunBtnMenu = new QMenu ( ui . btnAddCmd ) ;
pRunBtnMenu - > addAction ( tr ( " Browse for Program " ) , this , SLOT ( OnBrowsePath ( ) ) ) ;
ui . btnAddCmd - > setPopupMode ( QToolButton : : MenuButtonPopup ) ;
ui . btnAddCmd - > setMenu ( pRunBtnMenu ) ;
2023-04-13 18:46:51 +01:00
connect ( ui . btnCmdUp , SIGNAL ( clicked ( bool ) ) , this , SLOT ( OnCommandUp ( ) ) ) ;
connect ( ui . btnCmdDown , SIGNAL ( clicked ( bool ) ) , this , SLOT ( OnCommandDown ( ) ) ) ;
2022-11-29 17:26:51 +00:00
connect ( ui . btnDelCmd , SIGNAL ( clicked ( bool ) ) , this , SLOT ( OnDelCommand ( ) ) ) ;
connect ( ui . treeRun , SIGNAL ( itemChanged ( QTreeWidgetItem * , int ) ) , this , SLOT ( OnRunChanged ( ) ) ) ;
2023-04-13 18:46:51 +01:00
m_RunChanged = false ;
//
2022-11-29 17:26:51 +00:00
2023-07-01 17:54:53 +01:00
// Addons
QObject : : connect ( theGUI - > GetAddonManager ( ) , & CAddonManager : : DataUpdated , this , [ = ] ( ) {
ui . lblUpdateAddons - > setVisible ( false ) ;
OnLoadAddon ( ) ;
} ) ;
connect ( ui . btnInstallAddon , SIGNAL ( clicked ( bool ) ) , this , SLOT ( OnInstallAddon ( ) ) ) ;
connect ( ui . btnRemoveAddon , SIGNAL ( clicked ( bool ) ) , this , SLOT ( OnRemoveAddon ( ) ) ) ;
2023-07-01 20:24:12 +01:00
connect ( ui . lblUpdateAddons , & QLabel : : linkActivated , this , [ = ] ( ) {
2023-07-01 17:54:53 +01:00
theGUI - > GetAddonManager ( ) - > UpdateAddons ( ) ;
2023-07-01 20:24:12 +01:00
} ) ;
2023-07-01 17:54:53 +01:00
2023-08-24 17:39:00 +01:00
connect ( ui . chkRamDisk , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnRamDiskChange ( ) ) ) ;
connect ( ui . lblImDisk , SIGNAL ( linkActivated ( const QString & ) ) , theGUI , SLOT ( OpenUrl ( const QString & ) ) ) ;
QObject : : connect ( theGUI - > GetAddonManager ( ) , & CAddonManager : : AddonInstalled , this , [ = ] {
if ( ! theGUI - > GetAddonManager ( ) - > GetAddon ( " ImDisk " , CAddonManager : : eInstalled ) . isNull ( ) ) {
ui . lblImDisk - > setVisible ( false ) ;
ui . chkRamDisk - > setEnabled ( true ) ;
OnRamDiskChange ( ) ;
}
} ) ;
connect ( ui . txtRamLimit , SIGNAL ( textChanged ( const QString & ) ) , this , SLOT ( OnRamDiskChange ( ) ) ) ;
2023-08-27 11:34:06 +01:00
connect ( ui . chkRamLetter , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnRamDiskChange ( ) ) ) ;
connect ( ui . cmbRamLetter , SIGNAL ( currentIndexChanged ( int ) ) , this , SLOT ( OnGeneralChanged ( ) ) ) ;
2023-07-01 17:54:53 +01:00
//
2023-04-13 18:46:51 +01:00
// Advanced Config
connect ( ui . cmbDefault , SIGNAL ( currentIndexChanged ( int ) ) , this , SLOT ( OnGeneralChanged ( ) ) ) ;
connect ( ui . chkAutoRoot , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnRootChanged ( ) ) ) ; // not sbie ini
connect ( ui . fileRoot , SIGNAL ( textChanged ( const QString & ) ) , this , SLOT ( OnGeneralChanged ( ) ) ) ;
connect ( ui . regRoot , SIGNAL ( textChanged ( const QString & ) ) , this , SLOT ( OnGeneralChanged ( ) ) ) ;
connect ( ui . ipcRoot , SIGNAL ( textChanged ( const QString & ) ) , this , SLOT ( OnGeneralChanged ( ) ) ) ;
2022-11-29 17:26:51 +00:00
2021-10-16 16:19:51 +01:00
connect ( ui . chkWFP , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnFeaturesChanged ( ) ) ) ;
2021-11-13 08:28:32 +00:00
connect ( ui . chkObjCb , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnFeaturesChanged ( ) ) ) ;
2022-09-29 17:28:48 +01:00
if ( CurrentVersion . value ( " CurrentBuild " ) . toInt ( ) < 14393 ) // Windows 10 RS1 and later
2022-08-15 12:18:26 +01:00
ui . chkWin32k - > setEnabled ( false ) ;
2024-05-07 18:44:32 +01:00
//connect(ui.chkForceExplorerChild, SIGNAL(stateChanged(int)), this, SLOT(OnFeaturesChanged()));
2023-04-13 18:46:51 +01:00
//connect(ui.chkWin32k, SIGNAL(stateChanged(int)), this, SLOT(OnFeaturesChanged()));
m_FeaturesChanged = false ;
connect ( ui . chkWin32k , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnGeneralChanged ( ) ) ) ;
connect ( ui . chkSbieLogon , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnGeneralChanged ( ) ) ) ;
2024-05-24 22:28:18 +01:00
connect ( ui . chkSbieAll , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnGeneralChanged ( ) ) ) ;
2023-04-13 18:46:51 +01:00
m_GeneralChanged = false ;
2022-08-15 12:18:26 +01:00
2023-04-13 18:46:51 +01:00
connect ( ui . chkWatchConfig , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ; // not sbie ini
2021-10-16 16:19:51 +01:00
2024-07-21 14:45:51 +01:00
connect ( ui . chkSkipUAC , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnSkipUAC ( ) ) ) ;
ui . chkSkipUAC - > setEnabled ( IsElevated ( ) ) ;
m_SkipUACChanged = false ;
2023-04-13 18:46:51 +01:00
connect ( ui . chkAdminOnly , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnProtectionChange ( ) ) ) ;
connect ( ui . chkPassRequired , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnProtectionChange ( ) ) ) ;
2021-10-16 16:19:51 +01:00
connect ( ui . btnSetPassword , SIGNAL ( clicked ( bool ) ) , this , SLOT ( OnSetPassword ( ) ) ) ;
2023-04-13 18:46:51 +01:00
connect ( ui . chkAdminOnlyFP , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnProtectionChange ( ) ) ) ;
connect ( ui . chkClearPass , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnProtectionChange ( ) ) ) ;
2024-03-17 11:10:29 +00:00
2023-04-13 18:46:51 +01:00
m_ProtectionChanged = false ;
//
// Program Control
2021-10-16 16:19:51 +01:00
connect ( ui . chkStartBlock , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnWarnChanged ( ) ) ) ;
connect ( ui . chkStartBlockMsg , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnWarnChanged ( ) ) ) ;
2022-09-29 17:28:48 +01:00
connect ( ui . chkNotForcedMsg , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnWarnChanged ( ) ) ) ;
2021-10-16 16:19:51 +01:00
connect ( ui . btnAddWarnProg , SIGNAL ( clicked ( bool ) ) , this , SLOT ( OnAddWarnProg ( ) ) ) ;
connect ( ui . btnAddWarnFolder , SIGNAL ( clicked ( bool ) ) , this , SLOT ( OnAddWarnFolder ( ) ) ) ;
connect ( ui . btnDelWarnProg , SIGNAL ( clicked ( bool ) ) , this , SLOT ( OnDelWarnProg ( ) ) ) ;
connect ( ui . btnBrowse , SIGNAL ( clicked ( bool ) ) , this , SLOT ( OnBrowse ( ) ) ) ;
2023-04-13 18:46:51 +01:00
m_WarnProgsChanged = false ;
//
2021-10-16 16:19:51 +01:00
2023-10-19 17:34:09 +01:00
// USB
connect ( ui . chkSandboxUsb , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnVolumeChanged ( ) ) ) ;
connect ( ui . cmbUsbSandbox , SIGNAL ( currentIndexChanged ( int ) ) , this , SLOT ( OnVolumeChanged ( ) ) ) ;
connect ( ui . treeVolumes , SIGNAL ( itemChanged ( QTreeWidgetItem * , int ) ) , this , SLOT ( OnVolumeChanged ( ) ) ) ;
m_VolumeChanged = false ;
//
2023-04-13 18:46:51 +01:00
// Templates
2021-10-16 16:19:51 +01:00
connect ( ui . btnAddCompat , SIGNAL ( clicked ( bool ) ) , this , SLOT ( OnAddCompat ( ) ) ) ;
connect ( ui . btnDelCompat , SIGNAL ( clicked ( bool ) ) , this , SLOT ( OnDelCompat ( ) ) ) ;
m_CompatLoaded = 0 ;
m_CompatChanged = false ;
2022-03-12 07:23:02 +00:00
ui . chkNoCompat - > setChecked ( ! theConf - > GetBool ( " Options/AutoRunSoftCompat " , true ) ) ;
2021-10-16 16:19:51 +01:00
connect ( ui . treeCompat , SIGNAL ( itemClicked ( QTreeWidgetItem * , int ) ) , this , SLOT ( OnTemplateClicked ( QTreeWidgetItem * , int ) ) ) ;
2022-05-29 07:07:17 +01:00
connect ( ui . treeCompat , SIGNAL ( itemDoubleClicked ( QTreeWidgetItem * , int ) ) , this , SLOT ( OnTemplateDoubleClicked ( QTreeWidgetItem * , int ) ) ) ;
2021-10-16 16:19:51 +01:00
2023-04-13 18:46:51 +01:00
connect ( ui . txtTemplates , SIGNAL ( textChanged ( const QString & ) ) , this , SLOT ( OnFilterTemplates ( ) ) ) ;
//connect(ui.treeTemplates, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(OnTemplateClicked(QTreeWidgetItem*, int)));
connect ( ui . treeTemplates , SIGNAL ( itemChanged ( QTreeWidgetItem * , int ) ) , this , SLOT ( OnTemplateClicked ( QTreeWidgetItem * , int ) ) ) ;
connect ( ui . treeTemplates , SIGNAL ( itemDoubleClicked ( QTreeWidgetItem * , int ) ) , this , SLOT ( OnTemplateDoubleClicked ( QTreeWidgetItem * , int ) ) ) ;
connect ( ui . btnAddTemplate , SIGNAL ( clicked ( bool ) ) , this , SLOT ( OnAddTemplates ( ) ) ) ;
QMenu * pTmplBtnMenu = new QMenu ( ui . btnAddTemplate ) ;
for ( int i = 1 ; i < CTemplateWizard : : TmplMax ; i + + )
pTmplBtnMenu - > addAction ( tr ( " Add %1 Template " ) . arg ( CTemplateWizard : : GetTemplateLabel ( ( CTemplateWizard : : ETemplateType ) i ) ) , this , SLOT ( OnTemplateWizard ( ) ) ) - > setData ( i ) ;
ui . btnAddTemplate - > setPopupMode ( QToolButton : : MenuButtonPopup ) ;
ui . btnAddTemplate - > setMenu ( pTmplBtnMenu ) ;
2024-04-20 13:43:30 +01:00
connect ( ui . btnOpenTemplate , SIGNAL ( clicked ( bool ) ) , this , SLOT ( OnOpenTemplate ( ) ) ) ;
2023-04-13 18:46:51 +01:00
connect ( ui . btnDelTemplate , SIGNAL ( clicked ( bool ) ) , this , SLOT ( OnDelTemplates ( ) ) ) ;
//
// Support
2021-10-16 16:19:51 +01:00
connect ( ui . lblSupport , SIGNAL ( linkActivated ( const QString & ) ) , theGUI , SLOT ( OpenUrl ( const QString & ) ) ) ;
connect ( ui . lblSupportCert , SIGNAL ( linkActivated ( const QString & ) ) , theGUI , SLOT ( OpenUrl ( const QString & ) ) ) ;
2022-01-13 22:52:58 +00:00
connect ( ui . lblCertExp , SIGNAL ( linkActivated ( const QString & ) ) , theGUI , SLOT ( OpenUrl ( const QString & ) ) ) ;
2024-03-23 11:14:25 +00:00
connect ( ui . lblCertGuide , SIGNAL ( linkActivated ( const QString & ) ) , theGUI , SLOT ( OpenUrl ( const QString & ) ) ) ;
2023-07-01 17:54:53 +01:00
connect ( ui . lblInsiderInfo , SIGNAL ( linkActivated ( const QString & ) ) , theGUI , SLOT ( OpenUrl ( const QString & ) ) ) ;
2021-10-16 16:19:51 +01:00
m_CertChanged = false ;
connect ( ui . txtCertificate , SIGNAL ( textChanged ( ) ) , this , SLOT ( CertChanged ( ) ) ) ;
2024-04-14 11:30:27 +01:00
connect ( ui . txtSerial , SIGNAL ( textChanged ( const QString & ) ) , this , SLOT ( KeyChanged ( ) ) ) ;
ui . btnGetCert - > setEnabled ( false ) ;
2022-01-13 22:52:58 +00:00
connect ( theGUI , SIGNAL ( CertUpdated ( ) ) , this , SLOT ( UpdateCert ( ) ) ) ;
2021-10-16 16:19:51 +01:00
2022-05-08 13:41:49 +01:00
ui . txtCertificate - > setPlaceholderText (
" NAME: User Name \n "
2023-08-15 08:49:03 +01:00
" TYPE: ULTIMATE \n "
2022-05-08 13:41:49 +01:00
" DATE: dd.mm.yyyy \n "
" UPDATEKEY: 00000000000000000000000000000000 \n "
" SIGNATURE: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== "
) ;
2023-08-15 08:49:03 +01:00
if ( g_CertInfo . active ) {
QString Text = ui . lblSerial - > text ( ) ;
ui . lblSerial - > setText ( QString ( " <a href= \" _ \" >%1</a> " ) . arg ( Text ) ) ;
ui . txtSerial - > setVisible ( false ) ;
2024-07-21 09:34:58 +01:00
ui . lblHwId - > setVisible ( false ) ;
2023-08-15 08:49:03 +01:00
ui . btnGetCert - > setVisible ( false ) ;
connect ( ui . lblSerial , & QLabel : : linkActivated , this , [ = ] ( ) {
ui . lblSerial - > setText ( Text ) ;
ui . txtSerial - > setVisible ( true ) ;
2024-07-21 09:34:58 +01:00
ui . lblHwId - > setVisible ( true ) ;
2023-08-15 08:49:03 +01:00
ui . btnGetCert - > setVisible ( true ) ;
} ) ;
}
2024-07-21 09:34:58 +01:00
wchar_t uuid_str [ 40 ] ;
if ( theAPI - > GetDriverInfo ( - 2 , uuid_str , sizeof ( uuid_str ) ) )
ui . lblHwId - > setText ( tr ( " HwId: %1 " ) . arg ( QString : : fromWCharArray ( uuid_str ) ) ) ;
2024-08-25 09:36:29 +01:00
connect ( ui . lblCert , SIGNAL ( linkActivated ( const QString & ) ) , this , SLOT ( OnStartEval ( ) ) ) ;
2023-08-15 08:49:03 +01:00
connect ( ui . btnGetCert , SIGNAL ( clicked ( bool ) ) , this , SLOT ( OnGetCert ( ) ) ) ;
2023-07-01 17:54:53 +01:00
connect ( ui . chkNoCheck , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
//
2022-08-11 23:09:35 +01:00
connect ( ui . lblCurrent , SIGNAL ( linkActivated ( const QString & ) ) , this , SLOT ( OnUpdate ( const QString & ) ) ) ;
2022-11-20 16:23:15 +00:00
connect ( ui . lblStable , SIGNAL ( linkActivated ( const QString & ) ) , this , SLOT ( OnUpdate ( const QString & ) ) ) ;
2022-08-11 23:09:35 +01:00
connect ( ui . lblPreview , SIGNAL ( linkActivated ( const QString & ) ) , this , SLOT ( OnUpdate ( const QString & ) ) ) ;
2023-07-01 17:54:53 +01:00
connect ( ui . lblInsider , SIGNAL ( linkActivated ( const QString & ) ) , this , SLOT ( OnUpdate ( const QString & ) ) ) ;
2023-04-13 18:46:51 +01:00
//connect(ui.lblInsiderInfo, SIGNAL(linkActivated(const QString&)), this, SLOT(OnUpdate(const QString&)));
2022-11-20 16:23:15 +00:00
connect ( ui . chkAutoUpdate , SIGNAL ( toggled ( bool ) ) , this , SLOT ( UpdateUpdater ( ) ) ) ;
2023-07-02 09:22:38 +01:00
connect ( ui . cmbInterval , SIGNAL ( currentIndexChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
2022-11-20 16:23:15 +00:00
connect ( ui . radStable , SIGNAL ( toggled ( bool ) ) , this , SLOT ( UpdateUpdater ( ) ) ) ;
connect ( ui . radPreview , SIGNAL ( toggled ( bool ) ) , this , SLOT ( UpdateUpdater ( ) ) ) ;
2023-07-01 17:54:53 +01:00
connect ( ui . radInsider , SIGNAL ( toggled ( bool ) ) , this , SLOT ( UpdateUpdater ( ) ) ) ;
2023-04-13 18:46:51 +01:00
connect ( ui . cmbUpdate , SIGNAL ( currentIndexChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
connect ( ui . cmbRelease , SIGNAL ( currentIndexChanged ( int ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
2023-07-01 17:54:53 +01:00
connect ( ui . chkUpdateIssues , SIGNAL ( toggled ( bool ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
connect ( ui . chkUpdateAddons , SIGNAL ( toggled ( bool ) ) , this , SLOT ( OnOptChanged ( ) ) ) ;
2023-04-13 18:46:51 +01:00
//
2022-08-11 23:09:35 +01:00
2021-10-16 16:19:51 +01:00
connect ( ui . tabs , SIGNAL ( currentChanged ( int ) ) , this , SLOT ( OnTab ( ) ) ) ;
2023-04-13 18:46:51 +01:00
// Ini Edit
2023-07-03 12:58:49 +01:00
ui . btnSelectIniFont - > setIcon ( CSandMan : : GetIcon ( " Font " ) ) ;
ui . btnSelectIniFont - > setToolTip ( tr ( " Select font " ) ) ;
ui . btnResetIniFont - > setIcon ( CSandMan : : GetIcon ( " ResetFont " ) ) ;
ui . btnResetIniFont - > setToolTip ( tr ( " Reset font " ) ) ;
2023-06-09 09:47:09 +01:00
ApplyIniEditFont ( ) ;
2023-07-03 12:58:49 +01:00
connect ( ui . btnSelectIniFont , SIGNAL ( clicked ( bool ) ) , this , SLOT ( OnSelectIniEditFont ( ) ) ) ;
connect ( ui . btnResetIniFont , SIGNAL ( clicked ( bool ) ) , this , SLOT ( OnResetIniEditFont ( ) ) ) ;
2022-01-13 22:52:58 +00:00
connect ( ui . btnEditIni , SIGNAL ( clicked ( bool ) ) , this , SLOT ( OnEditIni ( ) ) ) ;
connect ( ui . btnSaveIni , SIGNAL ( clicked ( bool ) ) , this , SLOT ( OnSaveIni ( ) ) ) ;
connect ( ui . btnCancelEdit , SIGNAL ( clicked ( bool ) ) , this , SLOT ( OnCancelEdit ( ) ) ) ;
2023-04-13 18:46:51 +01:00
connect ( ui . txtIniSection , SIGNAL ( textChanged ( ) ) , this , SLOT ( OnIniChanged ( ) ) ) ;
//
2022-01-13 22:52:58 +00:00
2021-10-16 16:19:51 +01:00
connect ( ui . buttonBox - > button ( QDialogButtonBox : : Ok ) , SIGNAL ( clicked ( bool ) ) , this , SLOT ( ok ( ) ) ) ;
connect ( ui . buttonBox - > button ( QDialogButtonBox : : Apply ) , SIGNAL ( clicked ( bool ) ) , this , SLOT ( apply ( ) ) ) ;
connect ( ui . buttonBox , SIGNAL ( rejected ( ) ) , this , SLOT ( reject ( ) ) ) ;
2023-08-27 11:34:06 +01:00
if ( ! CERT_IS_LEVEL ( g_CertInfo , eCertStandard ) ) {
//COptionsWindow__AddCertIcon(ui.chkUpdateTemplates);
COptionsWindow__AddCertIcon ( ui . chkUpdateIssues ) ;
COptionsWindow__AddCertIcon ( ui . chkRamDisk ) ;
2023-10-26 08:32:03 +01:00
COptionsWindow__AddCertIcon ( ui . chkSandboxUsb ) ;
2023-08-27 11:34:06 +01:00
}
2023-07-01 17:54:53 +01:00
2022-08-15 12:18:26 +01:00
this - > installEventFilter ( this ) ; // prevent enter from closing the dialog
2021-10-16 16:19:51 +01:00
restoreGeometry ( theConf - > GetBlob ( " SettingsWindow/Window_Geometry " ) ) ;
2022-08-15 12:18:26 +01:00
2023-04-13 18:46:51 +01:00
foreach ( QTreeWidget * pTree , this - > findChildren < QTreeWidget * > ( ) ) {
QByteArray Columns = theConf - > GetBlob ( " SettingsWindow/ " + pTree - > objectName ( ) + " _Columns " ) ;
if ( ! Columns . isEmpty ( ) )
pTree - > header ( ) - > restoreState ( Columns ) ;
}
2022-08-15 12:18:26 +01:00
int iOptionTree = theConf - > GetInt ( " Options/OptionTree " , 2 ) ;
if ( iOptionTree = = 2 )
iOptionTree = iViewMode = = 2 ? 1 : 0 ;
if ( iOptionTree )
OnSetTree ( ) ;
else {
2022-08-15 18:32:38 +01:00
QWidget * pSearch = AddConfigSearch ( ui . tabs ) ;
ui . horizontalLayout - > insertWidget ( 0 , pSearch ) ;
QTimer : : singleShot ( 0 , [ this ] ( ) {
m_pSearch - > setMaximumWidth ( m_pTabs - > tabBar ( ) - > width ( ) ) ;
} ) ;
2022-09-29 17:28:48 +01:00
QAction * pSetTree = new QAction ( ) ;
connect ( pSetTree , SIGNAL ( triggered ( ) ) , this , SLOT ( OnSetTree ( ) ) ) ;
pSetTree - > setShortcut ( QKeySequence ( " Ctrl+Alt+T " ) ) ;
pSetTree - > setShortcutContext ( Qt : : WidgetWithChildrenShortcut ) ;
this - > addAction ( pSetTree ) ;
2022-08-15 12:18:26 +01:00
}
2022-08-20 19:11:27 +01:00
m_pSearch - > setPlaceholderText ( tr ( " Search for settings " ) ) ;
2022-08-15 12:18:26 +01:00
}
2023-06-09 09:47:09 +01:00
void CSettingsWindow : : ApplyIniEditFont ( )
{
QFont font ; // defaults to application font
auto fontName = theConf - > GetString ( " UIConfig/IniFont " , " " ) . trimmed ( ) ;
if ( ! fontName . isEmpty ( ) ) bool dummy = font . fromString ( fontName ) ; // ignore fromString() fail
ui . txtIniSection - > setFont ( font ) ;
2023-07-03 12:58:49 +01:00
ui . lblIniEditFont - > setText ( tr ( " %0, %1 pt " ) . arg ( font . family ( ) ) . arg ( font . pointSizeF ( ) ) ) ; // tr: example: "Calibri, 9.5 pt"
2023-06-09 09:47:09 +01:00
}
void CSettingsWindow : : OnSelectIniEditFont ( )
{
bool ok ;
auto newFont = QFontDialog : : getFont ( & ok , ui . txtIniSection - > font ( ) , this ) ;
if ( ! ok ) return ;
theConf - > SetValue ( " UIConfig/IniFont " , newFont . toString ( ) ) ;
ApplyIniEditFont ( ) ;
}
void CSettingsWindow : : OnResetIniEditFont ( )
{
theConf - > DelValue ( " UIConfig/IniFont " ) ;
ApplyIniEditFont ( ) ;
}
2022-08-15 12:18:26 +01:00
void CSettingsWindow : : OnSetTree ( )
{
if ( ! ui . tabs ) return ;
QWidget * pAltView = ConvertToTree ( ui . tabs ) ;
ui . verticalLayout - > replaceWidget ( ui . tabs , pAltView ) ;
ui . tabs - > deleteLater ( ) ;
ui . tabs = NULL ;
2021-10-16 16:19:51 +01:00
}
CSettingsWindow : : ~ CSettingsWindow ( )
{
theConf - > SetBlob ( " SettingsWindow/Window_Geometry " , saveGeometry ( ) ) ;
2023-04-13 18:46:51 +01:00
foreach ( QTreeWidget * pTree , this - > findChildren < QTreeWidget * > ( ) )
theConf - > SetBlob ( " SettingsWindow/ " + pTree - > objectName ( ) + " _Columns " , pTree - > header ( ) - > saveState ( ) ) ;
2021-10-16 16:19:51 +01:00
}
2023-07-08 10:46:29 +01:00
void CSettingsWindow : : showTab ( const QString & Name , bool bExclusive )
2021-10-16 16:19:51 +01:00
{
2023-07-08 10:46:29 +01:00
QWidget * pWidget = this - > findChild < QWidget * > ( " tab " + Name ) ;
2022-08-15 10:58:39 +01:00
2023-04-13 18:46:51 +01:00
if ( ui . tabs ) {
for ( int i = 0 ; i < ui . tabs - > count ( ) ; i + + ) {
QGridLayout * pGrid = qobject_cast < QGridLayout * > ( ui . tabs - > widget ( i ) - > layout ( ) ) ;
QTabWidget * pSubTabs = pGrid ? qobject_cast < QTabWidget * > ( pGrid - > itemAt ( 0 ) - > widget ( ) ) : NULL ;
2023-07-08 10:46:29 +01:00
if ( ui . tabs - > widget ( i ) = = pWidget )
ui . tabs - > setCurrentIndex ( i ) ;
else if ( pSubTabs ) {
2023-04-13 18:46:51 +01:00
for ( int j = 0 ; j < pSubTabs - > count ( ) ; j + + ) {
if ( pSubTabs - > widget ( j ) = = pWidget ) {
ui . tabs - > setCurrentIndex ( i ) ;
pSubTabs - > setCurrentIndex ( j ) ;
}
}
}
}
}
2022-09-29 17:28:48 +01:00
else
m_pStack - > setCurrentWidget ( pWidget ) ;
2022-08-15 12:18:26 +01:00
if ( pWidget = = ui . tabCompat )
2022-07-09 10:46:07 +01:00
m_CompatLoaded = 2 ;
2022-08-15 12:18:26 +01:00
if ( pWidget = = ui . tabSupport )
2022-07-09 10:46:07 +01:00
ui . chkNoCheck - > setVisible ( true ) ;
2021-10-16 16:19:51 +01:00
2022-08-15 12:18:26 +01:00
if ( bExclusive ) {
if ( ui . tabs )
ui . tabs - > tabBar ( ) - > setVisible ( false ) ;
else {
m_pTree - > setVisible ( false ) ;
m_pSearch - > setVisible ( false ) ;
}
}
2022-07-10 17:28:10 +01:00
2024-04-20 13:32:15 +01:00
CSandMan : : SafeShow ( this ) ;
2022-01-13 22:52:58 +00:00
}
2021-10-16 16:19:51 +01:00
void CSettingsWindow : : closeEvent ( QCloseEvent * e )
{
emit Closed ( ) ;
this - > deleteLater ( ) ;
}
2022-08-15 12:18:26 +01:00
bool CSettingsWindow : : eventFilter ( QObject * source , QEvent * event )
{
2022-08-20 21:32:51 +01:00
//if (event->type() == QEvent::KeyPress && ((QKeyEvent*)event)->key() == Qt::Key_Escape
// && ((QKeyEvent*)event)->modifiers() == Qt::NoModifier)
//{
// return true; // cancel event
//}
2022-08-15 12:18:26 +01:00
if ( event - > type ( ) = = QEvent : : KeyPress & & ( ( ( QKeyEvent * ) event ) - > key ( ) = = Qt : : Key_Enter | | ( ( QKeyEvent * ) event ) - > key ( ) = = Qt : : Key_Return )
2022-08-20 21:32:51 +01:00
& & ( ( ( QKeyEvent * ) event ) - > modifiers ( ) = = Qt : : NoModifier | | ( ( QKeyEvent * ) event ) - > modifiers ( ) = = Qt : : KeypadModifier ) )
2022-08-15 12:18:26 +01:00
{
return true ; // cancel event
}
return QDialog : : eventFilter ( source , event ) ;
}
2023-04-13 18:46:51 +01:00
void CSettingsWindow : : OnAddMessage ( )
{
QString Value = QInputDialog : : getText ( this , " Sandboxie-Plus " , tr ( " Please enter message " ) , QLineEdit : : Normal ) ;
if ( Value . isEmpty ( ) )
return ;
StrPair IdText = Split2 ( Value , " , " ) ;
AddMessageItem ( IdText . first , IdText . second ) ;
OnMessageChanged ( ) ;
}
void CSettingsWindow : : AddMessageItem ( const QString & ID , const QString & Text )
{
QTreeWidgetItem * pItem = new QTreeWidgetItem ( ) ;
pItem - > setText ( 0 , ID ) ;
pItem - > setText ( 1 , Text ) ;
pItem - > setFlags ( pItem - > flags ( ) | Qt : : ItemIsEditable ) ;
ui . treeMessages - > addTopLevelItem ( pItem ) ;
}
void CSettingsWindow : : OnDelMessage ( )
{
QTreeWidgetItem * pItem = ui . treeMessages - > currentItem ( ) ;
if ( ! pItem )
return ;
delete pItem ;
OnMessageChanged ( ) ;
}
2022-11-29 17:26:51 +00:00
void CSettingsWindow : : OnBrowsePath ( )
{
QString Value = QFileDialog : : getOpenFileName ( this , tr ( " Select Program " ) , " " , tr ( " Executables (*.exe *.cmd) " ) ) . replace ( " / " , " \\ " ) ;
if ( Value . isEmpty ( ) )
return ;
QString Name = QInputDialog : : getText ( this , " Sandboxie-Plus " , tr ( " Please enter a menu title " ) , QLineEdit : : Normal ) ;
if ( Name . isEmpty ( ) )
return ;
2023-07-19 20:15:18 +01:00
QVariantMap Entry ;
Entry [ " Name " ] = Name ;
Entry [ " Command " ] = " \" " + Value + " \" " ;
AddRunItem ( ui . treeRun , Entry ) ;
2022-11-29 17:26:51 +00:00
}
void CSettingsWindow : : OnAddCommand ( )
{
QString Value = QInputDialog : : getText ( this , " Sandboxie-Plus " , tr ( " Please enter a command " ) , QLineEdit : : Normal ) ;
if ( Value . isEmpty ( ) )
return ;
QString Name = QInputDialog : : getText ( this , " Sandboxie-Plus " , tr ( " Please enter a menu title " ) , QLineEdit : : Normal ) ;
if ( Name . isEmpty ( ) )
return ;
2023-07-19 20:15:18 +01:00
QVariantMap Entry ;
Entry [ " Name " ] = Name ;
Entry [ " Command " ] = Value ;
AddRunItem ( ui . treeRun , Entry ) ;
2022-11-29 17:26:51 +00:00
2023-07-19 20:15:18 +01:00
OnRunChanged ( ) ;
2022-11-29 17:26:51 +00:00
}
2023-04-13 18:46:51 +01:00
void CSettingsWindow : : OnCommandUp ( )
{
int index = ui . treeRun - > indexOfTopLevelItem ( ui . treeRun - > currentItem ( ) ) ;
if ( index > 0 ) {
QTreeWidgetItem * pItem = ui . treeRun - > takeTopLevelItem ( index ) ;
ui . treeRun - > insertTopLevelItem ( index - 1 , pItem ) ;
ui . treeRun - > setCurrentItem ( pItem ) ;
OnRunChanged ( ) ;
}
}
void CSettingsWindow : : OnCommandDown ( )
{
int index = ui . treeRun - > indexOfTopLevelItem ( ui . treeRun - > currentItem ( ) ) ;
if ( index < ui . treeRun - > topLevelItemCount ( ) - 1 ) {
QTreeWidgetItem * pItem = ui . treeRun - > takeTopLevelItem ( index ) ;
ui . treeRun - > insertTopLevelItem ( index + 1 , pItem ) ;
ui . treeRun - > setCurrentItem ( pItem ) ;
OnRunChanged ( ) ;
}
}
2022-11-29 17:26:51 +00:00
void CSettingsWindow : : OnDelCommand ( )
{
QTreeWidgetItem * pItem = ui . treeRun - > currentItem ( ) ;
if ( ! pItem )
return ;
delete pItem ;
2023-04-13 18:46:51 +01:00
OnRunChanged ( ) ;
2022-11-29 17:26:51 +00:00
}
2023-07-01 17:54:53 +01:00
Qt : : CheckState CSettingsWindow : : IsContextMenu ( )
2021-10-16 16:19:51 +01:00
{
2022-09-22 15:53:13 +01:00
//QSettings Package("HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\PackagedCom\\Package", QSettings::NativeFormat);
QSettings Package ( " HKEY_CURRENT_USER \\ Software \\ Classes \\ PackagedCom \\ Package " , QSettings : : NativeFormat ) ;
foreach ( const QString & Key , Package . childGroups ( ) ) {
2022-05-15 12:26:22 +01:00
if ( Key . indexOf ( " SandboxieShell " ) = = 0 )
return Qt : : Checked ;
}
2021-10-16 16:19:51 +01:00
QString cmd = CSbieUtils : : GetContextMenuStartCmd ( ) ;
2022-02-04 21:08:25 +00:00
if ( cmd . contains ( " SandMan.exe " , Qt : : CaseInsensitive ) )
2021-10-16 16:19:51 +01:00
return Qt : : Checked ; // set up and sandman
if ( ! cmd . isEmpty ( ) ) // ... probably sbiectrl.exe
return Qt : : PartiallyChecked ;
return Qt : : Unchecked ; // not set up
}
2023-07-01 17:54:53 +01:00
void CSettingsWindow : : AddContextMenu ( bool bAlwaysClassic )
2022-02-04 21:08:25 +00:00
{
2022-09-22 15:53:13 +01:00
QSettings CurrentVersion ( " HKEY_LOCAL_MACHINE \\ SOFTWARE \\ Microsoft \\ Windows NT \\ CurrentVersion " , QSettings : : NativeFormat ) ;
if ( CurrentVersion . value ( " CurrentBuild " ) . toInt ( ) > = 22000 & & ! bAlwaysClassic ) // Windows 11
2022-05-15 12:26:22 +01:00
{
2022-09-22 15:53:13 +01:00
QSettings MyReg ( " HKEY_CURRENT_USER \\ SOFTWARE \\ Xanasoft \\ Sandboxie-Plus \\ SbieShellExt \\ Lang " , QSettings : : NativeFormat ) ;
2022-09-22 16:56:24 +01:00
MyReg . setValue ( " Open Sandboxed " , CSettingsWindow : : tr ( " Run &Sandboxed " ) ) ;
MyReg . setValue ( " Explore Sandboxed " , CSettingsWindow : : tr ( " Run &Sandboxed " ) ) ;
2022-09-22 15:53:13 +01:00
QDir : : setCurrent ( QCoreApplication : : applicationDirPath ( ) ) ;
2022-05-15 12:26:22 +01:00
QProcess Proc ;
2022-08-10 19:14:37 +01:00
Proc . execute ( " rundll32.exe " , QStringList ( ) < < " SbieShellExt.dll,RegisterPackage " ) ;
2022-05-15 12:26:22 +01:00
Proc . waitForFinished ( ) ;
return ;
}
2022-02-04 21:08:25 +00:00
CSbieUtils : : AddContextMenu ( QApplication : : applicationDirPath ( ) . replace ( " / " , " \\ " ) + " \\ SandMan.exe " ,
2022-02-13 12:24:16 +00:00
CSettingsWindow : : tr ( " Run &Sandboxed " ) , //CSettingsWindow::tr("Explore &Sandboxed"),
2022-02-04 21:08:25 +00:00
QApplication : : applicationDirPath ( ) . replace ( " / " , " \\ " ) + " \\ Start.exe " ) ;
}
2023-07-01 17:54:53 +01:00
void CSettingsWindow : : RemoveContextMenu ( )
2022-05-15 12:26:22 +01:00
{
2022-09-22 15:53:13 +01:00
QSettings CurrentVersion ( " HKEY_LOCAL_MACHINE \\ SOFTWARE \\ Microsoft \\ Windows NT \\ CurrentVersion " , QSettings : : NativeFormat ) ;
if ( CurrentVersion . value ( " CurrentBuild " ) . toInt ( ) > = 22000 ) // Windows 11
2022-05-15 12:26:22 +01:00
{
2022-09-22 15:53:13 +01:00
QDir : : setCurrent ( QCoreApplication : : applicationDirPath ( ) ) ;
2022-05-15 12:26:22 +01:00
QProcess Proc ;
2022-08-10 19:14:37 +01:00
Proc . execute ( " rundll32.exe " , QStringList ( ) < < " SbieShellExt.dll,RemovePackage " ) ;
2022-05-15 12:26:22 +01:00
Proc . waitForFinished ( ) ;
}
CSbieUtils : : RemoveContextMenu ( ) ;
}
2023-07-01 17:54:53 +01:00
bool CSettingsWindow : : AddBrowserIcon ( )
2022-05-15 12:26:22 +01:00
{
QString Path = QStandardPaths : : writableLocation ( QStandardPaths : : DesktopLocation ) . replace ( " / " , " \\ " ) ;
Path + = " \\ " + CSettingsWindow : : tr ( " Sandboxed Web Browser " ) + " .lnk " ;
2023-07-01 17:54:53 +01:00
QString StartExe = theAPI - > GetSbiePath ( ) + " \\ SandMan.exe " ;
QString BoxName = theAPI - > GetGlobalSettings ( ) - > GetText ( " DefaultBox " , " DefaultBox " ) ;
return CSbieUtils : : CreateShortcut ( StartExe , Path , " " , BoxName , " default_browser " ) ;
2022-05-15 12:26:22 +01:00
}
2021-10-16 16:19:51 +01:00
void CSettingsWindow : : LoadSettings ( )
{
ui . uiLang - > setCurrentIndex ( ui . uiLang - > findData ( theConf - > GetString ( " Options/UiLanguage " ) ) ) ;
ui . chkAutoStart - > setChecked ( IsAutorunEnabled ( ) ) ;
2022-01-14 17:58:25 +00:00
if ( theAPI - > IsConnected ( ) ) {
if ( theAPI - > GetUserSettings ( ) - > GetBool ( " SbieCtrl_EnableAutoStart " , true ) ) {
2024-04-22 15:51:06 +01:00
if ( theAPI - > GetUserSettings ( ) - > GetText ( " SbieCtrl_AutoStartAgent " , " " ) . left ( 11 ) ! = " SandMan.exe " )
2022-01-14 17:58:25 +00:00
ui . chkSvcStart - > setCheckState ( Qt : : PartiallyChecked ) ;
else
ui . chkSvcStart - > setChecked ( true ) ;
}
2021-10-16 16:19:51 +01:00
else
2022-01-14 17:58:25 +00:00
ui . chkSvcStart - > setChecked ( false ) ;
}
else {
ui . chkSvcStart - > setEnabled ( false ) ;
}
2021-10-16 16:19:51 +01:00
2023-07-01 17:54:53 +01:00
ui . chkShellMenu - > setCheckState ( IsContextMenu ( ) ) ;
2022-02-04 21:08:25 +00:00
ui . chkShellMenu2 - > setChecked ( CSbieUtils : : HasContextMenu2 ( ) ) ;
2024-07-01 11:43:06 +01:00
ui . chkShellMenu3 - > setChecked ( CSbieUtils : : HasContextMenu3 ( ) ) ;
2024-07-18 14:16:53 +01:00
ui . chkShellMenu4 - > setChecked ( CSbieUtils : : HasContextMenu4 ( ) ) ;
2021-10-16 16:19:51 +01:00
ui . chkAlwaysDefault - > setChecked ( theConf - > GetBool ( " Options/RunInDefaultBox " , false ) ) ;
2022-07-09 10:46:07 +01:00
ui . cmbDPI - > setCurrentIndex ( theConf - > GetInt ( " Options/DPIScaling " , 1 ) ) ;
2021-10-16 16:19:51 +01:00
ui . chkDarkTheme - > setCheckState ( CSettingsWindow__Int2Chk ( theConf - > GetInt ( " Options/UseDarkTheme " , 2 ) ) ) ;
2022-08-10 19:14:37 +01:00
ui . chkFusionTheme - > setCheckState ( CSettingsWindow__Int2Chk ( theConf - > GetInt ( " Options/UseFusionTheme " , 2 ) ) ) ;
2022-07-29 09:24:32 +01:00
ui . chkAltRows - > setChecked ( theConf - > GetBool ( " Options/AltRowColors " , false ) ) ;
2022-07-09 10:46:07 +01:00
ui . chkBackground - > setCheckState ( CSettingsWindow__Int2Chk ( theConf - > GetInt ( " Options/UseBackground " , 2 ) ) ) ;
ui . chkLargeIcons - > setCheckState ( CSettingsWindow__Int2Chk ( theConf - > GetInt ( " Options/LargeIcons " , 2 ) ) ) ;
ui . chkNoIcons - > setCheckState ( CSettingsWindow__Int2Chk ( theConf - > GetInt ( " Options/NoIcons " , 2 ) ) ) ;
2022-07-09 23:06:11 +01:00
ui . chkOptTree - > setCheckState ( CSettingsWindow__Int2Chk ( theConf - > GetInt ( " Options/OptionTree " , 2 ) ) ) ;
2022-09-29 17:28:48 +01:00
ui . chkNewLayout - > setCheckState ( CSettingsWindow__Int2Chk ( theConf - > GetInt ( " Options/NewConfigLayout " , 2 ) ) ) ;
2022-07-10 17:28:10 +01:00
ui . chkColorIcons - > setChecked ( theConf - > GetBool ( " Options/ColorBoxIcons " , false ) ) ;
2023-04-29 10:55:43 +01:00
ui . chkOverlayIcons - > setChecked ( theConf - > GetBool ( " Options/UseOverlayIcons " , true ) ) ;
2023-07-06 20:12:22 +01:00
ui . chkHideCore - > setChecked ( theConf - > GetBool ( " Options/HideSbieProcesses " , false ) ) ;
2022-07-09 10:46:07 +01:00
2022-07-20 19:54:09 +01:00
//ui.cmbFontScale->setCurrentIndex(ui.cmbFontScale->findData(theConf->GetInt("Options/FontScaling", 100)));
ui . cmbFontScale - > setCurrentText ( QString : : number ( theConf - > GetInt ( " Options/FontScaling " , 100 ) ) ) ;
2024-04-20 13:32:15 +01:00
ui . chkHide - > setChecked ( theConf - > GetBool ( " Options/CoverWindows " , false ) ) ;
2021-10-16 16:19:51 +01:00
2023-07-20 18:46:18 +01:00
ui . txtEditor - > setText ( theConf - > GetString ( " Options/Editor " , " notepad.exe " ) ) ;
2022-12-15 13:06:58 +00:00
ui . chkSilentMode - > setChecked ( theConf - > GetBool ( " Options/CheckSilentMode " , true ) ) ;
2023-04-13 18:46:51 +01:00
ui . chkCopyProgress - > setChecked ( theConf - > GetBool ( " Options/ShowMigrationProgress " , true ) ) ;
ui . chkNoMessages - > setChecked ( ! theConf - > GetBool ( " Options/ShowNotifications " , true ) ) ;
2021-10-16 16:19:51 +01:00
ui . chkSandboxUrls - > setCheckState ( CSettingsWindow__Int2Chk ( theConf - > GetInt ( " Options/OpenUrlsSandboxed " , 2 ) ) ) ;
2024-08-26 12:50:33 +01:00
ui . chkAutoTerminate - > setChecked ( theConf - > GetBool ( " Options/TerminateWhenExit " ) ) ;
2021-10-16 16:19:51 +01:00
ui . chkShowRecovery - > setChecked ( theConf - > GetBool ( " Options/ShowRecovery " , false ) ) ;
2024-03-02 12:31:13 +00:00
ui . chkCheckDelete - > setChecked ( theConf - > GetBool ( " Options/CleanUpOnStart " , false ) ) ;
2021-10-16 16:19:51 +01:00
ui . chkNotifyRecovery - > setChecked ( ! theConf - > GetBool ( " Options/InstantRecovery " , true ) ) ;
2022-07-29 09:24:32 +01:00
ui . chkRecoveryTop - > setChecked ( theConf - > GetBool ( " Options/RecoveryOnTop " , true ) ) ;
2022-02-13 11:55:52 +00:00
ui . chkAsyncBoxOps - > setChecked ( theConf - > GetBool ( " Options/UseAsyncBoxOps " , false ) ) ;
2021-10-16 16:19:51 +01:00
ui . chkPanic - > setChecked ( theConf - > GetBool ( " Options/EnablePanicKey " , false ) ) ;
2021-11-13 12:09:32 +00:00
ui . keyPanic - > setKeySequence ( QKeySequence ( theConf - > GetString ( " Options/PanicKeySequence " , " Shift+Pause " ) ) ) ;
2021-10-16 16:19:51 +01:00
2023-10-21 20:50:56 +01:00
ui . chkTop - > setChecked ( theConf - > GetBool ( " Options/EnableTopMostKey " , false ) ) ;
ui . keyTop - > setKeySequence ( QKeySequence ( theConf - > GetString ( " Options/TopMostKeySequence " , " Alt+Pause " ) ) ) ;
2023-10-22 12:47:36 +01:00
ui . chkPauseForce - > setChecked ( theConf - > GetBool ( " Options/EnablePauseForceKey " , false ) ) ;
ui . keyPauseForce - > setKeySequence ( QKeySequence ( theConf - > GetString ( " Options/PauseForceKeySequence " , " Ctrl+Alt+F " ) ) ) ;
2024-02-25 08:50:07 +00:00
ui . chkSuspend - > setChecked ( theConf - > GetBool ( " Options/EnableSuspendKey " , false ) ) ;
2024-03-23 11:14:25 +00:00
ui . keySuspend - > setKeySequence ( QKeySequence ( theConf - > GetString ( " Options/SuspendKeySequence " , " Shift+Alt+Pause " ) ) ) ;
2024-02-25 08:50:07 +00:00
2022-05-16 20:30:40 +01:00
ui . chkMonitorSize - > setChecked ( theConf - > GetBool ( " Options/WatchBoxSize " , false ) ) ;
2021-10-16 16:19:51 +01:00
ui . chkWatchConfig - > setChecked ( theConf - > GetBool ( " Options/WatchIni " , true ) ) ;
2024-07-21 14:45:51 +01:00
ui . chkSkipUAC - > setChecked ( SkipUacRun ( true ) ) ;
2021-10-16 16:19:51 +01:00
2022-09-29 17:28:48 +01:00
ui . chkScanMenu - > setChecked ( theConf - > GetBool ( " Options/ScanStartMenu " , true ) ) ;
ui . cmbIntegrateMenu - > setCurrentIndex ( theConf - > GetInt ( " Options/IntegrateStartMenu " , 0 ) ) ;
2023-09-02 11:42:08 +01:00
ui . cmbIntegrateDesk - > setCurrentIndex ( theConf - > GetInt ( " Options/IntegrateDesktop " , 0 ) ) ;
2021-10-16 16:19:51 +01:00
ui . cmbSysTray - > setCurrentIndex ( theConf - > GetInt ( " Options/SysTrayIcon " , 1 ) ) ;
2022-02-05 14:09:53 +00:00
ui . cmbTrayBoxes - > setCurrentIndex ( theConf - > GetInt ( " Options/SysTrayFilter " , 0 ) ) ;
2022-07-10 17:28:10 +01:00
ui . chkCompactTray - > setChecked ( theConf - > GetBool ( " Options/CompactTray " , false ) ) ;
2022-02-13 11:55:52 +00:00
ui . chkBoxOpsNotify - > setChecked ( theConf - > GetBool ( " Options/AutoBoxOpsNotify " , false ) ) ;
2023-09-02 09:50:25 +01:00
ui . cmbOnClose - > setCurrentIndex ( ui . cmbOnClose - > findData ( theConf - > GetString ( " Options/OnClose " , " ToTray " ) ) ) ;
ui . chkMinimize - > setChecked ( theConf - > GetBool ( " Options/MinimizeToTray " , false ) ) ;
ui . chkSingleShow - > setChecked ( theConf - > GetBool ( " Options/TraySingleClick " , false ) ) ;
2021-10-16 16:19:51 +01:00
2024-05-07 18:44:32 +01:00
//ui.chkForceExplorerChild->setChecked(strcmp(theAPI->GetGlobalSettings()->GetText("ForceExplorerChild").toStdString().c_str(), theAPI->GetGlobalSettings()->GetText("DefaultBox").toStdString().c_str())==0);
2023-07-01 17:54:53 +01:00
OnLoadAddon ( ) ;
2021-10-16 16:19:51 +01:00
2023-08-24 17:39:00 +01:00
bool bImDiskReady = theGUI - > IsImDiskReady ( ) ;
ui . lblImDisk - > setVisible ( ! bImDiskReady ) ;
2021-10-16 16:19:51 +01:00
if ( theAPI - > IsConnected ( ) )
{
2023-04-13 18:46:51 +01:00
ui . treeMessages - > clear ( ) ;
foreach ( const QString & Value , theAPI - > GetUserSettings ( ) - > GetTextList ( " SbieCtrl_HideMessage " , false ) )
{
StrPair NameIcon = Split2 ( Value , " , " ) ;
AddMessageItem ( NameIcon . first , NameIcon . second ) ;
}
m_MessagesChanged = false ;
2022-11-29 17:26:51 +00:00
ui . treeRun - > clear ( ) ;
foreach ( const QString & Value , theAPI - > GetGlobalSettings ( ) - > GetTextList ( " RunCommand " , false ) )
2023-07-19 20:15:18 +01:00
AddRunItem ( ui . treeRun , GetRunEntry ( Value ) ) ;
2023-04-13 18:46:51 +01:00
m_RunChanged = false ;
2022-12-23 06:29:35 +00:00
ui . cmbDefault - > clear ( ) ;
foreach ( const CSandBoxPtr & pBox , theAPI - > GetAllBoxes ( ) )
ui . cmbDefault - > addItem ( pBox - > GetName ( ) . replace ( " _ " , " " ) , pBox - > GetName ( ) ) ;
2022-12-07 10:50:33 +00:00
int pos = ui . cmbDefault - > findData ( theAPI - > GetGlobalSettings ( ) - > GetText ( " DefaultBox " , " DefaultBox " ) ) ;
if ( pos = = - 1 )
pos = ui . cmbDefault - > findData ( " DefaultBox " ) ;
ui . cmbDefault - > setCurrentIndex ( pos ) ;
2021-10-16 16:19:51 +01:00
QString FileRootPath_Default = " \\ ?? \\ %SystemDrive% \\ Sandbox \\ %USER% \\ %SANDBOX% " ;
QString KeyRootPath_Default = " \\ REGISTRY \\ USER \\ Sandbox_%USER%_%SANDBOX% " ;
QString IpcRootPath_Default = " \\ Sandbox \\ %USER% \\ %SANDBOX% \\ Session_%SESSION% " ;
ui . fileRoot - > setText ( theAPI - > GetGlobalSettings ( ) - > GetText ( " FileRootPath " , FileRootPath_Default ) ) ;
2023-01-25 11:54:41 +00:00
//ui.chkSeparateUserFolders->setChecked(theAPI->GetGlobalSettings()->GetBool("SeparateUserFolders", true));
2021-10-16 16:19:51 +01:00
ui . regRoot - > setText ( theAPI - > GetGlobalSettings ( ) - > GetText ( " KeyRootPath " , KeyRootPath_Default ) ) ;
ui . ipcRoot - > setText ( theAPI - > GetGlobalSettings ( ) - > GetText ( " IpcRootPath " , IpcRootPath_Default ) ) ;
2023-08-24 17:39:00 +01:00
ui . chkRamDisk - > setEnabled ( bImDiskReady ) ;
quint32 uDiskLimit = theAPI - > GetGlobalSettings ( ) - > GetNum64 ( " RamDiskSizeKb " ) ;
ui . chkRamDisk - > setChecked ( uDiskLimit > 0 ) ;
if ( uDiskLimit > 0 ) ui . txtRamLimit - > setText ( QString : : number ( uDiskLimit ) ) ;
2023-08-27 11:34:06 +01:00
QString RamLetter = theAPI - > GetGlobalSettings ( ) - > GetText ( " RamDiskLetter " ) ;
ui . chkRamLetter - > setChecked ( ! RamLetter . isEmpty ( ) ) ;
2024-04-13 18:12:40 +01:00
ui . cmbRamLetter - > setCurrentIndex ( ui . cmbRamLetter - > findText ( RamLetter ) ) ;
2023-08-24 17:39:00 +01:00
m_HoldChange = true ;
OnRamDiskChange ( ) ;
m_HoldChange = false ;
2021-10-16 16:19:51 +01:00
ui . chkWFP - > setChecked ( theAPI - > GetGlobalSettings ( ) - > GetBool ( " NetworkEnableWFP " , false ) ) ;
2022-02-13 11:55:52 +00:00
ui . chkObjCb - > setChecked ( theAPI - > GetGlobalSettings ( ) - > GetBool ( " EnableObjectFiltering " , true ) ) ;
2021-12-21 13:57:27 +00:00
ui . chkWin32k - > setChecked ( theAPI - > GetGlobalSettings ( ) - > GetBool ( " EnableWin32kHooks " , true ) ) ;
2022-07-28 07:40:57 +01:00
ui . chkSbieLogon - > setChecked ( theAPI - > GetGlobalSettings ( ) - > GetBool ( " SandboxieLogon " , false ) ) ;
2024-05-22 16:52:32 +01:00
ui . chkSbieAll - > setChecked ( theAPI - > GetGlobalSettings ( ) - > GetBool ( " SandboxieAllGroup " , false ) ) ;
2021-10-16 16:19:51 +01:00
ui . chkAdminOnly - > setChecked ( theAPI - > GetGlobalSettings ( ) - > GetBool ( " EditAdminOnly " , false ) ) ;
2022-09-02 10:04:49 +01:00
ui . chkAdminOnly - > setEnabled ( IsAdminUser ( ) ) ;
2021-10-16 16:19:51 +01:00
ui . chkPassRequired - > setChecked ( ! theAPI - > GetGlobalSettings ( ) - > GetText ( " EditPassword " , " " ) . isEmpty ( ) ) ;
ui . chkAdminOnlyFP - > setChecked ( theAPI - > GetGlobalSettings ( ) - > GetBool ( " ForceDisableAdminOnly " , false ) ) ;
ui . chkClearPass - > setChecked ( theAPI - > GetGlobalSettings ( ) - > GetBool ( " ForgetPassword " , false ) ) ;
2023-04-13 18:46:51 +01:00
m_HoldChange = true ;
OnProtectionChange ( ) ;
m_HoldChange = false ;
m_GeneralChanged = false ;
2021-10-16 16:19:51 +01:00
ui . chkStartBlock - > setChecked ( theAPI - > GetGlobalSettings ( ) - > GetBool ( " StartRunAlertDenied " , false ) ) ;
2022-11-20 16:23:15 +00:00
ui . chkStartBlockMsg - > setChecked ( theAPI - > GetGlobalSettings ( ) - > GetBool ( " AlertStartRunAccessDenied " , true ) ) ;
2022-09-29 17:28:48 +01:00
ui . chkNotForcedMsg - > setChecked ( theAPI - > GetGlobalSettings ( ) - > GetBool ( " NotifyForceProcessDisabled " , false ) ) ;
2023-04-13 18:46:51 +01:00
2021-10-16 16:19:51 +01:00
ui . treeWarnProgs - > clear ( ) ;
foreach ( const QString & Value , theAPI - > GetGlobalSettings ( ) - > GetTextList ( " AlertProcess " , false ) )
AddWarnEntry ( Value , 1 ) ;
foreach ( const QString & Value , theAPI - > GetGlobalSettings ( ) - > GetTextList ( " AlertFolder " , false ) )
AddWarnEntry ( Value , 2 ) ;
2023-04-13 18:46:51 +01:00
m_WarnProgsChanged = false ;
2023-10-19 17:34:09 +01:00
ui . chkSandboxUsb - > setChecked ( theAPI - > GetGlobalSettings ( ) - > GetBool ( " ForceUsbDrives " , false ) ) ;
ui . cmbUsbSandbox - > clear ( ) ;
foreach ( const CSandBoxPtr & pBox , theAPI - > GetAllBoxes ( ) )
ui . cmbUsbSandbox - > addItem ( pBox - > GetName ( ) . replace ( " _ " , " " ) ) ;
ui . cmbUsbSandbox - > setCurrentText ( theAPI - > GetGlobalSettings ( ) - > GetText ( " UsbSandbox " , " USB_Box " ) . replace ( " _ " , " " ) ) ;
2023-10-26 10:07:00 +01:00
ui . cmbUsbSandbox - > setEnabled ( ui . chkSandboxUsb - > isChecked ( ) & & g_CertInfo . active ) ;
ui . treeVolumes - > setEnabled ( ui . chkSandboxUsb - > isChecked ( ) & & g_CertInfo . active ) ;
2023-10-19 17:34:09 +01:00
UpdateDrives ( ) ;
m_VolumeChanged = false ;
2021-10-16 16:19:51 +01:00
}
2022-09-02 10:04:49 +01:00
if ( ! theAPI - > IsConnected ( ) | | ( theAPI - > GetGlobalSettings ( ) - > GetBool ( " EditAdminOnly " , false ) & & ! IsAdminUser ( ) ) )
2021-10-16 16:19:51 +01:00
{
2022-12-07 10:50:33 +00:00
ui . cmbDefault - > setEnabled ( false ) ;
2021-10-16 16:19:51 +01:00
ui . fileRoot - > setEnabled ( false ) ;
2023-01-25 11:54:41 +00:00
//ui.chkSeparateUserFolders->setEnabled(false);
2022-01-14 17:58:25 +00:00
ui . chkAutoRoot - > setEnabled ( false ) ;
2021-10-16 16:19:51 +01:00
ui . chkWFP - > setEnabled ( false ) ;
2021-11-13 08:28:32 +00:00
ui . chkObjCb - > setEnabled ( false ) ;
2021-12-10 21:59:19 +00:00
ui . chkWin32k - > setEnabled ( false ) ;
2022-07-09 10:46:07 +01:00
ui . chkSbieLogon - > setEnabled ( false ) ;
2024-05-24 22:28:18 +01:00
ui . chkSbieAll - > setEnabled ( false ) ;
2021-10-16 16:19:51 +01:00
ui . regRoot - > setEnabled ( false ) ;
ui . ipcRoot - > setEnabled ( false ) ;
2023-08-24 17:39:00 +01:00
ui . chkRamDisk - > setEnabled ( false ) ;
ui . txtRamLimit - > setEnabled ( false ) ;
ui . lblRamLimit - > setEnabled ( false ) ;
2021-10-16 16:19:51 +01:00
ui . chkAdminOnly - > setEnabled ( false ) ;
ui . chkPassRequired - > setEnabled ( false ) ;
ui . chkAdminOnlyFP - > setEnabled ( false ) ;
ui . chkClearPass - > setEnabled ( false ) ;
ui . btnSetPassword - > setEnabled ( false ) ;
ui . treeWarnProgs - > setEnabled ( false ) ;
ui . btnAddWarnProg - > setEnabled ( false ) ;
ui . btnDelWarnProg - > setEnabled ( false ) ;
2023-10-19 17:34:09 +01:00
ui . chkSandboxUsb - > setEnabled ( false ) ;
ui . cmbUsbSandbox - > setEnabled ( false ) ;
ui . treeVolumes - > setEnabled ( false ) ;
2021-10-16 16:19:51 +01:00
ui . treeCompat - > setEnabled ( false ) ;
ui . btnAddCompat - > setEnabled ( false ) ;
ui . btnDelCompat - > setEnabled ( false ) ;
2023-04-13 18:46:51 +01:00
ui . treeTemplates - > setEnabled ( false ) ;
ui . btnAddTemplate - > setEnabled ( false ) ;
ui . btnDelTemplate - > setEnabled ( false ) ;
2022-09-02 10:04:49 +01:00
ui . btnEditIni - > setEnabled ( false ) ;
2021-10-16 16:19:51 +01:00
}
2023-04-13 18:46:51 +01:00
if ( theGUI - > IsFullyPortable ( ) ) {
2022-01-14 13:06:01 +00:00
ui . chkAutoRoot - > setCheckState ( CSettingsWindow__Int2Chk ( theConf - > GetInt ( " Options/PortableRootDir " , 2 ) ) ) ;
2023-04-13 18:46:51 +01:00
m_HoldChange = true ;
OnRootChanged ( ) ;
m_HoldChange = false ;
}
2021-10-16 16:19:51 +01:00
else
ui . chkAutoRoot - > setVisible ( false ) ;
2022-01-13 22:52:58 +00:00
UpdateCert ( ) ;
2023-07-01 17:54:53 +01:00
ui . chkNoCheck - > setChecked ( theConf - > GetBool ( " Options/NoSupportCheck " , false ) ) ;
if ( ui . chkNoCheck - > isCheckable ( ) & & ! g_CertInfo . expired )
ui . chkNoCheck - > setVisible ( false ) ; // hide if not relevant
2022-01-13 22:52:58 +00:00
ui . chkAutoUpdate - > setCheckState ( CSettingsWindow__Int2Chk ( theConf - > GetInt ( " Options/CheckForUpdates " , 2 ) ) ) ;
2023-07-02 09:22:38 +01:00
int UpdateInterval = theConf - > GetInt ( " Options/UpdateInterval " , UPDATE_INTERVAL ) ;
int pos = ui . cmbInterval - > findData ( UpdateInterval ) ;
if ( pos = = - 1 )
ui . cmbInterval - > setCurrentText ( QString : : number ( UpdateInterval ) ) ;
else
ui . cmbInterval - > setCurrentIndex ( pos ) ;
2022-11-20 16:23:15 +00:00
QString ReleaseChannel = theConf - > GetString ( " Options/ReleaseChannel " , " stable " ) ;
ui . radStable - > setChecked ( ReleaseChannel = = " stable " ) ;
ui . radPreview - > setChecked ( ReleaseChannel = = " preview " ) ;
2023-07-01 17:54:53 +01:00
ui . radInsider - > setChecked ( ReleaseChannel = = " insider " ) ;
2022-11-20 16:23:15 +00:00
2023-04-13 18:46:51 +01:00
m_HoldChange = true ;
2022-11-20 16:23:15 +00:00
UpdateUpdater ( ) ;
2023-04-13 18:46:51 +01:00
m_HoldChange = false ;
2022-11-20 16:23:15 +00:00
2022-12-03 19:25:04 +00:00
ui . cmbUpdate - > setCurrentIndex ( ui . cmbUpdate - > findData ( theConf - > GetString ( " Options/OnNewUpdate " , " ignore " ) ) ) ;
2022-11-20 16:23:15 +00:00
ui . cmbRelease - > setCurrentIndex ( ui . cmbRelease - > findData ( theConf - > GetString ( " Options/OnNewRelease " , " download " ) ) ) ;
2023-07-01 17:54:53 +01:00
//ui.chkUpdateTemplates->setCheckState(CSettingsWindow__Int2Chk(theConf->GetInt("Options/CheckForTemplates", 2)));
ui . chkUpdateAddons - > setCheckState ( CSettingsWindow__Int2Chk ( theConf - > GetInt ( " Options/CheckForAddons " , 2 ) ) ) ;
ui . chkUpdateIssues - > setCheckState ( CSettingsWindow__Int2Chk ( theConf - > GetInt ( " Options/CheckForIssues " , 2 ) ) ) ;
2022-08-09 17:19:46 +01:00
2023-07-11 21:35:59 +01:00
//ui.chkUpdateTemplates->setEnabled(g_CertInfo.active && !g_CertInfo.expired);
ui . chkUpdateIssues - > setEnabled ( g_CertInfo . active & & ! g_CertInfo . expired ) ;
2022-01-13 22:52:58 +00:00
}
2023-08-24 17:39:00 +01:00
void CSettingsWindow : : OnRamDiskChange ( )
{
2023-08-27 11:34:06 +01:00
if ( sender ( ) = = ui . chkRamDisk ) {
if ( ui . chkRamDisk - > isChecked ( ) )
2024-07-28 15:16:07 +01:00
theGUI - > CheckCertificate ( this ) ;
2023-08-27 11:34:06 +01:00
}
2023-08-24 17:39:00 +01:00
if ( ui . chkRamDisk - > isChecked ( ) & & ui . txtRamLimit - > text ( ) . isEmpty ( ) )
ui . txtRamLimit - > setText ( QString : : number ( 2 * 1024 * 1024 ) ) ;
bool bEnabled = ui . chkRamDisk - > isChecked ( ) & & ui . chkRamDisk - > isEnabled ( ) ;
ui . lblRamDisk - > setEnabled ( bEnabled ) ;
ui . txtRamLimit - > setEnabled ( bEnabled ) ;
ui . lblRamLimit - > setEnabled ( bEnabled ) ;
ui . lblRamLimit - > setText ( tr ( " kilobytes (%1) " ) . arg ( FormatSize ( ui . txtRamLimit - > text ( ) . toULongLong ( ) * 1024 ) ) ) ;
2023-08-27 11:34:06 +01:00
ui . chkRamLetter - > setEnabled ( bEnabled ) ;
ui . cmbRamLetter - > setEnabled ( bEnabled & & ui . chkRamLetter - > isChecked ( ) ) ;
ui . lblRamLetter - > setEnabled ( bEnabled & & ui . chkRamLetter - > isChecked ( ) ) ;
2023-08-24 17:39:00 +01:00
OnGeneralChanged ( ) ;
}
2023-10-19 17:34:09 +01:00
void CSettingsWindow : : OnVolumeChanged ( )
{
2023-10-26 08:32:03 +01:00
if ( sender ( ) = = ui . chkSandboxUsb ) {
if ( ui . chkSandboxUsb - > isChecked ( ) )
2024-07-28 15:16:07 +01:00
theGUI - > CheckCertificate ( this ) ;
2023-10-26 08:32:03 +01:00
}
2023-10-26 09:33:53 +01:00
ui . cmbUsbSandbox - > setEnabled ( ui . chkSandboxUsb - > isChecked ( ) & & g_CertInfo . active ) ;
ui . treeVolumes - > setEnabled ( ui . chkSandboxUsb - > isChecked ( ) & & g_CertInfo . active ) ;
if ( ! g_CertInfo . active )
return ;
2023-10-19 17:34:09 +01:00
m_VolumeChanged = true ;
OnOptChanged ( ) ;
}
void CSettingsWindow : : UpdateDrives ( )
{
if ( ! theAPI - > IsConnected ( ) )
return ;
ui . treeVolumes - > clear ( ) ;
QStringList DisabledForceVolume = theAPI - > GetGlobalSettings ( ) - > GetTextList ( " DisabledForceVolume " , false ) ;
auto volumes = ListAllVolumes ( ) ;
auto drives = ListAllDrives ( ) ;
for ( auto I = volumes . begin ( ) ; I ! = volumes . end ( ) ; + + I ) {
QStringList Devices ;
bool bOnUSB = false ;
for ( auto J = I - > disks . begin ( ) ; J ! = I - > disks . end ( ) ; + + J ) {
SDriveInfo & info = drives [ J - > deviceName ] ;
if ( info . Enum = = L " USBSTOR " )
bOnUSB = true ;
Devices . append ( QString : : fromStdWString ( info . Name ) ) ;
}
if ( bOnUSB ) {
QTreeWidgetItem * pItem = new QTreeWidgetItem ( ) ;
ui . treeVolumes - > addTopLevelItem ( pItem ) ;
QString Info = Devices . join ( " | " ) ;
QStringList Mounts ;
for ( auto J = I - > mountPoints . begin ( ) ; J ! = I - > mountPoints . end ( ) ; + + J )
Mounts . append ( QString : : fromStdWString ( * J ) ) ;
Info + = " ( " + Mounts . join ( " , " ) + " ) " ;
std : : wstring label ;
quint32 sn = CSbieAPI : : GetVolumeSN ( I - > deviceName . c_str ( ) , & label ) ;
QString SN = QString ( " %1-%2 " ) . arg ( ( ushort ) HIWORD ( sn ) , 4 , 16 , QChar ( ' 0 ' ) ) . arg ( ( ushort ) LOWORD ( sn ) , 4 , 16 , QChar ( ' 0 ' ) ) . toUpper ( ) ;
if ( ! label . empty ( ) )
Info + = " [ " + QString : : fromStdWString ( label ) + " ] " ;
pItem - > setText ( 0 , SN ) ;
if ( DisabledForceVolume . removeAll ( SN ) )
pItem - > setCheckState ( 0 , Qt : : Unchecked ) ;
else
pItem - > setCheckState ( 0 , Qt : : Checked ) ;
pItem - > setText ( 1 , Info ) ;
}
}
foreach ( const QString & SN , DisabledForceVolume ) {
QTreeWidgetItem * pItem = new QTreeWidgetItem ( ) ;
ui . treeVolumes - > addTopLevelItem ( pItem ) ;
pItem - > setText ( 0 , SN ) ;
pItem - > setCheckState ( 0 , Qt : : Unchecked ) ;
pItem - > setText ( 1 , tr ( " Volume not attached " ) ) ;
}
}
//void ScanForSeats();
//int CountSeats();
2022-01-13 22:52:58 +00:00
void CSettingsWindow : : UpdateCert ( )
{
2021-10-16 16:19:51 +01:00
ui . lblCertExp - > setVisible ( false ) ;
2024-08-25 09:36:29 +01:00
int EvalCount = theConf - > GetInt ( " User/EvalCount " , 0 ) ;
if ( EvalCount > = EVAL_MAX )
ui . lblCert - > setText ( tr ( " <b>You have used %1/%2 evaluation certificates. No more free certificates can be generated.</b> " ) . arg ( EvalCount ) . arg ( EVAL_MAX ) ) ;
else
ui . lblCert - > setText ( tr ( " <b><a href= \" _ \" >Get a free evaluation certificate</a> and enjoy all premium features for %1 days.</b> " ) . arg ( EVAL_DAYS ) ) ;
2024-08-27 14:36:54 +01:00
ui . lblCert - > setToolTip ( tr ( " You can request a free %1-day evaluation certificate up to %2 times per hardware ID. " ) . arg ( EVAL_DAYS ) . arg ( EVAL_MAX ) ) ;
2024-08-25 09:36:29 +01:00
2023-08-15 08:49:03 +01:00
//ui.lblCertLevel->setVisible(!g_Certificate.isEmpty());
2023-08-24 17:39:00 +01:00
if ( ! g_Certificate . isEmpty ( ) )
2021-10-16 16:19:51 +01:00
{
ui . txtCertificate - > setPlainText ( g_Certificate ) ;
//ui.lblSupport->setVisible(false);
QPalette palette = QApplication : : palette ( ) ;
if ( theGUI - > m_DarkTheme )
palette . setColor ( QPalette : : Text , Qt : : black ) ;
2023-01-23 21:48:51 +00:00
if ( g_CertInfo . expired ) {
2021-11-13 08:28:32 +00:00
palette . setColor ( QPalette : : Base , QColor ( 255 , 255 , 192 ) ) ;
2023-08-15 08:49:03 +01:00
QString infoMsg = tr ( " This supporter certificate has expired, please <a href= \" https://sandboxie-plus.com/go.php?to=sbie-renew-cert \" >get an updated certificate</a>. " ) ;
2023-07-11 21:35:59 +01:00
if ( g_CertInfo . active ) {
2023-01-23 21:48:51 +00:00
if ( g_CertInfo . grace_period )
2023-08-24 17:39:00 +01:00
infoMsg . append ( tr ( " <br /><font color='red'>Plus features will be disabled in %1 days.</font> " ) . arg ( ( g_CertInfo . expirers_in_sec + 30 * 60 * 60 * 24 ) / ( 60 * 60 * 24 ) ) ) ;
2023-01-23 21:48:51 +00:00
else if ( ! g_CertInfo . outdated ) // must be an expiren medium or large cert on an old build
2023-07-09 10:43:45 +01:00
infoMsg . append ( tr ( " <br /><font color='red'>For the current build Plus features remain enabled</font>, but you no longer have access to Sandboxie-Live services, including compatibility updates and the troubleshooting database. " ) ) ;
2023-08-24 17:39:00 +01:00
} else
2023-01-23 21:48:51 +00:00
infoMsg . append ( tr ( " <br />Plus features are no longer enabled. " ) ) ;
ui . lblCertExp - > setText ( infoMsg ) ;
2021-11-13 08:28:32 +00:00
ui . lblCertExp - > setVisible ( true ) ;
}
else {
2023-07-09 10:43:45 +01:00
if ( g_CertInfo . expirers_in_sec > 0 & & g_CertInfo . expirers_in_sec < ( 60 * 60 * 24 * 30 ) ) {
2023-08-24 17:39:00 +01:00
ui . lblCertExp - > setText ( tr ( " This supporter certificate will <font color='red'>expire in %1 days</font>, please <a href= \" https://sandboxie-plus.com/go.php?to=sbie-renew-cert \" >get an updated certificate</a>. " ) . arg ( g_CertInfo . expirers_in_sec / ( 60 * 60 * 24 ) ) ) ;
ui . lblCertExp - > setVisible ( true ) ;
}
/*#ifdef _DEBUG
else {
ui . lblCertExp - > setText ( tr ( " This supporter certificate is valid, <a href= \" https://sandboxie-plus.com/go.php?to=sbie-renew-cert \" >check for an updated certificate</a>. " ) ) ;
2022-08-09 17:19:46 +01:00
ui . lblCertExp - > setVisible ( true ) ;
}
2023-08-24 17:39:00 +01:00
# endif* /
2021-11-13 08:28:32 +00:00
palette . setColor ( QPalette : : Base , QColor ( 192 , 255 , 192 ) ) ;
}
2021-10-16 16:19:51 +01:00
ui . txtCertificate - > setPalette ( palette ) ;
2023-08-15 08:49:03 +01:00
//ui.lblCertLevel->setText(tr("Feature Level: %1").arg(GetCertLevel()));
//
//QStringList Infos;
//Infos += tr("Type: %1").arg(GetCertType());
//if (CERT_IS_INSIDER(g_CertInfo))
// Infos += tr("Insider release capable");
//ui.lblCertLevel->setToolTip(Infos.join("\n"));
//if (CERT_IS_TYPE(g_CertInfo, eCertBusiness)) {
// ScanForSeats();
// QTimer::singleShot(1000, this, [=]() {
// QString CntInfo = QString::number(CountSeats());
// QString Amount = GetArguments(g_Certificate, L'\n', L':').value("AMOUNT");
// if (!Amount.isEmpty())
// CntInfo += "/" + Amount;
// ui.lblCertCount->setText(CntInfo);
// ui.lblCertCount->setToolTip(tr("Count of certificates in use"));
// });
//}
2024-08-25 09:36:29 +01:00
QStringList Info ;
if ( g_CertInfo . expirers_in_sec > 0 )
2024-08-27 09:56:16 +01:00
Info . append ( tr ( " Expires in: %1 days " ) . arg ( g_CertInfo . expirers_in_sec / ( 60 * 60 * 24 ) ) ) ;
2024-08-25 09:36:29 +01:00
else if ( g_CertInfo . expirers_in_sec < 0 )
2024-09-16 17:09:31 +01:00
Info . append ( tr ( " Expired: %1 days ago " ) . arg ( - g_CertInfo . expirers_in_sec / ( 60 * 60 * 24 ) ) ) ;
2024-08-25 09:36:29 +01:00
QStringList Options ;
if ( g_CertInfo . opt_sec ) Options . append ( " SBox " ) ;
else Options . append ( QString ( " <font color='gray'>SBox</font> " ) ) ;
if ( g_CertInfo . opt_enc ) Options . append ( " EBox " ) ;
else Options . append ( QString ( " <font color='gray'>EBox</font> " ) ) ;
if ( g_CertInfo . opt_net ) Options . append ( " NetI " ) ;
else Options . append ( QString ( " <font color='gray'>NetI</font> " ) ) ;
if ( g_CertInfo . opt_desk ) Options . append ( " Desk " ) ;
else Options . append ( QString ( " <font color='gray'>Desk</font> " ) ) ;
Info . append ( tr ( " Options: %1 " ) . arg ( Options . join ( " , " ) ) ) ;
ui . lblCert - > setText ( Info . join ( " <br /> " ) ) ;
QStringList OptionsEx ;
OptionsEx . append ( tr ( " Security/Privacy Enhanced & App Boxes (SBox): %1 " ) . arg ( g_CertInfo . opt_sec ? tr ( " Enabled " ) : tr ( " Disabled " ) ) ) ;
OptionsEx . append ( tr ( " Encrypted Sandboxes (EBox): %1 " ) . arg ( g_CertInfo . opt_enc ? tr ( " Enabled " ) : tr ( " Disabled " ) ) ) ;
OptionsEx . append ( tr ( " Network Interception (NetI): %1 " ) . arg ( g_CertInfo . opt_net ? tr ( " Enabled " ) : tr ( " Disabled " ) ) ) ;
OptionsEx . append ( tr ( " Sandboxie Desktop (Desk): %1 " ) . arg ( g_CertInfo . opt_desk ? tr ( " Enabled " ) : tr ( " Disabled " ) ) ) ;
ui . lblCert - > setToolTip ( OptionsEx . join ( " \n " ) ) ;
2021-10-16 16:19:51 +01:00
}
2023-04-13 18:46:51 +01:00
2023-07-11 21:35:59 +01:00
ui . radInsider - > setEnabled ( CERT_IS_INSIDER ( g_CertInfo ) ) ;
2021-10-16 16:19:51 +01:00
}
2023-08-15 08:49:03 +01:00
void CSettingsWindow : : OnGetCert ( )
{
2024-04-08 18:24:26 +01:00
QByteArray Certificate = ui . txtCertificate - > toPlainText ( ) . toUtf8 ( ) ;
QString Serial = ui . txtSerial - > text ( ) ;
QString Message ;
2024-04-14 11:30:27 +01:00
if ( Serial . length ( ) < 4 | | Serial . left ( 4 ) . compare ( " SBIE " , Qt : : CaseInsensitive ) ! = 0 ) {
Message = tr ( " This does not look like a Sandboxie-Plus Serial Number.<br /> "
" If you have attempted to enter the UpdateKey or the Signature from a certificate, "
" that is not correct, please enter the entire certificate into the text area above instead. " ) ;
}
2024-04-19 20:31:18 +01:00
else if ( Certificate . isEmpty ( ) )
{
if ( Serial . length ( ) > 5 & & Serial . at ( 4 ) . toUpper ( ) = = ' U ' ) {
Message = tr ( " You are attempting to use a feature Upgrade-Key without having entered a pre-existing supporter certificate. "
" Please note that this type of key (<b>as it is clearly stated in bold on the website</b) requires you to have a pre-existing valid supporter certificate; it is useless without one. "
" <br />If you want to use the advanced features, you need to obtain both a standard certificate and the feature upgrade key to unlock advanced functionality. " ) ;
}
2024-04-14 11:30:27 +01:00
2024-04-19 20:31:18 +01:00
else if ( Serial . length ( ) > 5 & & Serial . at ( 4 ) . toUpper ( ) = = ' R ' ) {
Message = tr ( " You are attempting to use a Renew-Key without having entered a pre-existing supporter certificate. "
" Please note that this type of key (<b>as it is clearly stated in bold on the website</b) requires you to have a pre-existing valid supporter certificate; it is useless without one. " ) ;
}
2024-04-08 18:24:26 +01:00
2024-04-19 20:31:18 +01:00
if ( ! Message . isEmpty ( ) )
Message + = tr ( " <br /><br /><u>If you have not read the product description and obtained this key by mistake, please contact us via email (provided on our website) to resolve this issue.</u> " ) ;
2024-04-08 18:24:26 +01:00
}
2024-04-19 20:31:18 +01:00
2024-04-08 18:24:26 +01:00
if ( ! Message . isEmpty ( ) ) {
CSandMan : : ShowMessageBox ( this , QMessageBox : : Critical , Message ) ;
return ;
}
QVariantMap Params ;
if ( ! Certificate . isEmpty ( ) )
Params [ " key " ] = GetArguments ( Certificate , L ' \n ' , L ' : ' ) . value ( " UPDATEKEY " ) ;
SB_PROGRESS Status = theGUI - > m_pUpdater - > GetSupportCert ( Serial , this , SLOT ( OnCertData ( const QByteArray & , const QVariantMap & ) ) , Params ) ;
2023-08-15 08:49:03 +01:00
if ( Status . GetStatus ( ) = = OP_ASYNC ) {
theGUI - > AddAsyncOp ( Status . GetValue ( ) ) ;
2023-10-21 13:10:45 +01:00
Status . GetValue ( ) - > ShowMessage ( tr ( " Retrieving certificate... " ) ) ;
2023-08-15 08:49:03 +01:00
}
}
2024-08-25 09:36:29 +01:00
void CSettingsWindow : : OnStartEval ( )
{
StartEval ( this , this , SLOT ( OnCertData ( const QByteArray & , const QVariantMap & ) ) ) ;
}
void CSettingsWindow : : StartEval ( QWidget * parent , QObject * receiver , const char * member )
{
QString Name = theConf - > GetString ( " User/Name " , qgetenv ( " USERNAME " ) ) ;
QString eMail = QInputDialog : : getText ( parent , tr ( " Sandboxie-Plus - Get EVALUATION Certificate " ) , tr ( " Please enter your email address to receive a free %1-day evaluation certificate, which will be issued to %2 and locked to the current hardware. \n "
" You can request up to %3 evaluation certificates for each unique hardware ID. " ) . arg ( EVAL_DAYS ) . arg ( Name ) . arg ( EVAL_MAX ) , QLineEdit : : Normal , theConf - > GetString ( " User/eMail " ) ) ;
if ( eMail . isEmpty ( ) ) return ;
theConf - > SetValue ( " User/eMail " , eMail ) ;
QVariantMap Params ;
Params [ " eMail " ] = eMail ;
Params [ " Name " ] = Name ;
SB_PROGRESS Status = theGUI - > m_pUpdater - > GetSupportCert ( " " , receiver , member , Params ) ;
if ( Status . GetStatus ( ) = = OP_ASYNC ) {
theGUI - > AddAsyncOp ( Status . GetValue ( ) ) ;
Status . GetValue ( ) - > ShowMessage ( tr ( " Retrieving certificate... " ) ) ;
}
}
2023-08-15 08:49:03 +01:00
void CSettingsWindow : : OnCertData ( const QByteArray & Certificate , const QVariantMap & Params )
{
2024-04-08 18:24:26 +01:00
if ( Certificate . isEmpty ( ) )
{
QString Error = Params [ " error " ] . toString ( ) ;
qDebug ( ) < < Error ;
2024-08-25 09:36:29 +01:00
if ( Error = = " max eval reached " ) {
if ( theConf - > GetInt ( " User/EvalCount " , 0 ) < EVAL_MAX )
theConf - > SetValue ( " User/EvalCount " , EVAL_MAX ) ;
}
2024-04-09 16:06:20 +01:00
QString Message = tr ( " Error retrieving certificate: %1 " ) . arg ( Error . isEmpty ( ) ? tr ( " Unknown Error (probably a network issue) " ) : Error ) ;
2024-04-08 18:24:26 +01:00
CSandMan : : ShowMessageBox ( this , QMessageBox : : Critical , Message ) ;
return ;
}
2023-08-15 08:49:03 +01:00
ui . txtCertificate - > setPlainText ( Certificate ) ;
ApplyCert ( ) ;
}
void CSettingsWindow : : ApplyCert ( )
{
if ( ! theAPI - > IsConnected ( ) )
return ;
QByteArray Certificate = ui . txtCertificate - > toPlainText ( ) . toUtf8 ( ) ;
if ( g_Certificate ! = Certificate ) {
QPalette palette = QApplication : : palette ( ) ;
if ( theGUI - > m_DarkTheme )
palette . setColor ( QPalette : : Text , Qt : : black ) ;
ui . lblCertExp - > setVisible ( false ) ;
bool bRet = ApplyCertificate ( Certificate , this ) ;
2024-08-25 09:36:29 +01:00
if ( bRet & & CERT_IS_TYPE ( g_CertInfo , eCertEvaluation ) ) {
int EvalCount = theConf - > GetInt ( " User/EvalCount " , 0 ) ;
EvalCount + + ;
theConf - > SetValue ( " User/EvalCount " , EvalCount ) ;
}
2023-08-15 08:49:03 +01:00
if ( Certificate . isEmpty ( ) )
palette . setColor ( QPalette : : Base , Qt : : white ) ;
else if ( ! bRet )
palette . setColor ( QPalette : : Base , QColor ( 255 , 192 , 192 ) ) ;
else
palette . setColor ( QPalette : : Base , QColor ( 192 , 255 , 192 ) ) ;
ui . txtCertificate - > setPalette ( palette ) ;
}
m_CertChanged = false ;
}
QString CSettingsWindow : : GetCertType ( )
{
QString CertType ;
if ( CERT_IS_TYPE ( g_CertInfo , eCertContributor ) )
CertType = tr ( " Contributor " ) ;
else if ( CERT_IS_TYPE ( g_CertInfo , eCertEternal ) )
CertType = tr ( " Eternal " ) ;
else if ( CERT_IS_TYPE ( g_CertInfo , eCertBusiness ) )
CertType = tr ( " Business " ) ;
else if ( CERT_IS_TYPE ( g_CertInfo , eCertPersonal ) )
CertType = tr ( " Personal " ) ;
else if ( g_CertInfo . type = = eCertGreatPatreon )
CertType = tr ( " Great Patreon " ) ;
else if ( CERT_IS_TYPE ( g_CertInfo , eCertPatreon ) )
CertType = tr ( " Patreon " ) ;
else if ( g_CertInfo . type = = eCertFamily )
CertType = tr ( " Family " ) ;
2023-10-05 08:27:46 +01:00
else if ( CERT_IS_TYPE ( g_CertInfo , eCertHome ) )
CertType = tr ( " Home " ) ;
2023-08-15 08:49:03 +01:00
else if ( CERT_IS_TYPE ( g_CertInfo , eCertEvaluation ) )
CertType = tr ( " Evaluation " ) ;
else
CertType = tr ( " Type %1 " ) . arg ( g_CertInfo . type ) ;
return CertType ;
}
QColor CSettingsWindow : : GetCertColor ( )
{
if ( CERT_IS_TYPE ( g_CertInfo , eCertEternal ) )
return QColor ( 135 , 0 , 255 , 255 ) ;
else if ( CERT_IS_TYPE ( g_CertInfo , eCertBusiness ) )
return QColor ( 211 , 0 , 0 , 255 ) ;
else if ( CERT_IS_TYPE ( g_CertInfo , eCertPersonal ) )
return QColor ( 38 , 127 , 0 , 255 ) ;
else if ( CERT_IS_TYPE ( g_CertInfo , eCertPatreon ) )
return QColor ( 38 , 127 , 0 , 255 ) ;
else if ( g_CertInfo . type = = eCertFamily )
return QColor ( 0 , 38 , 255 , 255 ) ;
2023-10-05 08:27:46 +01:00
else if ( CERT_IS_TYPE ( g_CertInfo , eCertHome ) )
2023-08-15 08:49:03 +01:00
return QColor ( 255 , 106 , 0 , 255 ) ;
else if ( CERT_IS_TYPE ( g_CertInfo , eCertEvaluation ) )
return Qt : : gray ;
else
return Qt : : black ;
}
QString CSettingsWindow : : GetCertLevel ( )
{
QString CertLevel ;
2023-08-31 19:29:15 +01:00
if ( g_CertInfo . level = = eCertAdvanced )
2023-08-15 08:49:03 +01:00
CertLevel = tr ( " Advanced " ) ;
2024-05-17 18:05:25 +01:00
else if ( g_CertInfo . level = = eCertAdvanced1 )
CertLevel = tr ( " Advanced (L) " ) ;
2023-08-15 08:49:03 +01:00
else if ( g_CertInfo . level = = eCertMaxLevel )
CertLevel = tr ( " Max Level " ) ;
2023-08-31 19:29:15 +01:00
else if ( g_CertInfo . level ! = eCertStandard & & g_CertInfo . level ! = eCertStandard2 )
2023-08-15 08:49:03 +01:00
CertLevel = tr ( " Level %1 " ) . arg ( g_CertInfo . level ) ;
return CertLevel ;
}
2022-11-20 16:23:15 +00:00
void CSettingsWindow : : UpdateUpdater ( )
{
2023-12-03 19:05:40 +00:00
bool bOk = ( g_CertInfo . active & & ! g_CertInfo . expired ) ;
2022-12-03 19:25:04 +00:00
//ui.radLive->setEnabled(false);
2023-12-03 19:05:40 +00:00
if ( ! ui . chkAutoUpdate - > isChecked ( ) )
{
2023-07-02 15:47:14 +01:00
ui . cmbInterval - > setEnabled ( false ) ;
2022-11-20 16:23:15 +00:00
ui . cmbUpdate - > setEnabled ( false ) ;
ui . cmbRelease - > setEnabled ( false ) ;
ui . lblRevision - > setText ( QString ( ) ) ;
2023-12-03 19:05:40 +00:00
ui . lblRelease - > setText ( QString ( ) ) ;
2022-11-20 16:23:15 +00:00
}
2023-12-03 19:05:40 +00:00
else
{
2023-07-02 15:47:14 +01:00
ui . cmbInterval - > setEnabled ( true ) ;
2023-12-03 19:05:40 +00:00
2023-12-16 17:13:18 +00:00
bool bAllowAuto ;
2023-12-03 19:05:40 +00:00
if ( ui . radStable - > isChecked ( ) & & ! bOk ) {
2022-11-20 16:23:15 +00:00
ui . cmbUpdate - > setEnabled ( false ) ;
2022-12-03 19:25:04 +00:00
ui . cmbUpdate - > setCurrentIndex ( ui . cmbUpdate - > findData ( " ignore " ) ) ;
2023-12-03 19:05:40 +00:00
ui . lblRevision - > setText ( tr ( " Supporter certificate required for access " ) ) ;
2023-12-16 17:13:18 +00:00
bAllowAuto = false ;
2023-12-03 19:05:40 +00:00
} else {
2022-11-20 16:23:15 +00:00
ui . cmbUpdate - > setEnabled ( true ) ;
2023-12-03 19:05:40 +00:00
2022-11-20 16:23:15 +00:00
ui . lblRevision - > setText ( QString ( ) ) ;
2023-12-16 17:13:18 +00:00
bAllowAuto = true ;
2022-11-20 16:23:15 +00:00
}
2023-12-03 19:05:40 +00:00
2022-12-03 19:25:04 +00:00
ui . cmbRelease - > setEnabled ( true ) ;
2023-12-03 19:05:40 +00:00
QStandardItemModel * model = qobject_cast < QStandardItemModel * > ( ui . cmbRelease - > model ( ) ) ;
for ( int i = 1 ; i < ui . cmbRelease - > count ( ) ; i + + ) {
QStandardItem * item = model - > item ( i ) ;
2023-12-16 17:13:18 +00:00
item - > setFlags ( bAllowAuto ? ( item - > flags ( ) | Qt : : ItemIsEnabled ) : ( item - > flags ( ) & ~ Qt : : ItemIsEnabled ) ) ;
2023-12-03 19:05:40 +00:00
}
2023-12-16 17:13:18 +00:00
if ( ! bAllowAuto )
2023-12-03 19:05:40 +00:00
ui . lblRelease - > setText ( tr ( " Supporter certificate required for automation " ) ) ;
else
ui . lblRelease - > setText ( QString ( ) ) ;
2022-11-20 16:23:15 +00:00
}
2023-04-13 18:46:51 +01:00
OnOptChanged ( ) ;
2022-11-20 16:23:15 +00:00
}
2022-07-24 14:30:54 +01:00
void CSettingsWindow : : WriteAdvancedCheck ( QCheckBox * pCheck , const QString & Name , const QString & OnValue , const QString & OffValue )
{
//if (pCheck->checkState() == Qt::PartiallyChecked)
// return;
if ( ! pCheck - > isEnabled ( ) )
return ;
SB_STATUS Status ;
if ( pCheck - > checkState ( ) = = Qt : : Checked )
{
if ( ! OnValue . isEmpty ( ) )
Status = theAPI - > GetGlobalSettings ( ) - > SetText ( Name , OnValue ) ;
else
Status = theAPI - > GetGlobalSettings ( ) - > DelValue ( Name ) ;
}
else if ( pCheck - > checkState ( ) = = Qt : : Unchecked )
{
if ( ! OffValue . isEmpty ( ) )
Status = theAPI - > GetGlobalSettings ( ) - > SetText ( Name , OffValue ) ;
else
Status = theAPI - > GetGlobalSettings ( ) - > DelValue ( Name ) ;
}
if ( ! Status )
throw Status ;
}
void CSettingsWindow : : WriteText ( const QString & Name , const QString & Value )
{
SB_STATUS Status ;
if ( Value . isEmpty ( ) )
Status = theAPI - > GetGlobalSettings ( ) - > DelValue ( Name ) ;
else
Status = theAPI - > GetGlobalSettings ( ) - > SetText ( Name , Value ) ;
if ( ! Status )
throw Status ;
}
void CSettingsWindow : : WriteTextList ( const QString & Setting , const QStringList & List )
{
SB_STATUS Status = theAPI - > GetGlobalSettings ( ) - > UpdateTextList ( Setting , List , false ) ;
if ( ! Status )
throw Status ;
}
2021-10-16 16:19:51 +01:00
void CSettingsWindow : : SaveSettings ( )
{
theConf - > SetValue ( " Options/UiLanguage " , ui . uiLang - > currentData ( ) ) ;
2022-07-09 10:46:07 +01:00
theConf - > SetValue ( " Options/DPIScaling " , ui . cmbDPI - > currentData ( ) ) ;
2021-10-16 16:19:51 +01:00
theConf - > SetValue ( " Options/UseDarkTheme " , CSettingsWindow__Chk2Int ( ui . chkDarkTheme - > checkState ( ) ) ) ;
2022-08-10 19:14:37 +01:00
theConf - > SetValue ( " Options/UseFusionTheme " , CSettingsWindow__Chk2Int ( ui . chkFusionTheme - > checkState ( ) ) ) ;
2022-07-29 09:24:32 +01:00
theConf - > SetValue ( " Options/AltRowColors " , ui . chkAltRows - > isChecked ( ) ) ;
2022-07-09 10:46:07 +01:00
theConf - > SetValue ( " Options/UseBackground " , CSettingsWindow__Chk2Int ( ui . chkBackground - > checkState ( ) ) ) ;
theConf - > SetValue ( " Options/LargeIcons " , CSettingsWindow__Chk2Int ( ui . chkLargeIcons - > checkState ( ) ) ) ;
theConf - > SetValue ( " Options/NoIcons " , CSettingsWindow__Chk2Int ( ui . chkNoIcons - > checkState ( ) ) ) ;
2022-07-09 23:06:11 +01:00
theConf - > SetValue ( " Options/OptionTree " , CSettingsWindow__Chk2Int ( ui . chkOptTree - > checkState ( ) ) ) ;
2022-09-29 17:28:48 +01:00
theConf - > SetValue ( " Options/NewConfigLayout " , CSettingsWindow__Chk2Int ( ui . chkNewLayout - > checkState ( ) ) ) ;
2022-07-10 17:28:10 +01:00
theConf - > SetValue ( " Options/ColorBoxIcons " , ui . chkColorIcons - > isChecked ( ) ) ;
2023-04-29 10:55:43 +01:00
theConf - > SetValue ( " Options/UseOverlayIcons " , ui . chkOverlayIcons - > isChecked ( ) ) ;
2023-07-06 20:12:22 +01:00
theConf - > SetValue ( " Options/HideSbieProcesses " , ui . chkHideCore - > isChecked ( ) ) ;
2022-07-09 10:46:07 +01:00
2022-07-20 19:54:09 +01:00
int Scaling = ui . cmbFontScale - > currentText ( ) . toInt ( ) ;
if ( Scaling < 75 )
Scaling = 75 ;
else if ( Scaling > 500 )
Scaling = 500 ;
theConf - > SetValue ( " Options/FontScaling " , Scaling ) ;
2024-04-20 13:32:15 +01:00
theConf - > SetValue ( " Options/CoverWindows " , ui . chkHide - > isChecked ( ) ) ;
2021-10-16 16:19:51 +01:00
2023-07-20 18:46:18 +01:00
theConf - > SetValue ( " Options/Editor " , ui . txtEditor - > text ( ) ) ;
2021-10-16 16:19:51 +01:00
AutorunEnable ( ui . chkAutoStart - > isChecked ( ) ) ;
2022-01-14 17:58:25 +00:00
if ( theAPI - > IsConnected ( ) ) {
if ( ui . chkSvcStart - > checkState ( ) = = Qt : : Checked ) {
theAPI - > GetUserSettings ( ) - > SetBool ( " SbieCtrl_EnableAutoStart " , true ) ;
2024-04-24 09:47:28 +01:00
theAPI - > GetUserSettings ( ) - > SetText ( " SbieCtrl_AutoStartAgent " , " SandMan.exe -autorun " ) ;
2022-01-14 17:58:25 +00:00
}
else if ( ui . chkSvcStart - > checkState ( ) = = Qt : : Unchecked )
theAPI - > GetUserSettings ( ) - > SetBool ( " SbieCtrl_EnableAutoStart " , false ) ;
}
2021-10-16 16:19:51 +01:00
2023-07-01 17:54:53 +01:00
if ( ui . chkShellMenu - > checkState ( ) ! = IsContextMenu ( ) )
2021-10-16 16:19:51 +01:00
{
2022-07-09 10:46:07 +01:00
if ( ui . chkShellMenu - > isChecked ( ) ) {
CSecretCheckBox * SecretCheckBox = qobject_cast < CSecretCheckBox * > ( ui . chkShellMenu ) ;
2023-07-01 17:54:53 +01:00
AddContextMenu ( SecretCheckBox & & SecretCheckBox - > IsSecretSet ( ) ) ;
2022-07-09 10:46:07 +01:00
}
2022-02-04 21:08:25 +00:00
else
2023-07-01 17:54:53 +01:00
RemoveContextMenu ( ) ;
2022-02-04 21:08:25 +00:00
}
if ( ui . chkShellMenu2 - > isChecked ( ) ! = CSbieUtils : : HasContextMenu2 ( ) ) {
if ( ui . chkShellMenu2 - > isChecked ( ) ) {
2024-01-07 16:24:28 +00:00
CSbieUtils : : AddContextMenu2 ( QApplication : : applicationDirPath ( ) . replace ( " / " , " \\ " ) + " \\ SandMan.exe " ,
2022-02-04 21:08:25 +00:00
tr ( " Run &Un-Sandboxed " ) ,
2021-10-16 16:19:51 +01:00
QApplication : : applicationDirPath ( ) . replace ( " / " , " \\ " ) + " \\ Start.exe " ) ;
} else
2022-02-04 21:08:25 +00:00
CSbieUtils : : RemoveContextMenu2 ( ) ;
2021-10-16 16:19:51 +01:00
}
2024-07-01 11:43:06 +01:00
if ( ui . chkShellMenu3 - > isChecked ( ) ! = CSbieUtils : : HasContextMenu3 ( ) ) {
if ( ui . chkShellMenu3 - > isChecked ( ) ) {
CSbieUtils : : AddContextMenu3 ( QApplication : : applicationDirPath ( ) . replace ( " / " , " \\ " ) + " \\ SandMan.exe " ,
2024-07-21 09:21:26 +01:00
tr ( " Set Force in Sandbox " ) ,
2024-07-01 11:43:06 +01:00
QApplication : : applicationDirPath ( ) . replace ( " / " , " \\ " ) + " \\ Start.exe " ) ;
}
else
CSbieUtils : : RemoveContextMenu3 ( ) ;
}
2024-07-18 14:16:53 +01:00
if ( ui . chkShellMenu4 - > isChecked ( ) ! = CSbieUtils : : HasContextMenu4 ( ) ) {
if ( ui . chkShellMenu4 - > isChecked ( ) ) {
CSbieUtils : : AddContextMenu4 ( QApplication : : applicationDirPath ( ) . replace ( " / " , " \\ " ) + " \\ SandMan.exe " ,
2024-07-21 09:21:26 +01:00
tr ( " Set Open Path in Sandbox " ) ,
2024-07-18 14:16:53 +01:00
QApplication : : applicationDirPath ( ) . replace ( " / " , " \\ " ) + " \\ Start.exe " ) ;
}
else
CSbieUtils : : RemoveContextMenu4 ( ) ;
}
2021-10-16 16:19:51 +01:00
theConf - > SetValue ( " Options/RunInDefaultBox " , ui . chkAlwaysDefault - > isChecked ( ) ) ;
2022-12-15 13:06:58 +00:00
theConf - > SetValue ( " Options/CheckSilentMode " , ui . chkSilentMode - > isChecked ( ) ) ;
2023-04-13 18:46:51 +01:00
theConf - > SetValue ( " Options/ShowMigrationProgress " , ui . chkCopyProgress - > isChecked ( ) ) ;
theConf - > SetValue ( " Options/ShowNotifications " , ! ui . chkNoMessages - > isChecked ( ) ) ;
2021-10-16 16:19:51 +01:00
theConf - > SetValue ( " Options/OpenUrlsSandboxed " , CSettingsWindow__Chk2Int ( ui . chkSandboxUrls - > checkState ( ) ) ) ;
2024-08-26 12:50:33 +01:00
theConf - > SetValue ( " Options/TerminateWhenExit " , ui . chkAutoTerminate - > isChecked ( ) ) ;
2021-10-16 16:19:51 +01:00
theConf - > SetValue ( " Options/ShowRecovery " , ui . chkShowRecovery - > isChecked ( ) ) ;
theConf - > SetValue ( " Options/InstantRecovery " , ! ui . chkNotifyRecovery - > isChecked ( ) ) ;
2022-07-29 09:24:32 +01:00
theConf - > SetValue ( " Options/RecoveryOnTop " , ui . chkRecoveryTop - > isChecked ( ) ) ;
2022-02-13 11:55:52 +00:00
theConf - > SetValue ( " Options/UseAsyncBoxOps " , ui . chkAsyncBoxOps - > isChecked ( ) ) ;
2021-10-16 16:19:51 +01:00
theConf - > SetValue ( " Options/EnablePanicKey " , ui . chkPanic - > isChecked ( ) ) ;
theConf - > SetValue ( " Options/PanicKeySequence " , ui . keyPanic - > keySequence ( ) . toString ( ) ) ;
2023-10-21 20:50:56 +01:00
theConf - > SetValue ( " Options/EnableTopMostKey " , ui . chkTop - > isChecked ( ) ) ;
theConf - > SetValue ( " Options/TopMostKeySequence " , ui . keyTop - > keySequence ( ) . toString ( ) ) ;
2023-10-22 12:47:36 +01:00
theConf - > SetValue ( " Options/EnablePauseForceKey " , ui . chkPauseForce - > isChecked ( ) ) ;
theConf - > SetValue ( " Options/PauseForceKeySequence " , ui . keyPauseForce - > keySequence ( ) . toString ( ) ) ;
2024-02-25 08:50:07 +00:00
theConf - > SetValue ( " Options/EnableSuspendKey " , ui . chkSuspend - > isChecked ( ) ) ;
theConf - > SetValue ( " Options/SuspendKeySequence " , ui . keySuspend - > keySequence ( ) . toString ( ) ) ;
2024-03-02 12:31:13 +00:00
theConf - > SetValue ( " Options/CleanUpOnStart " , ui . chkCheckDelete - > isChecked ( ) ) ;
2024-03-01 11:19:45 +00:00
2022-05-16 20:30:40 +01:00
theConf - > SetValue ( " Options/WatchBoxSize " , ui . chkMonitorSize - > isChecked ( ) ) ;
2021-10-16 16:19:51 +01:00
theConf - > SetValue ( " Options/WatchIni " , ui . chkWatchConfig - > isChecked ( ) ) ;
2024-07-21 14:45:51 +01:00
if ( m_SkipUACChanged )
SkipUacEnable ( ui . chkSkipUAC - > isChecked ( ) ) ;
2021-10-16 16:19:51 +01:00
2022-09-29 17:28:48 +01:00
theConf - > SetValue ( " Options/ScanStartMenu " , ui . chkScanMenu - > isChecked ( ) ) ;
int OldIntegrateStartMenu = theConf - > GetInt ( " Options/IntegrateStartMenu " , 0 ) ;
theConf - > SetValue ( " Options/IntegrateStartMenu " , ui . cmbIntegrateMenu - > currentIndex ( ) ) ;
2023-09-02 11:42:08 +01:00
int OldIntegrateDesktop = theConf - > GetInt ( " Options/IntegrateDesktop " , 0 ) ;
theConf - > SetValue ( " Options/IntegrateDesktop " , ui . cmbIntegrateDesk - > currentIndex ( ) ) ;
if ( ui . cmbIntegrateDesk - > currentIndex ( ) ! = OldIntegrateDesktop | | ui . cmbIntegrateMenu - > currentIndex ( ) ! = OldIntegrateStartMenu ) {
theGUI - > ClearStartMenu ( ) ;
theGUI - > SyncStartMenu ( ) ;
2022-09-29 17:28:48 +01:00
}
2021-10-16 16:19:51 +01:00
theConf - > SetValue ( " Options/SysTrayIcon " , ui . cmbSysTray - > currentIndex ( ) ) ;
2022-02-05 14:09:53 +00:00
theConf - > SetValue ( " Options/SysTrayFilter " , ui . cmbTrayBoxes - > currentIndex ( ) ) ;
2022-07-10 17:28:10 +01:00
theConf - > SetValue ( " Options/CompactTray " , ui . chkCompactTray - > isChecked ( ) ) ;
2022-02-13 11:55:52 +00:00
theConf - > SetValue ( " Options/AutoBoxOpsNotify " , ui . chkBoxOpsNotify - > isChecked ( ) ) ;
2023-09-02 09:50:25 +01:00
theConf - > SetValue ( " Options/OnClose " , ui . cmbOnClose - > currentData ( ) ) ;
theConf - > SetValue ( " Options/MinimizeToTray " , ui . chkMinimize - > isChecked ( ) ) ;
theConf - > SetValue ( " Options/TraySingleClick " , ui . chkSingleShow - > isChecked ( ) ) ;
2024-05-07 18:44:32 +01:00
//if (ui.chkForceExplorerChild->isChecked())
// theAPI->GetGlobalSettings()->SetText("ForceExplorerChild", theAPI->GetGlobalSettings()->GetText("DefaultBox"));
//else if (theAPI->GetGlobalSettings()->GetText("ForceExplorerChild").compare(theAPI->GetGlobalSettings()->GetText("DefaultBox")) == 0)
// theAPI->GetGlobalSettings()->DelValue("ForceExplorerChild");
2021-10-16 16:19:51 +01:00
if ( theAPI - > IsConnected ( ) )
{
2022-07-24 14:30:54 +01:00
try
2021-10-16 16:19:51 +01:00
{
2023-04-13 18:46:51 +01:00
if ( m_MessagesChanged )
{
m_MessagesChanged = false ;
QStringList HiddenMessages ;
for ( int i = 0 ; i < ui . treeMessages - > topLevelItemCount ( ) ; i + + ) {
QTreeWidgetItem * pItem = ui . treeMessages - > topLevelItem ( i ) ;
if ( ! pItem - > text ( 1 ) . isEmpty ( ) )
HiddenMessages . append ( pItem - > text ( 0 ) + " , " + pItem - > text ( 1 ) ) ;
else
HiddenMessages . append ( pItem - > text ( 0 ) ) ;
}
theAPI - > GetUserSettings ( ) - > UpdateTextList ( " SbieCtrl_HideMessage " , HiddenMessages , false ) ;
}
if ( m_RunChanged )
{
m_RunChanged = false ;
QStringList RunCommands ;
2023-07-19 20:15:18 +01:00
for ( int i = 0 ; i < ui . treeRun - > topLevelItemCount ( ) ; i + + )
RunCommands . prepend ( MakeRunEntry ( ui . treeRun - > topLevelItem ( i ) ) ) ;
2023-04-13 18:46:51 +01:00
//WriteTextList("RunCommand", RunCommands);
theAPI - > GetGlobalSettings ( ) - > DelValue ( " RunCommand " ) ;
foreach ( const QString & Value , RunCommands )
theAPI - > GetGlobalSettings ( ) - > InsertText ( " RunCommand " , Value ) ;
2022-11-29 17:26:51 +00:00
}
2023-04-13 18:46:51 +01:00
if ( m_GeneralChanged )
{
m_GeneralChanged = false ;
WriteText ( " DefaultBox " , ui . cmbDefault - > currentData ( ) . toString ( ) ) ;
2022-12-07 10:50:33 +00:00
2023-04-13 18:46:51 +01:00
WriteText ( " FileRootPath " , ui . fileRoot - > text ( ) ) ; //ui.fileRoot->setText("\\??\\%SystemDrive%\\Sandbox\\%USER%\\%SANDBOX%");
//WriteAdvancedCheck(ui.chkSeparateUserFolders, "SeparateUserFolders", "", "n");
WriteText ( " KeyRootPath " , ui . regRoot - > text ( ) ) ; //ui.regRoot->setText("\\REGISTRY\\USER\\Sandbox_%USER%_%SANDBOX%");
WriteText ( " IpcRootPath " , ui . ipcRoot - > text ( ) ) ; //ui.ipcRoot->setText("\\Sandbox\\%USER%\\%SANDBOX%\\Session_%SESSION%");
2022-07-24 14:30:54 +01:00
2023-08-24 17:39:00 +01:00
WriteText ( " RamDiskSizeKb " , ui . chkRamDisk - > isChecked ( ) ? ui . txtRamLimit - > text ( ) : " " ) ;
2023-08-27 11:34:06 +01:00
WriteText ( " RamDiskLetter " , ui . chkRamLetter - > isChecked ( ) ? ui . cmbRamLetter - > currentText ( ) : " " ) ;
2023-08-24 17:39:00 +01:00
2023-04-13 18:46:51 +01:00
WriteAdvancedCheck ( ui . chkWFP , " NetworkEnableWFP " , " y " , " " ) ;
WriteAdvancedCheck ( ui . chkObjCb , " EnableObjectFiltering " , " " , " n " ) ;
WriteAdvancedCheck ( ui . chkWin32k , " EnableWin32kHooks " , " " , " n " ) ;
WriteAdvancedCheck ( ui . chkSbieLogon , " SandboxieLogon " , " y " , " " ) ;
2024-05-22 16:52:32 +01:00
WriteAdvancedCheck ( ui . chkSbieAll , " SandboxieAllGroup " , " y " , " " ) ;
2022-07-24 14:30:54 +01:00
2023-04-13 18:46:51 +01:00
if ( m_FeaturesChanged ) {
m_FeaturesChanged = false ;
theAPI - > ReloadConfig ( true ) ;
}
2021-10-16 16:19:51 +01:00
}
2023-04-13 18:46:51 +01:00
if ( m_ProtectionChanged )
2021-10-16 16:19:51 +01:00
{
2023-04-13 18:46:51 +01:00
m_ProtectionChanged = false ;
WriteAdvancedCheck ( ui . chkAdminOnly , " EditAdminOnly " , " y " , " " ) ;
bool isPassSet = ! theAPI - > GetGlobalSettings ( ) - > GetText ( " EditPassword " , " " ) . isEmpty ( ) ;
if ( ui . chkPassRequired - > isChecked ( ) )
{
if ( ! isPassSet & & m_NewPassword . isEmpty ( ) )
OnSetPassword ( ) ; // request password entry if it wasn't entered already
if ( ! m_NewPassword . isEmpty ( ) ) {
theAPI - > LockConfig ( m_NewPassword ) ; // set new/changed password
m_NewPassword . clear ( ) ;
}
2021-10-16 16:19:51 +01:00
}
2023-04-13 18:46:51 +01:00
else if ( isPassSet )
theAPI - > LockConfig ( QString ( ) ) ; // clear password
2021-10-16 16:19:51 +01:00
2023-04-13 18:46:51 +01:00
WriteAdvancedCheck ( ui . chkAdminOnlyFP , " ForceDisableAdminOnly " , " y " , " " ) ;
WriteAdvancedCheck ( ui . chkClearPass , " ForgetPassword " , " y " , " " ) ;
}
2021-10-16 16:19:51 +01:00
2022-07-24 14:30:54 +01:00
if ( m_WarnProgsChanged )
{
2023-04-13 18:46:51 +01:00
m_WarnProgsChanged = false ;
2022-07-24 14:30:54 +01:00
WriteAdvancedCheck ( ui . chkStartBlock , " StartRunAlertDenied " , " y " , " " ) ;
2022-11-20 16:23:15 +00:00
WriteAdvancedCheck ( ui . chkStartBlockMsg , " AlertStartRunAccessDenied " , " " , " n " ) ;
2022-09-29 17:28:48 +01:00
WriteAdvancedCheck ( ui . chkNotForcedMsg , " NotifyForceProcessDisabled " , " y " , " " ) ;
2021-10-16 16:19:51 +01:00
2022-07-24 14:30:54 +01:00
QStringList AlertProcess ;
QStringList AlertFolder ;
for ( int i = 0 ; i < ui . treeWarnProgs - > topLevelItemCount ( ) ; i + + )
{
QTreeWidgetItem * pItem = ui . treeWarnProgs - > topLevelItem ( i ) ;
int Type = pItem - > data ( 0 , Qt : : UserRole ) . toInt ( ) ;
switch ( Type )
{
case 1 : AlertProcess . append ( pItem - > data ( 1 , Qt : : UserRole ) . toString ( ) ) ; break ;
case 2 : AlertFolder . append ( pItem - > data ( 1 , Qt : : UserRole ) . toString ( ) ) ; break ;
}
2021-10-16 16:19:51 +01:00
}
2022-07-24 14:30:54 +01:00
WriteTextList ( " AlertProcess " , AlertProcess ) ;
WriteTextList ( " AlertFolder " , AlertFolder ) ;
2021-10-16 16:19:51 +01:00
}
2023-10-19 17:34:09 +01:00
if ( m_VolumeChanged )
{
m_VolumeChanged = false ;
WriteAdvancedCheck ( ui . chkSandboxUsb , " ForceUsbDrives " , " y " , " " ) ;
QString UsbSandbox = ui . cmbUsbSandbox - > currentText ( ) . replace ( " " , " _ " ) ;
SB_STATUS Status = theAPI - > ValidateName ( UsbSandbox ) ;
if ( Status . IsError ( ) )
QMessageBox : : warning ( this , " Sandboxie-Plus " , theGUI - > FormatError ( Status ) ) ;
else
WriteText ( " UsbSandbox " , UsbSandbox ) ;
QStringList DisabledForceVolume ;
for ( int i = 0 ; i < ui . treeVolumes - > topLevelItemCount ( ) ; i + + ) {
QTreeWidgetItem * pItem = ui . treeVolumes - > topLevelItem ( i ) ;
if ( pItem - > checkState ( 0 ) = = Qt : : Unchecked ) {
DisabledForceVolume . append ( pItem - > text ( 0 ) ) ;
}
}
WriteTextList ( " DisabledForceVolume " , DisabledForceVolume ) ;
theGUI - > UpdateForceUSB ( ) ;
}
2022-07-24 14:30:54 +01:00
if ( m_CompatChanged )
{
2023-04-13 18:46:51 +01:00
m_CompatChanged = false ;
2022-07-24 14:30:54 +01:00
QStringList Used ;
QStringList Rejected ;
for ( int i = 0 ; i < ui . treeCompat - > topLevelItemCount ( ) ; i + + ) {
QTreeWidgetItem * pItem = ui . treeCompat - > topLevelItem ( i ) ;
2023-04-13 18:46:51 +01:00
QString Template = pItem - > data ( 0 , Qt : : UserRole ) . toString ( ) . mid ( 9 ) ;
2022-07-24 14:30:54 +01:00
if ( pItem - > checkState ( 0 ) = = Qt : : Unchecked )
2023-04-13 18:46:51 +01:00
Rejected . append ( Template ) ;
2022-07-24 14:30:54 +01:00
else
2023-04-13 18:46:51 +01:00
Used . append ( Template ) ;
2022-07-24 14:30:54 +01:00
}
// retain local templates
foreach ( const QString & Template , theAPI - > GetGlobalSettings ( ) - > GetTextList ( " Template " , false ) ) {
if ( Template . left ( 6 ) = = " Local_ " ) {
Used . append ( Template ) ;
}
}
WriteTextList ( " Template " , Used ) ;
WriteTextList ( " TemplateReject " , Rejected ) ;
}
}
catch ( SB_STATUS Status )
{
2023-07-01 17:54:53 +01:00
theGUI - > CheckResults ( QList < SB_STATUS > ( ) < < Status , theGUI ) ;
2021-10-16 16:19:51 +01:00
}
}
if ( ui . chkAutoRoot - > isVisible ( ) )
2022-01-14 13:06:01 +00:00
theConf - > SetValue ( " Options/PortableRootDir " , CSettingsWindow__Chk2Int ( ui . chkAutoRoot - > checkState ( ) ) ) ;
2021-10-16 16:19:51 +01:00
theConf - > SetValue ( " Options/AutoRunSoftCompat " , ! ui . chkNoCompat - > isChecked ( ) ) ;
2023-08-15 08:49:03 +01:00
if ( m_CertChanged )
ApplyCert ( ) ;
2021-10-16 16:19:51 +01:00
2023-07-01 17:54:53 +01:00
theConf - > SetValue ( " Options/NoSupportCheck " , ui . chkNoCheck - > isChecked ( ) ) ;
2021-10-16 16:19:51 +01:00
theConf - > SetValue ( " Options/CheckForUpdates " , CSettingsWindow__Chk2Int ( ui . chkAutoUpdate - > checkState ( ) ) ) ;
2023-07-02 09:22:38 +01:00
int UpdateInterval = ui . cmbInterval - > currentData ( ) . toInt ( ) ;
if ( ! UpdateInterval )
UpdateInterval = ui . cmbInterval - > currentText ( ) . toInt ( ) ;
if ( ! UpdateInterval )
UpdateInterval = UPDATE_INTERVAL ;
theConf - > SetValue ( " Options/UpdateInterval " , UpdateInterval ) ;
2022-11-20 16:23:15 +00:00
QString ReleaseChannel ;
if ( ui . radStable - > isChecked ( ) )
ReleaseChannel = " stable " ;
else if ( ui . radPreview - > isChecked ( ) )
ReleaseChannel = " preview " ;
2023-07-01 17:54:53 +01:00
else if ( ui . radInsider - > isChecked ( ) )
ReleaseChannel = " insider " ;
2022-11-20 16:23:15 +00:00
if ( ! ReleaseChannel . isEmpty ( ) ) theConf - > SetValue ( " Options/ReleaseChannel " , ReleaseChannel ) ;
theConf - > SetValue ( " Options/OnNewUpdate " , ui . cmbUpdate - > currentData ( ) ) ;
theConf - > SetValue ( " Options/OnNewRelease " , ui . cmbRelease - > currentData ( ) ) ;
2022-08-09 17:19:46 +01:00
2023-07-01 17:54:53 +01:00
//theConf->SetValue("Options/CheckForTemplates", CSettingsWindow__Chk2Int(ui.chkUpdateTemplates->checkState()));
theConf - > SetValue ( " Options/CheckForAddons " , CSettingsWindow__Chk2Int ( ui . chkUpdateAddons - > checkState ( ) ) ) ;
theConf - > SetValue ( " Options/CheckForIssues " , CSettingsWindow__Chk2Int ( ui . chkUpdateIssues - > checkState ( ) ) ) ;
2022-01-13 22:52:58 +00:00
2022-07-09 10:46:07 +01:00
emit OptionsChanged ( m_bRebuildUI ) ;
2021-10-16 16:19:51 +01:00
}
2022-05-15 14:02:58 +01:00
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 {
2022-05-24 00:02:29 +01:00
QMessageBox : : critical ( widget , " Sandboxie-Plus " , tr ( " This does not look like a certificate. Please enter the entire certificate, not just a portion of it. " ) ) ;
2022-05-15 14:02:58 +01:00
return false ;
}
}
else if ( ! g_Certificate . isEmpty ( ) ) {
2023-08-15 08:49:03 +01:00
g_Certificate . clear ( ) ;
2022-05-15 14:02:58 +01:00
WindowsMoveFile ( CertPath . replace ( " / " , " \\ " ) , " " ) ;
}
if ( Certificate . isEmpty ( ) )
return false ;
2023-08-15 08:49:03 +01:00
if ( ! theGUI - > ReloadCert ( widget ) . IsError ( ) )
2022-05-15 14:02:58 +01:00
{
g_FeatureFlags = theAPI - > GetFeatureFlags ( ) ;
2023-01-23 21:48:51 +00:00
g_Certificate = Certificate ;
2022-05-15 14:02:58 +01:00
theGUI - > UpdateCertState ( ) ;
if ( g_CertInfo . expired | | g_CertInfo . outdated ) {
2023-07-09 10:43:45 +01:00
if ( g_CertInfo . outdated )
QMessageBox : : information ( widget , " Sandboxie-Plus " , tr ( " This certificate is unfortunately not valid for the current build, you need to get a new certificate or downgrade to an earlier build. " ) ) ;
2023-07-11 21:35:59 +01:00
else if ( g_CertInfo . active & & ! g_CertInfo . grace_period )
2023-07-09 10:43:45 +01:00
QMessageBox : : information ( widget , " Sandboxie-Plus " , tr ( " Although this certificate has expired, for the currently installed version plus features remain enabled. However, you will no longer have access to Sandboxie-Live services, including compatibility updates and the online troubleshooting database. " ) ) ;
2022-05-15 14:02:58 +01:00
else
2023-07-09 10:43:45 +01:00
QMessageBox : : information ( widget , " Sandboxie-Plus " , tr ( " This certificate has unfortunately expired, you need to get a new certificate. " ) ) ;
2022-05-15 14:02:58 +01:00
}
else {
2024-08-25 09:36:29 +01:00
if ( CERT_IS_TYPE ( g_CertInfo , eCertEvaluation ) )
QMessageBox : : information ( widget , " Sandboxie-Plus " , tr ( " The evaluation certificate has been successfully applied. Enjoy your free trial! " ) ) ;
else
QMessageBox : : information ( widget , " Sandboxie-Plus " , tr ( " Thank you for supporting the development of Sandboxie-Plus. " ) ) ;
2022-05-15 14:02:58 +01:00
}
return true ;
}
else
{
g_CertInfo . State = 0 ;
g_Certificate . clear ( ) ;
return false ;
}
}
2021-10-16 16:19:51 +01:00
void CSettingsWindow : : apply ( )
{
2022-01-13 22:52:58 +00:00
if ( ! ui . btnEditIni - > isEnabled ( ) )
SaveIniSection ( ) ;
else
SaveSettings ( ) ;
2021-10-16 16:19:51 +01:00
LoadSettings ( ) ;
}
void CSettingsWindow : : ok ( )
{
2022-07-24 14:30:54 +01:00
apply ( ) ;
2021-10-16 16:19:51 +01:00
this - > close ( ) ;
}
void CSettingsWindow : : reject ( )
{
this - > close ( ) ;
}
2023-04-13 18:46:51 +01:00
void CSettingsWindow : : OnOptChanged ( )
{
2023-09-02 09:50:25 +01:00
QStandardItemModel * model = qobject_cast < QStandardItemModel * > ( ui . cmbOnClose - > model ( ) ) ;
QStandardItem * item = model - > item ( 0 ) ;
item - > setFlags ( ( ui . cmbSysTray - > currentIndex ( ) = = 0 ) ? item - > flags ( ) & ~ Qt : : ItemIsEnabled : item - > flags ( ) | Qt : : ItemIsEnabled ) ;
2023-04-13 18:46:51 +01:00
if ( m_HoldChange )
return ;
ui . buttonBox - > button ( QDialogButtonBox : : Apply ) - > setEnabled ( true ) ;
}
2023-07-01 17:54:53 +01:00
void CSettingsWindow : : OnLoadAddon ( )
{
ui . treeAddons - > clear ( ) ;
2023-07-30 13:28:35 +01:00
foreach ( const CAddonInfoPtr pAddon , theGUI - > GetAddonManager ( ) - > GetAddons ( ) ) {
2023-07-01 17:54:53 +01:00
QTreeWidgetItem * pItem = new QTreeWidgetItem ;
pItem - > setText ( 0 , pAddon - > GetLocalizedEntry ( " name " ) ) ;
if ( ! pAddon - > Data [ " mandatory " ] . toBool ( ) )
pItem - > setData ( 0 , Qt : : UserRole , pAddon - > Id ) ;
pItem - > setIcon ( 0 , pAddon - > Data . contains ( " icon " ) ? CSandMan : : GetIcon ( pAddon - > Data [ " icon " ] . toString ( ) ) : CSandMan : : GetIcon ( " Addon " ) ) ;
2023-07-30 13:28:35 +01:00
if ( pAddon - > Installed ) {
if ( ! pAddon - > UpdateVersion . isEmpty ( ) )
pItem - > setText ( 1 , tr ( " Update Available " ) ) ;
else
pItem - > setText ( 1 , tr ( " Installed " ) ) ;
}
pItem - > setText ( 2 , pAddon - > Data [ " version " ] . toString ( ) ) ;
2023-08-06 13:28:03 +01:00
QString Maker = pAddon - > Data [ " maintainer " ] . toString ( ) ;
if ( ! Maker . isEmpty ( ) )
pItem - > setToolTip ( 2 , tr ( " by %1 " ) . arg ( Maker ) ) ;
//pItem->setText(3, );
2023-07-01 17:54:53 +01:00
ui . treeAddons - > addTopLevelItem ( pItem ) ;
2023-08-06 13:28:03 +01:00
QString Info = pAddon - > GetLocalizedEntry ( " description " ) ;
QString infoUrl = pAddon - > Data [ " infoUrl " ] . toString ( ) ;
2023-08-06 20:53:11 +01:00
if ( ! infoUrl . isEmpty ( ) ) Info + = " <a href= \" " + infoUrl + " \" > " + tr ( " (info website) " ) + " </a> " ;
2023-08-06 13:28:03 +01:00
QLabel * pLabel = new QLabel ( Info ) ;
//pLabel->setToolTip(tr("by %1").arg(pAddon->Data["maintainer"].toString()));
connect ( pLabel , SIGNAL ( linkActivated ( const QString & ) ) , theGUI , SLOT ( OpenUrl ( const QString & ) ) ) ;
ui . treeAddons - > setItemWidget ( pItem , 3 , pLabel ) ;
2023-07-01 17:54:53 +01:00
}
}
void CSettingsWindow : : OnInstallAddon ( )
{
QTreeWidgetItem * pItem = ui . treeAddons - > currentItem ( ) ;
if ( ! pItem )
return ;
QString Id = pItem - > data ( 0 , Qt : : UserRole ) . toString ( ) ;
SB_PROGRESS Status = theGUI - > GetAddonManager ( ) - > TryInstallAddon ( Id , this ) ;
if ( Status . GetStatus ( ) = = OP_ASYNC ) connect ( Status . GetValue ( ) . data ( ) , SIGNAL ( Finished ( ) ) , this , SLOT ( OnLoadAddon ( ) ) ) ;
}
void CSettingsWindow : : OnRemoveAddon ( )
{
QTreeWidgetItem * pItem = ui . treeAddons - > currentItem ( ) ;
if ( ! pItem )
return ;
QString Id = pItem - > data ( 0 , Qt : : UserRole ) . toString ( ) ;
if ( Id . isEmpty ( ) ) {
2023-08-26 22:15:15 +01:00
QMessageBox : : warning ( this , " Sandboxie-Plus " , tr ( " This Add-on is mandatory and can not be removed. " ) ) ;
2023-07-01 17:54:53 +01:00
return ;
}
SB_PROGRESS Status = theGUI - > GetAddonManager ( ) - > TryRemoveAddon ( Id , this ) ;
if ( Status . GetStatus ( ) = = OP_ASYNC ) connect ( Status . GetValue ( ) . data ( ) , SIGNAL ( Finished ( ) ) , this , SLOT ( OnLoadAddon ( ) ) ) ;
}
2021-10-16 16:19:51 +01:00
void CSettingsWindow : : OnBrowse ( )
{
QString Value = QFileDialog : : getExistingDirectory ( this , tr ( " Select Directory " ) ) . replace ( " / " , " \\ " ) ;
if ( Value . isEmpty ( ) )
return ;
ui . fileRoot - > setText ( Value + " \\ %SANDBOX% " ) ;
}
2023-04-13 18:46:51 +01:00
void CSettingsWindow : : OnRootChanged ( )
2021-10-16 16:19:51 +01:00
{
2022-01-14 13:06:01 +00:00
if ( ui . chkAutoRoot - > isVisible ( ) )
2021-10-16 16:19:51 +01:00
ui . fileRoot - > setEnabled ( ui . chkAutoRoot - > checkState ( ) ! = Qt : : Checked ) ;
2023-04-13 18:46:51 +01:00
OnOptChanged ( ) ;
2021-10-16 16:19:51 +01:00
}
void CSettingsWindow : : OnTab ( )
{
2022-09-29 17:28:48 +01:00
OnTab ( ui . tabs - > currentWidget ( ) ) ;
2022-08-15 12:18:26 +01:00
}
2022-09-29 17:28:48 +01:00
void CSettingsWindow : : OnTab ( QWidget * pTab )
2022-08-15 12:18:26 +01:00
{
2022-09-29 17:28:48 +01:00
m_pCurrentTab = pTab ;
if ( pTab = = ui . tabSupport )
2022-08-11 23:09:35 +01:00
{
if ( ui . lblCurrent - > text ( ) . isEmpty ( ) ) {
if ( ui . chkAutoUpdate - > checkState ( ) )
GetUpdates ( ) ;
else
ui . lblCurrent - > setText ( tr ( " <a href= \" check \" >Check Now</a> " ) ) ;
}
}
2023-07-01 20:24:12 +01:00
else if ( pTab = = ui . tabAddons )
{
if ( theConf - > GetInt ( " Options/CheckForAddons " , 2 ) = = 1 ) {
ui . lblUpdateAddons - > setVisible ( false ) ;
theGUI - > GetAddonManager ( ) - > UpdateAddonsWhenNotCached ( ) ;
}
}
2022-09-29 17:28:48 +01:00
else if ( pTab = = ui . tabEdit )
2022-01-13 22:52:58 +00:00
{
LoadIniSection ( ) ;
2023-04-13 18:46:51 +01:00
//ui.txtIniSection->setReadOnly(true);
2022-01-13 22:52:58 +00:00
}
2022-09-29 17:28:48 +01:00
else if ( pTab = = ui . tabCompat & & m_CompatLoaded ! = 1 & & theAPI - > IsConnected ( ) )
2021-10-16 16:19:51 +01:00
{
if ( m_CompatLoaded = = 0 )
2023-07-01 17:54:53 +01:00
theGUI - > CheckCompat ( this , " OnCompat " ) ;
}
}
2021-10-16 16:19:51 +01:00
2023-07-01 17:54:53 +01:00
void CSettingsWindow : : OnCompat ( )
{
ui . treeCompat - > clear ( ) ;
2021-10-16 16:19:51 +01:00
2023-07-01 17:54:53 +01:00
bool bNew = false ;
2023-04-13 18:46:51 +01:00
2023-07-01 17:54:53 +01:00
QMap < QString , int > Templates = theGUI - > GetCompat ( ) - > GetTemplates ( ) ;
for ( QMap < QString , int > : : iterator I = Templates . begin ( ) ; I ! = Templates . end ( ) ; + + I )
{
if ( I . value ( ) = = CSbieTemplates : : eNone )
continue ;
2021-10-16 16:19:51 +01:00
2023-07-01 17:54:53 +01:00
QSharedPointer < CSbieIni > pTemplate = QSharedPointer < CSbieIni > ( new CSbieIni ( " Template_ " + I . key ( ) , theAPI ) ) ;
2021-10-16 16:19:51 +01:00
2023-07-01 17:54:53 +01:00
QString Title = pTemplate - > GetText ( " Tmpl.Title " , " " , false , true , true ) ;
if ( Title . left ( 1 ) = = " # " )
{
int End = Title . mid ( 1 ) . indexOf ( " , " ) ;
if ( End = = - 1 ) End = Title . length ( ) - 1 ;
int MsgNum = Title . mid ( 1 , End ) . toInt ( ) ;
Title = theAPI - > GetSbieMsgStr ( MsgNum , theGUI - > m_LanguageId ) . arg ( Title . mid ( End + 2 ) ) . arg ( " " ) ;
2021-10-16 16:19:51 +01:00
}
2023-07-01 17:54:53 +01:00
//if (Title.isEmpty()) Title = Name;
2021-10-16 16:19:51 +01:00
2023-07-01 17:54:53 +01:00
QTreeWidgetItem * pItem = new QTreeWidgetItem ( ) ;
pItem - > setText ( 0 , Title ) ;
pItem - > setData ( 0 , Qt : : UserRole , " Template_ " + I . key ( ) ) ;
if ( ( I . value ( ) & CSbieTemplates : : eDisabled ) ! = 0 )
pItem - > setCheckState ( 0 , Qt : : Unchecked ) ;
else if ( ( I . value ( ) & CSbieTemplates : : eEnabled ) ! = 0 )
pItem - > setCheckState ( 0 , Qt : : Checked ) ;
else {
pItem - > setCheckState ( 0 , Qt : : PartiallyChecked ) ;
bNew = true ;
}
ui . treeCompat - > addTopLevelItem ( pItem ) ;
2021-10-16 16:19:51 +01:00
}
2023-07-01 17:54:53 +01:00
m_CompatLoaded = 1 ;
if ( bNew )
OnCompatChanged ( ) ;
LoadTemplates ( ) ;
2021-10-16 16:19:51 +01:00
}
2023-04-13 18:46:51 +01:00
void CSettingsWindow : : OnProtectionChange ( )
{
ui . btnSetPassword - > setEnabled ( ui . chkPassRequired - > isChecked ( ) ) ;
m_ProtectionChanged = true ;
OnOptChanged ( ) ;
}
2021-10-16 16:19:51 +01:00
void CSettingsWindow : : OnSetPassword ( )
{
retry :
QString Value1 = QInputDialog : : getText ( this , " Sandboxie-Plus " , tr ( " Please enter the new configuration password. " ) , QLineEdit : : Password ) ;
if ( Value1 . isEmpty ( ) )
return ;
QString Value2 = QInputDialog : : getText ( this , " Sandboxie-Plus " , tr ( " Please re-enter the new configuration password. " ) , QLineEdit : : Password ) ;
if ( Value2 . isEmpty ( ) )
return ;
if ( Value1 ! = Value2 ) {
QMessageBox : : warning ( this , " Sandboxie-Plus " , tr ( " Passwords did not match, please retry. " ) ) ;
goto retry ;
}
m_NewPassword = Value1 ;
2023-04-13 18:46:51 +01:00
m_ProtectionChanged = true ;
OnOptChanged ( ) ;
2021-10-16 16:19:51 +01:00
}
void CSettingsWindow : : AddWarnEntry ( const QString & Name , int type )
{
QTreeWidgetItem * pItem = new QTreeWidgetItem ( ) ;
pItem - > setText ( 0 , ( type = = 1 ? tr ( " Process " ) : tr ( " Folder " ) ) ) ;
pItem - > setData ( 0 , Qt : : UserRole , type ) ;
pItem - > setData ( 1 , Qt : : UserRole , Name ) ;
pItem - > setText ( 1 , Name ) ;
ui . treeWarnProgs - > addTopLevelItem ( pItem ) ;
}
void CSettingsWindow : : OnAddWarnProg ( )
{
QString Value = QInputDialog : : getText ( this , " Sandboxie-Plus " , tr ( " Please enter a program file name " ) ) ;
if ( Value . isEmpty ( ) )
return ;
AddWarnEntry ( Value , 1 ) ;
2023-04-13 18:46:51 +01:00
OnWarnChanged ( ) ;
2021-10-16 16:19:51 +01:00
}
void CSettingsWindow : : OnAddWarnFolder ( )
{
QString Value = QFileDialog : : getExistingDirectory ( this , tr ( " Select Directory " ) ) . replace ( " / " , " \\ " ) ;
if ( Value . isEmpty ( ) )
return ;
AddWarnEntry ( Value , 2 ) ;
2023-04-13 18:46:51 +01:00
OnWarnChanged ( ) ;
2021-10-16 16:19:51 +01:00
}
void CSettingsWindow : : OnDelWarnProg ( )
{
QTreeWidgetItem * pItem = ui . treeWarnProgs - > currentItem ( ) ;
if ( ! pItem )
return ;
delete pItem ;
2023-04-13 18:46:51 +01:00
OnWarnChanged ( ) ;
2021-10-16 16:19:51 +01:00
}
void CSettingsWindow : : OnTemplateClicked ( QTreeWidgetItem * pItem , int Column )
{
2023-04-13 18:46:51 +01:00
if ( sender ( ) = = ui . treeCompat ) {
// todo: check if really changed
OnCompatChanged ( ) ;
}
2022-05-29 07:07:17 +01:00
}
2021-10-16 16:19:51 +01:00
void CSettingsWindow : : OnAddCompat ( )
{
QTreeWidgetItem * pItem = ui . treeCompat - > currentItem ( ) ;
if ( ! pItem )
return ;
pItem - > setCheckState ( 0 , Qt : : Checked ) ;
2023-04-13 18:46:51 +01:00
OnCompatChanged ( ) ;
2021-10-16 16:19:51 +01:00
}
void CSettingsWindow : : OnDelCompat ( )
{
QTreeWidgetItem * pItem = ui . treeCompat - > currentItem ( ) ;
if ( ! pItem )
return ;
pItem - > setCheckState ( 0 , Qt : : Unchecked ) ;
2023-04-13 18:46:51 +01:00
OnCompatChanged ( ) ;
}
void CSettingsWindow : : OnTemplateDoubleClicked ( QTreeWidgetItem * pItem , int Column )
{
QSharedPointer < CSbieIni > pTemplate = QSharedPointer < CSbieIni > ( new CSbieIni ( pItem - > data ( 0 , Qt : : UserRole ) . toString ( ) , theAPI ) ) ;
COptionsWindow OptionsWindow ( pTemplate , pItem - > text ( 0 ) ) ;
QPoint ParentPos = mapToGlobal ( rect ( ) . topLeft ( ) ) ;
OptionsWindow . move ( ParentPos . x ( ) + 30 , ParentPos . y ( ) + 10 ) ;
OptionsWindow . exec ( ) ;
// todo update name if it changed
}
void CSettingsWindow : : OnAddTemplates ( )
{
QString Value = QInputDialog : : getText ( this , " Sandboxie-Plus " , tr ( " Please enter the template identifier " ) , QLineEdit : : Normal ) ;
if ( Value . isEmpty ( ) )
return ;
QString Name = QString ( Value ) . replace ( " " , " _ " ) ;
SB_STATUS Status = theAPI - > ValidateName ( Name ) ;
if ( Status . IsError ( ) ) {
QMessageBox : : critical ( this , " Sandboxie-Plus " , tr ( " Error: %1 " ) . arg ( CSandMan : : FormatError ( Status ) ) ) ;
return ;
}
QSharedPointer < CSbieIni > pTemplate = QSharedPointer < CSbieIni > ( new CSbieIni ( " Template_Local_ " + Name , theAPI ) ) ;
pTemplate - > SetText ( " Tmpl.Title " , Value ) ;
pTemplate - > SetText ( " Tmpl.Class " , " Local " ) ;
COptionsWindow OptionsWindow ( pTemplate , Value ) ;
OptionsWindow . exec ( ) ;
LoadTemplates ( ) ;
}
void CSettingsWindow : : OnTemplateWizard ( )
{
CTemplateWizard : : ETemplateType Type = ( CTemplateWizard : : ETemplateType ) ( ( QAction * ) sender ( ) ) - > data ( ) . toInt ( ) ;
if ( CTemplateWizard : : CreateNewTemplate ( NULL , Type , this ) ) {
LoadTemplates ( ) ;
}
}
2024-04-20 13:43:30 +01:00
void CSettingsWindow : : OnOpenTemplate ( )
{
QTreeWidgetItem * pItem = ui . treeTemplates - > currentItem ( ) ;
if ( pItem )
OnTemplateDoubleClicked ( pItem , 0 ) ;
}
2023-04-13 18:46:51 +01:00
void CSettingsWindow : : OnDelTemplates ( )
{
if ( QMessageBox ( " Sandboxie-Plus " , tr ( " Do you really want to delete the selected local template(s)? " ) , QMessageBox : : Question , QMessageBox : : Yes , QMessageBox : : No | QMessageBox : : Default | QMessageBox : : Escape , QMessageBox : : NoButton , this ) . exec ( ) ! = QMessageBox : : Yes )
return ;
foreach ( QTreeWidgetItem * pItem , ui . treeTemplates - > selectedItems ( ) )
{
QString Section = pItem - > data ( 0 , Qt : : UserRole ) . toString ( ) ;
delete pItem ;
// delete section
theAPI - > SbieIniSet ( Section , " * " , " " ) ;
}
2021-10-16 16:19:51 +01:00
}
2023-04-13 18:46:51 +01:00
void CSettingsWindow : : LoadTemplates ( )
{
QStringList Templates ;
for ( int index = 0 ; ; index + + )
{
QString Value = theAPI - > SbieIniGet2 ( " " , " " , index ) ;
if ( Value . isNull ( ) )
break ;
Templates . append ( Value ) ;
}
ui . treeTemplates - > clear ( ) ;
QString TextFilter = ui . txtTemplates - > text ( ) ;
foreach ( const QString & Name , Templates )
{
if ( Name . left ( 9 ) . compare ( " Template_ " , Qt : : CaseInsensitive ) ! = 0 )
continue ;
if ( Name . indexOf ( TextFilter , 0 , Qt : : CaseInsensitive ) = = - 1 )
continue ;
QString Title = theAPI - > SbieIniGet2 ( Name , " Tmpl.Title " ) ;
if ( Title . left ( 1 ) = = " # " )
{
int End = Title . mid ( 1 ) . indexOf ( " , " ) ;
if ( End = = - 1 ) End = Title . length ( ) - 1 ;
int MsgNum = Title . mid ( 1 , End ) . toInt ( ) ;
Title = theAPI - > GetSbieMsgStr ( MsgNum , theGUI - > m_LanguageId ) . arg ( Title . mid ( End + 2 ) ) . arg ( " " ) ;
}
if ( Title . isEmpty ( ) ) Title = Name ;
2022-01-13 22:52:58 +00:00
2023-04-13 18:46:51 +01:00
QTreeWidgetItem * pItem = new QTreeWidgetItem ( ) ;
pItem - > setData ( 0 , Qt : : UserRole , Name ) ;
pItem - > setText ( 0 , Title ) ;
ui . treeTemplates - > addTopLevelItem ( pItem ) ;
}
}
2022-01-13 22:52:58 +00:00
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2022-01-14 21:28:44 +00:00
// Raw section ini Editor
2022-01-13 22:52:58 +00:00
//
void CSettingsWindow : : SetIniEdit ( bool bEnable )
{
2022-08-15 12:18:26 +01:00
if ( m_pTree ) {
m_pTree - > setEnabled ( ! bEnable ) ;
}
else {
2023-04-13 18:46:51 +01:00
for ( int i = 4 ; i < ui . tabs - > count ( ) - 1 ; i + + ) {
2022-08-15 12:18:26 +01:00
bool Enabled = ui . tabs - > widget ( i ) - > isEnabled ( ) ;
ui . tabs - > setTabEnabled ( i , ! bEnable & & Enabled ) ;
ui . tabs - > widget ( i ) - > setEnabled ( Enabled ) ;
}
2022-01-13 22:52:58 +00:00
}
ui . btnSaveIni - > setEnabled ( bEnable ) ;
ui . btnCancelEdit - > setEnabled ( bEnable ) ;
2023-04-13 18:46:51 +01:00
//ui.txtIniSection->setReadOnly(!bEnable);
2022-01-13 22:52:58 +00:00
ui . btnEditIni - > setEnabled ( ! bEnable ) ;
}
void CSettingsWindow : : OnEditIni ( )
{
SetIniEdit ( true ) ;
}
void CSettingsWindow : : OnSaveIni ( )
{
SaveIniSection ( ) ;
SetIniEdit ( false ) ;
LoadSettings ( ) ;
}
2023-04-13 18:46:51 +01:00
void CSettingsWindow : : OnIniChanged ( )
{
if ( m_HoldChange )
return ;
if ( ui . btnEditIni - > isEnabled ( ) )
SetIniEdit ( true ) ;
ui . buttonBox - > button ( QDialogButtonBox : : Apply ) - > setEnabled ( true ) ;
}
2022-01-13 22:52:58 +00:00
void CSettingsWindow : : OnCancelEdit ( )
{
SetIniEdit ( false ) ;
2023-04-13 18:46:51 +01:00
LoadIniSection ( ) ;
2022-01-13 22:52:58 +00:00
}
void CSettingsWindow : : LoadIniSection ( )
{
QString Section ;
2022-01-14 17:58:25 +00:00
if ( theAPI - > IsConnected ( ) )
Section = theAPI - > SbieIniGetEx ( " GlobalSettings " , " " ) ;
2022-01-13 22:52:58 +00:00
2023-04-13 18:46:51 +01:00
m_HoldChange = true ;
2022-01-13 22:52:58 +00:00
ui . txtIniSection - > setPlainText ( Section ) ;
2023-04-13 18:46:51 +01:00
m_HoldChange = false ;
2022-01-13 22:52:58 +00:00
}
void CSettingsWindow : : SaveIniSection ( )
{
2022-01-14 17:58:25 +00:00
if ( theAPI - > IsConnected ( ) )
theAPI - > SbieIniSet ( " GlobalSettings " , " " , ui . txtIniSection - > toPlainText ( ) ) ;
2022-01-13 22:52:58 +00:00
LoadIniSection ( ) ;
}
2023-07-19 20:15:18 +01:00
QVariantMap GetRunEntry ( const QString & sEntry )
{
QVariantMap Entry ;
if ( sEntry . left ( 1 ) = = " { " )
{
Entry = QJsonDocument : : fromJson ( sEntry . toUtf8 ( ) ) . toVariant ( ) . toMap ( ) ;
}
else
{
StrPair NameCmd = Split2 ( sEntry , " | " ) ;
StrPair NameIcon = Split2 ( NameCmd . first , " , " ) ;
Entry [ " Name " ] = NameIcon . first ;
Entry [ " Icon " ] = NameIcon . second ;
Entry [ " Command " ] = NameCmd . second ;
}
return Entry ;
}
void AddRunItem ( QTreeWidget * treeRun , const QVariantMap & Entry )
{
QTreeWidgetItem * pItem = new QTreeWidgetItem ( ) ;
pItem - > setText ( 0 , Entry [ " Name " ] . toString ( ) ) ;
pItem - > setData ( 0 , Qt : : UserRole , Entry ) ;
pItem - > setText ( 1 , Entry [ " Command " ] . toString ( ) ) ;
pItem - > setFlags ( pItem - > flags ( ) | Qt : : ItemIsEditable ) ;
treeRun - > addTopLevelItem ( pItem ) ;
}
QString MakeRunEntry ( QTreeWidgetItem * pItem )
{
QVariantMap Entry = pItem - > data ( 0 , Qt : : UserRole ) . toMap ( ) ;
Entry [ " Name " ] = pItem - > text ( 0 ) ;
Entry [ " Command " ] = pItem - > text ( 1 ) ;
return MakeRunEntry ( Entry ) ;
}
QString MakeRunEntry ( const QVariantMap & Entry )
{
if ( ! Entry [ " WorkingDir " ] . toString ( ) . isEmpty ( ) | | ! Entry [ " Icon " ] . toString ( ) . isEmpty ( ) ) {
QJsonDocument doc ( QJsonValue : : fromVariant ( Entry ) . toObject ( ) ) ;
QString sEntry = QString : : fromUtf8 ( doc . toJson ( QJsonDocument : : Compact ) ) ;
return sEntry ;
}
//if(!Entry["Icon"].toString().isEmpty())
// return Entry["Name"].toString() + "," + Entry["Icon"].toString() + "|" + Entry["Command"].toString();
return Entry [ " Name " ] . toString ( ) + " | " + Entry [ " Command " ] . toString ( ) ;
}
2022-01-13 22:52:58 +00:00
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2022-08-11 23:09:35 +01:00
// Update
//
void CSettingsWindow : : GetUpdates ( )
{
QVariantMap Params ;
Params [ " channel " ] = " all " ;
2022-11-20 16:23:15 +00:00
theGUI - > m_pUpdater - > GetUpdates ( this , SLOT ( OnUpdateData ( const QVariantMap & , const QVariantMap & ) ) , Params ) ;
}
QString CSettingsWindow__MkVersion ( const QString & Name , const QVariantMap & Releases )
{
QVariantMap Release = Releases [ Name ] . toMap ( ) ;
QString Version = Release . value ( " version " ) . toString ( ) ;
//if (Release["build"].type() != QVariant::Invalid)
2022-12-07 15:45:38 +00:00
int iUpdate = Release [ " update " ] . toInt ( ) ;
2022-11-20 17:16:13 +00:00
if ( iUpdate ) Version + = QChar ( ' a ' + ( iUpdate - 1 ) ) ;
2022-11-20 16:23:15 +00:00
return QString ( " <a href= \" %1 \" >%2</a> " ) . arg ( Name , Version ) ;
2022-08-11 23:09:35 +01:00
}
void CSettingsWindow : : OnUpdateData ( const QVariantMap & Data , const QVariantMap & Params )
{
if ( Data . isEmpty ( ) | | Data [ " error " ] . toBool ( ) )
return ;
m_UpdateData = Data ;
2022-11-20 16:23:15 +00:00
QVariantMap Releases = m_UpdateData [ " releases " ] . toMap ( ) ;
2024-04-26 08:01:16 +01:00
ui . lblCurrent - > setText ( tr ( " %1 (Current) " ) . arg ( theGUI - > GetVersion ( true ) ) ) ;
2022-11-20 16:23:15 +00:00
ui . lblStable - > setText ( CSettingsWindow__MkVersion ( " stable " , Releases ) ) ;
ui . lblPreview - > setText ( CSettingsWindow__MkVersion ( " preview " , Releases ) ) ;
2023-07-01 17:54:53 +01:00
if ( ui . radInsider - > isEnabled ( ) )
ui . lblInsider - > setText ( CSettingsWindow__MkVersion ( " insider " , Releases ) ) ;
2022-08-11 23:09:35 +01:00
}
void CSettingsWindow : : OnUpdate ( const QString & Channel )
{
2022-11-20 16:23:15 +00:00
if ( Channel = = " check " ) {
2022-08-11 23:09:35 +01:00
GetUpdates ( ) ;
2022-11-20 16:23:15 +00:00
return ;
}
QVariantMap Releases = m_UpdateData [ " releases " ] . toMap ( ) ;
QVariantMap Release = Releases [ Channel ] . toMap ( ) ;
2022-08-11 23:09:35 +01:00
2022-11-20 16:23:15 +00:00
QString VersionStr = Release [ " version " ] . toString ( ) ;
if ( VersionStr . isEmpty ( ) )
return ;
2022-08-11 23:09:35 +01:00
2022-11-20 16:23:15 +00:00
QVariantMap Installer = Releases [ " installer " ] . toMap ( ) ;
QString DownloadUrl = Installer [ " downloadUrl " ] . toString ( ) ;
//QString DownloadSig = Installer["signature"].toString();
// todo xxx
//if (!DownloadUrl.isEmpty() /*&& !DownloadSig.isEmpty()*/)
//{
// // todo: signature
// if (QMessageBox("Sandboxie-Plus", tr("Do you want to download the installer for v%1?").arg(VersionStr), QMessageBox::Question, QMessageBox::Yes | QMessageBox::Default, QMessageBox::No | QMessageBox::Escape, QMessageBox::NoButton, this).exec() == QMessageBox::Yes)
// COnlineUpdater::Instance()->DownloadInstaller(DownloadUrl, true);
//}
//else
{
QString InfoUrl = Release [ " infoUrl " ] . toString ( ) ;
if ( InfoUrl . isEmpty ( ) )
InfoUrl = " https://sandboxie-plus.com/go.php?to=sbie-get " ;
QDesktopServices : : openUrl ( InfoUrl ) ;
2022-08-11 23:09:35 +01:00
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2022-01-13 22:52:58 +00:00
// Support
//
2023-04-13 18:46:51 +01:00
void CSettingsWindow : : CertChanged ( )
2021-10-16 16:19:51 +01:00
{
m_CertChanged = true ;
QPalette palette = QApplication : : palette ( ) ;
ui . txtCertificate - > setPalette ( palette ) ;
2023-04-13 18:46:51 +01:00
OnOptChanged ( ) ;
2021-10-16 16:19:51 +01:00
}
2024-04-14 11:30:27 +01:00
void CSettingsWindow : : KeyChanged ( )
{
ui . btnGetCert - > setEnabled ( ui . txtSerial - > text ( ) . length ( ) > 5 ) ;
}
2022-07-09 10:46:07 +01:00
void CSettingsWindow : : LoadCertificate ( QString CertPath )
2021-10-16 16:19:51 +01:00
{
2022-01-30 14:53:37 +00:00
if ( theAPI & & theAPI - > IsConnected ( ) )
2021-10-16 16:19:51 +01:00
CertPath = theAPI - > GetSbiePath ( ) + " \\ Certificate.dat " ;
QFile CertFile ( CertPath ) ;
if ( CertFile . open ( QFile : : ReadOnly ) ) {
g_Certificate = CertFile . readAll ( ) ;
CertFile . close ( ) ;
}
}
void WindowsMoveFile ( const QString & From , const QString & To )
{
2022-09-29 17:28:48 +01:00
std : : wstring from = From . toStdWString ( ) ;
2021-10-16 16:19:51 +01:00
from . append ( L " \0 " , 1 ) ;
2022-09-29 17:28:48 +01:00
std : : wstring to = To . toStdWString ( ) ;
2021-10-16 16:19:51 +01:00
to . append ( L " \0 " , 1 ) ;
SHFILEOPSTRUCT SHFileOp ;
memset ( & SHFileOp , 0 , sizeof ( SHFILEOPSTRUCT ) ) ;
SHFileOp . hwnd = NULL ;
SHFileOp . wFunc = To . isEmpty ( ) ? FO_DELETE : FO_MOVE ;
SHFileOp . pFrom = from . c_str ( ) ;
SHFileOp . pTo = to . c_str ( ) ;
SHFileOp . fFlags = NULL ;
//The Copying Function
SHFileOperation ( & SHFileOp ) ;
}