diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 99101d4..9f4e050 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -130,8 +130,11 @@ jobs: robocopy ./dependencies_bin/bin build/bin *.dll if ErrorLevel 8 (exit /B 1) copy LICENSE build\bin + copy build\dist\ppic.iss build\bin\ppic.iss + iscc /Q build\bin\ppic.iss + if not ErrorLevel 0 (exit /B 1) exit /B 0 - uses: actions/upload-artifact@v4 with: - name: "windows-msvc${{ matrix.vs }}-qt${{ matrix.qt_ver }}-cmake-package" - path: build/bin/* + name: "ppic-windows-msvc${{ matrix.vs }}-qt${{ matrix.qt_ver }}-cmake-setup" + path: build/bin/ppic-setup.exe diff --git a/CMakeLists.txt b/CMakeLists.txt index ae2fe86..78ee90d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -217,6 +217,11 @@ if (WIN32) set_target_properties(${EXE_NAME} PROPERTIES WIN32_EXECUTABLE TRUE ) + configure_file( + ${CMAKE_CURRENT_LIST_DIR}/dist/ppic.iss.in + ${CMAKE_CURRENT_BINARY_DIR}/dist/ppic.iss + @ONLY + ) elseif (APPLE) set_source_files_properties(assets/icons/app-icon.icns PROPERTIES MACOSX_PACKAGE_LOCATION "Resources" diff --git a/dist/ppic.iss.in b/dist/ppic.iss.in new file mode 100644 index 0000000..b2b79c1 --- /dev/null +++ b/dist/ppic.iss.in @@ -0,0 +1,193 @@ +; Script generated by the Inno Setup Script Wizard. +; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! + +; YYC MARK: +; This file MUST be placed with "ppic.exe" before compiling this script. +; Otherwise exception will be thrown. + +#define MyAppName "Pineapple Pictures" +#define MyAppVersion "@PROJECT_VERSION@" +#define MyAppPublisher "BLumia" +#define MyAppURL "https://github.com/BLumia/pineapple-pictures" +#define MyAppExeName "ppic.exe" + +[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.) +AppId={{B5291320-FE7C-4069-BF87-A0AC327FCD20} +AppName={#MyAppName} +AppVersion={#MyAppVersion} +;AppVerName={#MyAppName} {#MyAppVersion} +AppPublisher={#MyAppPublisher} +AppPublisherURL={#MyAppURL} +AppSupportURL={#MyAppURL} +AppUpdatesURL={#MyAppURL} +DefaultDirName={autopf}\pineapple-pictures +UninstallDisplayIcon={app}\{#MyAppExeName} +; "ArchitecturesAllowed=x64compatible" specifies that Setup cannot run +; on anything but x64 and Windows 11 on Arm. +ArchitecturesAllowed=x64compatible +; "ArchitecturesInstallIn64BitMode=x64compatible" requests that the +; install be done in "64-bit mode" on x64 or Windows 11 on Arm, +; meaning it should use the native 64-bit Program Files directory and +; the 64-bit view of the registry. +ArchitecturesInstallIn64BitMode=x64compatible +ChangesAssociations=yes +DefaultGroupName={#MyAppName} +AllowNoIcons=yes +LicenseFile=LICENSE +; Uncomment the following line to run in non administrative install mode (install for current user only). +;PrivilegesRequired=lowest +PrivilegesRequiredOverridesAllowed=dialog +OutputDir=. +OutputBaseFilename=ppic-setup +SolidCompression=yes +WizardStyle=modern + +[Languages] +Name: "english"; MessagesFile: "compiler:Default.isl" + +[CustomMessages] +english.Other=Other: +english.AssociateWithFiles=Associate %1 with its supported file types. +english.InstallVcRedist=Installing Microsoft Visual C++ Redistributable... + +[Tasks] +Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked +Name: "associatewithfiles"; Description: "{cm:AssociateWithFiles,{#MyAppName}}"; GroupDescription: "{cm:Other}" + +[Files] +Source: "{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion +Source: "*"; Excludes: "vc_redist.x64.exe,ppic-setup.exe,ppic.iss"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs +Source: "vc_redist.x64.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall +; NOTE: Don't use "Flags: ignoreversion" on any shared system files + +[Registry] +; YYC MARK: +; When adding new supported file estensions, pleasse copy following comment and de-comment it. +; Then search "wtf" (case insensitive) inside it and replace it (preserve word case) with your desired file extension. + +; ; .wtf File Type +; Root: HKA; Subkey: "Software\Classes\.wtf\OpenWithProgids"; ValueType: string; ValueName: "PineapplePictures.wtf"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +; Root: HKA; Subkey: "Software\Classes\PineapplePictures.wtf"; ValueType: string; ValueName: ""; ValueData: "Pineapple Pictures WTF Image"; Flags: uninsdeletekey; Tasks: associatewithfiles +; Root: HKA; Subkey: "Software\Classes\PineapplePictures.wtf\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0"; Tasks: associatewithfiles +; Root: HKA; Subkey: "Software\Classes\PineapplePictures.wtf\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""; Tasks: associatewithfiles + +; .jpg File Type +Root: HKA; Subkey: "Software\Classes\.jpg\OpenWithProgids"; ValueType: string; ValueName: "PineapplePictures.jpg"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.jpg"; ValueType: string; ValueName: ""; ValueData: "Pineapple Pictures JPG Image"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.jpg\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0"; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.jpg\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""; Tasks: associatewithfiles + +; .jfif File Type +Root: HKA; Subkey: "Software\Classes\.jfif\OpenWithProgids"; ValueType: string; ValueName: "PineapplePictures.jfif"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.jfif"; ValueType: string; ValueName: ""; ValueData: "Pineapple Pictures JFIF Image"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.jfif\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0"; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.jfif\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""; Tasks: associatewithfiles + +; .gif File Type +Root: HKA; Subkey: "Software\Classes\.gif\OpenWithProgids"; ValueType: string; ValueName: "PineapplePictures.gif"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.gif"; ValueType: string; ValueName: ""; ValueData: "Pineapple Pictures GIF Image"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.gif\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0"; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.gif\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""; Tasks: associatewithfiles + +; .bmp File Type +Root: HKA; Subkey: "Software\Classes\.bmp\OpenWithProgids"; ValueType: string; ValueName: "PineapplePictures.bmp"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.bmp"; ValueType: string; ValueName: ""; ValueData: "Pineapple Pictures BMP Image"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.bmp\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0"; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.bmp\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""; Tasks: associatewithfiles + +; .png File Type +Root: HKA; Subkey: "Software\Classes\.png\OpenWithProgids"; ValueType: string; ValueName: "PineapplePictures.png"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.png"; ValueType: string; ValueName: ""; ValueData: "Pineapple Pictures PNG Image"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.png\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0"; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.png\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""; Tasks: associatewithfiles + +; .ico File Type +Root: HKA; Subkey: "Software\Classes\.ico\OpenWithProgids"; ValueType: string; ValueName: "PineapplePictures.ico"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.ico"; ValueType: string; ValueName: ""; ValueData: "Pineapple Pictures ICO Image"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.ico\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0"; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.ico\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""; Tasks: associatewithfiles + +; .jpeg File Type +Root: HKA; Subkey: "Software\Classes\.jpeg\OpenWithProgids"; ValueType: string; ValueName: "PineapplePictures.jpeg"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.jpeg"; ValueType: string; ValueName: ""; ValueData: "Pineapple Pictures JPEG Image"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.jpeg\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0"; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.jpeg\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""; Tasks: associatewithfiles + +; .tif File Type +Root: HKA; Subkey: "Software\Classes\.tif\OpenWithProgids"; ValueType: string; ValueName: "PineapplePictures.tif"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.tif"; ValueType: string; ValueName: ""; ValueData: "Pineapple Pictures TIF Image"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.tif\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0"; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.tif\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""; Tasks: associatewithfiles + +; .tiff File Type +Root: HKA; Subkey: "Software\Classes\.tiff\OpenWithProgids"; ValueType: string; ValueName: "PineapplePictures.tiff"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.tiff"; ValueType: string; ValueName: ""; ValueData: "Pineapple Pictures TIFF Image"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.tiff\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0"; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.tiff\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""; Tasks: associatewithfiles + +; .webp File Type +Root: HKA; Subkey: "Software\Classes\.webp\OpenWithProgids"; ValueType: string; ValueName: "PineapplePictures.webp"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.webp"; ValueType: string; ValueName: ""; ValueData: "Pineapple Pictures WEBP Image"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.webp\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0"; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.webp\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""; Tasks: associatewithfiles + +; .psd File Type +Root: HKA; Subkey: "Software\Classes\.psd\OpenWithProgids"; ValueType: string; ValueName: "PineapplePictures.psd"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.psd"; ValueType: string; ValueName: ""; ValueData: "Pineapple Pictures PSD Image"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.psd\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0"; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.psd\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""; Tasks: associatewithfiles + +; .svg File Type +Root: HKA; Subkey: "Software\Classes\.svg\OpenWithProgids"; ValueType: string; ValueName: "PineapplePictures.svg"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.svg"; ValueType: string; ValueName: ""; ValueData: "Pineapple Pictures SVG Image"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.svg\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0"; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.svg\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""; Tasks: associatewithfiles + +; .kra File Type +Root: HKA; Subkey: "Software\Classes\.kra\OpenWithProgids"; ValueType: string; ValueName: "PineapplePictures.kra"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.kra"; ValueType: string; ValueName: ""; ValueData: "Pineapple Pictures KRA Image"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.kra\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0"; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.kra\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""; Tasks: associatewithfiles + +; .xcf File Type +Root: HKA; Subkey: "Software\Classes\.xcf\OpenWithProgids"; ValueType: string; ValueName: "PineapplePictures.xcf"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.xcf"; ValueType: string; ValueName: ""; ValueData: "Pineapple Pictures XCF Image"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.xcf\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0"; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.xcf\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""; Tasks: associatewithfiles + +; .avif File Type +Root: HKA; Subkey: "Software\Classes\.avif\OpenWithProgids"; ValueType: string; ValueName: "PineapplePictures.avif"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.avif"; ValueType: string; ValueName: ""; ValueData: "Pineapple Pictures AVIF Image"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.avif\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0"; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.avif\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""; Tasks: associatewithfiles + +; .qoi File Type +Root: HKA; Subkey: "Software\Classes\.qoi\OpenWithProgids"; ValueType: string; ValueName: "PineapplePictures.qoi"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.qoi"; ValueType: string; ValueName: ""; ValueData: "Pineapple Pictures QOI Image"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.qoi\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0"; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.qoi\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""; Tasks: associatewithfiles + +; .apng File Type +Root: HKA; Subkey: "Software\Classes\.apng\OpenWithProgids"; ValueType: string; ValueName: "PineapplePictures.apng"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.apng"; ValueType: string; ValueName: ""; ValueData: "Pineapple Pictures APNG Image"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.apng\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0"; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.apng\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""; Tasks: associatewithfiles + +; .exr File Type +Root: HKA; Subkey: "Software\Classes\.exr\OpenWithProgids"; ValueType: string; ValueName: "PineapplePictures.exr"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.exr"; ValueType: string; ValueName: ""; ValueData: "Pineapple Pictures EXR Image"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.exr\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0"; Tasks: associatewithfiles +Root: HKA; Subkey: "Software\Classes\PineapplePictures.exr\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""; Tasks: associatewithfiles + +[Icons] +Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" +Name: "{group}\{cm:ProgramOnTheWeb,{#MyAppName}}"; Filename: "{#MyAppURL}" +Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}" +Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon + +[Run] +Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent +Filename: "{tmp}\vc_redist.x64.exe"; Parameters: "/install /quiet /norestart"; StatusMsg: "{cm:InstallVcRedist}"; Flags: waituntilterminated +