obs-StreamFX/templates/windows/installer.iss.in
Michael Fabian 'Xaymar' Dirks 5a3954ae0e project: Fix License, License headers and Copyright information
Fixes several files incorrectly stated a different license from the actual project, as well as the copyright headers included in all files. This change has no effect on the licensing terms, it should clear up a bit of confusion by contributors. Plus the files get a bit smaller, and we have less duplicated information across the entire project.

Overall the project is GPLv2 if not built with Qt, and GPLv3 if it is built with Qt. There are no parts licensed under a different license, all have been adapted from other compatible licenses into GPLv2 or GPLv3.
2023-04-05 18:59:08 +02:00

706 lines
24 KiB
Text

; AUTOGENERATED COPYRIGHT HEADER START
; Copyright (C) 2022-2023 Michael Fabian 'Xaymar' Dirks <info@xaymar.com>
; AUTOGENERATED COPYRIGHT HEADER END
#define MyAppName "@PROJECT_TITLE@"
#define MyAppVersion "@PROJECT_VERSION@"
#define MyAppVersionText "@_VERSION@"
#define MyAppPublisher "Xaymars Technology Workshop"
#define MyAppURL "https://xaymar.com/"
#define MyAppCopyright "@PROJECT_COPYRIGHT@"
[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
; Application Information
AppId={{DE56A03A-C8A4-474B-83B0-CFD270262D38}}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
AppMutex=@PROJECT_NAME@,Global\@PROJECT_NAME@
; Versioning
VersionInfoProductName={#MyAppName}
VersionInfoProductVersion={#MyAppVersion}
VersionInfoVersion={#MyAppVersion}
VersionInfoProductTextVersion={#MyAppVersionText}
VersionInfoTextVersion={#MyAppVersionText}
VersionInfoCompany={#MyAppPublisher}
VersionInfoCopyright={#MyAppCopyright}
VersionInfoDescription={#MyAppName} Setup
; Architecture (Platform is always Windows)
ArchitecturesInstallIn64BitMode=x64 arm64 ia64
ArchitecturesAllowed=@ARCH@
; Installation Modes
AlwaysShowComponentsList=no
UsePreviousTasks=no
UsePreviousSetupType=no
UsePreviousPrivileges=no
PrivilegesRequired=admin
PrivilegesRequiredOverridesAllowed=dialog commandline
; Wizard Information
WizardStyle=modern
WizardResizable=yes
SetupIconFile="@PROJECT_SOURCE_DIR@/media/icon.ico"
SetupMutex=@PROJECT_NAME@-Setup,Global\@PROJECT_NAME@-Setup
UninstallDisplayIcon={uninstallexe}
; Directory Choices
UsePreviousAppDir=no
DisableDirPage=no
DirExistsWarning=no
DefaultDirName={code:GetDefaultDirectory}
AppendDefaultDirName=yes
DisableProgramGroupPage=no
DefaultGroupName={#MyAppName}
AppendDefaultGroupName=yes
; Other Information
Uninstallable=yes
CreateUninstallRegKey=not IsPortableMode()
ChangesEnvironment=yes
AllowNoIcons=yes
LicenseFile="@ISS_SOURCE_DIR@/LICENSE"
OutputDir="@ISS_PACKAGE_DIR@"
OutputBaseFilename=@PACKAGE_NAME@-@_PACKAGE_SUFFIX_OVERRIDE@
Compression=lzma2/ultra64
SolidCompression=yes
LZMAAlgorithm=1
[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
[Components]
name: "startmenu"; Description: "Start Menu Entries"
[Files]
Source: "@ISS_FILES_DIR@/data/obs-plugins/@PROJECT_NAME@/*"; DestDir: "{code:GetOutputDataDir}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "@ISS_FILES_DIR@/obs-plugins/@D_PLATFORM_BITS@bit/*"; DestDir: "{code:GetOutputBinaryDir}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "@PROJECT_SOURCE_DIR@/templates/windows/msvc-redist-helper.exe"; DestDir: "{app}"; DestName: "msvc-redist-helper.exe"; Flags: ignoreversion dontcopy noencryption
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
[Icons]
Name: "{group}\{cm:ProgramOnTheWeb,{#MyAppName}}"; Filename: "{#MyAppURL}"; Components: startmenu
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"; Components: startmenu
[Code]
// ------------------------------------------------------------------------------------------------------------------ //
#ifdef UNICODE
#define AW "W"
#else
#define AW "A"
#endif
type
WPARAM = UINT_PTR;
LPARAM = INT_PTR;
LRESULT = INT_PTR;
const
SMTO_ABORTIFHUNG = 2;
WM_WININICHANGE = $001A;
WM_SETTINGCHANGE = WM_WININICHANGE;
function user32_SendTextMessageTimeoutA(
hWnd: HWND;
Msg: UINT;
wParam: WPARAM;
lParam: PAnsiChar;
fuFlags: UINT;
uTimeout: UINT;
out lpdwResult: DWORD): LRESULT;
external 'SendMessageTimeoutA@user32.dll stdcall';
procedure RefreshEnvironment();
var
S: AnsiString;
MsgResult: DWORD;
begin
S := 'Environment';
user32_SendTextMessageTimeoutA(HWND_BROADCAST, WM_SETTINGCHANGE, 0,
PAnsiChar(S), SMTO_ABORTIFHUNG, 5000, MsgResult);
end;
// ------------------------------------------------------------------------------------------------------------------ //
function ParamExists(Name: String): Boolean;
var
Idx: Integer;
Limit: Integer;
Param: String;
begin
Limit := ParamCount()
for Idx := 1 to Limit do begin
Param := ParamStr(Idx);
if SameText(Param, '/' + Name) then begin
Result := True;
exit;
end;
end;
Result := False;
end;
// ------------------------------------------------------------------------------------------------------------------ //
var
oModePageSystemChoice: TNewRadioButton;
oModePageUserChoice: TNewRadioButton;
oModePagePortableChoice: TNewRadioButton;
bIsPortableMode: Boolean;
bIsUserMode: Boolean;
bIsSystemMode: Boolean;
// InnoSetup
procedure InitializeWizard; forward;
function ShouldSkipPage(PageID: Integer): Boolean; forward;
function PrepareToInstall(var NeedsRestart: Boolean): String; forward;
function GetDefaultDirectory(Value: String): String; forward;
function GetOutputBinaryDir(Value: String): String; forward;
function GetOutputDataDir(Value: String): String; forward;
// Which installation is present?
function IsSystemInstallPresent(): Boolean; forward;
function GetSystemUninstaller(): String; forward;
function IsUserInstallPresent(): Boolean; forward;
function GetUserUninstaller(): String; forward;
// Which installation mode is selected?
function IsSystemMode(): Boolean; forward;
function IsUserMode(): Boolean; forward;
function IsPortableMode(): Boolean; forward;
// Other Metadata
function AppRegistryKey(): String; forward;
function GetUninstallerPath(): String; forward;
function IsUpgrade(): Boolean; forward;
function UninstallOldVersion(): Integer; forward;
// Mode Page
function CreateModePage: TWizardPage; forward;
procedure OnModePagePortableChoiceClick(Sender: TObject); forward;
procedure OnModePageSystemChoiceClick(Sender: TObject); forward;
// ------------------------------------------------------------------------------------------------------------------ //
function InitializeSetup(): Boolean;
begin
if ParamExists('Portable') then begin
bIsSystemMode := False;
bIsUserMode := False;
bIsPortableMode := True;
end else begin
bIsSystemMode := IsAdmin();
bIsUserMode := not IsAdmin();
bIsPortableMode := False;
end;
Result := True;
end;
// ------------------------------------------------------------------------------------------------------------------ //
procedure InitializeWizard;
var
oModePage: TWizardPage;
begin
oModePage := CreateModePage();
if (IsPortableMode()) then begin
WizardSelectComponents('!startmenu');
end else begin
WizardSelectComponents('startmenu');
end;
end;
// ------------------------------------------------------------------------------------------------------------------ //
function ShouldSkipPage(PageID: Integer): Boolean;
begin
Result := False;
if (PageID = wpSelectDir) then begin
Result := not IsPortableMode();
end else if (PageID = wpSelectComponents) then begin
Result := True;
end else if (PageID = wpSelectProgramGroup) then begin
Result := not WizardIsComponentSelected('startmenu');
end;
end;
// ------------------------------------------------------------------------------------------------------------------ //
function PrepareToInstall(var NeedsRestart: Boolean): String;
var
iResultCode: Integer;
sPluginsPath: String;
sPluginsDataPath: String;
begin
// Attempt to remove old version if it exists.
if (IsUpgrade()) then begin
UninstallOldVersion();
end;
// Also ensure that we have the necessary prerequisites installed to run the program.
ExtractTemporaryFile('msvc-redist-helper.exe');
Exec(ExpandConstant('{tmp}\msvc-redist-helper.exe'), '2019', '', SW_HIDE, ewWaitUntilTerminated, iResultCode);
// If this is a User install, register the necessary environment changes.
if (IsUserMode()) then begin
sPluginsPath := ExpandConstant('{userpf}\obs-studio\plugins\%module%\bin\');
StringChangeEx(sPluginsPath, '\', '/', True);
RegWriteExpandStringValue(HKEY_CURRENT_USER, 'Environment', 'OBS_PLUGINS_PATH', sPluginsPath);
sPluginsDataPath := ExpandConstant('{userpf}\obs-studio\plugins\%module%\data\');
StringChangeEx(sPluginsDataPath, '\', '/', True);
RegWriteExpandStringValue(HKEY_CURRENT_USER, 'Environment', 'OBS_PLUGINS_DATA_PATH', sPluginsDataPath);
RefreshEnvironment();
end;
end;
// ------------------------------------------------------------------------------------------------------------------ //
function GetDefaultDirectory(Value: String): String;
var
sPath: String;
begin
// In all other cases, change depending on the chosen install method.
if (IsSystemMode()) then begin
// Default to ProgramData/obs-studio/@PROJECT_NAME@
Result := ExpandConstant('{commonappdata}\obs-studio\plugins\@PROJECT_NAME@');
end else if (IsUserMode()) then begin
Result := ExpandConstant('{userpf}\obs-studio\plugins\@PROJECT_NAME@');
end else begin
// If a path was given as an argument, use it.
if (Value <> '') then begin
Result := Value;
exit;
end;
Result := ExpandConstant('{userdesktop}\obs-studio');
end;
end;
// ------------------------------------------------------------------------------------------------------------------ //
function GetOutputBinaryDir(Value: String): String;
var
sPath: String;
begin
if (IsSystemMode()) then begin
sPath := ExpandConstant('{app}\bin\@D_PLATFORM_BITS@bit\');
end else if (IsUserMode()) then begin
sPath := ExpandConstant('{app}\bin\');
end else if (IsPortableMode()) then begin
sPath := ExpandConstant('{app}\obs-plugins\@D_PLATFORM_BITS@bit\');
end;
Result := sPath;
end;
function GetOutputDataDir(Value: String): String;
var
sPath: String;
begin
if (IsSystemMode()) then begin
sPath := ExpandConstant('{app}\data\');
end else if (IsUserMode()) then begin
sPath := ExpandConstant('{app}\data\@PROJECT_NAME@\');
end else if (IsPortableMode()) then begin
sPath := ExpandConstant('{app}\data\obs-plugins\@PROJECT_NAME@\');
end;
Result := sPath;
end;
// ------------------------------------------------------------------------------------------------------------------ //
function GetSystemUninstaller(): String;
var
sPath : String;
begin
Result := '';
if (RegQueryStringValue(HKLM64, AppRegistryKey(), 'UninstallString', sPath)) then begin
Result := sPath;
end;
end;
function IsSystemInstallPresent(): Boolean;
var
sPath : String;
begin
sPath := GetSystemUninstaller();
if (sPath <> '') then begin
Result := True;
end else begin
Result := False;
end;
end;
function GetUserUninstaller(): String;
var
sPath : String;
begin
Result := '';
if (RegQueryStringValue(HKCU64, AppRegistryKey(), 'UninstallString', sPath)) then begin
Result := sPath;
end;
end;
function IsUserInstallPresent(): Boolean;
var
sPath : String;
begin
sPath := GetUserUninstaller();
if (sPath <> '') then begin
Result := True;
end else begin
Result := False;
end;
end;
function GetUninstallerPath(): String;
begin
if (IsSystemMode()) then begin
Result := GetSystemUninstaller();
end else if (IsUserMode()) then begin
Result := GetUserUninstaller();
end else begin
Result := '';
end;
end;
// ------------------------------------------------------------------------------------------------------------------ //
function IsSystemMode(): Boolean;
begin
Result := bIsSystemMode;
end;
function IsUserMode(): Boolean;
begin
Result := bIsUserMode;
end;
function IsPortableMode(): Boolean;
begin
Result := bIsPortableMode;
end;
// ------------------------------------------------------------------------------------------------------------------ //
function AppRegistryKey(): String;
begin
Result := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{#emit SetupSetting('AppId')}_is1');
end;
// ------------------------------------------------------------------------------------------------------------------ //
function IsUpgrade(): Boolean;
begin
Result := (not IsPortableMode()) and (GetUninstallerPath() <> '');
end;
// ------------------------------------------------------------------------------------------------------------------ //
function UninstallOldVersion(): Integer;
var
sUninstallerPath: String;
iResultCode: Integer;
begin
Result := 0;
sUninstallerPath := GetUninstallerPath();
if (sUninstallerPath <> '') then begin
sUninstallerPath := RemoveQuotes(sUninstallerPath);
if Exec(sUninstallerPath, '/VERYSILENT /NORESTART /SUPPRESSMSGBOXES', '', SW_HIDE, ewWaitUntilTerminated, iResultCode) then begin
Result := iResultCode
end else begin
Result := 1
end;
end;
end;
// ------------------------------------------------------------------------------------------------------------------ //
procedure OnModePageSystemChoiceClick(Sender: TObject);
begin
if (not oModePageSystemChoice.Enabled) then begin
OnModePagePortableChoiceClick(Sender);
end else begin
oModePageSystemChoice.Checked := True;
oModePageUserChoice.Checked := False;
oModePagePortableChoice.Checked := False;
bIsSystemMode := True;
bIsUserMode := False;
bIsPortableMode := False;
WizardSelectComponents('startmenu');
end;
end;
procedure onModePageUserChoiceClick(Sender: TObject);
begin
if (not oModePageUserChoice.Enabled) then begin
OnModePagePortableChoiceClick(Sender);
end else begin
oModePageSystemChoice.Checked := False;
oModePageUserChoice.Checked := True;
oModePagePortableChoice.Checked := False;
bIsSystemMode := False;
bIsUserMode := True;
bIsPortableMode := False;
WizardSelectComponents('startmenu');
end;
end;
procedure OnModePagePortableChoiceClick(Sender: TObject);
begin
oModePageSystemChoice.Checked := False;
oModePageUserChoice.Checked := False;
oModePagePortableChoice.Checked := True;
bIsSystemMode := False;
bIsUserMode := False;
bIsPortableMode := True;
WizardSelectComponents('!startmenu');
end;
function CreateModePage: TWizardPage;
var
oPage: TWizardPage;
oSystemPanel: TPanel;
oSystemChoice: TNewRadioButton;
oSystemText: TLabel;
oSystemWarningText: TLabel;
oUserPanel: TPanel;
oUserChoice: TNewRadioButton;
oUserText: TLabel;
oUserWarningText: TLabel;
oPortablePanel: TPanel;
oPortableChoice: TNewRadioButton;
oPortableText: TLabel;
oPortableWarningText: TLabel;
oFractionalHeight: Integer;
begin
// Build a page that asks a user if they want to use Movable or Static installation.
oPage := CreateCustomPage(wpLicense,
'Installation Mode',
'Select how to install StreamFX on your System');
oFractionalHeight := ScaleY((oPage.SurfaceHeight - 10) / 3);
// System-Wide installation
if (True) then begin
oSystemPanel := TPanel.Create(oPage);
oSystemPanel.Parent := oPage.Surface;
oSystemPanel.ParentBackground := False;
oSystemPanel.Left := ScaleX(5);
oSystemPanel.Top := ScaleY(5);
oSystemPanel.Width := oPage.SurfaceWidth - ScaleX(10);
oSystemPanel.Height := oFractionalHeight;
oSystemPanel.Anchors := [akLeft, akTop, akRight];
oSystemPanel.Color := clWindow;
oSystemPanel.BevelKind := bkTile;
oSystemPanel.BevelInner := bvNone;
oSystemPanel.BevelOuter := bvRaised;
oSystemPanel.BevelWidth := 1;
oSystemPanel.OnClick := @OnModePageSystemChoiceClick;
oSystemChoice := TNewRadioButton.Create(oSystemPanel);
oModePageSystemChoice := oSystemChoice;
oSystemChoice.Parent := oSystemPanel;
oSystemChoice.ParentBackground := False;
oSystemChoice.Left := ScaleX(5);
oSystemChoice.Top := ScaleY(5);
oSystemChoice.Width := oSystemPanel.Width - ScaleX(10);
oSystemChoice.Height := ScaleY(20);
oSystemChoice.Anchors := [akLeft, akTop, akRight];
oSystemChoice.Caption := 'All Users';
oSystemChoice.Font.Style := [fsBold];
oSystemChoice.OnClick := @OnModePageSystemChoiceClick;
oSystemText := TLabel.Create(oSystemPanel);
oSystemText.Parent := oSystemPanel;
oSystemText.AutoSize := False;
oSystemText.Left := ScaleX(5);
oSystemText.Top := ScaleY(5) + oSystemChoice.Top + oSystemChoice.Height;
oSystemText.Width := oSystemPanel.Width - ScaleX(10);
oSystemText.Height := oSystemPanel.Height - ScaleX(5) - oSystemText.Top;
oSystemText.Anchors := [akLeft, akTop, akRight];
oSystemText.WordWrap := True
oSystemText.Caption := 'Install for all users of this System, which will require Administrator rights for future updates. May cause problems with Portable and Current User installations.';
oSystemText.OnClick := @OnModePageSystemChoiceClick;
// Not available without Administrator rights.
if (not IsAdmin()) then begin
oSystemWarningText := TLabel.Create(oSystemPanel);
oSystemWarningText.Parent := oSystemPanel;
oSystemWarningText.AutoSize := False;
oSystemWarningText.Left := ScaleX(5);
oSystemWarningText.Top := oSystemPanel.Height - ScaleY(5) - ScaleY(15);
oSystemWarningText.Width := oSystemPanel.Width - ScaleX(10);
oSystemWarningText.Height := ScaleY(15);
oSystemWarningText.Anchors := [akLeft, akBottom, akRight];
oSystemWarningText.WordWrap := True
oSystemWarningText.Font.Color := clRed;
oSystemWarningText.Font.Style := [fsBold];
oSystemWarningText.Caption := 'Please launch the installer with Administrator rights.';
oSystemPanel.Enabled := False;
oSystemChoice.Enabled := False;
oSystemChoice.Checked := False;
oSystemText.Enabled := False;
end else if (IsUserInstallPresent()) then begin
oSystemWarningText := TLabel.Create(oSystemPanel);
oSystemWarningText.Parent := oSystemPanel;
oSystemWarningText.AutoSize := False;
oSystemWarningText.Left := ScaleX(5);
oSystemWarningText.Top := oSystemPanel.Height - ScaleY(5) - ScaleY(15);
oSystemWarningText.Width := oSystemPanel.Width - ScaleX(10);
oSystemWarningText.Height := ScaleY(15);
oSystemWarningText.Anchors := [akLeft, akBottom, akRight];
oSystemWarningText.WordWrap := True
oSystemWarningText.Font.Color := $007EFF;
oSystemWarningText.Font.Style := [fsBold];
oSystemWarningText.Caption := 'A conflicting installation was detected which may cause issues.';
end;
end;
// Local-User installation
if (True) then begin
oUserPanel := TPanel.Create(oPage);
oUserPanel.Parent := oPage.Surface;
oUserPanel.ParentBackground := False;
oUserPanel.Left := ScaleX(5);
oUserPanel.Top := ScaleY(5) + oSystemPanel.Top + oSystemPanel.Height;
oUserPanel.Width := oPage.SurfaceWidth - ScaleX(10);
oUserPanel.Height := oFractionalHeight;
oUserPanel.Anchors := [akLeft, akTop, akRight];
oUserPanel.Color := clWindow;
oUserPanel.BevelKind := bkTile;
oUserPanel.BevelInner := bvNone;
oUserPanel.BevelOuter := bvRaised;
oUserPanel.BevelWidth := 1;
oUserPanel.OnClick := @OnModePageUserChoiceClick;
oUserChoice := TNewRadioButton.Create(oUserPanel);
oModePageUserChoice := oUserChoice;
oUserChoice.Parent := oUserPanel;
oUserChoice.ParentBackground := False;
oUserChoice.Left := ScaleX(5);
oUserChoice.Top := ScaleY(5);
oUserChoice.Width := oUserPanel.Width - ScaleX(10);
oUserChoice.Height := ScaleY(20);
oUserChoice.Anchors := [akLeft, akTop, akRight];
oUserChoice.Caption := 'Current User';
oUserChoice.Font.Style := [fsBold];
oUserChoice.OnClick := @OnModePageUserChoiceClick;
oUserText := TLabel.Create(oUserPanel);
oUserText.Parent := oUserPanel;
oUserText.AutoSize := False;
oUserText.Left := ScaleX(5);
oUserText.Top := ScaleY(5) + oUserChoice.Top + oUserChoice.Height;
oUserText.Width := oUserPanel.Width - ScaleX(10);
oUserText.Height := oUserPanel.Height - ScaleX(5) - oUserText.Top;
oUserText.Anchors := [akLeft, akTop, akRight];
oUserText.WordWrap := True
oUserText.Caption := 'Install for the current user only, which will allow you to use @PROJECT_NAME@. Updating will not require Administrator rights.';
oUserText.OnClick := @OnModePageUserChoiceClick;
// Not available with Administrator rights.
if (IsAdmin()) then begin
oUserWarningText := TLabel.Create(oUserPanel);
oUserWarningText.Parent := oUserPanel;
oUserWarningText.AutoSize := False;
oUserWarningText.Left := ScaleX(5);
oUserWarningText.Top := oUserPanel.Height - ScaleY(5) - ScaleY(15);
oUserWarningText.Width := oUserPanel.Width - ScaleX(10);
oUserWarningText.Height := ScaleY(15);
oUserWarningText.Anchors := [akLeft, akBottom, akRight];
oUserWarningText.WordWrap := True
oUserWarningText.Font.Color := clRed;
oUserWarningText.Font.Style := [fsBold];
oUserWarningText.Caption := 'Please launch the Installer without Administrator rights.';
oUserPanel.Enabled := False;
oUserChoice.Enabled := False;
oUserChoice.Checked := False;
oUserText.Enabled := False;
end else if (IsSystemInstallPresent()) then begin
oUserWarningText := TLabel.Create(oUserPanel);
oUserWarningText.Parent := oUserPanel;
oUserWarningText.AutoSize := False;
oUserWarningText.Left := ScaleX(5);
oUserWarningText.Top := oUserPanel.Height - ScaleY(5) - ScaleY(15);
oUserWarningText.Width := oUserPanel.Width - ScaleX(10);
oUserWarningText.Height := ScaleY(15);
oUserWarningText.Anchors := [akLeft, akBottom, akRight];
oUserWarningText.WordWrap := True
oUserWarningText.Font.Color := $007EFF;
oUserWarningText.Font.Style := [fsBold];
oUserWarningText.Caption := 'A conflicting system wide installation was detected.';
oUserPanel.Enabled := False;
oUserChoice.Enabled := False;
oUserChoice.Checked := False;
oUserText.Enabled := False;
end;
end;
// Portable
if (True) then begin
oPortablePanel := TPanel.Create(oPage);
oPortablePanel.Parent := oPage.Surface;
oPortablePanel.ParentBackground := False;
oPortablePanel.Left := ScaleX(5);
oPortablePanel.Top := ScaleY(5) + oUserPanel.Top + oUserPanel.Height;
oPortablePanel.Width := oPage.SurfaceWidth - ScaleX(10);
oPortablePanel.Height := oFractionalHeight;
oPortablePanel.Anchors := [akLeft, akTop, akRight];
oPortablePanel.Color := clWindow;
oPortablePanel.BevelKind := bkTile;
oPortablePanel.BevelInner := bvNone;
oPortablePanel.BevelOuter := bvRaised;
oPortablePanel.BevelWidth := 1;
oPortablePanel.OnClick := @OnModePagePortableChoiceClick;
oPortableChoice := TNewRadioButton.Create(oPortablePanel);
oModePagePortableChoice := oPortableChoice;
oPortableChoice.Parent := oPortablePanel;
oPortableChoice.ParentBackground := False;
oPortableChoice.Left := ScaleX(5);
oPortableChoice.Top := ScaleY(5);
oPortableChoice.Width := oPortablePanel.Width - ScaleX(10);
oPortableChoice.Height := ScaleY(20);
oPortableChoice.Anchors := [akLeft, akTop, akRight];
oPortableChoice.Caption := 'Portable';
oPortableChoice.Font.Style := [fsBold];
oPortableChoice.OnClick := @OnModePagePortableChoiceClick;
oPortableText := TLabel.Create(oPortablePanel);
oPortableText.Parent := oPortablePanel;
oPortableText.AutoSize := False;
oPortableText.Left := ScaleX(5);
oPortableText.Top := ScaleY(5) + oPortableChoice.Top + oPortableChoice.Height;
oPortableText.Width := oPortablePanel.Width - ScaleX(10);
oPortableText.Height := oPortablePanel.Height - ScaleX(5) - oPortableText.Top;
oPortableText.Anchors := [akLeft, akTop, akRight];
oPortableText.WordWrap := True
oPortableText.Caption := 'Install for a portable OBS Studio environment.';
oPortableText.OnClick := @OnModePagePortableChoiceClick;
// Warn about Administrator rights
if (IsAdmin()) then begin
oPortableWarningText := TLabel.Create(oPortablePanel);
oPortableWarningText.Parent := oPortablePanel;
oPortableWarningText.AutoSize := False;
oPortableWarningText.Left := ScaleX(5);
oPortableWarningText.Top := oPortablePanel.Height - ScaleY(5) - ScaleY(15);
oPortableWarningText.Width := oPortablePanel.Width - ScaleX(10);
oPortableWarningText.Height := ScaleY(15);
oPortableWarningText.Anchors := [akLeft, akBottom, akRight];
oPortableWarningText.WordWrap := True
oPortableWarningText.Font.Color := $007EFF;
oPortableWarningText.Font.Style := [fsBold];
oPortableWarningText.Caption := 'Portable installation with Administrator rights may cause unforeseen consequences. Proceed with caution.';
end;
end;
oSystemChoice.Checked := bIsSystemMode;
oUserChoice.Checked := bIsUserMode;
oPortableChoice.Checked := bIsPortableMode;
Result := oPage;
end;