mirror of
https://github.com/PrismLauncher/PrismLauncher.git
synced 2025-04-30 06:34:27 +02:00
Merge branch 'develop' of https://github.com/PrismLauncher/PrismLauncher into skin
This commit is contained in:
commit
47af33ff6f
116
.github/workflows/build.yml
vendored
116
.github/workflows/build.yml
vendored
@ -39,9 +39,6 @@ on:
|
|||||||
APPLE_NOTARIZE_PASSWORD:
|
APPLE_NOTARIZE_PASSWORD:
|
||||||
description: Password used for notarizing macOS builds
|
description: Password used for notarizing macOS builds
|
||||||
required: false
|
required: false
|
||||||
CACHIX_AUTH_TOKEN:
|
|
||||||
description: Private token for authenticating against Cachix cache
|
|
||||||
required: false
|
|
||||||
GPG_PRIVATE_KEY:
|
GPG_PRIVATE_KEY:
|
||||||
description: Private key for AppImage signing
|
description: Private key for AppImage signing
|
||||||
required: false
|
required: false
|
||||||
@ -62,7 +59,7 @@ jobs:
|
|||||||
qt_version: "5.15.2"
|
qt_version: "5.15.2"
|
||||||
qt_modules: "qtnetworkauth"
|
qt_modules: "qtnetworkauth"
|
||||||
|
|
||||||
- os: ubuntu-20.04
|
- os: ubuntu-22.04
|
||||||
qt_ver: 6
|
qt_ver: 6
|
||||||
qt_host: linux
|
qt_host: linux
|
||||||
qt_arch: ""
|
qt_arch: ""
|
||||||
@ -80,9 +77,9 @@ jobs:
|
|||||||
architecture: "x64"
|
architecture: "x64"
|
||||||
vcvars_arch: "amd64"
|
vcvars_arch: "amd64"
|
||||||
qt_ver: 6
|
qt_ver: 6
|
||||||
qt_host: windows
|
qt_host: "windows"
|
||||||
qt_arch: ""
|
qt_arch: "win64_msvc2022_64"
|
||||||
qt_version: "6.7.3"
|
qt_version: "6.8.1"
|
||||||
qt_modules: "qt5compat qtimageformats qtnetworkauth"
|
qt_modules: "qt5compat qtimageformats qtnetworkauth"
|
||||||
nscurl_tag: "v24.9.26.122"
|
nscurl_tag: "v24.9.26.122"
|
||||||
nscurl_sha256: "AEE6C4BE3CB6455858E9C1EE4B3AFE0DB9960FA03FE99CCDEDC28390D57CCBB0"
|
nscurl_sha256: "AEE6C4BE3CB6455858E9C1EE4B3AFE0DB9960FA03FE99CCDEDC28390D57CCBB0"
|
||||||
@ -93,9 +90,9 @@ jobs:
|
|||||||
architecture: "arm64"
|
architecture: "arm64"
|
||||||
vcvars_arch: "amd64_arm64"
|
vcvars_arch: "amd64_arm64"
|
||||||
qt_ver: 6
|
qt_ver: 6
|
||||||
qt_host: windows
|
qt_host: "windows"
|
||||||
qt_arch: "win64_msvc2019_arm64"
|
qt_arch: "win64_msvc2022_arm64_cross_compiled"
|
||||||
qt_version: "6.7.3"
|
qt_version: "6.8.1"
|
||||||
qt_modules: "qt5compat qtimageformats qtnetworkauth"
|
qt_modules: "qt5compat qtimageformats qtnetworkauth"
|
||||||
nscurl_tag: "v24.9.26.122"
|
nscurl_tag: "v24.9.26.122"
|
||||||
nscurl_sha256: "AEE6C4BE3CB6455858E9C1EE4B3AFE0DB9960FA03FE99CCDEDC28390D57CCBB0"
|
nscurl_sha256: "AEE6C4BE3CB6455858E9C1EE4B3AFE0DB9960FA03FE99CCDEDC28390D57CCBB0"
|
||||||
@ -106,7 +103,7 @@ jobs:
|
|||||||
qt_ver: 6
|
qt_ver: 6
|
||||||
qt_host: mac
|
qt_host: mac
|
||||||
qt_arch: ""
|
qt_arch: ""
|
||||||
qt_version: "6.7.3"
|
qt_version: "6.8.1"
|
||||||
qt_modules: "qt5compat qtimageformats qtnetworkauth"
|
qt_modules: "qt5compat qtimageformats qtnetworkauth"
|
||||||
|
|
||||||
- os: macos-14
|
- os: macos-14
|
||||||
@ -167,13 +164,13 @@ jobs:
|
|||||||
|
|
||||||
- name: Setup ccache
|
- name: Setup ccache
|
||||||
if: (runner.os != 'Windows' || matrix.msystem == '') && inputs.build_type == 'Debug'
|
if: (runner.os != 'Windows' || matrix.msystem == '') && inputs.build_type == 'Debug'
|
||||||
uses: hendrikmuhs/ccache-action@v1.2.14
|
uses: hendrikmuhs/ccache-action@v1.2.17
|
||||||
with:
|
with:
|
||||||
key: ${{ matrix.os }}-qt${{ matrix.qt_ver }}-${{ matrix.architecture }}
|
key: ${{ matrix.os }}-qt${{ matrix.qt_ver }}-${{ matrix.architecture }}
|
||||||
|
|
||||||
- name: Retrieve ccache cache (Windows MinGW-w64)
|
- name: Retrieve ccache cache (Windows MinGW-w64)
|
||||||
if: runner.os == 'Windows' && matrix.msystem != '' && inputs.build_type == 'Debug'
|
if: runner.os == 'Windows' && matrix.msystem != '' && inputs.build_type == 'Debug'
|
||||||
uses: actions/cache@v4.2.0
|
uses: actions/cache@v4.2.1
|
||||||
with:
|
with:
|
||||||
path: '${{ github.workspace }}\.ccache'
|
path: '${{ github.workspace }}\.ccache'
|
||||||
key: ${{ matrix.os }}-mingw-w64-ccache-${{ github.run_id }}
|
key: ${{ matrix.os }}-mingw-w64-ccache-${{ github.run_id }}
|
||||||
@ -216,14 +213,14 @@ jobs:
|
|||||||
|
|
||||||
- name: Install host Qt (Windows MSVC arm64)
|
- name: Install host Qt (Windows MSVC arm64)
|
||||||
if: runner.os == 'Windows' && matrix.architecture == 'arm64'
|
if: runner.os == 'Windows' && matrix.architecture == 'arm64'
|
||||||
uses: jurplel/install-qt-action@v3
|
uses: jurplel/install-qt-action@v4
|
||||||
with:
|
with:
|
||||||
aqtversion: "==3.1.*"
|
aqtversion: "==3.1.*"
|
||||||
py7zrversion: ">=0.20.2"
|
py7zrversion: ">=0.20.2"
|
||||||
version: ${{ matrix.qt_version }}
|
version: ${{ matrix.qt_version }}
|
||||||
host: "windows"
|
host: "windows"
|
||||||
target: "desktop"
|
target: "desktop"
|
||||||
arch: ""
|
arch: ${{ matrix.qt_arch }}
|
||||||
modules: ${{ matrix.qt_modules }}
|
modules: ${{ matrix.qt_modules }}
|
||||||
cache: ${{ inputs.is_qt_cached }}
|
cache: ${{ inputs.is_qt_cached }}
|
||||||
cache-key-prefix: host-qt-arm64-windows
|
cache-key-prefix: host-qt-arm64-windows
|
||||||
@ -232,7 +229,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Install Qt (macOS, Linux & Windows MSVC)
|
- name: Install Qt (macOS, Linux & Windows MSVC)
|
||||||
if: matrix.msystem == ''
|
if: matrix.msystem == ''
|
||||||
uses: jurplel/install-qt-action@v3
|
uses: jurplel/install-qt-action@v4
|
||||||
with:
|
with:
|
||||||
aqtversion: "==3.1.*"
|
aqtversion: "==3.1.*"
|
||||||
py7zrversion: ">=0.20.2"
|
py7zrversion: ">=0.20.2"
|
||||||
@ -259,12 +256,12 @@ jobs:
|
|||||||
|
|
||||||
wget "https://github.com/AppImageCommunity/AppImageUpdate/releases/download/continuous/AppImageUpdate-x86_64.AppImage"
|
wget "https://github.com/AppImageCommunity/AppImageUpdate/releases/download/continuous/AppImageUpdate-x86_64.AppImage"
|
||||||
|
|
||||||
sudo apt install libopengl0
|
sudo apt install libopengl0 libfuse2
|
||||||
|
|
||||||
- name: Add QT_HOST_PATH var (Windows MSVC arm64)
|
- name: Add QT_HOST_PATH var (Windows MSVC arm64)
|
||||||
if: runner.os == 'Windows' && matrix.architecture == 'arm64'
|
if: runner.os == 'Windows' && matrix.architecture == 'arm64'
|
||||||
run: |
|
run: |
|
||||||
echo "QT_HOST_PATH=${{ github.workspace }}\HostQt\Qt\${{ matrix.qt_version }}\msvc2019_64" >> $env:GITHUB_ENV
|
echo "QT_HOST_PATH=${{ github.workspace }}\HostQt\Qt\${{ matrix.qt_version }}\msvc2022_64" >> $env:GITHUB_ENV
|
||||||
|
|
||||||
- name: Setup java (macOS)
|
- name: Setup java (macOS)
|
||||||
if: runner.os == 'macOS'
|
if: runner.os == 'macOS'
|
||||||
@ -521,8 +518,8 @@ jobs:
|
|||||||
|
|
||||||
cp -r ${{ runner.workspace }}/Qt/${{ matrix.qt_version }}/gcc_64/plugins/iconengines/* ${{ env.INSTALL_APPIMAGE_DIR }}/usr/plugins/iconengines
|
cp -r ${{ runner.workspace }}/Qt/${{ matrix.qt_version }}/gcc_64/plugins/iconengines/* ${{ env.INSTALL_APPIMAGE_DIR }}/usr/plugins/iconengines
|
||||||
|
|
||||||
cp /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 ${{ env.INSTALL_APPIMAGE_DIR }}/usr/lib/
|
cp /usr/lib/x86_64-linux-gnu/libcrypto.so.* ${{ env.INSTALL_APPIMAGE_DIR }}/usr/lib/
|
||||||
cp /usr/lib/x86_64-linux-gnu/libssl.so.1.1 ${{ env.INSTALL_APPIMAGE_DIR }}/usr/lib/
|
cp /usr/lib/x86_64-linux-gnu/libssl.so.* ${{ env.INSTALL_APPIMAGE_DIR }}/usr/lib/
|
||||||
cp /usr/lib/x86_64-linux-gnu/libOpenGL.so.0* ${{ env.INSTALL_APPIMAGE_DIR }}/usr/lib/
|
cp /usr/lib/x86_64-linux-gnu/libOpenGL.so.0* ${{ env.INSTALL_APPIMAGE_DIR }}/usr/lib/
|
||||||
|
|
||||||
LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${{ env.INSTALL_APPIMAGE_DIR }}/usr/lib"
|
LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${{ env.INSTALL_APPIMAGE_DIR }}/usr/lib"
|
||||||
@ -557,9 +554,9 @@ jobs:
|
|||||||
mkdir ${{ env.INSTALL_PORTABLE_DIR }}/lib
|
mkdir ${{ env.INSTALL_PORTABLE_DIR }}/lib
|
||||||
cp /lib/x86_64-linux-gnu/libbz2.so.1.0 ${{ env.INSTALL_PORTABLE_DIR }}/lib
|
cp /lib/x86_64-linux-gnu/libbz2.so.1.0 ${{ env.INSTALL_PORTABLE_DIR }}/lib
|
||||||
cp /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 ${{ env.INSTALL_PORTABLE_DIR }}/lib
|
cp /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 ${{ env.INSTALL_PORTABLE_DIR }}/lib
|
||||||
cp /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 ${{ env.INSTALL_PORTABLE_DIR }}/lib
|
cp /usr/lib/x86_64-linux-gnu/libcrypto.so.* ${{ env.INSTALL_PORTABLE_DIR }}/lib
|
||||||
cp /usr/lib/x86_64-linux-gnu/libssl.so.1.1 ${{ env.INSTALL_PORTABLE_DIR }}/lib
|
cp /usr/lib/x86_64-linux-gnu/libssl.so.* ${{ env.INSTALL_PORTABLE_DIR }}/lib
|
||||||
cp /usr/lib/x86_64-linux-gnu/libffi.so.7 ${{ env.INSTALL_PORTABLE_DIR }}/lib
|
cp /usr/lib/x86_64-linux-gnu/libffi.so.*.* ${{ env.INSTALL_PORTABLE_DIR }}/lib
|
||||||
mv ${{ env.INSTALL_PORTABLE_DIR }}/bin/*.so* ${{ env.INSTALL_PORTABLE_DIR }}/lib
|
mv ${{ env.INSTALL_PORTABLE_DIR }}/bin/*.so* ${{ env.INSTALL_PORTABLE_DIR }}/lib
|
||||||
|
|
||||||
for l in $(find ${{ env.INSTALL_PORTABLE_DIR }} -type f); do l=${l#$(pwd)/}; l=${l#${{ env.INSTALL_PORTABLE_DIR }}/}; l=${l#./}; echo $l; done > ${{ env.INSTALL_PORTABLE_DIR }}/manifest.txt
|
for l in $(find ${{ env.INSTALL_PORTABLE_DIR }} -type f); do l=${l#$(pwd)/}; l=${l#${{ env.INSTALL_PORTABLE_DIR }}/}; l=${l#./}; echo $l; done > ${{ env.INSTALL_PORTABLE_DIR }}/manifest.txt
|
||||||
@ -631,76 +628,3 @@ jobs:
|
|||||||
shell: msys2 {0}
|
shell: msys2 {0}
|
||||||
run: |
|
run: |
|
||||||
ccache -s
|
ccache -s
|
||||||
|
|
||||||
flatpak:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
container:
|
|
||||||
image: ghcr.io/flathub-infra/flatpak-github-actions:kde-6.8
|
|
||||||
options: --privileged
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
if: inputs.build_type == 'Debug'
|
|
||||||
with:
|
|
||||||
submodules: true
|
|
||||||
|
|
||||||
- name: Set short version
|
|
||||||
shell: bash
|
|
||||||
run: echo "VERSION=${GITHUB_SHA::7}" >> $GITHUB_ENV
|
|
||||||
|
|
||||||
- name: Build Flatpak (Linux)
|
|
||||||
if: inputs.build_type == 'Debug'
|
|
||||||
uses: flatpak/flatpak-github-actions/flatpak-builder@v6
|
|
||||||
with:
|
|
||||||
bundle: PrismLauncher-${{ runner.os }}-${{ env.VERSION }}-Flatpak.flatpak
|
|
||||||
manifest-path: flatpak/org.prismlauncher.PrismLauncher.yml
|
|
||||||
|
|
||||||
nix:
|
|
||||||
name: Nix (${{ matrix.system }})
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- os: ubuntu-22.04
|
|
||||||
system: x86_64-linux
|
|
||||||
|
|
||||||
- os: macos-13
|
|
||||||
system: x86_64-darwin
|
|
||||||
|
|
||||||
- os: macos-14
|
|
||||||
system: aarch64-darwin
|
|
||||||
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Install Nix
|
|
||||||
uses: cachix/install-nix-action@v30
|
|
||||||
|
|
||||||
# For PRs
|
|
||||||
- name: Setup Nix Magic Cache
|
|
||||||
uses: DeterminateSystems/magic-nix-cache-action@v8
|
|
||||||
|
|
||||||
# For in-tree builds
|
|
||||||
- name: Setup Cachix
|
|
||||||
uses: cachix/cachix-action@v15
|
|
||||||
with:
|
|
||||||
name: prismlauncher
|
|
||||||
authToken: ${{ secrets.CACHIX_AUTH_TOKEN }}
|
|
||||||
|
|
||||||
- name: Run flake checks
|
|
||||||
run: |
|
|
||||||
nix flake check --print-build-logs --show-trace
|
|
||||||
|
|
||||||
- name: Build debug package
|
|
||||||
if: ${{ inputs.build_type == 'Debug' }}
|
|
||||||
run: |
|
|
||||||
nix build --print-build-logs .#prismlauncher-debug
|
|
||||||
|
|
||||||
- name: Build release package
|
|
||||||
if: ${{ inputs.build_type != 'Debug' }}
|
|
||||||
run: |
|
|
||||||
nix build --print-build-logs .#prismlauncher
|
|
||||||
|
62
.github/workflows/flatpak.yml
vendored
Normal file
62
.github/workflows/flatpak.yml
vendored
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
name: Flatpak
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths-ignore:
|
||||||
|
- "**.md"
|
||||||
|
- "**/LICENSE"
|
||||||
|
- ".github/ISSUE_TEMPLATE/**"
|
||||||
|
- ".markdownlint**"
|
||||||
|
- "nix/**"
|
||||||
|
# We don't do anything with these artifacts on releases. They go to Flathub
|
||||||
|
tags-ignore:
|
||||||
|
- "*"
|
||||||
|
pull_request:
|
||||||
|
paths-ignore:
|
||||||
|
- "**.md"
|
||||||
|
- "**/LICENSE"
|
||||||
|
- ".github/ISSUE_TEMPLATE/**"
|
||||||
|
- ".markdownlint**"
|
||||||
|
- "nix/**"
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: Build (${{ matrix.arch }})
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- os: ubuntu-22.04
|
||||||
|
arch: x86_64
|
||||||
|
|
||||||
|
- os: ubuntu-22.04-arm
|
||||||
|
arch: aarch64
|
||||||
|
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
|
||||||
|
container:
|
||||||
|
image: ghcr.io/flathub-infra/flatpak-github-actions:kde-6.8
|
||||||
|
options: --privileged
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
submodules: true
|
||||||
|
|
||||||
|
- name: Set short version
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
echo "VERSION=${GITHUB_SHA::7}" >> "$GITHUB_ENV"
|
||||||
|
|
||||||
|
- name: Build Flatpak
|
||||||
|
uses: flatpak/flatpak-github-actions/flatpak-builder@v6
|
||||||
|
with:
|
||||||
|
bundle: PrismLauncher-${{ runner.os }}-${{ env.VERSION }}-Flatpak.flatpak
|
||||||
|
manifest-path: flatpak/org.prismlauncher.PrismLauncher.yml
|
||||||
|
arch: ${{ matrix.arch }}
|
90
.github/workflows/nix.yml
vendored
Normal file
90
.github/workflows/nix.yml
vendored
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
name: Nix
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths-ignore:
|
||||||
|
- "**.md"
|
||||||
|
- "**/LICENSE"
|
||||||
|
- ".github/ISSUE_TEMPLATE/**"
|
||||||
|
- ".markdownlint**"
|
||||||
|
- "flatpak/**"
|
||||||
|
pull_request_target:
|
||||||
|
paths-ignore:
|
||||||
|
- "**.md"
|
||||||
|
- "**/LICENSE"
|
||||||
|
- ".github/ISSUE_TEMPLATE/**"
|
||||||
|
- ".markdownlint**"
|
||||||
|
- "flatpak/**"
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
env:
|
||||||
|
DEBUG: ${{ github.ref_type != 'tag' }}
|
||||||
|
USE_DETERMINATE: ${{ github.event_name == 'pull_request' }}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: Build (${{ matrix.system }})
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- os: ubuntu-22.04
|
||||||
|
system: x86_64-linux
|
||||||
|
|
||||||
|
- os: ubuntu-22.04-arm
|
||||||
|
system: aarch64-linux
|
||||||
|
|
||||||
|
- os: macos-13
|
||||||
|
system: x86_64-darwin
|
||||||
|
|
||||||
|
- os: macos-14
|
||||||
|
system: aarch64-darwin
|
||||||
|
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
id-token: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install Nix
|
||||||
|
uses: DeterminateSystems/nix-installer-action@v16
|
||||||
|
with:
|
||||||
|
determinate: ${{ env.USE_DETERMINATE }}
|
||||||
|
|
||||||
|
# For PRs
|
||||||
|
- name: Setup Nix Magic Cache
|
||||||
|
if: ${{ env.USE_DETERMINATE }}
|
||||||
|
uses: DeterminateSystems/flakehub-cache-action@v1
|
||||||
|
|
||||||
|
# For in-tree builds
|
||||||
|
- name: Setup Cachix
|
||||||
|
if: ${{ github.event_name == 'push' || github.event_name == 'workflow_dispatch' }}
|
||||||
|
uses: cachix/cachix-action@v15
|
||||||
|
with:
|
||||||
|
name: prismlauncher
|
||||||
|
authToken: ${{ secrets.CACHIX_AUTH_TOKEN }}
|
||||||
|
|
||||||
|
- name: Run Flake checks
|
||||||
|
run: |
|
||||||
|
nix flake check --print-build-logs --show-trace
|
||||||
|
|
||||||
|
- name: Build debug package
|
||||||
|
if: ${{ env.DEBUG }}
|
||||||
|
run: |
|
||||||
|
nix build \
|
||||||
|
--no-link --print-build-logs --print-out-paths \
|
||||||
|
.#prismlauncher-debug >> "$GITHUB_STEP_SUMMARY"
|
||||||
|
|
||||||
|
- name: Build release package
|
||||||
|
if: ${{ !env.DEBUG }}
|
||||||
|
run: |
|
||||||
|
nix build \
|
||||||
|
--no-link --print-build-logs --print-out-paths \
|
||||||
|
.#prismlauncher >> "$GITHUB_STEP_SUMMARY"
|
45
.github/workflows/publish.yml
vendored
Normal file
45
.github/workflows/publish.yml
vendored
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
name: Publish
|
||||||
|
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types: [ released ]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
flakehub:
|
||||||
|
name: FlakeHub
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
id-token: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
ref: ${{ github.ref }}
|
||||||
|
|
||||||
|
- name: Install Nix
|
||||||
|
uses: cachix/install-nix-action@v30
|
||||||
|
|
||||||
|
- name: Publish on FlakeHub
|
||||||
|
uses: determinatesystems/flakehub-push@v5
|
||||||
|
with:
|
||||||
|
visibility: "public"
|
||||||
|
|
||||||
|
winget:
|
||||||
|
name: Winget
|
||||||
|
|
||||||
|
runs-on: windows-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Publish on Winget
|
||||||
|
uses: vedantmgoyal2009/winget-releaser@v2
|
||||||
|
with:
|
||||||
|
identifier: PrismLauncher.PrismLauncher
|
||||||
|
version: ${{ github.event.release.tag_name }}
|
||||||
|
installers-regex: 'PrismLauncher-Windows-MSVC(:?-arm64|-Legacy)?-Setup-.+\.exe$'
|
||||||
|
token: ${{ secrets.WINGET_TOKEN }}
|
29
.github/workflows/stale.yml
vendored
Normal file
29
.github/workflows/stale.yml
vendored
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
name: Stale
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
# run weekly on sunday
|
||||||
|
- cron: "0 0 * * 0"
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
label:
|
||||||
|
name: Label issues and PRs
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/stale@v9
|
||||||
|
with:
|
||||||
|
days-before-stale: 60
|
||||||
|
days-before-close: -1 # Don't close anything
|
||||||
|
exempt-issue-labels: rfc,nostale,help wanted
|
||||||
|
exempt-all-milestones: true
|
||||||
|
exempt-all-assignees: true
|
||||||
|
operations-per-run: 1000
|
||||||
|
stale-issue-label: inactive
|
||||||
|
stale-pr-label: inactive
|
1
.github/workflows/trigger_builds.yml
vendored
1
.github/workflows/trigger_builds.yml
vendored
@ -38,6 +38,5 @@ jobs:
|
|||||||
APPLE_NOTARIZE_APPLE_ID: ${{ secrets.APPLE_NOTARIZE_APPLE_ID }}
|
APPLE_NOTARIZE_APPLE_ID: ${{ secrets.APPLE_NOTARIZE_APPLE_ID }}
|
||||||
APPLE_NOTARIZE_TEAM_ID: ${{ secrets.APPLE_NOTARIZE_TEAM_ID }}
|
APPLE_NOTARIZE_TEAM_ID: ${{ secrets.APPLE_NOTARIZE_TEAM_ID }}
|
||||||
APPLE_NOTARIZE_PASSWORD: ${{ secrets.APPLE_NOTARIZE_PASSWORD }}
|
APPLE_NOTARIZE_PASSWORD: ${{ secrets.APPLE_NOTARIZE_PASSWORD }}
|
||||||
CACHIX_AUTH_TOKEN: ${{ secrets.CACHIX_AUTH_TOKEN }}
|
|
||||||
GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }}
|
GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }}
|
||||||
GPG_PRIVATE_KEY_ID: ${{ secrets.GPG_PRIVATE_KEY_ID }}
|
GPG_PRIVATE_KEY_ID: ${{ secrets.GPG_PRIVATE_KEY_ID }}
|
||||||
|
1
.github/workflows/trigger_release.yml
vendored
1
.github/workflows/trigger_release.yml
vendored
@ -22,7 +22,6 @@ jobs:
|
|||||||
APPLE_NOTARIZE_APPLE_ID: ${{ secrets.APPLE_NOTARIZE_APPLE_ID }}
|
APPLE_NOTARIZE_APPLE_ID: ${{ secrets.APPLE_NOTARIZE_APPLE_ID }}
|
||||||
APPLE_NOTARIZE_TEAM_ID: ${{ secrets.APPLE_NOTARIZE_TEAM_ID }}
|
APPLE_NOTARIZE_TEAM_ID: ${{ secrets.APPLE_NOTARIZE_TEAM_ID }}
|
||||||
APPLE_NOTARIZE_PASSWORD: ${{ secrets.APPLE_NOTARIZE_PASSWORD }}
|
APPLE_NOTARIZE_PASSWORD: ${{ secrets.APPLE_NOTARIZE_PASSWORD }}
|
||||||
CACHIX_AUTH_TOKEN: ${{ secrets.CACHIX_AUTH_TOKEN }}
|
|
||||||
GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }}
|
GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }}
|
||||||
GPG_PRIVATE_KEY_ID: ${{ secrets.GPG_PRIVATE_KEY_ID }}
|
GPG_PRIVATE_KEY_ID: ${{ secrets.GPG_PRIVATE_KEY_ID }}
|
||||||
|
|
||||||
|
15
.github/workflows/winget.yml
vendored
15
.github/workflows/winget.yml
vendored
@ -1,15 +0,0 @@
|
|||||||
name: Publish to WinGet
|
|
||||||
on:
|
|
||||||
release:
|
|
||||||
types: [released]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
publish:
|
|
||||||
runs-on: windows-latest
|
|
||||||
steps:
|
|
||||||
- uses: vedantmgoyal2009/winget-releaser@v2
|
|
||||||
with:
|
|
||||||
identifier: PrismLauncher.PrismLauncher
|
|
||||||
version: ${{ github.event.release.tag_name }}
|
|
||||||
installers-regex: 'PrismLauncher-Windows-MSVC(:?-arm64|-Legacy)?-Setup-.+\.exe$'
|
|
||||||
token: ${{ secrets.WINGET_TOKEN }}
|
|
@ -78,6 +78,13 @@ else()
|
|||||||
# ATL's pack list needs more than the default 1 Mib stack on windows
|
# ATL's pack list needs more than the default 1 Mib stack on windows
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
set(CMAKE_EXE_LINKER_FLAGS "-Wl,--stack,8388608 ${CMAKE_EXE_LINKER_FLAGS}")
|
set(CMAKE_EXE_LINKER_FLAGS "-Wl,--stack,8388608 ${CMAKE_EXE_LINKER_FLAGS}")
|
||||||
|
|
||||||
|
# -ffunction-sections and -fdata-sections help reduce binary size
|
||||||
|
# -mguard=cf enables Control Flow Guard
|
||||||
|
# TODO: Look into -gc-sections to further reduce binary size
|
||||||
|
foreach(lang C CXX)
|
||||||
|
set("CMAKE_${lang}_FLAGS_RELEASE" "-ffunction-sections -fdata-sections -mguard=cf")
|
||||||
|
endforeach()
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@ -106,14 +113,14 @@ if ((CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebI
|
|||||||
else()
|
else()
|
||||||
# AppleClang and Clang
|
# AppleClang and Clang
|
||||||
message(STATUS "Address Sanitizer available on Clang")
|
message(STATUS "Address Sanitizer available on Clang")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer -fsanitize=undefined -fno-sanitize-recover=null")
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-omit-frame-pointer")
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-omit-frame-pointer -fsanitize=undefined -fno-sanitize-recover=null")
|
||||||
endif()
|
endif()
|
||||||
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
|
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
|
||||||
# GCC
|
# GCC
|
||||||
message(STATUS "Address Sanitizer available on GCC")
|
message(STATUS "Address Sanitizer available on GCC")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer -fsanitize=undefined -fno-sanitize-recover")
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-omit-frame-pointer")
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-omit-frame-pointer -fsanitize=undefined -fno-sanitize-recover")
|
||||||
link_libraries("asan")
|
link_libraries("asan")
|
||||||
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
|
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
|
||||||
message(STATUS "Address Sanitizer available on MSVC")
|
message(STATUS "Address Sanitizer available on MSVC")
|
||||||
|
6
flake.lock
generated
6
flake.lock
generated
@ -49,11 +49,11 @@
|
|||||||
},
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1735834308,
|
"lastModified": 1739446958,
|
||||||
"narHash": "sha256-dklw3AXr3OGO4/XT1Tu3Xz9n/we8GctZZ75ZWVqAVhk=",
|
"narHash": "sha256-+/bYK3DbPxMIvSL4zArkMX0LQvS7rzBKXnDXLfKyRVc=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "6df24922a1400241dae323af55f30e4318a6ca65",
|
"rev": "2ff53fe64443980e139eaa286017f53f88336dd0",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit f2b0c16a2a217a1822ce5a6538ba8f755ed1dd32
|
Subproject commit f5d368a31d6ef046eb2955c74ec6f54f32ed5c4e
|
@ -59,8 +59,6 @@
|
|||||||
#include "ui/pages/BasePageProvider.h"
|
#include "ui/pages/BasePageProvider.h"
|
||||||
#include "ui/pages/global/APIPage.h"
|
#include "ui/pages/global/APIPage.h"
|
||||||
#include "ui/pages/global/AccountListPage.h"
|
#include "ui/pages/global/AccountListPage.h"
|
||||||
#include "ui/pages/global/CustomCommandsPage.h"
|
|
||||||
#include "ui/pages/global/EnvironmentVariablesPage.h"
|
|
||||||
#include "ui/pages/global/ExternalToolsPage.h"
|
#include "ui/pages/global/ExternalToolsPage.h"
|
||||||
#include "ui/pages/global/JavaPage.h"
|
#include "ui/pages/global/JavaPage.h"
|
||||||
#include "ui/pages/global/LanguagePage.h"
|
#include "ui/pages/global/LanguagePage.h"
|
||||||
@ -802,8 +800,6 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv)
|
|||||||
m_globalSettingsProvider->addPage<MinecraftPage>();
|
m_globalSettingsProvider->addPage<MinecraftPage>();
|
||||||
m_globalSettingsProvider->addPage<JavaPage>();
|
m_globalSettingsProvider->addPage<JavaPage>();
|
||||||
m_globalSettingsProvider->addPage<LanguagePage>();
|
m_globalSettingsProvider->addPage<LanguagePage>();
|
||||||
m_globalSettingsProvider->addPage<CustomCommandsPage>();
|
|
||||||
m_globalSettingsProvider->addPage<EnvironmentVariablesPage>();
|
|
||||||
m_globalSettingsProvider->addPage<ProxyPage>();
|
m_globalSettingsProvider->addPage<ProxyPage>();
|
||||||
m_globalSettingsProvider->addPage<ExternalToolsPage>();
|
m_globalSettingsProvider->addPage<ExternalToolsPage>();
|
||||||
m_globalSettingsProvider->addPage<AccountListPage>();
|
m_globalSettingsProvider->addPage<AccountListPage>();
|
||||||
|
@ -909,7 +909,6 @@ SET(LAUNCHER_SOURCES
|
|||||||
ui/pages/instance/NotesPage.h
|
ui/pages/instance/NotesPage.h
|
||||||
ui/pages/instance/LogPage.cpp
|
ui/pages/instance/LogPage.cpp
|
||||||
ui/pages/instance/LogPage.h
|
ui/pages/instance/LogPage.h
|
||||||
ui/pages/instance/InstanceSettingsPage.cpp
|
|
||||||
ui/pages/instance/InstanceSettingsPage.h
|
ui/pages/instance/InstanceSettingsPage.h
|
||||||
ui/pages/instance/ScreenshotsPage.cpp
|
ui/pages/instance/ScreenshotsPage.cpp
|
||||||
ui/pages/instance/ScreenshotsPage.h
|
ui/pages/instance/ScreenshotsPage.h
|
||||||
@ -923,17 +922,12 @@ SET(LAUNCHER_SOURCES
|
|||||||
# GUI - global settings pages
|
# GUI - global settings pages
|
||||||
ui/pages/global/AccountListPage.cpp
|
ui/pages/global/AccountListPage.cpp
|
||||||
ui/pages/global/AccountListPage.h
|
ui/pages/global/AccountListPage.h
|
||||||
ui/pages/global/CustomCommandsPage.cpp
|
|
||||||
ui/pages/global/CustomCommandsPage.h
|
|
||||||
ui/pages/global/EnvironmentVariablesPage.cpp
|
|
||||||
ui/pages/global/EnvironmentVariablesPage.h
|
|
||||||
ui/pages/global/ExternalToolsPage.cpp
|
ui/pages/global/ExternalToolsPage.cpp
|
||||||
ui/pages/global/ExternalToolsPage.h
|
ui/pages/global/ExternalToolsPage.h
|
||||||
ui/pages/global/JavaPage.cpp
|
ui/pages/global/JavaPage.cpp
|
||||||
ui/pages/global/JavaPage.h
|
ui/pages/global/JavaPage.h
|
||||||
ui/pages/global/LanguagePage.cpp
|
ui/pages/global/LanguagePage.cpp
|
||||||
ui/pages/global/LanguagePage.h
|
ui/pages/global/LanguagePage.h
|
||||||
ui/pages/global/MinecraftPage.cpp
|
|
||||||
ui/pages/global/MinecraftPage.h
|
ui/pages/global/MinecraftPage.h
|
||||||
ui/pages/global/LauncherPage.cpp
|
ui/pages/global/LauncherPage.cpp
|
||||||
ui/pages/global/LauncherPage.h
|
ui/pages/global/LauncherPage.h
|
||||||
@ -1031,8 +1025,6 @@ SET(LAUNCHER_SOURCES
|
|||||||
ui/dialogs/CopyInstanceDialog.h
|
ui/dialogs/CopyInstanceDialog.h
|
||||||
ui/dialogs/CustomMessageBox.cpp
|
ui/dialogs/CustomMessageBox.cpp
|
||||||
ui/dialogs/CustomMessageBox.h
|
ui/dialogs/CustomMessageBox.h
|
||||||
ui/dialogs/EditAccountDialog.cpp
|
|
||||||
ui/dialogs/EditAccountDialog.h
|
|
||||||
ui/dialogs/ExportInstanceDialog.cpp
|
ui/dialogs/ExportInstanceDialog.cpp
|
||||||
ui/dialogs/ExportInstanceDialog.h
|
ui/dialogs/ExportInstanceDialog.h
|
||||||
ui/dialogs/ExportPackDialog.cpp
|
ui/dialogs/ExportPackDialog.cpp
|
||||||
@ -1097,8 +1089,8 @@ SET(LAUNCHER_SOURCES
|
|||||||
ui/widgets/FocusLineEdit.h
|
ui/widgets/FocusLineEdit.h
|
||||||
ui/widgets/IconLabel.cpp
|
ui/widgets/IconLabel.cpp
|
||||||
ui/widgets/IconLabel.h
|
ui/widgets/IconLabel.h
|
||||||
ui/widgets/JavaSettingsWidget.cpp
|
ui/widgets/JavaWizardWidget.cpp
|
||||||
ui/widgets/JavaSettingsWidget.h
|
ui/widgets/JavaWizardWidget.h
|
||||||
ui/widgets/LabeledToolButton.cpp
|
ui/widgets/LabeledToolButton.cpp
|
||||||
ui/widgets/LabeledToolButton.h
|
ui/widgets/LabeledToolButton.h
|
||||||
ui/widgets/LanguageSelectionWidget.cpp
|
ui/widgets/LanguageSelectionWidget.cpp
|
||||||
@ -1134,6 +1126,10 @@ SET(LAUNCHER_SOURCES
|
|||||||
ui/widgets/WideBar.cpp
|
ui/widgets/WideBar.cpp
|
||||||
ui/widgets/ThemeCustomizationWidget.h
|
ui/widgets/ThemeCustomizationWidget.h
|
||||||
ui/widgets/ThemeCustomizationWidget.cpp
|
ui/widgets/ThemeCustomizationWidget.cpp
|
||||||
|
ui/widgets/MinecraftSettingsWidget.h
|
||||||
|
ui/widgets/MinecraftSettingsWidget.cpp
|
||||||
|
ui/widgets/JavaSettingsWidget.h
|
||||||
|
ui/widgets/JavaSettingsWidget.cpp
|
||||||
|
|
||||||
# GUI - instance group view
|
# GUI - instance group view
|
||||||
ui/instanceview/InstanceProxyModel.cpp
|
ui/instanceview/InstanceProxyModel.cpp
|
||||||
@ -1177,7 +1173,6 @@ qt_wrap_ui(LAUNCHER_UI
|
|||||||
ui/pages/global/LauncherPage.ui
|
ui/pages/global/LauncherPage.ui
|
||||||
ui/pages/global/APIPage.ui
|
ui/pages/global/APIPage.ui
|
||||||
ui/pages/global/ProxyPage.ui
|
ui/pages/global/ProxyPage.ui
|
||||||
ui/pages/global/MinecraftPage.ui
|
|
||||||
ui/pages/global/ExternalToolsPage.ui
|
ui/pages/global/ExternalToolsPage.ui
|
||||||
ui/pages/instance/ExternalResourcesPage.ui
|
ui/pages/instance/ExternalResourcesPage.ui
|
||||||
ui/pages/instance/NotesPage.ui
|
ui/pages/instance/NotesPage.ui
|
||||||
@ -1185,7 +1180,6 @@ qt_wrap_ui(LAUNCHER_UI
|
|||||||
ui/pages/instance/ServersPage.ui
|
ui/pages/instance/ServersPage.ui
|
||||||
ui/pages/instance/GameOptionsPage.ui
|
ui/pages/instance/GameOptionsPage.ui
|
||||||
ui/pages/instance/OtherLogsPage.ui
|
ui/pages/instance/OtherLogsPage.ui
|
||||||
ui/pages/instance/InstanceSettingsPage.ui
|
|
||||||
ui/pages/instance/VersionPage.ui
|
ui/pages/instance/VersionPage.ui
|
||||||
ui/pages/instance/ManagedPackPage.ui
|
ui/pages/instance/ManagedPackPage.ui
|
||||||
ui/pages/instance/WorldListPage.ui
|
ui/pages/instance/WorldListPage.ui
|
||||||
@ -1208,6 +1202,8 @@ qt_wrap_ui(LAUNCHER_UI
|
|||||||
ui/widgets/ModFilterWidget.ui
|
ui/widgets/ModFilterWidget.ui
|
||||||
ui/widgets/SubTaskProgressBar.ui
|
ui/widgets/SubTaskProgressBar.ui
|
||||||
ui/widgets/ThemeCustomizationWidget.ui
|
ui/widgets/ThemeCustomizationWidget.ui
|
||||||
|
ui/widgets/MinecraftSettingsWidget.ui
|
||||||
|
ui/widgets/JavaSettingsWidget.ui
|
||||||
ui/dialogs/CopyInstanceDialog.ui
|
ui/dialogs/CopyInstanceDialog.ui
|
||||||
ui/dialogs/ProfileSetupDialog.ui
|
ui/dialogs/ProfileSetupDialog.ui
|
||||||
ui/dialogs/ProgressDialog.ui
|
ui/dialogs/ProgressDialog.ui
|
||||||
@ -1223,12 +1219,10 @@ qt_wrap_ui(LAUNCHER_UI
|
|||||||
ui/dialogs/MSALoginDialog.ui
|
ui/dialogs/MSALoginDialog.ui
|
||||||
ui/dialogs/OfflineLoginDialog.ui
|
ui/dialogs/OfflineLoginDialog.ui
|
||||||
ui/dialogs/AboutDialog.ui
|
ui/dialogs/AboutDialog.ui
|
||||||
ui/dialogs/EditAccountDialog.ui
|
|
||||||
ui/dialogs/ReviewMessageBox.ui
|
ui/dialogs/ReviewMessageBox.ui
|
||||||
ui/dialogs/ScrollMessageBox.ui
|
ui/dialogs/ScrollMessageBox.ui
|
||||||
ui/dialogs/BlockedModsDialog.ui
|
ui/dialogs/BlockedModsDialog.ui
|
||||||
ui/dialogs/ChooseProviderDialog.ui
|
ui/dialogs/ChooseProviderDialog.ui
|
||||||
|
|
||||||
ui/dialogs/skins/SkinManageDialog.ui
|
ui/dialogs/skins/SkinManageDialog.ui
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ class InstancePageProvider : protected QObject, public BasePageProvider {
|
|||||||
values.append(new ServersPage(onesix));
|
values.append(new ServersPage(onesix));
|
||||||
// values.append(new GameOptionsPage(onesix.get()));
|
// values.append(new GameOptionsPage(onesix.get()));
|
||||||
values.append(new ScreenshotsPage(FS::PathCombine(onesix->gameRoot(), "screenshots")));
|
values.append(new ScreenshotsPage(FS::PathCombine(onesix->gameRoot(), "screenshots")));
|
||||||
values.append(new InstanceSettingsPage(onesix.get()));
|
values.append(new InstanceSettingsPage(onesix));
|
||||||
auto logMatcher = inst->getLogFileMatcher();
|
auto logMatcher = inst->getLogFileMatcher();
|
||||||
if (logMatcher) {
|
if (logMatcher) {
|
||||||
values.append(new OtherLogsPage(inst->getLogFileRoot(), logMatcher));
|
values.append(new OtherLogsPage(inst->getLogFileRoot(), logMatcher));
|
||||||
|
@ -171,7 +171,7 @@ void JavaChecker::finished(int exitcode, QProcess::ExitStatus status)
|
|||||||
auto os_arch = results["os.arch"];
|
auto os_arch = results["os.arch"];
|
||||||
auto java_version = results["java.version"];
|
auto java_version = results["java.version"];
|
||||||
auto java_vendor = results["java.vendor"];
|
auto java_vendor = results["java.vendor"];
|
||||||
bool is_64 = os_arch == "x86_64" || os_arch == "amd64" || os_arch == "aarch64" || os_arch == "arm64";
|
bool is_64 = os_arch == "x86_64" || os_arch == "amd64" || os_arch == "aarch64" || os_arch == "arm64" || os_arch == "riscv64";
|
||||||
|
|
||||||
result.validity = Result::Validity::Valid;
|
result.validity = Result::Validity::Valid;
|
||||||
result.is_64bit = is_64;
|
result.is_64bit = is_64;
|
||||||
|
@ -254,20 +254,60 @@ void LaunchTask::emitFailed(QString reason)
|
|||||||
Task::emitFailed(reason);
|
Task::emitFailed(reason);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LaunchTask::substituteVariables(QStringList& args) const
|
QString expandVariables(const QString& input, QProcessEnvironment dict)
|
||||||
{
|
{
|
||||||
auto env = m_instance->createEnvironment();
|
QString result = input;
|
||||||
|
|
||||||
for (auto key : env.keys()) {
|
enum { base, maybeBrace, variable, brace } state = base;
|
||||||
args.replaceInStrings("$" + key, env.value(key));
|
int startIdx = -1;
|
||||||
|
for (int i = 0; i < result.length();) {
|
||||||
|
QChar c = result.at(i++);
|
||||||
|
switch (state) {
|
||||||
|
case base:
|
||||||
|
if (c == '$')
|
||||||
|
state = maybeBrace;
|
||||||
|
break;
|
||||||
|
case maybeBrace:
|
||||||
|
if (c == '{') {
|
||||||
|
state = brace;
|
||||||
|
startIdx = i;
|
||||||
|
} else if (c.isLetterOrNumber() || c == '_') {
|
||||||
|
state = variable;
|
||||||
|
startIdx = i - 1;
|
||||||
|
} else {
|
||||||
|
state = base;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case brace:
|
||||||
|
if (c == '}') {
|
||||||
|
const auto res = dict.value(result.mid(startIdx, i - 1 - startIdx), "");
|
||||||
|
if (!res.isEmpty()) {
|
||||||
|
result.replace(startIdx - 2, i - startIdx + 2, res);
|
||||||
|
i = startIdx - 2 + res.length();
|
||||||
|
}
|
||||||
|
state = base;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case variable:
|
||||||
|
if (!c.isLetterOrNumber() && c != '_') {
|
||||||
|
const auto res = dict.value(result.mid(startIdx, i - startIdx - 1), "");
|
||||||
|
if (!res.isEmpty()) {
|
||||||
|
result.replace(startIdx - 1, i - startIdx, res);
|
||||||
|
i = startIdx - 1 + res.length();
|
||||||
|
}
|
||||||
|
state = base;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
if (state == variable) {
|
||||||
|
if (const auto res = dict.value(result.mid(startIdx), ""); !res.isEmpty())
|
||||||
|
result.replace(startIdx - 1, result.length() - startIdx + 1, res);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void LaunchTask::substituteVariables(QString& cmd) const
|
QString LaunchTask::substituteVariables(QString& cmd, bool isLaunch) const
|
||||||
{
|
{
|
||||||
auto env = m_instance->createEnvironment();
|
return expandVariables(cmd, isLaunch ? m_instance->createLaunchEnvironment() : m_instance->createEnvironment());
|
||||||
|
|
||||||
for (auto key : env.keys()) {
|
|
||||||
cmd.replace("$" + key, env.value(key));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -87,8 +87,7 @@ class LaunchTask : public Task {
|
|||||||
shared_qobject_ptr<LogModel> getLogModel();
|
shared_qobject_ptr<LogModel> getLogModel();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void substituteVariables(QStringList& args) const;
|
QString substituteVariables(QString& cmd, bool isLaunch = false) const;
|
||||||
void substituteVariables(QString& cmd) const;
|
|
||||||
QString censorPrivateInfo(QString in);
|
QString censorPrivateInfo(QString in);
|
||||||
|
|
||||||
protected: /* methods */
|
protected: /* methods */
|
||||||
|
@ -32,7 +32,7 @@ class LogModel : public QAbstractListModel {
|
|||||||
|
|
||||||
private /* types */:
|
private /* types */:
|
||||||
struct entry {
|
struct entry {
|
||||||
MessageLevel::Enum level;
|
MessageLevel::Enum level = MessageLevel::Enum::Unknown;
|
||||||
QString line;
|
QString line;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -47,19 +47,15 @@ PostLaunchCommand::PostLaunchCommand(LaunchTask* parent) : LaunchStep(parent)
|
|||||||
|
|
||||||
void PostLaunchCommand::executeTask()
|
void PostLaunchCommand::executeTask()
|
||||||
{
|
{
|
||||||
// FIXME: where to put this?
|
auto cmd = m_parent->substituteVariables(m_command);
|
||||||
|
emit logLine(tr("Running Post-Launch command: %1").arg(cmd), MessageLevel::Launcher);
|
||||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
|
#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
|
||||||
auto args = QProcess::splitCommand(m_command);
|
auto args = QProcess::splitCommand(cmd);
|
||||||
m_parent->substituteVariables(args);
|
|
||||||
|
|
||||||
emit logLine(tr("Running Post-Launch command: %1").arg(args.join(' ')), MessageLevel::Launcher);
|
|
||||||
const QString program = args.takeFirst();
|
const QString program = args.takeFirst();
|
||||||
m_process.start(program, args);
|
m_process.start(program, args);
|
||||||
#else
|
#else
|
||||||
m_parent->substituteVariables(m_command);
|
m_process.start(cmd);
|
||||||
|
|
||||||
emit logLine(tr("Running Post-Launch command: %1").arg(m_command), MessageLevel::Launcher);
|
|
||||||
m_process.start(m_command);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,19 +47,14 @@ PreLaunchCommand::PreLaunchCommand(LaunchTask* parent) : LaunchStep(parent)
|
|||||||
|
|
||||||
void PreLaunchCommand::executeTask()
|
void PreLaunchCommand::executeTask()
|
||||||
{
|
{
|
||||||
// FIXME: where to put this?
|
auto cmd = m_parent->substituteVariables(m_command);
|
||||||
|
emit logLine(tr("Running Pre-Launch command: %1").arg(cmd), MessageLevel::Launcher);
|
||||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
|
#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
|
||||||
auto args = QProcess::splitCommand(m_command);
|
auto args = QProcess::splitCommand(cmd);
|
||||||
m_parent->substituteVariables(args);
|
|
||||||
|
|
||||||
emit logLine(tr("Running Pre-Launch command: %1").arg(args.join(' ')), MessageLevel::Launcher);
|
|
||||||
const QString program = args.takeFirst();
|
const QString program = args.takeFirst();
|
||||||
m_process.start(program, args);
|
m_process.start(program, args);
|
||||||
#else
|
#else
|
||||||
m_parent->substituteVariables(m_command);
|
m_process.start(cmd);
|
||||||
|
|
||||||
emit logLine(tr("Running Pre-Launch command: %1").arg(m_command), MessageLevel::Launcher);
|
|
||||||
m_process.start(m_command);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -656,6 +656,7 @@ QProcessEnvironment MinecraftInstance::createLaunchEnvironment()
|
|||||||
// dlsym variant is only needed for OpenGL and not included in the vulkan layer
|
// dlsym variant is only needed for OpenGL and not included in the vulkan layer
|
||||||
appendLib("libMangoHud_dlsym.so");
|
appendLib("libMangoHud_dlsym.so");
|
||||||
appendLib("libMangoHud_opengl.so");
|
appendLib("libMangoHud_opengl.so");
|
||||||
|
appendLib("libMangoHud_shim.so");
|
||||||
preloadList << mangoHudLibString;
|
preloadList << mangoHudLibString;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1158,13 +1159,6 @@ shared_qobject_ptr<LaunchTask> MinecraftInstance::createLaunchTask(AuthSessionPt
|
|||||||
process->appendStep(step);
|
process->appendStep(step);
|
||||||
}
|
}
|
||||||
|
|
||||||
// run pre-launch command if that's needed
|
|
||||||
if (getPreLaunchCommand().size()) {
|
|
||||||
auto step = makeShared<PreLaunchCommand>(pptr);
|
|
||||||
step->setWorkingDirectory(gameRoot());
|
|
||||||
process->appendStep(step);
|
|
||||||
}
|
|
||||||
|
|
||||||
// load meta
|
// load meta
|
||||||
{
|
{
|
||||||
auto mode = session->status != AuthSession::PlayableOffline ? Net::Mode::Online : Net::Mode::Offline;
|
auto mode = session->status != AuthSession::PlayableOffline ? Net::Mode::Online : Net::Mode::Offline;
|
||||||
@ -1177,6 +1171,13 @@ shared_qobject_ptr<LaunchTask> MinecraftInstance::createLaunchTask(AuthSessionPt
|
|||||||
process->appendStep(makeShared<CheckJava>(pptr));
|
process->appendStep(makeShared<CheckJava>(pptr));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// run pre-launch command if that's needed
|
||||||
|
if (getPreLaunchCommand().size()) {
|
||||||
|
auto step = makeShared<PreLaunchCommand>(pptr);
|
||||||
|
step->setWorkingDirectory(gameRoot());
|
||||||
|
process->appendStep(step);
|
||||||
|
}
|
||||||
|
|
||||||
// if we aren't in offline mode,.
|
// if we aren't in offline mode,.
|
||||||
if (session->status != AuthSession::PlayableOffline) {
|
if (session->status != AuthSession::PlayableOffline) {
|
||||||
if (!session->demo) {
|
if (!session->demo) {
|
||||||
|
@ -131,6 +131,7 @@ void LauncherPartLaunch::executeTask()
|
|||||||
|
|
||||||
QString wrapperCommandStr = instance->getWrapperCommand().trimmed();
|
QString wrapperCommandStr = instance->getWrapperCommand().trimmed();
|
||||||
if (!wrapperCommandStr.isEmpty()) {
|
if (!wrapperCommandStr.isEmpty()) {
|
||||||
|
wrapperCommandStr = m_parent->substituteVariables(wrapperCommandStr);
|
||||||
auto wrapperArgs = Commandline::splitArgs(wrapperCommandStr);
|
auto wrapperArgs = Commandline::splitArgs(wrapperCommandStr);
|
||||||
auto wrapperCommand = wrapperArgs.takeFirst();
|
auto wrapperCommand = wrapperArgs.takeFirst();
|
||||||
auto realWrapperCommand = QStandardPaths::findExecutable(wrapperCommand);
|
auto realWrapperCommand = QStandardPaths::findExecutable(wrapperCommand);
|
||||||
@ -170,6 +171,7 @@ void LauncherPartLaunch::on_state(LoggedProcess::State state)
|
|||||||
case LoggedProcess::Aborted:
|
case LoggedProcess::Aborted:
|
||||||
case LoggedProcess::Crashed: {
|
case LoggedProcess::Crashed: {
|
||||||
m_parent->setPid(-1);
|
m_parent->setPid(-1);
|
||||||
|
m_parent->instance()->setMinecraftRunning(false);
|
||||||
emitFailed(tr("Game crashed."));
|
emitFailed(tr("Game crashed."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -73,7 +73,7 @@ class ResourceAPI {
|
|||||||
std::optional<QString> search;
|
std::optional<QString> search;
|
||||||
std::optional<SortingMethod> sorting;
|
std::optional<SortingMethod> sorting;
|
||||||
std::optional<ModPlatform::ModLoaderTypes> loaders;
|
std::optional<ModPlatform::ModLoaderTypes> loaders;
|
||||||
std::optional<std::list<Version> > versions;
|
std::optional<std::list<Version>> versions;
|
||||||
std::optional<QString> side;
|
std::optional<QString> side;
|
||||||
std::optional<QStringList> categoryIds;
|
std::optional<QStringList> categoryIds;
|
||||||
bool openSource;
|
bool openSource;
|
||||||
@ -169,11 +169,23 @@ class ResourceAPI {
|
|||||||
protected:
|
protected:
|
||||||
[[nodiscard]] inline QString debugName() const { return "External resource API"; }
|
[[nodiscard]] inline QString debugName() const { return "External resource API"; }
|
||||||
|
|
||||||
[[nodiscard]] inline auto getGameVersionsString(std::list<Version> mcVersions) const -> QString
|
[[nodiscard]] inline QString mapMCVersionToModrinth(Version v) const
|
||||||
|
{
|
||||||
|
static const QString preString = " Pre-Release ";
|
||||||
|
auto verStr = v.toString();
|
||||||
|
|
||||||
|
if (verStr.contains(preString)) {
|
||||||
|
verStr.replace(preString, "-pre");
|
||||||
|
}
|
||||||
|
verStr.replace(" ", "-");
|
||||||
|
return verStr;
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] inline QString getGameVersionsString(std::list<Version> mcVersions) const
|
||||||
{
|
{
|
||||||
QString s;
|
QString s;
|
||||||
for (auto& ver : mcVersions) {
|
for (auto& ver : mcVersions) {
|
||||||
s += QString("\"%1\",").arg(ver.toString());
|
s += QString("\"%1\",").arg(mapMCVersionToModrinth(ver));
|
||||||
}
|
}
|
||||||
s.remove(s.length() - 1, 1); // remove last comma
|
s.remove(s.length() - 1, 1); // remove last comma
|
||||||
return s;
|
return s;
|
||||||
|
@ -87,6 +87,30 @@ void Flame::FileResolvingTask::executeTask()
|
|||||||
m_task->start();
|
m_task->start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PackedResourceType getResourceType(int classId)
|
||||||
|
{
|
||||||
|
switch (classId) {
|
||||||
|
case 17: // Worlds
|
||||||
|
return PackedResourceType::WorldSave;
|
||||||
|
case 6: // Mods
|
||||||
|
return PackedResourceType::Mod;
|
||||||
|
case 12: // Resource Packs
|
||||||
|
// return PackedResourceType::ResourcePack; // not really a resourcepack
|
||||||
|
/* fallthrough */
|
||||||
|
case 4546: // Customization
|
||||||
|
// return PackedResourceType::ShaderPack; // not really a shaderPack
|
||||||
|
/* fallthrough */
|
||||||
|
case 4471: // Modpacks
|
||||||
|
/* fallthrough */
|
||||||
|
case 5: // Bukkit Plugins
|
||||||
|
/* fallthrough */
|
||||||
|
case 4559: // Addons
|
||||||
|
/* fallthrough */
|
||||||
|
default:
|
||||||
|
return PackedResourceType::UNKNOWN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Flame::FileResolvingTask::netJobFinished()
|
void Flame::FileResolvingTask::netJobFinished()
|
||||||
{
|
{
|
||||||
setProgress(1, 3);
|
setProgress(1, 3);
|
||||||
@ -232,6 +256,10 @@ void Flame::FileResolvingTask::getFlameProjects()
|
|||||||
|
|
||||||
setStatus(tr("Parsing API response from CurseForge for '%1'...").arg(file->version.fileName));
|
setStatus(tr("Parsing API response from CurseForge for '%1'...").arg(file->version.fileName));
|
||||||
FlameMod::loadIndexedPack(file->pack, entry_obj);
|
FlameMod::loadIndexedPack(file->pack, entry_obj);
|
||||||
|
file->resourceType = getResourceType(Json::requireInteger(entry_obj, "classId", "modClassId"));
|
||||||
|
if (file->resourceType == PackedResourceType::WorldSave) {
|
||||||
|
file->targetFolder = "saves";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} catch (Json::JsonException& e) {
|
} catch (Json::JsonException& e) {
|
||||||
qDebug() << e.cause();
|
qDebug() << e.cause();
|
||||||
|
@ -270,6 +270,7 @@ std::optional<ModPlatform::IndexedVersion> FlameAPI::getLatestVersion(QList<ModP
|
|||||||
QList<ModPlatform::ModLoaderType> instanceLoaders,
|
QList<ModPlatform::ModLoaderType> instanceLoaders,
|
||||||
ModPlatform::ModLoaderTypes modLoaders)
|
ModPlatform::ModLoaderTypes modLoaders)
|
||||||
{
|
{
|
||||||
|
static const auto noLoader = ModPlatform::ModLoaderType(0);
|
||||||
QHash<ModPlatform::ModLoaderType, ModPlatform::IndexedVersion> bestMatch;
|
QHash<ModPlatform::ModLoaderType, ModPlatform::IndexedVersion> bestMatch;
|
||||||
auto checkVersion = [&bestMatch](const ModPlatform::IndexedVersion& version, const ModPlatform::ModLoaderType& loader) {
|
auto checkVersion = [&bestMatch](const ModPlatform::IndexedVersion& version, const ModPlatform::ModLoaderType& loader) {
|
||||||
if (bestMatch.contains(loader)) {
|
if (bestMatch.contains(loader)) {
|
||||||
@ -284,7 +285,7 @@ std::optional<ModPlatform::IndexedVersion> FlameAPI::getLatestVersion(QList<ModP
|
|||||||
for (auto file_tmp : versions) {
|
for (auto file_tmp : versions) {
|
||||||
auto loaders = ModPlatform::modLoaderTypesToList(file_tmp.loaders);
|
auto loaders = ModPlatform::modLoaderTypesToList(file_tmp.loaders);
|
||||||
if (loaders.isEmpty()) {
|
if (loaders.isEmpty()) {
|
||||||
checkVersion(file_tmp, ModPlatform::ModLoaderType(0));
|
checkVersion(file_tmp, noLoader);
|
||||||
} else {
|
} else {
|
||||||
for (auto loader : loaders) {
|
for (auto loader : loaders) {
|
||||||
checkVersion(file_tmp, loader);
|
checkVersion(file_tmp, loader);
|
||||||
@ -293,11 +294,19 @@ std::optional<ModPlatform::IndexedVersion> FlameAPI::getLatestVersion(QList<ModP
|
|||||||
}
|
}
|
||||||
// edge case: mod has installed for forge but the instance is fabric => fabric version will be prioritizated on update
|
// edge case: mod has installed for forge but the instance is fabric => fabric version will be prioritizated on update
|
||||||
auto currentLoaders = instanceLoaders + ModPlatform::modLoaderTypesToList(modLoaders);
|
auto currentLoaders = instanceLoaders + ModPlatform::modLoaderTypesToList(modLoaders);
|
||||||
currentLoaders.append(ModPlatform::ModLoaderType(0)); // add a fallback in case the versions do not define a loader
|
currentLoaders.append(noLoader); // add a fallback in case the versions do not define a loader
|
||||||
|
|
||||||
for (auto loader : currentLoaders) {
|
for (auto loader : currentLoaders) {
|
||||||
if (bestMatch.contains(loader)) {
|
if (bestMatch.contains(loader)) {
|
||||||
return bestMatch.value(loader);
|
auto bestForLoader = bestMatch.value(loader);
|
||||||
|
// awkward case where the mod has only two loaders and one of them is not specified
|
||||||
|
if (loader != noLoader && bestMatch.contains(noLoader) && bestMatch.size() == 2) {
|
||||||
|
auto bestForNoLoader = bestMatch.value(noLoader);
|
||||||
|
if (bestForNoLoader.date > bestForLoader.date) {
|
||||||
|
return bestForNoLoader;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return bestForLoader;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return {};
|
return {};
|
||||||
|
@ -75,12 +75,12 @@ bool FlameCreationTask::abort()
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
m_abort = true;
|
m_abort = true;
|
||||||
if (m_process_update_file_info_job)
|
if (m_processUpdateFileInfoJob)
|
||||||
m_process_update_file_info_job->abort();
|
m_processUpdateFileInfoJob->abort();
|
||||||
if (m_files_job)
|
if (m_filesJob)
|
||||||
m_files_job->abort();
|
m_filesJob->abort();
|
||||||
if (m_mod_id_resolver)
|
if (m_modIdResolver)
|
||||||
m_mod_id_resolver->abort();
|
m_modIdResolver->abort();
|
||||||
|
|
||||||
return Task::abort();
|
return Task::abort();
|
||||||
}
|
}
|
||||||
@ -232,12 +232,12 @@ bool FlameCreationTask::updateInstance()
|
|||||||
connect(job.get(), &Task::failed, this, [](QString reason) { qCritical() << "Failed to get files: " << reason; });
|
connect(job.get(), &Task::failed, this, [](QString reason) { qCritical() << "Failed to get files: " << reason; });
|
||||||
connect(job.get(), &Task::finished, &loop, &QEventLoop::quit);
|
connect(job.get(), &Task::finished, &loop, &QEventLoop::quit);
|
||||||
|
|
||||||
m_process_update_file_info_job = job;
|
m_processUpdateFileInfoJob = job;
|
||||||
job->start();
|
job->start();
|
||||||
|
|
||||||
loop.exec();
|
loop.exec();
|
||||||
|
|
||||||
m_process_update_file_info_job = nullptr;
|
m_processUpdateFileInfoJob = nullptr;
|
||||||
} else {
|
} else {
|
||||||
// We don't have an old index file, so we may duplicate stuff!
|
// We don't have an old index file, so we may duplicate stuff!
|
||||||
auto dialog = CustomMessageBox::selectable(m_parent, tr("No index file."),
|
auto dialog = CustomMessageBox::selectable(m_parent, tr("No index file."),
|
||||||
@ -430,26 +430,26 @@ bool FlameCreationTask::createInstance()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Don't add managed info to packs without an ID (most likely imported from ZIP)
|
// Don't add managed info to packs without an ID (most likely imported from ZIP)
|
||||||
if (!m_managed_id.isEmpty())
|
if (!m_managedId.isEmpty())
|
||||||
instance.setManagedPack("flame", m_managed_id, m_pack.name, m_managed_version_id, m_pack.version);
|
instance.setManagedPack("flame", m_managedId, m_pack.name, m_managedVersionId, m_pack.version);
|
||||||
else
|
else
|
||||||
instance.setManagedPack("flame", "", name(), "", "");
|
instance.setManagedPack("flame", "", name(), "", "");
|
||||||
|
|
||||||
instance.setName(name());
|
instance.setName(name());
|
||||||
|
|
||||||
m_mod_id_resolver.reset(new Flame::FileResolvingTask(APPLICATION->network(), m_pack));
|
m_modIdResolver.reset(new Flame::FileResolvingTask(APPLICATION->network(), m_pack));
|
||||||
connect(m_mod_id_resolver.get(), &Flame::FileResolvingTask::succeeded, this, [this, &loop] { idResolverSucceeded(loop); });
|
connect(m_modIdResolver.get(), &Flame::FileResolvingTask::succeeded, this, [this, &loop] { idResolverSucceeded(loop); });
|
||||||
connect(m_mod_id_resolver.get(), &Flame::FileResolvingTask::failed, [this, &loop](QString reason) {
|
connect(m_modIdResolver.get(), &Flame::FileResolvingTask::failed, [this, &loop](QString reason) {
|
||||||
m_mod_id_resolver.reset();
|
m_modIdResolver.reset();
|
||||||
setError(tr("Unable to resolve mod IDs:\n") + reason);
|
setError(tr("Unable to resolve mod IDs:\n") + reason);
|
||||||
loop.quit();
|
loop.quit();
|
||||||
});
|
});
|
||||||
connect(m_mod_id_resolver.get(), &Flame::FileResolvingTask::aborted, &loop, &QEventLoop::quit);
|
connect(m_modIdResolver.get(), &Flame::FileResolvingTask::aborted, &loop, &QEventLoop::quit);
|
||||||
connect(m_mod_id_resolver.get(), &Flame::FileResolvingTask::progress, this, &FlameCreationTask::setProgress);
|
connect(m_modIdResolver.get(), &Flame::FileResolvingTask::progress, this, &FlameCreationTask::setProgress);
|
||||||
connect(m_mod_id_resolver.get(), &Flame::FileResolvingTask::status, this, &FlameCreationTask::setStatus);
|
connect(m_modIdResolver.get(), &Flame::FileResolvingTask::status, this, &FlameCreationTask::setStatus);
|
||||||
connect(m_mod_id_resolver.get(), &Flame::FileResolvingTask::stepProgress, this, &FlameCreationTask::propagateStepProgress);
|
connect(m_modIdResolver.get(), &Flame::FileResolvingTask::stepProgress, this, &FlameCreationTask::propagateStepProgress);
|
||||||
connect(m_mod_id_resolver.get(), &Flame::FileResolvingTask::details, this, &FlameCreationTask::setDetails);
|
connect(m_modIdResolver.get(), &Flame::FileResolvingTask::details, this, &FlameCreationTask::setDetails);
|
||||||
m_mod_id_resolver->start();
|
m_modIdResolver->start();
|
||||||
|
|
||||||
loop.exec();
|
loop.exec();
|
||||||
|
|
||||||
@ -468,14 +468,14 @@ bool FlameCreationTask::createInstance()
|
|||||||
|
|
||||||
void FlameCreationTask::idResolverSucceeded(QEventLoop& loop)
|
void FlameCreationTask::idResolverSucceeded(QEventLoop& loop)
|
||||||
{
|
{
|
||||||
auto results = m_mod_id_resolver->getResults();
|
auto results = m_modIdResolver->getResults();
|
||||||
|
|
||||||
// first check for blocked mods
|
// first check for blocked mods
|
||||||
QList<BlockedMod> blocked_mods;
|
QList<BlockedMod> blocked_mods;
|
||||||
auto anyBlocked = false;
|
auto anyBlocked = false;
|
||||||
for (const auto& result : results.files.values()) {
|
for (const auto& result : results.files.values()) {
|
||||||
if (result.version.fileName.endsWith(".zip")) {
|
if (result.resourceType != PackedResourceType::Mod) {
|
||||||
m_ZIP_resources.append(std::make_pair(result.version.fileName, result.targetFolder));
|
m_otherResources.append(std::make_pair(result.version.fileName, result.targetFolder));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result.version.downloadUrl.isEmpty()) {
|
if (result.version.downloadUrl.isEmpty()) {
|
||||||
@ -507,7 +507,7 @@ void FlameCreationTask::idResolverSucceeded(QEventLoop& loop)
|
|||||||
copyBlockedMods(blocked_mods);
|
copyBlockedMods(blocked_mods);
|
||||||
setupDownloadJob(loop);
|
setupDownloadJob(loop);
|
||||||
} else {
|
} else {
|
||||||
m_mod_id_resolver.reset();
|
m_modIdResolver.reset();
|
||||||
setError("Canceled");
|
setError("Canceled");
|
||||||
loop.quit();
|
loop.quit();
|
||||||
}
|
}
|
||||||
@ -518,8 +518,8 @@ void FlameCreationTask::idResolverSucceeded(QEventLoop& loop)
|
|||||||
|
|
||||||
void FlameCreationTask::setupDownloadJob(QEventLoop& loop)
|
void FlameCreationTask::setupDownloadJob(QEventLoop& loop)
|
||||||
{
|
{
|
||||||
m_files_job.reset(new NetJob(tr("Mod Download Flame"), APPLICATION->network()));
|
m_filesJob.reset(new NetJob(tr("Mod Download Flame"), APPLICATION->network()));
|
||||||
auto results = m_mod_id_resolver->getResults().files;
|
auto results = m_modIdResolver->getResults().files;
|
||||||
|
|
||||||
QStringList optionalFiles;
|
QStringList optionalFiles;
|
||||||
for (auto& result : results) {
|
for (auto& result : results) {
|
||||||
@ -554,26 +554,26 @@ void FlameCreationTask::setupDownloadJob(QEventLoop& loop)
|
|||||||
if (!result.version.downloadUrl.isEmpty()) {
|
if (!result.version.downloadUrl.isEmpty()) {
|
||||||
qDebug() << "Will download" << result.version.downloadUrl << "to" << path;
|
qDebug() << "Will download" << result.version.downloadUrl << "to" << path;
|
||||||
auto dl = Net::ApiDownload::makeFile(result.version.downloadUrl, path);
|
auto dl = Net::ApiDownload::makeFile(result.version.downloadUrl, path);
|
||||||
m_files_job->addNetAction(dl);
|
m_filesJob->addNetAction(dl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
connect(m_files_job.get(), &NetJob::finished, this, [this, &loop]() {
|
connect(m_filesJob.get(), &NetJob::finished, this, [this, &loop]() {
|
||||||
m_files_job.reset();
|
m_filesJob.reset();
|
||||||
validateZIPResources(loop);
|
validateOtherResources(loop);
|
||||||
});
|
});
|
||||||
connect(m_files_job.get(), &NetJob::failed, [this](QString reason) {
|
connect(m_filesJob.get(), &NetJob::failed, [this](QString reason) {
|
||||||
m_files_job.reset();
|
m_filesJob.reset();
|
||||||
setError(reason);
|
setError(reason);
|
||||||
});
|
});
|
||||||
connect(m_files_job.get(), &NetJob::progress, this, [this](qint64 current, qint64 total) {
|
connect(m_filesJob.get(), &NetJob::progress, this, [this](qint64 current, qint64 total) {
|
||||||
setDetails(tr("%1 out of %2 complete").arg(current).arg(total));
|
setDetails(tr("%1 out of %2 complete").arg(current).arg(total));
|
||||||
setProgress(current, total);
|
setProgress(current, total);
|
||||||
});
|
});
|
||||||
connect(m_files_job.get(), &NetJob::stepProgress, this, &FlameCreationTask::propagateStepProgress);
|
connect(m_filesJob.get(), &NetJob::stepProgress, this, &FlameCreationTask::propagateStepProgress);
|
||||||
|
|
||||||
setStatus(tr("Downloading mods..."));
|
setStatus(tr("Downloading mods..."));
|
||||||
m_files_job->start();
|
m_filesJob->start();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @brief copy the matched blocked mods to the instance staging area
|
/// @brief copy the matched blocked mods to the instance staging area
|
||||||
@ -614,11 +614,11 @@ void FlameCreationTask::copyBlockedMods(QList<BlockedMod> const& blocked_mods)
|
|||||||
setAbortable(true);
|
setAbortable(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FlameCreationTask::validateZIPResources(QEventLoop& loop)
|
void FlameCreationTask::validateOtherResources(QEventLoop& loop)
|
||||||
{
|
{
|
||||||
qDebug() << "Validating whether resources stored as .zip are in the right place";
|
qDebug() << "Validating whether other resources are in the right place";
|
||||||
QStringList zipMods;
|
QStringList zipMods;
|
||||||
for (auto [fileName, targetFolder] : m_ZIP_resources) {
|
for (auto [fileName, targetFolder] : m_otherResources) {
|
||||||
qDebug() << "Checking" << fileName << "...";
|
qDebug() << "Checking" << fileName << "...";
|
||||||
auto localPath = FS::PathCombine(m_stagingPath, "minecraft", targetFolder, fileName);
|
auto localPath = FS::PathCombine(m_stagingPath, "minecraft", targetFolder, fileName);
|
||||||
|
|
||||||
@ -678,6 +678,7 @@ void FlameCreationTask::validateZIPResources(QEventLoop& loop)
|
|||||||
installWorld(worldPath);
|
installWorld(worldPath);
|
||||||
break;
|
break;
|
||||||
case PackedResourceType::UNKNOWN:
|
case PackedResourceType::UNKNOWN:
|
||||||
|
/* fallthrough */
|
||||||
default:
|
default:
|
||||||
qDebug() << "Can't Identify" << fileName << "at" << localPath << ", leaving it where it is.";
|
qDebug() << "Can't Identify" << fileName << "at" << localPath << ", leaving it where it is.";
|
||||||
break;
|
break;
|
||||||
@ -685,7 +686,7 @@ void FlameCreationTask::validateZIPResources(QEventLoop& loop)
|
|||||||
}
|
}
|
||||||
// TODO make this work with other sorts of resource
|
// TODO make this work with other sorts of resource
|
||||||
auto task = makeShared<ConcurrentTask>("CreateModMetadata", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt());
|
auto task = makeShared<ConcurrentTask>("CreateModMetadata", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt());
|
||||||
auto results = m_mod_id_resolver->getResults().files;
|
auto results = m_modIdResolver->getResults().files;
|
||||||
auto folder = FS::PathCombine(m_stagingPath, "minecraft", "mods", ".index");
|
auto folder = FS::PathCombine(m_stagingPath, "minecraft", "mods", ".index");
|
||||||
for (auto file : results) {
|
for (auto file : results) {
|
||||||
if (file.targetFolder != "mods" || (file.version.fileName.endsWith(".zip") && !zipMods.contains(file.version.fileName))) {
|
if (file.targetFolder != "mods" || (file.version.fileName.endsWith(".zip") && !zipMods.contains(file.version.fileName))) {
|
||||||
@ -694,6 +695,6 @@ void FlameCreationTask::validateZIPResources(QEventLoop& loop)
|
|||||||
task->addTask(makeShared<LocalResourceUpdateTask>(folder, file.pack, file.version));
|
task->addTask(makeShared<LocalResourceUpdateTask>(folder, file.pack, file.version));
|
||||||
}
|
}
|
||||||
connect(task.get(), &Task::finished, &loop, &QEventLoop::quit);
|
connect(task.get(), &Task::finished, &loop, &QEventLoop::quit);
|
||||||
m_process_update_file_info_job = task;
|
m_processUpdateFileInfoJob = task;
|
||||||
task->start();
|
task->start();
|
||||||
}
|
}
|
||||||
|
@ -57,7 +57,7 @@ class FlameCreationTask final : public InstanceCreationTask {
|
|||||||
QString id,
|
QString id,
|
||||||
QString version_id,
|
QString version_id,
|
||||||
QString original_instance_id = {})
|
QString original_instance_id = {})
|
||||||
: InstanceCreationTask(), m_parent(parent), m_managed_id(std::move(id)), m_managed_version_id(std::move(version_id))
|
: InstanceCreationTask(), m_parent(parent), m_managedId(std::move(id)), m_managedVersionId(std::move(version_id))
|
||||||
{
|
{
|
||||||
setStagingPath(staging_path);
|
setStagingPath(staging_path);
|
||||||
setParentSettings(global_settings);
|
setParentSettings(global_settings);
|
||||||
@ -74,22 +74,22 @@ class FlameCreationTask final : public InstanceCreationTask {
|
|||||||
void idResolverSucceeded(QEventLoop&);
|
void idResolverSucceeded(QEventLoop&);
|
||||||
void setupDownloadJob(QEventLoop&);
|
void setupDownloadJob(QEventLoop&);
|
||||||
void copyBlockedMods(QList<BlockedMod> const& blocked_mods);
|
void copyBlockedMods(QList<BlockedMod> const& blocked_mods);
|
||||||
void validateZIPResources(QEventLoop& loop);
|
void validateOtherResources(QEventLoop& loop);
|
||||||
QString getVersionForLoader(QString uid, QString loaderType, QString version, QString mcVersion);
|
QString getVersionForLoader(QString uid, QString loaderType, QString version, QString mcVersion);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QWidget* m_parent = nullptr;
|
QWidget* m_parent = nullptr;
|
||||||
|
|
||||||
shared_qobject_ptr<Flame::FileResolvingTask> m_mod_id_resolver;
|
shared_qobject_ptr<Flame::FileResolvingTask> m_modIdResolver;
|
||||||
Flame::Manifest m_pack;
|
Flame::Manifest m_pack;
|
||||||
|
|
||||||
// Handle to allow aborting
|
// Handle to allow aborting
|
||||||
Task::Ptr m_process_update_file_info_job = nullptr;
|
Task::Ptr m_processUpdateFileInfoJob = nullptr;
|
||||||
NetJob::Ptr m_files_job = nullptr;
|
NetJob::Ptr m_filesJob = nullptr;
|
||||||
|
|
||||||
QString m_managed_id, m_managed_version_id;
|
QString m_managedId, m_managedVersionId;
|
||||||
|
|
||||||
QList<std::pair<QString, QString>> m_ZIP_resources;
|
QList<std::pair<QString, QString>> m_otherResources;
|
||||||
|
|
||||||
std::optional<InstancePtr> m_instance;
|
std::optional<InstancePtr> m_instance;
|
||||||
};
|
};
|
||||||
|
@ -40,6 +40,7 @@
|
|||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QUrl>
|
#include <QUrl>
|
||||||
#include <QVector>
|
#include <QVector>
|
||||||
|
#include "minecraft/mod/tasks/LocalResourceParse.h"
|
||||||
#include "modplatform/ModIndex.h"
|
#include "modplatform/ModIndex.h"
|
||||||
|
|
||||||
namespace Flame {
|
namespace Flame {
|
||||||
@ -54,6 +55,7 @@ struct File {
|
|||||||
|
|
||||||
// our
|
// our
|
||||||
QString targetFolder = QStringLiteral("mods");
|
QString targetFolder = QStringLiteral("mods");
|
||||||
|
PackedResourceType resourceType;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Modloader {
|
struct Modloader {
|
||||||
|
@ -54,7 +54,7 @@ Task::Ptr ModrinthAPI::latestVersion(QString hash,
|
|||||||
if (mcVersions.has_value()) {
|
if (mcVersions.has_value()) {
|
||||||
QStringList game_versions;
|
QStringList game_versions;
|
||||||
for (auto& ver : mcVersions.value()) {
|
for (auto& ver : mcVersions.value()) {
|
||||||
game_versions.append(ver.toString());
|
game_versions.append(mapMCVersionToModrinth(ver));
|
||||||
}
|
}
|
||||||
Json::writeStringList(body_obj, "game_versions", game_versions);
|
Json::writeStringList(body_obj, "game_versions", game_versions);
|
||||||
}
|
}
|
||||||
@ -87,7 +87,7 @@ Task::Ptr ModrinthAPI::latestVersions(const QStringList& hashes,
|
|||||||
if (mcVersions.has_value()) {
|
if (mcVersions.has_value()) {
|
||||||
QStringList game_versions;
|
QStringList game_versions;
|
||||||
for (auto& ver : mcVersions.value()) {
|
for (auto& ver : mcVersions.value()) {
|
||||||
game_versions.append(ver.toString());
|
game_versions.append(mapMCVersionToModrinth(ver));
|
||||||
}
|
}
|
||||||
Json::writeStringList(body_obj, "game_versions", game_versions);
|
Json::writeStringList(body_obj, "game_versions", game_versions);
|
||||||
}
|
}
|
||||||
|
@ -71,16 +71,33 @@ class ModrinthAPI : public NetworkResourceAPI {
|
|||||||
|
|
||||||
static auto getSideFilters(QString side) -> const QString
|
static auto getSideFilters(QString side) -> const QString
|
||||||
{
|
{
|
||||||
if (side.isEmpty() || side == "both") {
|
if (side.isEmpty()) {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
if (side == "both")
|
||||||
|
return QString("\"client_side:required\"],[\"server_side:required\"");
|
||||||
if (side == "client")
|
if (side == "client")
|
||||||
return QString("\"client_side:required\",\"client_side:optional\"");
|
return QString("\"client_side:required\",\"client_side:optional\"],[\"server_side:optional\",\"server_side:unsupported\"");
|
||||||
if (side == "server")
|
if (side == "server")
|
||||||
return QString("\"server_side:required\",\"server_side:optional\"");
|
return QString("\"server_side:required\",\"server_side:optional\"],[\"client_side:optional\",\"client_side:unsupported\"");
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] static inline QString mapMCVersionFromModrinth(QString v)
|
||||||
|
{
|
||||||
|
static const QString preString = " Pre-Release ";
|
||||||
|
bool pre = false;
|
||||||
|
if (v.contains("-pre")) {
|
||||||
|
pre = true;
|
||||||
|
v.replace("-pre", preString);
|
||||||
|
}
|
||||||
|
v.replace("-", " ");
|
||||||
|
if (pre) {
|
||||||
|
v.replace(" Pre Release ", preString);
|
||||||
|
}
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
[[nodiscard]] static QString resourceTypeParameter(ModPlatform::ResourceType type)
|
[[nodiscard]] static QString resourceTypeParameter(ModPlatform::ResourceType type)
|
||||||
{
|
{
|
||||||
@ -172,7 +189,7 @@ class ModrinthAPI : public NetworkResourceAPI {
|
|||||||
{
|
{
|
||||||
QString s;
|
QString s;
|
||||||
for (auto& ver : mcVersions) {
|
for (auto& ver : mcVersions) {
|
||||||
s += QString("\"versions:%1\",").arg(ver.toString());
|
s += QString("\"versions:%1\",").arg(mapMCVersionToModrinth(ver));
|
||||||
}
|
}
|
||||||
s.remove(s.length() - 1, 1); // remove last comma
|
s.remove(s.length() - 1, 1); // remove last comma
|
||||||
return s.isEmpty() ? QString() : s;
|
return s.isEmpty() ? QString() : s;
|
||||||
@ -189,7 +206,7 @@ class ModrinthAPI : public NetworkResourceAPI {
|
|||||||
: QString("%1/project/%2/version?game_versions=[\"%3\"]&loaders=[\"%4\"]")
|
: QString("%1/project/%2/version?game_versions=[\"%3\"]&loaders=[\"%4\"]")
|
||||||
.arg(BuildConfig.MODRINTH_PROD_URL)
|
.arg(BuildConfig.MODRINTH_PROD_URL)
|
||||||
.arg(args.dependency.addonId.toString())
|
.arg(args.dependency.addonId.toString())
|
||||||
.arg(args.mcVersion.toString())
|
.arg(mapMCVersionToModrinth(args.mcVersion))
|
||||||
.arg(getModLoaderStrings(args.loader).join("\",\""));
|
.arg(getModLoaderStrings(args.loader).join("\",\""));
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -131,9 +131,7 @@ void Modrinth::loadIndexedPackVersions(ModPlatform::IndexedPack& pack, QJsonArra
|
|||||||
pack.versionsLoaded = true;
|
pack.versionsLoaded = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Modrinth::loadIndexedPackVersion(QJsonObject& obj,
|
ModPlatform::IndexedVersion Modrinth::loadIndexedPackVersion(QJsonObject& obj, QString preferred_hash_type, QString preferred_file_name)
|
||||||
QString preferred_hash_type,
|
|
||||||
QString preferred_file_name) -> ModPlatform::IndexedVersion
|
|
||||||
{
|
{
|
||||||
ModPlatform::IndexedVersion file;
|
ModPlatform::IndexedVersion file;
|
||||||
|
|
||||||
@ -145,7 +143,7 @@ auto Modrinth::loadIndexedPackVersion(QJsonObject& obj,
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
for (auto mcVer : versionArray) {
|
for (auto mcVer : versionArray) {
|
||||||
file.mcVersion.append(mcVer.toString());
|
file.mcVersion.append(ModrinthAPI::mapMCVersionFromModrinth(mcVer.toString()));
|
||||||
}
|
}
|
||||||
auto loaders = Json::requireArray(obj, "loaders");
|
auto loaders = Json::requireArray(obj, "loaders");
|
||||||
for (auto loader : loaders) {
|
for (auto loader : loaders) {
|
||||||
@ -247,9 +245,9 @@ auto Modrinth::loadIndexedPackVersion(QJsonObject& obj,
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Modrinth::loadDependencyVersions([[maybe_unused]] const ModPlatform::Dependency& m,
|
ModPlatform::IndexedVersion Modrinth::loadDependencyVersions([[maybe_unused]] const ModPlatform::Dependency& m,
|
||||||
QJsonArray& arr,
|
QJsonArray& arr,
|
||||||
const BaseInstance* inst) -> ModPlatform::IndexedVersion
|
const BaseInstance* inst)
|
||||||
{
|
{
|
||||||
auto profile = (dynamic_cast<const MinecraftInstance*>(inst))->getPackProfile();
|
auto profile = (dynamic_cast<const MinecraftInstance*>(inst))->getPackProfile();
|
||||||
QString mcVersion = profile->getComponentVersion("net.minecraft");
|
QString mcVersion = profile->getComponentVersion("net.minecraft");
|
||||||
|
@ -40,9 +40,6 @@
|
|||||||
|
|
||||||
#include "modplatform/modrinth/ModrinthAPI.h"
|
#include "modplatform/modrinth/ModrinthAPI.h"
|
||||||
|
|
||||||
#include "minecraft/MinecraftInstance.h"
|
|
||||||
#include "minecraft/PackProfile.h"
|
|
||||||
|
|
||||||
#include <QSet>
|
#include <QSet>
|
||||||
|
|
||||||
static ModrinthAPI api;
|
static ModrinthAPI api;
|
||||||
@ -134,6 +131,7 @@ auto loadIndexedVersion(QJsonObject& obj) -> ModpackVersion
|
|||||||
auto gameVersions = Json::ensureArray(obj, "game_versions");
|
auto gameVersions = Json::ensureArray(obj, "game_versions");
|
||||||
if (!gameVersions.isEmpty()) {
|
if (!gameVersions.isEmpty()) {
|
||||||
file.gameVersion = Json::ensureString(gameVersions[0]);
|
file.gameVersion = Json::ensureString(gameVersions[0]);
|
||||||
|
file.gameVersion = ModrinthAPI::mapMCVersionFromModrinth(file.gameVersion);
|
||||||
}
|
}
|
||||||
auto loaders = Json::requireArray(obj, "loaders");
|
auto loaders = Json::requireArray(obj, "loaders");
|
||||||
for (auto loader : loaders) {
|
for (auto loader : loaders) {
|
||||||
|
@ -51,11 +51,35 @@
|
|||||||
#include <settings/SettingsObject.h>
|
#include <settings/SettingsObject.h>
|
||||||
#include "Application.h"
|
#include "Application.h"
|
||||||
|
|
||||||
|
constexpr int MaxMclogsLines = 25000;
|
||||||
|
constexpr int InitialMclogsLines = 10000;
|
||||||
|
constexpr int FinalMclogsLines = 14900;
|
||||||
|
|
||||||
|
QString truncateLogForMclogs(const QString& logContent)
|
||||||
|
{
|
||||||
|
QStringList lines = logContent.split("\n");
|
||||||
|
if (lines.size() > MaxMclogsLines) {
|
||||||
|
QString truncatedLog = lines.mid(0, InitialMclogsLines).join("\n");
|
||||||
|
truncatedLog +=
|
||||||
|
"\n\n\n\n\n\n\n\n\n\n"
|
||||||
|
"------------------------------------------------------------\n"
|
||||||
|
"----------------------- Log truncated ----------------------\n"
|
||||||
|
"------------------------------------------------------------\n"
|
||||||
|
"----- Middle portion omitted to fit mclo.gs size limits ----\n"
|
||||||
|
"------------------------------------------------------------\n"
|
||||||
|
"\n\n\n\n\n\n\n\n\n\n";
|
||||||
|
truncatedLog += lines.mid(lines.size() - FinalMclogsLines - 1).join("\n");
|
||||||
|
return truncatedLog;
|
||||||
|
}
|
||||||
|
return logContent;
|
||||||
|
}
|
||||||
|
|
||||||
std::optional<QString> GuiUtil::uploadPaste(const QString& name, const QString& text, QWidget* parentWidget)
|
std::optional<QString> GuiUtil::uploadPaste(const QString& name, const QString& text, QWidget* parentWidget)
|
||||||
{
|
{
|
||||||
ProgressDialog dialog(parentWidget);
|
ProgressDialog dialog(parentWidget);
|
||||||
auto pasteTypeSetting = static_cast<PasteUpload::PasteType>(APPLICATION->settings()->get("PastebinType").toInt());
|
auto pasteTypeSetting = static_cast<PasteUpload::PasteType>(APPLICATION->settings()->get("PastebinType").toInt());
|
||||||
auto pasteCustomAPIBaseSetting = APPLICATION->settings()->get("PastebinCustomAPIBase").toString();
|
auto pasteCustomAPIBaseSetting = APPLICATION->settings()->get("PastebinCustomAPIBase").toString();
|
||||||
|
bool shouldTruncate = false;
|
||||||
|
|
||||||
{
|
{
|
||||||
QUrl baseUrl;
|
QUrl baseUrl;
|
||||||
@ -75,10 +99,36 @@ std::optional<QString> GuiUtil::uploadPaste(const QString& name, const QString&
|
|||||||
|
|
||||||
if (response != QMessageBox::Yes)
|
if (response != QMessageBox::Yes)
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
|
if (baseUrl.toString() == "https://api.mclo.gs" && text.count("\n") > MaxMclogsLines) {
|
||||||
|
auto truncateResponse = CustomMessageBox::selectable(
|
||||||
|
parentWidget, QObject::tr("Confirm Truncation"),
|
||||||
|
QObject::tr("The log has %1 lines, exceeding mclo.gs' limit of %2.\n"
|
||||||
|
"The launcher can keep the first %3 and last %4 lines, trimming the middle.\n\n"
|
||||||
|
"If you choose 'No', mclo.gs will only keep the first %2 lines, cutting off "
|
||||||
|
"potentially useful info like crashes at the end.\n\n"
|
||||||
|
"Proceed with truncation?")
|
||||||
|
.arg(text.count("\n"))
|
||||||
|
.arg(MaxMclogsLines)
|
||||||
|
.arg(InitialMclogsLines)
|
||||||
|
.arg(FinalMclogsLines),
|
||||||
|
QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::No)
|
||||||
|
->exec();
|
||||||
|
|
||||||
|
if (truncateResponse == QMessageBox::Cancel) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
shouldTruncate = truncateResponse == QMessageBox::Yes;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<PasteUpload> paste(new PasteUpload(parentWidget, text, pasteCustomAPIBaseSetting, pasteTypeSetting));
|
QString textToUpload = text;
|
||||||
|
if (shouldTruncate) {
|
||||||
|
textToUpload = truncateLogForMclogs(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<PasteUpload> paste(new PasteUpload(parentWidget, textToUpload, pasteCustomAPIBaseSetting, pasteTypeSetting));
|
||||||
|
|
||||||
dialog.execWithTask(paste.get());
|
dialog.execWithTask(paste.get());
|
||||||
if (!paste->wasSuccessful()) {
|
if (!paste->wasSuccessful()) {
|
||||||
|
@ -1027,6 +1027,14 @@ void MainWindow::processURLs(QList<QUrl> urls)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (APPLICATION->instances()->count() <= 0) {
|
||||||
|
CustomMessageBox::selectable(this, tr("No instance!"),
|
||||||
|
tr("No instance available to add the resource to.\nPlease create a new instance before "
|
||||||
|
"attempting to install this resource again."),
|
||||||
|
QMessageBox::Critical)
|
||||||
|
->show();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
ImportResourceDialog dlg(localFileName, type, this);
|
ImportResourceDialog dlg(localFileName, type, this);
|
||||||
|
|
||||||
if (dlg.exec() != QDialog::Accepted)
|
if (dlg.exec() != QDialog::Accepted)
|
||||||
|
@ -1,64 +0,0 @@
|
|||||||
/* Copyright 2013-2021 MultiMC Contributors
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "EditAccountDialog.h"
|
|
||||||
#include <DesktopServices.h>
|
|
||||||
#include <QPushButton>
|
|
||||||
#include <QUrl>
|
|
||||||
#include "ui_EditAccountDialog.h"
|
|
||||||
|
|
||||||
EditAccountDialog::EditAccountDialog(const QString& text, QWidget* parent, int flags) : QDialog(parent), ui(new Ui::EditAccountDialog)
|
|
||||||
{
|
|
||||||
ui->setupUi(this);
|
|
||||||
|
|
||||||
ui->label->setText(text);
|
|
||||||
ui->label->setVisible(!text.isEmpty());
|
|
||||||
|
|
||||||
ui->userTextBox->setEnabled(flags & UsernameField);
|
|
||||||
ui->passTextBox->setEnabled(flags & PasswordField);
|
|
||||||
|
|
||||||
ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel"));
|
|
||||||
ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK"));
|
|
||||||
}
|
|
||||||
|
|
||||||
EditAccountDialog::~EditAccountDialog()
|
|
||||||
{
|
|
||||||
delete ui;
|
|
||||||
}
|
|
||||||
|
|
||||||
void EditAccountDialog::on_label_linkActivated(const QString& link)
|
|
||||||
{
|
|
||||||
DesktopServices::openUrl(QUrl(link));
|
|
||||||
}
|
|
||||||
|
|
||||||
void EditAccountDialog::setUsername(const QString& user) const
|
|
||||||
{
|
|
||||||
ui->userTextBox->setText(user);
|
|
||||||
}
|
|
||||||
|
|
||||||
QString EditAccountDialog::username() const
|
|
||||||
{
|
|
||||||
return ui->userTextBox->text();
|
|
||||||
}
|
|
||||||
|
|
||||||
void EditAccountDialog::setPassword(const QString& pass) const
|
|
||||||
{
|
|
||||||
ui->passTextBox->setText(pass);
|
|
||||||
}
|
|
||||||
|
|
||||||
QString EditAccountDialog::password() const
|
|
||||||
{
|
|
||||||
return ui->passTextBox->text();
|
|
||||||
}
|
|
@ -1,52 +0,0 @@
|
|||||||
/* Copyright 2013-2021 MultiMC Contributors
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <QDialog>
|
|
||||||
|
|
||||||
namespace Ui {
|
|
||||||
class EditAccountDialog;
|
|
||||||
}
|
|
||||||
|
|
||||||
class EditAccountDialog : public QDialog {
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit EditAccountDialog(const QString& text = "", QWidget* parent = 0, int flags = UsernameField | PasswordField);
|
|
||||||
~EditAccountDialog();
|
|
||||||
|
|
||||||
void setUsername(const QString& user) const;
|
|
||||||
void setPassword(const QString& pass) const;
|
|
||||||
|
|
||||||
QString username() const;
|
|
||||||
QString password() const;
|
|
||||||
|
|
||||||
enum Flags {
|
|
||||||
NoFlags = 0,
|
|
||||||
|
|
||||||
//! Specifies that the dialog should have a username field.
|
|
||||||
UsernameField,
|
|
||||||
|
|
||||||
//! Specifies that the dialog should have a password field.
|
|
||||||
PasswordField,
|
|
||||||
};
|
|
||||||
|
|
||||||
private slots:
|
|
||||||
void on_label_linkActivated(const QString& link);
|
|
||||||
|
|
||||||
private:
|
|
||||||
Ui::EditAccountDialog* ui;
|
|
||||||
};
|
|
@ -1,94 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<ui version="4.0">
|
|
||||||
<class>EditAccountDialog</class>
|
|
||||||
<widget class="QDialog" name="EditAccountDialog">
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>400</width>
|
|
||||||
<height>148</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="windowTitle">
|
|
||||||
<string>Login</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="label">
|
|
||||||
<property name="text">
|
|
||||||
<string notr="true">Message label placeholder.</string>
|
|
||||||
</property>
|
|
||||||
<property name="textFormat">
|
|
||||||
<enum>Qt::RichText</enum>
|
|
||||||
</property>
|
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLineEdit" name="userTextBox">
|
|
||||||
<property name="placeholderText">
|
|
||||||
<string>Email</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLineEdit" name="passTextBox">
|
|
||||||
<property name="echoMode">
|
|
||||||
<enum>QLineEdit::Password</enum>
|
|
||||||
</property>
|
|
||||||
<property name="placeholderText">
|
|
||||||
<string>Password</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QDialogButtonBox" name="buttonBox">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="standardButtons">
|
|
||||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<resources/>
|
|
||||||
<connections>
|
|
||||||
<connection>
|
|
||||||
<sender>buttonBox</sender>
|
|
||||||
<signal>accepted()</signal>
|
|
||||||
<receiver>EditAccountDialog</receiver>
|
|
||||||
<slot>accept()</slot>
|
|
||||||
<hints>
|
|
||||||
<hint type="sourcelabel">
|
|
||||||
<x>248</x>
|
|
||||||
<y>254</y>
|
|
||||||
</hint>
|
|
||||||
<hint type="destinationlabel">
|
|
||||||
<x>157</x>
|
|
||||||
<y>274</y>
|
|
||||||
</hint>
|
|
||||||
</hints>
|
|
||||||
</connection>
|
|
||||||
<connection>
|
|
||||||
<sender>buttonBox</sender>
|
|
||||||
<signal>rejected()</signal>
|
|
||||||
<receiver>EditAccountDialog</receiver>
|
|
||||||
<slot>reject()</slot>
|
|
||||||
<hints>
|
|
||||||
<hint type="sourcelabel">
|
|
||||||
<x>316</x>
|
|
||||||
<y>260</y>
|
|
||||||
</hint>
|
|
||||||
<hint type="destinationlabel">
|
|
||||||
<x>286</x>
|
|
||||||
<y>274</y>
|
|
||||||
</hint>
|
|
||||||
</hints>
|
|
||||||
</connection>
|
|
||||||
</connections>
|
|
||||||
</ui>
|
|
@ -30,6 +30,9 @@ Choose your name carefully:</string>
|
|||||||
<property name="wordWrap">
|
<property name="wordWrap">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
<property name="buddy">
|
<property name="buddy">
|
||||||
<cstring>nameEdit</cstring>
|
<cstring>nameEdit</cstring>
|
||||||
</property>
|
</property>
|
||||||
|
@ -207,7 +207,7 @@
|
|||||||
<item row="0" column="0">
|
<item row="0" column="0">
|
||||||
<widget class="QLabel" name="label_8">
|
<widget class="QLabel" name="label_8">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string><html><head/><body><p>Note: you only need to set this to access private data. Read the <a href="https://docs.modrinth.com/#section/Authentication">documentation</a> for more information.</p></body></html></string>
|
<string><html><head/><body><p>Note: you only need to set this to access private data. Read the <a href="https://docs.modrinth.com/api/#authentication">documentation</a> for more information.</p></body></html></string>
|
||||||
</property>
|
</property>
|
||||||
<property name="openExternalLinks">
|
<property name="openExternalLinks">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
|
@ -1,84 +0,0 @@
|
|||||||
// SPDX-License-Identifier: GPL-3.0-only
|
|
||||||
/*
|
|
||||||
* Prism Launcher - Minecraft Launcher
|
|
||||||
* Copyright (c) 2022 Jamie Mansfield <jmansfield@cadixdev.org>
|
|
||||||
* Copyright (C) 2022 Sefa Eyeoglu <contact@scrumplex.net>
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, version 3.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* This file incorporates work covered by the following copyright and
|
|
||||||
* permission notice:
|
|
||||||
*
|
|
||||||
* Copyright 2013-2021 MultiMC Contributors
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "CustomCommandsPage.h"
|
|
||||||
#include <QTabBar>
|
|
||||||
#include <QTabWidget>
|
|
||||||
#include <QVBoxLayout>
|
|
||||||
|
|
||||||
CustomCommandsPage::CustomCommandsPage(QWidget* parent) : QWidget(parent)
|
|
||||||
{
|
|
||||||
auto verticalLayout = new QVBoxLayout(this);
|
|
||||||
verticalLayout->setObjectName(QStringLiteral("verticalLayout"));
|
|
||||||
verticalLayout->setContentsMargins(0, 0, 0, 0);
|
|
||||||
|
|
||||||
auto tabWidget = new QTabWidget(this);
|
|
||||||
tabWidget->setObjectName(QStringLiteral("tabWidget"));
|
|
||||||
commands = new CustomCommands(this);
|
|
||||||
commands->setContentsMargins(6, 6, 6, 6);
|
|
||||||
tabWidget->addTab(commands, "Foo");
|
|
||||||
tabWidget->tabBar()->hide();
|
|
||||||
verticalLayout->addWidget(tabWidget);
|
|
||||||
loadSettings();
|
|
||||||
}
|
|
||||||
|
|
||||||
CustomCommandsPage::~CustomCommandsPage() {}
|
|
||||||
|
|
||||||
bool CustomCommandsPage::apply()
|
|
||||||
{
|
|
||||||
applySettings();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CustomCommandsPage::applySettings()
|
|
||||||
{
|
|
||||||
auto s = APPLICATION->settings();
|
|
||||||
s->set("PreLaunchCommand", commands->prelaunchCommand());
|
|
||||||
s->set("WrapperCommand", commands->wrapperCommand());
|
|
||||||
s->set("PostExitCommand", commands->postexitCommand());
|
|
||||||
}
|
|
||||||
|
|
||||||
void CustomCommandsPage::loadSettings()
|
|
||||||
{
|
|
||||||
auto s = APPLICATION->settings();
|
|
||||||
commands->initialize(false, true, s->get("PreLaunchCommand").toString(), s->get("WrapperCommand").toString(),
|
|
||||||
s->get("PostExitCommand").toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
void CustomCommandsPage::retranslate()
|
|
||||||
{
|
|
||||||
commands->retranslate();
|
|
||||||
}
|
|
@ -1,71 +0,0 @@
|
|||||||
// SPDX-License-Identifier: GPL-3.0-only
|
|
||||||
/*
|
|
||||||
* Prism Launcher - Minecraft Launcher
|
|
||||||
* Copyright (C) 2023 TheKodeToad <TheKodeToad@proton.me>
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, version 3.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <QTabBar>
|
|
||||||
#include <QTabWidget>
|
|
||||||
#include <QVBoxLayout>
|
|
||||||
|
|
||||||
#include "EnvironmentVariablesPage.h"
|
|
||||||
|
|
||||||
EnvironmentVariablesPage::EnvironmentVariablesPage(QWidget* parent) : QWidget(parent)
|
|
||||||
{
|
|
||||||
auto verticalLayout = new QVBoxLayout(this);
|
|
||||||
verticalLayout->setObjectName(QStringLiteral("verticalLayout"));
|
|
||||||
verticalLayout->setContentsMargins(0, 0, 0, 0);
|
|
||||||
|
|
||||||
auto tabWidget = new QTabWidget(this);
|
|
||||||
tabWidget->setObjectName(QStringLiteral("tabWidget"));
|
|
||||||
variables = new EnvironmentVariables(this);
|
|
||||||
variables->setContentsMargins(6, 6, 6, 6);
|
|
||||||
tabWidget->addTab(variables, "Foo");
|
|
||||||
tabWidget->tabBar()->hide();
|
|
||||||
verticalLayout->addWidget(tabWidget);
|
|
||||||
|
|
||||||
variables->initialize(false, false, APPLICATION->settings()->get("Env").toMap());
|
|
||||||
}
|
|
||||||
|
|
||||||
QString EnvironmentVariablesPage::displayName() const
|
|
||||||
{
|
|
||||||
return tr("Environment Variables");
|
|
||||||
}
|
|
||||||
|
|
||||||
QIcon EnvironmentVariablesPage::icon() const
|
|
||||||
{
|
|
||||||
return APPLICATION->getThemedIcon("environment-variables");
|
|
||||||
}
|
|
||||||
|
|
||||||
QString EnvironmentVariablesPage::id() const
|
|
||||||
{
|
|
||||||
return "environment-variables";
|
|
||||||
}
|
|
||||||
|
|
||||||
QString EnvironmentVariablesPage::helpPage() const
|
|
||||||
{
|
|
||||||
return "Environment-variables";
|
|
||||||
}
|
|
||||||
|
|
||||||
bool EnvironmentVariablesPage::apply()
|
|
||||||
{
|
|
||||||
APPLICATION->settings()->set("Env", variables->value());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void EnvironmentVariablesPage::retranslate()
|
|
||||||
{
|
|
||||||
variables->retranslate();
|
|
||||||
}
|
|
@ -1,42 +0,0 @@
|
|||||||
// SPDX-License-Identifier: GPL-3.0-only
|
|
||||||
/*
|
|
||||||
* Prism Launcher - Minecraft Launcher
|
|
||||||
* Copyright (C) 2023 TheKodeToad <TheKodeToad@proton.me>
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, version 3.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <Application.h>
|
|
||||||
|
|
||||||
#include "ui/pages/BasePage.h"
|
|
||||||
#include "ui/widgets/EnvironmentVariables.h"
|
|
||||||
|
|
||||||
class EnvironmentVariablesPage : public QWidget, public BasePage {
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit EnvironmentVariablesPage(QWidget* parent = nullptr);
|
|
||||||
|
|
||||||
QString displayName() const override;
|
|
||||||
QIcon icon() const override;
|
|
||||||
QString id() const override;
|
|
||||||
QString helpPage() const override;
|
|
||||||
|
|
||||||
bool apply() override;
|
|
||||||
void retranslate() override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
EnvironmentVariables* variables;
|
|
||||||
};
|
|
@ -62,25 +62,15 @@
|
|||||||
JavaPage::JavaPage(QWidget* parent) : QWidget(parent), ui(new Ui::JavaPage)
|
JavaPage::JavaPage(QWidget* parent) : QWidget(parent), ui(new Ui::JavaPage)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
if (BuildConfig.JAVA_DOWNLOADER_ENABLED) {
|
if (BuildConfig.JAVA_DOWNLOADER_ENABLED) {
|
||||||
ui->managedJavaList->initialize(new JavaInstallList(this, true));
|
ui->managedJavaList->initialize(new JavaInstallList(this, true));
|
||||||
ui->managedJavaList->setResizeOn(2);
|
ui->managedJavaList->setResizeOn(2);
|
||||||
ui->managedJavaList->selectCurrent();
|
ui->managedJavaList->selectCurrent();
|
||||||
ui->managedJavaList->setEmptyString(tr("No managed Java versions are installed"));
|
ui->managedJavaList->setEmptyString(tr("No managed Java versions are installed"));
|
||||||
ui->managedJavaList->setEmptyErrorString(tr("Couldn't load the managed Java list!"));
|
ui->managedJavaList->setEmptyErrorString(tr("Couldn't load the managed Java list!"));
|
||||||
connect(ui->autodetectJavaCheckBox, &QCheckBox::stateChanged, this, [this] {
|
} else
|
||||||
ui->autodownloadCheckBox->setEnabled(ui->autodetectJavaCheckBox->isChecked());
|
|
||||||
if (!ui->autodetectJavaCheckBox->isChecked())
|
|
||||||
ui->autodownloadCheckBox->setChecked(false);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
ui->autodownloadCheckBox->setHidden(true);
|
|
||||||
ui->tabWidget->tabBar()->hide();
|
ui->tabWidget->tabBar()->hide();
|
||||||
}
|
|
||||||
|
|
||||||
loadSettings();
|
|
||||||
updateThresholds();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
JavaPage::~JavaPage()
|
JavaPage::~JavaPage()
|
||||||
@ -88,117 +78,18 @@ JavaPage::~JavaPage()
|
|||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void JavaPage::retranslate()
|
||||||
|
{
|
||||||
|
ui->retranslateUi(this);
|
||||||
|
}
|
||||||
|
|
||||||
bool JavaPage::apply()
|
bool JavaPage::apply()
|
||||||
{
|
{
|
||||||
applySettings();
|
ui->javaSettings->saveSettings();
|
||||||
|
JavaCommon::checkJVMArgs(APPLICATION->settings()->get("JvmArgs").toString(), this);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void JavaPage::applySettings()
|
|
||||||
{
|
|
||||||
auto s = APPLICATION->settings();
|
|
||||||
|
|
||||||
// Memory
|
|
||||||
int min = ui->minMemSpinBox->value();
|
|
||||||
int max = ui->maxMemSpinBox->value();
|
|
||||||
if (min < max) {
|
|
||||||
s->set("MinMemAlloc", min);
|
|
||||||
s->set("MaxMemAlloc", max);
|
|
||||||
} else {
|
|
||||||
s->set("MinMemAlloc", max);
|
|
||||||
s->set("MaxMemAlloc", min);
|
|
||||||
}
|
|
||||||
s->set("PermGen", ui->permGenSpinBox->value());
|
|
||||||
|
|
||||||
// Java Settings
|
|
||||||
s->set("JavaPath", ui->javaPathTextBox->text());
|
|
||||||
s->set("JvmArgs", ui->jvmArgsTextBox->toPlainText().replace("\n", " "));
|
|
||||||
s->set("IgnoreJavaCompatibility", ui->skipCompatibilityCheckbox->isChecked());
|
|
||||||
s->set("IgnoreJavaWizard", ui->skipJavaWizardCheckbox->isChecked());
|
|
||||||
s->set("AutomaticJavaSwitch", ui->autodetectJavaCheckBox->isChecked());
|
|
||||||
s->set("AutomaticJavaDownload", ui->autodownloadCheckBox->isChecked());
|
|
||||||
JavaCommon::checkJVMArgs(s->get("JvmArgs").toString(), this->parentWidget());
|
|
||||||
}
|
|
||||||
void JavaPage::loadSettings()
|
|
||||||
{
|
|
||||||
auto s = APPLICATION->settings();
|
|
||||||
// Memory
|
|
||||||
int min = s->get("MinMemAlloc").toInt();
|
|
||||||
int max = s->get("MaxMemAlloc").toInt();
|
|
||||||
if (min < max) {
|
|
||||||
ui->minMemSpinBox->setValue(min);
|
|
||||||
ui->maxMemSpinBox->setValue(max);
|
|
||||||
} else {
|
|
||||||
ui->minMemSpinBox->setValue(max);
|
|
||||||
ui->maxMemSpinBox->setValue(min);
|
|
||||||
}
|
|
||||||
ui->permGenSpinBox->setValue(s->get("PermGen").toInt());
|
|
||||||
|
|
||||||
// Java Settings
|
|
||||||
ui->javaPathTextBox->setText(s->get("JavaPath").toString());
|
|
||||||
ui->jvmArgsTextBox->setPlainText(s->get("JvmArgs").toString());
|
|
||||||
ui->skipCompatibilityCheckbox->setChecked(s->get("IgnoreJavaCompatibility").toBool());
|
|
||||||
ui->skipJavaWizardCheckbox->setChecked(s->get("IgnoreJavaWizard").toBool());
|
|
||||||
ui->autodetectJavaCheckBox->setChecked(s->get("AutomaticJavaSwitch").toBool());
|
|
||||||
ui->autodownloadCheckBox->setChecked(s->get("AutomaticJavaSwitch").toBool() && s->get("AutomaticJavaDownload").toBool());
|
|
||||||
}
|
|
||||||
|
|
||||||
void JavaPage::on_javaDetectBtn_clicked()
|
|
||||||
{
|
|
||||||
if (JavaUtils::getJavaCheckPath().isEmpty()) {
|
|
||||||
JavaCommon::javaCheckNotFound(this);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
JavaInstallPtr java;
|
|
||||||
|
|
||||||
VersionSelectDialog vselect(APPLICATION->javalist().get(), tr("Select a Java version"), this, true);
|
|
||||||
vselect.setResizeOn(2);
|
|
||||||
vselect.exec();
|
|
||||||
|
|
||||||
if (vselect.result() == QDialog::Accepted && vselect.selectedVersion()) {
|
|
||||||
java = std::dynamic_pointer_cast<JavaInstall>(vselect.selectedVersion());
|
|
||||||
ui->javaPathTextBox->setText(java->path);
|
|
||||||
if (!java->is_64bit && APPLICATION->settings()->get("MaxMemAlloc").toInt() > 2048) {
|
|
||||||
CustomMessageBox::selectable(this, tr("Confirm Selection"),
|
|
||||||
tr("You selected a 32-bit version of Java.\n"
|
|
||||||
"This installation does not support more than 2048MiB of RAM.\n"
|
|
||||||
"Please make sure that the maximum memory value is lower."),
|
|
||||||
QMessageBox::Warning, QMessageBox::Ok, QMessageBox::Ok)
|
|
||||||
->exec();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void JavaPage::on_javaBrowseBtn_clicked()
|
|
||||||
{
|
|
||||||
QString raw_path = QFileDialog::getOpenFileName(this, tr("Find Java executable"));
|
|
||||||
|
|
||||||
// do not allow current dir - it's dirty. Do not allow dirs that don't exist
|
|
||||||
if (raw_path.isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString cooked_path = FS::NormalizePath(raw_path);
|
|
||||||
QFileInfo javaInfo(cooked_path);
|
|
||||||
;
|
|
||||||
if (!javaInfo.exists() || !javaInfo.isExecutable()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ui->javaPathTextBox->setText(cooked_path);
|
|
||||||
}
|
|
||||||
|
|
||||||
void JavaPage::on_javaTestBtn_clicked()
|
|
||||||
{
|
|
||||||
if (checker) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
checker.reset(new JavaCommon::TestCheck(this, ui->javaPathTextBox->text(), ui->jvmArgsTextBox->toPlainText().replace("\n", " "),
|
|
||||||
ui->minMemSpinBox->value(), ui->maxMemSpinBox->value(), ui->permGenSpinBox->value()));
|
|
||||||
connect(checker.get(), SIGNAL(finished()), SLOT(checkerFinished()));
|
|
||||||
checker->run();
|
|
||||||
}
|
|
||||||
|
|
||||||
void JavaPage::on_downloadJavaButton_clicked()
|
void JavaPage::on_downloadJavaButton_clicked()
|
||||||
{
|
{
|
||||||
auto jdialog = new Java::InstallDialog({}, nullptr, this);
|
auto jdialog = new Java::InstallDialog({}, nullptr, this);
|
||||||
@ -206,51 +97,6 @@ void JavaPage::on_downloadJavaButton_clicked()
|
|||||||
ui->managedJavaList->loadList();
|
ui->managedJavaList->loadList();
|
||||||
}
|
}
|
||||||
|
|
||||||
void JavaPage::on_maxMemSpinBox_valueChanged([[maybe_unused]] int i)
|
|
||||||
{
|
|
||||||
updateThresholds();
|
|
||||||
}
|
|
||||||
|
|
||||||
void JavaPage::checkerFinished()
|
|
||||||
{
|
|
||||||
checker.reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
void JavaPage::retranslate()
|
|
||||||
{
|
|
||||||
ui->retranslateUi(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
void JavaPage::updateThresholds()
|
|
||||||
{
|
|
||||||
auto sysMiB = Sys::getSystemRam() / Sys::mebibyte;
|
|
||||||
unsigned int maxMem = ui->maxMemSpinBox->value();
|
|
||||||
unsigned int minMem = ui->minMemSpinBox->value();
|
|
||||||
|
|
||||||
QString iconName;
|
|
||||||
|
|
||||||
if (maxMem >= sysMiB) {
|
|
||||||
iconName = "status-bad";
|
|
||||||
ui->labelMaxMemIcon->setToolTip(tr("Your maximum memory allocation exceeds your system memory capacity."));
|
|
||||||
} else if (maxMem > (sysMiB * 0.9)) {
|
|
||||||
iconName = "status-yellow";
|
|
||||||
ui->labelMaxMemIcon->setToolTip(tr("Your maximum memory allocation approaches your system memory capacity."));
|
|
||||||
} else if (maxMem < minMem) {
|
|
||||||
iconName = "status-yellow";
|
|
||||||
ui->labelMaxMemIcon->setToolTip(tr("Your maximum memory allocation is smaller than the minimum value"));
|
|
||||||
} else {
|
|
||||||
iconName = "status-good";
|
|
||||||
ui->labelMaxMemIcon->setToolTip("");
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
auto height = ui->labelMaxMemIcon->fontInfo().pixelSize();
|
|
||||||
QIcon icon = APPLICATION->getThemedIcon(iconName);
|
|
||||||
QPixmap pix = icon.pixmap(height, height);
|
|
||||||
ui->labelMaxMemIcon->setPixmap(pix);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void JavaPage::on_removeJavaButton_clicked()
|
void JavaPage::on_removeJavaButton_clicked()
|
||||||
{
|
{
|
||||||
auto version = ui->managedJavaList->selectedVersion();
|
auto version = ui->managedJavaList->selectedVersion();
|
||||||
|
@ -37,6 +37,7 @@
|
|||||||
|
|
||||||
#include <Application.h>
|
#include <Application.h>
|
||||||
#include <QObjectPtr.h>
|
#include <QObjectPtr.h>
|
||||||
|
#include "ui/widgets/JavaSettingsWidget.h"
|
||||||
#include <QDialog>
|
#include <QDialog>
|
||||||
#include <QStringListModel>
|
#include <QStringListModel>
|
||||||
#include "JavaCommon.h"
|
#include "JavaCommon.h"
|
||||||
@ -59,26 +60,15 @@ class JavaPage : public QWidget, public BasePage {
|
|||||||
QIcon icon() const override { return APPLICATION->getThemedIcon("java"); }
|
QIcon icon() const override { return APPLICATION->getThemedIcon("java"); }
|
||||||
QString id() const override { return "java-settings"; }
|
QString id() const override { return "java-settings"; }
|
||||||
QString helpPage() const override { return "Java-settings"; }
|
QString helpPage() const override { return "Java-settings"; }
|
||||||
bool apply() override;
|
|
||||||
void retranslate() override;
|
void retranslate() override;
|
||||||
|
|
||||||
void updateThresholds();
|
bool apply() override;
|
||||||
|
|
||||||
private:
|
|
||||||
void applySettings();
|
|
||||||
void loadSettings();
|
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void on_javaDetectBtn_clicked();
|
|
||||||
void on_javaTestBtn_clicked();
|
|
||||||
void on_javaBrowseBtn_clicked();
|
|
||||||
void on_downloadJavaButton_clicked();
|
void on_downloadJavaButton_clicked();
|
||||||
void on_removeJavaButton_clicked();
|
void on_removeJavaButton_clicked();
|
||||||
void on_refreshJavaButton_clicked();
|
void on_refreshJavaButton_clicked();
|
||||||
void on_maxMemSpinBox_valueChanged(int i);
|
|
||||||
void checkerFinished();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::JavaPage* ui;
|
Ui::JavaPage* ui;
|
||||||
unique_qobject_ptr<JavaCommon::TestCheck> checker;
|
|
||||||
};
|
};
|
||||||
|
@ -40,292 +40,27 @@
|
|||||||
</attribute>
|
</attribute>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QGroupBox" name="memoryGroupBox">
|
<widget class="QScrollArea" name="generalScrollArea">
|
||||||
<property name="title">
|
<property name="widgetResizable">
|
||||||
<string>Memory</string>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout_2" columnstretch="1,0,0,0">
|
<widget class="QWidget" name="scrollAreaWidgetContents">
|
||||||
<item row="1" column="0">
|
<property name="geometry">
|
||||||
<widget class="QLabel" name="labelMaxMem">
|
<rect>
|
||||||
<property name="text">
|
<x>0</x>
|
||||||
<string>Ma&ximum memory allocation:</string>
|
<y>0</y>
|
||||||
</property>
|
<width>535</width>
|
||||||
<property name="buddy">
|
<height>610</height>
|
||||||
<cstring>maxMemSpinBox</cstring>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
<layout class="QVBoxLayout" name="verticalLayout_4">
|
||||||
</item>
|
<item>
|
||||||
<item row="2" column="0">
|
<widget class="JavaSettingsWidget" name="javaSettings" native="true"/>
|
||||||
<widget class="QLabel" name="labelPermGen">
|
</item>
|
||||||
<property name="text">
|
</layout>
|
||||||
<string>&PermGen:</string>
|
</widget>
|
||||||
</property>
|
|
||||||
<property name="buddy">
|
|
||||||
<cstring>permGenSpinBox</cstring>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="QLabel" name="labelMinMem">
|
|
||||||
<property name="text">
|
|
||||||
<string>&Minimum memory allocation:</string>
|
|
||||||
</property>
|
|
||||||
<property name="buddy">
|
|
||||||
<cstring>minMemSpinBox</cstring>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="2">
|
|
||||||
<widget class="QSpinBox" name="minMemSpinBox">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>The amount of memory Minecraft is started with.</string>
|
|
||||||
</property>
|
|
||||||
<property name="suffix">
|
|
||||||
<string notr="true"> MiB</string>
|
|
||||||
</property>
|
|
||||||
<property name="minimum">
|
|
||||||
<number>8</number>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<number>1048576</number>
|
|
||||||
</property>
|
|
||||||
<property name="singleStep">
|
|
||||||
<number>128</number>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
|
||||||
<number>256</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="2">
|
|
||||||
<widget class="QSpinBox" name="maxMemSpinBox">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>The maximum amount of memory Minecraft is allowed to use.</string>
|
|
||||||
</property>
|
|
||||||
<property name="suffix">
|
|
||||||
<string notr="true"> MiB</string>
|
|
||||||
</property>
|
|
||||||
<property name="minimum">
|
|
||||||
<number>8</number>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<number>1048576</number>
|
|
||||||
</property>
|
|
||||||
<property name="singleStep">
|
|
||||||
<number>128</number>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
|
||||||
<number>1024</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="2">
|
|
||||||
<widget class="QSpinBox" name="permGenSpinBox">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>The amount of memory available to store loaded Java classes.</string>
|
|
||||||
</property>
|
|
||||||
<property name="suffix">
|
|
||||||
<string notr="true"> MiB</string>
|
|
||||||
</property>
|
|
||||||
<property name="minimum">
|
|
||||||
<number>4</number>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<number>999999999</number>
|
|
||||||
</property>
|
|
||||||
<property name="singleStep">
|
|
||||||
<number>8</number>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
|
||||||
<number>64</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="3">
|
|
||||||
<widget class="QLabel" name="labelMaxMemIcon">
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
<property name="buddy">
|
|
||||||
<cstring>maxMemSpinBox</cstring>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
|
||||||
<widget class="QGroupBox" name="javaSettingsGroupBox">
|
|
||||||
<property name="title">
|
|
||||||
<string>Java Runtime</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QGridLayout" name="gridLayout_3">
|
|
||||||
<item row="4" column="0">
|
|
||||||
<widget class="QCheckBox" name="skipCompatibilityCheckbox">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>If enabled, the launcher will not check if an instance is compatible with the selected Java version.</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>&Skip Java compatibility checks</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="0" colspan="3">
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="javaDetectBtn">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>&Auto-detect...</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="javaTestBtn">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>&Test</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item row="8" column="0">
|
|
||||||
<widget class="QLabel" name="labelJVMArgs">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>JVM arguments:</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="5" column="0">
|
|
||||||
<widget class="QCheckBox" name="skipJavaWizardCheckbox">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>If enabled, the launcher will not prompt you to choose a Java version if one isn't found.</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Skip Java &Wizard</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="9" column="0" colspan="3">
|
|
||||||
<widget class="QPlainTextEdit" name="jvmArgsTextBox">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>16777215</width>
|
|
||||||
<height>100</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="6" column="0">
|
|
||||||
<widget class="QCheckBox" name="autodetectJavaCheckBox">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Automatically selects the Java version that is compatible with the current Minecraft instance, based on the major version required.</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Autodetect Java version</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0" colspan="3">
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="labelJavaPath">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>&Java path:</string>
|
|
||||||
</property>
|
|
||||||
<property name="buddy">
|
|
||||||
<cstring>javaPathTextBox</cstring>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLineEdit" name="javaPathTextBox"/>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="javaBrowseBtn">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Browse</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item row="7" column="0">
|
|
||||||
<widget class="QCheckBox" name="autodownloadCheckBox">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Automatically downloads and selects the Java version recommended by Mojang.</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Auto-download Mojang Java</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="verticalSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Vertical</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>20</width>
|
|
||||||
<height>40</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="management">
|
<widget class="QWidget" name="management">
|
||||||
@ -416,20 +151,13 @@
|
|||||||
<header>ui/widgets/VersionSelectWidget.h</header>
|
<header>ui/widgets/VersionSelectWidget.h</header>
|
||||||
<container>1</container>
|
<container>1</container>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
|
<customwidget>
|
||||||
|
<class>JavaSettingsWidget</class>
|
||||||
|
<extends>QWidget</extends>
|
||||||
|
<header>ui/widgets/JavaSettingsWidget.h</header>
|
||||||
|
<container>1</container>
|
||||||
|
</customwidget>
|
||||||
</customwidgets>
|
</customwidgets>
|
||||||
<tabstops>
|
|
||||||
<tabstop>minMemSpinBox</tabstop>
|
|
||||||
<tabstop>maxMemSpinBox</tabstop>
|
|
||||||
<tabstop>permGenSpinBox</tabstop>
|
|
||||||
<tabstop>javaPathTextBox</tabstop>
|
|
||||||
<tabstop>javaBrowseBtn</tabstop>
|
|
||||||
<tabstop>javaDetectBtn</tabstop>
|
|
||||||
<tabstop>javaTestBtn</tabstop>
|
|
||||||
<tabstop>skipCompatibilityCheckbox</tabstop>
|
|
||||||
<tabstop>skipJavaWizardCheckbox</tabstop>
|
|
||||||
<tabstop>jvmArgsTextBox</tabstop>
|
|
||||||
<tabstop>tabWidget</tabstop>
|
|
||||||
</tabstops>
|
|
||||||
<resources/>
|
<resources/>
|
||||||
<connections/>
|
<connections/>
|
||||||
</ui>
|
</ui>
|
||||||
|
@ -217,9 +217,6 @@ void LauncherPage::applySettings()
|
|||||||
s->set("RequestTimeout", ui->timeoutSecondsSpinBox->value());
|
s->set("RequestTimeout", ui->timeoutSecondsSpinBox->value());
|
||||||
|
|
||||||
// Console settings
|
// Console settings
|
||||||
s->set("ShowConsole", ui->showConsoleCheck->isChecked());
|
|
||||||
s->set("AutoCloseConsole", ui->autoCloseConsoleCheck->isChecked());
|
|
||||||
s->set("ShowConsoleOnError", ui->showConsoleErrorCheck->isChecked());
|
|
||||||
QString consoleFontFamily = ui->consoleFont->currentFont().family();
|
QString consoleFontFamily = ui->consoleFont->currentFont().family();
|
||||||
s->set("ConsoleFont", consoleFontFamily);
|
s->set("ConsoleFont", consoleFontFamily);
|
||||||
s->set("ConsoleFontSize", ui->fontSizeBox->value());
|
s->set("ConsoleFontSize", ui->fontSizeBox->value());
|
||||||
@ -278,9 +275,6 @@ void LauncherPage::loadSettings()
|
|||||||
ui->timeoutSecondsSpinBox->setValue(s->get("RequestTimeout").toInt());
|
ui->timeoutSecondsSpinBox->setValue(s->get("RequestTimeout").toInt());
|
||||||
|
|
||||||
// Console settings
|
// Console settings
|
||||||
ui->showConsoleCheck->setChecked(s->get("ShowConsole").toBool());
|
|
||||||
ui->autoCloseConsoleCheck->setChecked(s->get("AutoCloseConsole").toBool());
|
|
||||||
ui->showConsoleErrorCheck->setChecked(s->get("ShowConsoleOnError").toBool());
|
|
||||||
QString fontFamily = APPLICATION->settings()->get("ConsoleFont").toString();
|
QString fontFamily = APPLICATION->settings()->get("ConsoleFont").toString();
|
||||||
QFont consoleFont(fontFamily);
|
QFont consoleFont(fontFamily);
|
||||||
ui->consoleFont->setCurrentFont(consoleFont);
|
ui->consoleFont->setCurrentFont(consoleFont);
|
||||||
|
@ -537,36 +537,6 @@
|
|||||||
<string>Console</string>
|
<string>Console</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||||
<item>
|
|
||||||
<widget class="QGroupBox" name="consoleSettingsBox">
|
|
||||||
<property name="title">
|
|
||||||
<string>Console Settings</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_3">
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="showConsoleCheck">
|
|
||||||
<property name="text">
|
|
||||||
<string>Show console while the game is &running</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="autoCloseConsoleCheck">
|
|
||||||
<property name="text">
|
|
||||||
<string>&Automatically close console when the game quits</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="showConsoleErrorCheck">
|
|
||||||
<property name="text">
|
|
||||||
<string>Show console when the game &crashes</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
<item>
|
||||||
<widget class="QGroupBox" name="groupBox_4">
|
<widget class="QGroupBox" name="groupBox_4">
|
||||||
<property name="title">
|
<property name="title">
|
||||||
@ -708,9 +678,6 @@
|
|||||||
<tabstop>sortByNameBtn</tabstop>
|
<tabstop>sortByNameBtn</tabstop>
|
||||||
<tabstop>catOpacitySpinBox</tabstop>
|
<tabstop>catOpacitySpinBox</tabstop>
|
||||||
<tabstop>preferMenuBarCheckBox</tabstop>
|
<tabstop>preferMenuBarCheckBox</tabstop>
|
||||||
<tabstop>showConsoleCheck</tabstop>
|
|
||||||
<tabstop>autoCloseConsoleCheck</tabstop>
|
|
||||||
<tabstop>showConsoleErrorCheck</tabstop>
|
|
||||||
<tabstop>lineLimitSpinBox</tabstop>
|
<tabstop>lineLimitSpinBox</tabstop>
|
||||||
<tabstop>checkStopLogging</tabstop>
|
<tabstop>checkStopLogging</tabstop>
|
||||||
<tabstop>consoleFont</tabstop>
|
<tabstop>consoleFont</tabstop>
|
||||||
@ -722,4 +689,4 @@
|
|||||||
<buttongroups>
|
<buttongroups>
|
||||||
<buttongroup name="sortingModeGroup"/>
|
<buttongroup name="sortingModeGroup"/>
|
||||||
</buttongroups>
|
</buttongroups>
|
||||||
</ui>
|
</ui>
|
@ -1,185 +0,0 @@
|
|||||||
// SPDX-License-Identifier: GPL-3.0-only
|
|
||||||
/*
|
|
||||||
* Prism Launcher - Minecraft Launcher
|
|
||||||
* Copyright (c) 2022 Jamie Mansfield <jmansfield@cadixdev.org>
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, version 3.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* This file incorporates work covered by the following copyright and
|
|
||||||
* permission notice:
|
|
||||||
*
|
|
||||||
* Copyright 2013-2021 MultiMC Contributors
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "MinecraftPage.h"
|
|
||||||
#include "BuildConfig.h"
|
|
||||||
#include "ui_MinecraftPage.h"
|
|
||||||
|
|
||||||
#include <QDir>
|
|
||||||
#include <QMessageBox>
|
|
||||||
#include <QTabBar>
|
|
||||||
|
|
||||||
#include "Application.h"
|
|
||||||
#include "settings/SettingsObject.h"
|
|
||||||
|
|
||||||
#ifdef Q_OS_LINUX
|
|
||||||
#include "MangoHud.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
MinecraftPage::MinecraftPage(QWidget* parent) : QWidget(parent), ui(new Ui::MinecraftPage)
|
|
||||||
{
|
|
||||||
ui->setupUi(this);
|
|
||||||
connect(ui->useNativeGLFWCheck, &QAbstractButton::toggled, this, &MinecraftPage::onUseNativeGLFWChanged);
|
|
||||||
connect(ui->useNativeOpenALCheck, &QAbstractButton::toggled, this, &MinecraftPage::onUseNativeOpenALChanged);
|
|
||||||
loadSettings();
|
|
||||||
updateCheckboxStuff();
|
|
||||||
}
|
|
||||||
|
|
||||||
MinecraftPage::~MinecraftPage()
|
|
||||||
{
|
|
||||||
delete ui;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MinecraftPage::apply()
|
|
||||||
{
|
|
||||||
applySettings();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MinecraftPage::updateCheckboxStuff()
|
|
||||||
{
|
|
||||||
ui->windowWidthSpinBox->setEnabled(!ui->maximizedCheckBox->isChecked());
|
|
||||||
ui->windowHeightSpinBox->setEnabled(!ui->maximizedCheckBox->isChecked());
|
|
||||||
}
|
|
||||||
|
|
||||||
void MinecraftPage::on_maximizedCheckBox_clicked(bool checked)
|
|
||||||
{
|
|
||||||
Q_UNUSED(checked);
|
|
||||||
updateCheckboxStuff();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MinecraftPage::onUseNativeGLFWChanged(bool checked)
|
|
||||||
{
|
|
||||||
ui->lineEditGLFWPath->setEnabled(checked);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MinecraftPage::onUseNativeOpenALChanged(bool checked)
|
|
||||||
{
|
|
||||||
ui->lineEditOpenALPath->setEnabled(checked);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MinecraftPage::applySettings()
|
|
||||||
{
|
|
||||||
auto s = APPLICATION->settings();
|
|
||||||
|
|
||||||
// Window Size
|
|
||||||
s->set("LaunchMaximized", ui->maximizedCheckBox->isChecked());
|
|
||||||
s->set("MinecraftWinWidth", ui->windowWidthSpinBox->value());
|
|
||||||
s->set("MinecraftWinHeight", ui->windowHeightSpinBox->value());
|
|
||||||
|
|
||||||
// Native library workarounds
|
|
||||||
s->set("UseNativeGLFW", ui->useNativeGLFWCheck->isChecked());
|
|
||||||
s->set("CustomGLFWPath", ui->lineEditGLFWPath->text());
|
|
||||||
s->set("UseNativeOpenAL", ui->useNativeOpenALCheck->isChecked());
|
|
||||||
s->set("CustomOpenALPath", ui->lineEditOpenALPath->text());
|
|
||||||
|
|
||||||
// Peformance related options
|
|
||||||
s->set("EnableFeralGamemode", ui->enableFeralGamemodeCheck->isChecked());
|
|
||||||
s->set("EnableMangoHud", ui->enableMangoHud->isChecked());
|
|
||||||
s->set("UseDiscreteGpu", ui->useDiscreteGpuCheck->isChecked());
|
|
||||||
s->set("UseZink", ui->useZink->isChecked());
|
|
||||||
|
|
||||||
// Game time
|
|
||||||
s->set("ShowGameTime", ui->showGameTime->isChecked());
|
|
||||||
s->set("ShowGlobalGameTime", ui->showGlobalGameTime->isChecked());
|
|
||||||
s->set("RecordGameTime", ui->recordGameTime->isChecked());
|
|
||||||
s->set("ShowGameTimeWithoutDays", ui->showGameTimeWithoutDays->isChecked());
|
|
||||||
|
|
||||||
// Miscellaneous
|
|
||||||
s->set("CloseAfterLaunch", ui->closeAfterLaunchCheck->isChecked());
|
|
||||||
s->set("QuitAfterGameStop", ui->quitAfterGameStopCheck->isChecked());
|
|
||||||
|
|
||||||
// Legacy settings
|
|
||||||
s->set("OnlineFixes", ui->onlineFixes->isChecked());
|
|
||||||
}
|
|
||||||
|
|
||||||
void MinecraftPage::loadSettings()
|
|
||||||
{
|
|
||||||
auto s = APPLICATION->settings();
|
|
||||||
|
|
||||||
// Window Size
|
|
||||||
ui->maximizedCheckBox->setChecked(s->get("LaunchMaximized").toBool());
|
|
||||||
ui->windowWidthSpinBox->setValue(s->get("MinecraftWinWidth").toInt());
|
|
||||||
ui->windowHeightSpinBox->setValue(s->get("MinecraftWinHeight").toInt());
|
|
||||||
|
|
||||||
ui->useNativeGLFWCheck->setChecked(s->get("UseNativeGLFW").toBool());
|
|
||||||
ui->lineEditGLFWPath->setText(s->get("CustomGLFWPath").toString());
|
|
||||||
ui->lineEditGLFWPath->setPlaceholderText(tr("Path to %1 library file").arg(BuildConfig.GLFW_LIBRARY_NAME));
|
|
||||||
#ifdef Q_OS_LINUX
|
|
||||||
if (!APPLICATION->m_detectedGLFWPath.isEmpty())
|
|
||||||
ui->lineEditGLFWPath->setPlaceholderText(tr("Auto detected path: %1").arg(APPLICATION->m_detectedGLFWPath));
|
|
||||||
#endif
|
|
||||||
ui->useNativeOpenALCheck->setChecked(s->get("UseNativeOpenAL").toBool());
|
|
||||||
ui->lineEditOpenALPath->setText(s->get("CustomOpenALPath").toString());
|
|
||||||
ui->lineEditOpenALPath->setPlaceholderText(tr("Path to %1 library file").arg(BuildConfig.OPENAL_LIBRARY_NAME));
|
|
||||||
#ifdef Q_OS_LINUX
|
|
||||||
if (!APPLICATION->m_detectedOpenALPath.isEmpty())
|
|
||||||
ui->lineEditOpenALPath->setPlaceholderText(tr("Auto detected path: %1").arg(APPLICATION->m_detectedOpenALPath));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ui->enableFeralGamemodeCheck->setChecked(s->get("EnableFeralGamemode").toBool());
|
|
||||||
ui->enableMangoHud->setChecked(s->get("EnableMangoHud").toBool());
|
|
||||||
ui->useDiscreteGpuCheck->setChecked(s->get("UseDiscreteGpu").toBool());
|
|
||||||
ui->useZink->setChecked(s->get("UseZink").toBool());
|
|
||||||
|
|
||||||
#if !defined(Q_OS_LINUX)
|
|
||||||
ui->perfomanceGroupBox->setVisible(false);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!(APPLICATION->capabilities() & Application::SupportsGameMode)) {
|
|
||||||
ui->enableFeralGamemodeCheck->setDisabled(true);
|
|
||||||
ui->enableFeralGamemodeCheck->setToolTip(tr("Feral Interactive's GameMode could not be found on your system."));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(APPLICATION->capabilities() & Application::SupportsMangoHud)) {
|
|
||||||
ui->enableMangoHud->setDisabled(true);
|
|
||||||
ui->enableMangoHud->setToolTip(tr("MangoHud could not be found on your system."));
|
|
||||||
}
|
|
||||||
|
|
||||||
ui->showGameTime->setChecked(s->get("ShowGameTime").toBool());
|
|
||||||
ui->showGlobalGameTime->setChecked(s->get("ShowGlobalGameTime").toBool());
|
|
||||||
ui->recordGameTime->setChecked(s->get("RecordGameTime").toBool());
|
|
||||||
ui->showGameTimeWithoutDays->setChecked(s->get("ShowGameTimeWithoutDays").toBool());
|
|
||||||
|
|
||||||
ui->closeAfterLaunchCheck->setChecked(s->get("CloseAfterLaunch").toBool());
|
|
||||||
ui->quitAfterGameStopCheck->setChecked(s->get("QuitAfterGameStop").toBool());
|
|
||||||
|
|
||||||
ui->onlineFixes->setChecked(s->get("OnlineFixes").toBool());
|
|
||||||
}
|
|
||||||
|
|
||||||
void MinecraftPage::retranslate()
|
|
||||||
{
|
|
||||||
ui->retranslateUi(this);
|
|
||||||
}
|
|
@ -38,41 +38,27 @@
|
|||||||
#include <QDialog>
|
#include <QDialog>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
#include <Application.h>
|
#include "Application.h"
|
||||||
#include "java/JavaChecker.h"
|
#include "java/JavaChecker.h"
|
||||||
#include "ui/pages/BasePage.h"
|
#include "ui/pages/BasePage.h"
|
||||||
|
#include "ui/widgets/MinecraftSettingsWidget.h"
|
||||||
|
|
||||||
class SettingsObject;
|
class SettingsObject;
|
||||||
|
|
||||||
namespace Ui {
|
class MinecraftPage : public MinecraftSettingsWidget, public BasePage {
|
||||||
class MinecraftPage;
|
|
||||||
}
|
|
||||||
|
|
||||||
class MinecraftPage : public QWidget, public BasePage {
|
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit MinecraftPage(QWidget* parent = 0);
|
explicit MinecraftPage(QWidget* parent = nullptr) : MinecraftSettingsWidget(nullptr, parent) {}
|
||||||
~MinecraftPage();
|
~MinecraftPage() override {}
|
||||||
|
|
||||||
QString displayName() const override { return tr("Minecraft"); }
|
QString displayName() const override { return tr("Minecraft"); }
|
||||||
QIcon icon() const override { return APPLICATION->getThemedIcon("minecraft"); }
|
QIcon icon() const override { return APPLICATION->getThemedIcon("minecraft"); }
|
||||||
QString id() const override { return "minecraft-settings"; }
|
QString id() const override { return "minecraft-settings"; }
|
||||||
QString helpPage() const override { return "Minecraft-settings"; }
|
QString helpPage() const override { return "Minecraft-settings"; }
|
||||||
bool apply() override;
|
bool apply() override
|
||||||
void retranslate() override;
|
{
|
||||||
|
saveSettings();
|
||||||
private:
|
return true;
|
||||||
void updateCheckboxStuff();
|
}
|
||||||
void applySettings();
|
|
||||||
void loadSettings();
|
|
||||||
|
|
||||||
private slots:
|
|
||||||
void on_maximizedCheckBox_clicked(bool checked);
|
|
||||||
|
|
||||||
void onUseNativeGLFWChanged(bool checked);
|
|
||||||
void onUseNativeOpenALChanged(bool checked);
|
|
||||||
|
|
||||||
private:
|
|
||||||
Ui::MinecraftPage* ui;
|
|
||||||
};
|
};
|
||||||
|
@ -1,361 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<ui version="4.0">
|
|
||||||
<class>MinecraftPage</class>
|
|
||||||
<widget class="QWidget" name="MinecraftPage">
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>936</width>
|
|
||||||
<height>541</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="mainLayout">
|
|
||||||
<property name="leftMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="topMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="rightMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="bottomMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<item>
|
|
||||||
<widget class="QTabWidget" name="tabWidget">
|
|
||||||
<property name="tabShape">
|
|
||||||
<enum>QTabWidget::Rounded</enum>
|
|
||||||
</property>
|
|
||||||
<property name="currentIndex">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<widget class="QWidget" name="minecraftTab">
|
|
||||||
<attribute name="title">
|
|
||||||
<string>General</string>
|
|
||||||
</attribute>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_3">
|
|
||||||
<item>
|
|
||||||
<widget class="QGroupBox" name="windowSizeGroupBox">
|
|
||||||
<property name="title">
|
|
||||||
<string>Window Size</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_4">
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="maximizedCheckBox">
|
|
||||||
<property name="text">
|
|
||||||
<string>Start Minecraft &maximized</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="maximizedWarning">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>On newer versions the game only supports resolution. In order to simulate the maximized behaviour the current implementation approximates the maximum display size.</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string><html><head/><body><p><span style=" font-weight:600; color:#f5c211;">Warning</span><span style=" color:#f5c211;">: On the newer Minecraft versions the start maximized option is not fully supported.</span></p></body></html></string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QGridLayout" name="gridLayoutWindowSize">
|
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QLabel" name="labelWindowHeight">
|
|
||||||
<property name="text">
|
|
||||||
<string>Window &height:</string>
|
|
||||||
</property>
|
|
||||||
<property name="buddy">
|
|
||||||
<cstring>windowHeightSpinBox</cstring>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="QLabel" name="labelWindowWidth">
|
|
||||||
<property name="text">
|
|
||||||
<string>Window &width:</string>
|
|
||||||
</property>
|
|
||||||
<property name="buddy">
|
|
||||||
<cstring>windowWidthSpinBox</cstring>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="1">
|
|
||||||
<widget class="QSpinBox" name="windowWidthSpinBox">
|
|
||||||
<property name="minimum">
|
|
||||||
<number>1</number>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<number>65536</number>
|
|
||||||
</property>
|
|
||||||
<property name="singleStep">
|
|
||||||
<number>1</number>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
|
||||||
<number>854</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="1">
|
|
||||||
<widget class="QSpinBox" name="windowHeightSpinBox">
|
|
||||||
<property name="minimum">
|
|
||||||
<number>1</number>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<number>65536</number>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
|
||||||
<number>480</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QGroupBox" name="gameTimeGroupBox">
|
|
||||||
<property name="title">
|
|
||||||
<string>Game time</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_6">
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="showGameTime">
|
|
||||||
<property name="text">
|
|
||||||
<string>Show time spent &playing instances</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="showGlobalGameTime">
|
|
||||||
<property name="text">
|
|
||||||
<string>Show time spent playing across &all instances</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="recordGameTime">
|
|
||||||
<property name="text">
|
|
||||||
<string>&Record time spent playing instances</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="showGameTimeWithoutDays">
|
|
||||||
<property name="text">
|
|
||||||
<string>Show time spent playing in hours</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QGroupBox" name="groupBox">
|
|
||||||
<property name="title">
|
|
||||||
<string>Miscellaneous</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="closeAfterLaunchCheck">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>The launcher will automatically reopen when the game crashes or exits.</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>&Close the launcher after game window opens</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="quitAfterGameStopCheck">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>The launcher will automatically quit after the game exits or crashes.</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>&Quit the launcher after game window closes</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="verticalSpacerMinecraft">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Vertical</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>0</width>
|
|
||||||
<height>0</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<widget class="QWidget" name="tab">
|
|
||||||
<attribute name="title">
|
|
||||||
<string>Tweaks</string>
|
|
||||||
</attribute>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_12">
|
|
||||||
<item>
|
|
||||||
<widget class="QGroupBox" name="legacySettingsGroupBox">
|
|
||||||
<property name="title">
|
|
||||||
<string>Legacy settings</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_5">
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="onlineFixes">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Emulates usages of old online services which are no longer operating.</p><p>Current fixes include: skin and online mode support.</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Enable online fixes (experimental)</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QGroupBox" name="nativeLibWorkaroundGroupBox">
|
|
||||||
<property name="title">
|
|
||||||
<string>Native library workarounds</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QGridLayout" name="gridLayout">
|
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="QCheckBox" name="useNativeGLFWCheck">
|
|
||||||
<property name="text">
|
|
||||||
<string>Use system installation of &GLFW</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QLabel" name="labelGLFWPath">
|
|
||||||
<property name="text">
|
|
||||||
<string>&GLFW library path</string>
|
|
||||||
</property>
|
|
||||||
<property name="buddy">
|
|
||||||
<cstring>lineEditGLFWPath</cstring>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="0">
|
|
||||||
<widget class="QCheckBox" name="useNativeOpenALCheck">
|
|
||||||
<property name="text">
|
|
||||||
<string>Use system installation of &OpenAL</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="0">
|
|
||||||
<widget class="QLabel" name="labelOpenALPath">
|
|
||||||
<property name="text">
|
|
||||||
<string>&OpenAL library path</string>
|
|
||||||
</property>
|
|
||||||
<property name="buddy">
|
|
||||||
<cstring>lineEditOpenALPath</cstring>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="1">
|
|
||||||
<widget class="QLineEdit" name="lineEditGLFWPath">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="1">
|
|
||||||
<widget class="QLineEdit" name="lineEditOpenALPath">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QGroupBox" name="perfomanceGroupBox">
|
|
||||||
<property name="title">
|
|
||||||
<string>Performance</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="enableFeralGamemodeCheck">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Enable Feral Interactive's GameMode, to potentially improve gaming performance.</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Enable Feral GameMode</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="enableMangoHud">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Enable MangoHud's advanced performance overlay.</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Enable MangoHud</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="useDiscreteGpuCheck">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Use the discrete GPU instead of the primary GPU.</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Use discrete GPU</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="useZink">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Use Zink, a Mesa OpenGL driver that implements OpenGL on top of Vulkan. Performance may vary depending on the situation. Note: If no suitable Vulkan driver is found, software rendering will be used.</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Use Zink</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="verticalSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Vertical</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>20</width>
|
|
||||||
<height>40</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<tabstops>
|
|
||||||
<tabstop>maximizedCheckBox</tabstop>
|
|
||||||
<tabstop>windowWidthSpinBox</tabstop>
|
|
||||||
<tabstop>windowHeightSpinBox</tabstop>
|
|
||||||
</tabstops>
|
|
||||||
<resources/>
|
|
||||||
<connections/>
|
|
||||||
</ui>
|
|
@ -1,611 +0,0 @@
|
|||||||
// SPDX-License-Identifier: GPL-3.0-only
|
|
||||||
/*
|
|
||||||
* Prism Launcher - Minecraft Launcher
|
|
||||||
* Copyright (c) 2022 Jamie Mansfield <jmansfield@cadixdev.org>
|
|
||||||
* Copyright (C) 2022 Sefa Eyeoglu <contact@scrumplex.net>
|
|
||||||
* Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me>
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, version 3.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* This file incorporates work covered by the following copyright and
|
|
||||||
* permission notice:
|
|
||||||
*
|
|
||||||
* Copyright 2013-2021 MultiMC Contributors
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "InstanceSettingsPage.h"
|
|
||||||
#include "minecraft/MinecraftInstance.h"
|
|
||||||
#include "minecraft/WorldList.h"
|
|
||||||
#include "settings/Setting.h"
|
|
||||||
#include "ui/dialogs/CustomMessageBox.h"
|
|
||||||
#include "ui/java/InstallJavaDialog.h"
|
|
||||||
#include "ui_InstanceSettingsPage.h"
|
|
||||||
|
|
||||||
#include <QDialog>
|
|
||||||
#include <QFileDialog>
|
|
||||||
#include <QMessageBox>
|
|
||||||
|
|
||||||
#include <sys.h>
|
|
||||||
|
|
||||||
#include "ui/dialogs/VersionSelectDialog.h"
|
|
||||||
#include "ui/widgets/CustomCommands.h"
|
|
||||||
|
|
||||||
#include "Application.h"
|
|
||||||
#include "BuildConfig.h"
|
|
||||||
#include "JavaCommon.h"
|
|
||||||
#include "minecraft/auth/AccountList.h"
|
|
||||||
|
|
||||||
#include "FileSystem.h"
|
|
||||||
#include "java/JavaInstallList.h"
|
|
||||||
#include "java/JavaUtils.h"
|
|
||||||
|
|
||||||
InstanceSettingsPage::InstanceSettingsPage(BaseInstance* inst, QWidget* parent)
|
|
||||||
: QWidget(parent), ui(new Ui::InstanceSettingsPage), m_instance(inst)
|
|
||||||
{
|
|
||||||
m_settings = inst->settings();
|
|
||||||
ui->setupUi(this);
|
|
||||||
|
|
||||||
ui->javaDownloadBtn->setHidden(!BuildConfig.JAVA_DOWNLOADER_ENABLED);
|
|
||||||
|
|
||||||
connect(ui->openGlobalJavaSettingsButton, &QCommandLinkButton::clicked, this, &InstanceSettingsPage::globalSettingsButtonClicked);
|
|
||||||
connect(APPLICATION, &Application::globalSettingsAboutToOpen, this, &InstanceSettingsPage::applySettings);
|
|
||||||
connect(APPLICATION, &Application::globalSettingsClosed, this, &InstanceSettingsPage::loadSettings);
|
|
||||||
connect(ui->instanceAccountSelector, QOverload<int>::of(&QComboBox::currentIndexChanged), this,
|
|
||||||
&InstanceSettingsPage::changeInstanceAccount);
|
|
||||||
|
|
||||||
connect(ui->useNativeGLFWCheck, &QAbstractButton::toggled, this, &InstanceSettingsPage::onUseNativeGLFWChanged);
|
|
||||||
connect(ui->useNativeOpenALCheck, &QAbstractButton::toggled, this, &InstanceSettingsPage::onUseNativeOpenALChanged);
|
|
||||||
|
|
||||||
auto mInst = dynamic_cast<MinecraftInstance*>(inst);
|
|
||||||
m_world_quickplay_supported = mInst && mInst->traits().contains("feature:is_quick_play_singleplayer");
|
|
||||||
if (m_world_quickplay_supported) {
|
|
||||||
auto worlds = mInst->worldList();
|
|
||||||
worlds->update();
|
|
||||||
for (const auto& world : worlds->allWorlds()) {
|
|
||||||
ui->worldsCb->addItem(world.folderName());
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ui->worldsCb->hide();
|
|
||||||
ui->worldJoinButton->hide();
|
|
||||||
ui->serverJoinAddressButton->setChecked(true);
|
|
||||||
ui->serverJoinAddress->setEnabled(true);
|
|
||||||
ui->serverJoinAddressButton->setStyleSheet("QRadioButton::indicator { width: 0px; height: 0px; }");
|
|
||||||
}
|
|
||||||
|
|
||||||
loadSettings();
|
|
||||||
|
|
||||||
updateThresholds();
|
|
||||||
}
|
|
||||||
|
|
||||||
InstanceSettingsPage::~InstanceSettingsPage()
|
|
||||||
{
|
|
||||||
delete ui;
|
|
||||||
}
|
|
||||||
|
|
||||||
void InstanceSettingsPage::globalSettingsButtonClicked(bool)
|
|
||||||
{
|
|
||||||
switch (ui->settingsTabs->currentIndex()) {
|
|
||||||
case 0:
|
|
||||||
APPLICATION->ShowGlobalSettings(this, "java-settings");
|
|
||||||
return;
|
|
||||||
case 2:
|
|
||||||
APPLICATION->ShowGlobalSettings(this, "custom-commands");
|
|
||||||
return;
|
|
||||||
case 3:
|
|
||||||
APPLICATION->ShowGlobalSettings(this, "environment-variables");
|
|
||||||
return;
|
|
||||||
default:
|
|
||||||
APPLICATION->ShowGlobalSettings(this, "minecraft-settings");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool InstanceSettingsPage::apply()
|
|
||||||
{
|
|
||||||
applySettings();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void InstanceSettingsPage::applySettings()
|
|
||||||
{
|
|
||||||
SettingsObject::Lock lock(m_settings);
|
|
||||||
|
|
||||||
// Miscellaneous
|
|
||||||
bool miscellaneous = ui->miscellaneousSettingsBox->isChecked();
|
|
||||||
m_settings->set("OverrideMiscellaneous", miscellaneous);
|
|
||||||
if (miscellaneous) {
|
|
||||||
m_settings->set("CloseAfterLaunch", ui->closeAfterLaunchCheck->isChecked());
|
|
||||||
m_settings->set("QuitAfterGameStop", ui->quitAfterGameStopCheck->isChecked());
|
|
||||||
} else {
|
|
||||||
m_settings->reset("CloseAfterLaunch");
|
|
||||||
m_settings->reset("QuitAfterGameStop");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Console
|
|
||||||
bool console = ui->consoleSettingsBox->isChecked();
|
|
||||||
m_settings->set("OverrideConsole", console);
|
|
||||||
if (console) {
|
|
||||||
m_settings->set("ShowConsole", ui->showConsoleCheck->isChecked());
|
|
||||||
m_settings->set("AutoCloseConsole", ui->autoCloseConsoleCheck->isChecked());
|
|
||||||
m_settings->set("ShowConsoleOnError", ui->showConsoleErrorCheck->isChecked());
|
|
||||||
} else {
|
|
||||||
m_settings->reset("ShowConsole");
|
|
||||||
m_settings->reset("AutoCloseConsole");
|
|
||||||
m_settings->reset("ShowConsoleOnError");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Window Size
|
|
||||||
bool window = ui->windowSizeGroupBox->isChecked();
|
|
||||||
m_settings->set("OverrideWindow", window);
|
|
||||||
if (window) {
|
|
||||||
m_settings->set("LaunchMaximized", ui->maximizedCheckBox->isChecked());
|
|
||||||
m_settings->set("MinecraftWinWidth", ui->windowWidthSpinBox->value());
|
|
||||||
m_settings->set("MinecraftWinHeight", ui->windowHeightSpinBox->value());
|
|
||||||
} else {
|
|
||||||
m_settings->reset("LaunchMaximized");
|
|
||||||
m_settings->reset("MinecraftWinWidth");
|
|
||||||
m_settings->reset("MinecraftWinHeight");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Memory
|
|
||||||
bool memory = ui->memoryGroupBox->isChecked();
|
|
||||||
m_settings->set("OverrideMemory", memory);
|
|
||||||
if (memory) {
|
|
||||||
int min = ui->minMemSpinBox->value();
|
|
||||||
int max = ui->maxMemSpinBox->value();
|
|
||||||
if (min < max) {
|
|
||||||
m_settings->set("MinMemAlloc", min);
|
|
||||||
m_settings->set("MaxMemAlloc", max);
|
|
||||||
} else {
|
|
||||||
m_settings->set("MinMemAlloc", max);
|
|
||||||
m_settings->set("MaxMemAlloc", min);
|
|
||||||
}
|
|
||||||
m_settings->set("PermGen", ui->permGenSpinBox->value());
|
|
||||||
} else {
|
|
||||||
m_settings->reset("MinMemAlloc");
|
|
||||||
m_settings->reset("MaxMemAlloc");
|
|
||||||
m_settings->reset("PermGen");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Java Install Settings
|
|
||||||
bool javaInstall = ui->javaSettingsGroupBox->isChecked();
|
|
||||||
m_settings->set("OverrideJavaLocation", javaInstall);
|
|
||||||
if (javaInstall) {
|
|
||||||
m_settings->set("JavaPath", ui->javaPathTextBox->text());
|
|
||||||
m_settings->set("IgnoreJavaCompatibility", ui->skipCompatibilityCheckbox->isChecked());
|
|
||||||
} else {
|
|
||||||
m_settings->reset("JavaPath");
|
|
||||||
m_settings->reset("IgnoreJavaCompatibility");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Java arguments
|
|
||||||
bool javaArgs = ui->javaArgumentsGroupBox->isChecked();
|
|
||||||
m_settings->set("OverrideJavaArgs", javaArgs);
|
|
||||||
if (javaArgs) {
|
|
||||||
m_settings->set("JvmArgs", ui->jvmArgsTextBox->toPlainText().replace("\n", " "));
|
|
||||||
} else {
|
|
||||||
m_settings->reset("JvmArgs");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Custom Commands
|
|
||||||
bool custcmd = ui->customCommands->checked();
|
|
||||||
m_settings->set("OverrideCommands", custcmd);
|
|
||||||
if (custcmd) {
|
|
||||||
m_settings->set("PreLaunchCommand", ui->customCommands->prelaunchCommand());
|
|
||||||
m_settings->set("WrapperCommand", ui->customCommands->wrapperCommand());
|
|
||||||
m_settings->set("PostExitCommand", ui->customCommands->postexitCommand());
|
|
||||||
} else {
|
|
||||||
m_settings->reset("PreLaunchCommand");
|
|
||||||
m_settings->reset("WrapperCommand");
|
|
||||||
m_settings->reset("PostExitCommand");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Environment Variables
|
|
||||||
auto env = ui->environmentVariables->override();
|
|
||||||
m_settings->set("OverrideEnv", env);
|
|
||||||
if (env)
|
|
||||||
m_settings->set("Env", ui->environmentVariables->value());
|
|
||||||
else
|
|
||||||
m_settings->reset("Env");
|
|
||||||
|
|
||||||
// Workarounds
|
|
||||||
bool workarounds = ui->nativeWorkaroundsGroupBox->isChecked();
|
|
||||||
m_settings->set("OverrideNativeWorkarounds", workarounds);
|
|
||||||
if (workarounds) {
|
|
||||||
m_settings->set("UseNativeGLFW", ui->useNativeGLFWCheck->isChecked());
|
|
||||||
m_settings->set("CustomGLFWPath", ui->lineEditGLFWPath->text());
|
|
||||||
m_settings->set("UseNativeOpenAL", ui->useNativeOpenALCheck->isChecked());
|
|
||||||
m_settings->set("CustomOpenALPath", ui->lineEditOpenALPath->text());
|
|
||||||
} else {
|
|
||||||
m_settings->reset("UseNativeGLFW");
|
|
||||||
m_settings->reset("CustomGLFWPath");
|
|
||||||
m_settings->reset("UseNativeOpenAL");
|
|
||||||
m_settings->reset("CustomOpenALPath");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Performance
|
|
||||||
bool performance = ui->perfomanceGroupBox->isChecked();
|
|
||||||
m_settings->set("OverridePerformance", performance);
|
|
||||||
if (performance) {
|
|
||||||
m_settings->set("EnableFeralGamemode", ui->enableFeralGamemodeCheck->isChecked());
|
|
||||||
m_settings->set("EnableMangoHud", ui->enableMangoHud->isChecked());
|
|
||||||
m_settings->set("UseDiscreteGpu", ui->useDiscreteGpuCheck->isChecked());
|
|
||||||
m_settings->set("UseZink", ui->useZink->isChecked());
|
|
||||||
|
|
||||||
} else {
|
|
||||||
m_settings->reset("EnableFeralGamemode");
|
|
||||||
m_settings->reset("EnableMangoHud");
|
|
||||||
m_settings->reset("UseDiscreteGpu");
|
|
||||||
m_settings->reset("UseZink");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Game time
|
|
||||||
bool gameTime = ui->gameTimeGroupBox->isChecked();
|
|
||||||
m_settings->set("OverrideGameTime", gameTime);
|
|
||||||
if (gameTime) {
|
|
||||||
m_settings->set("ShowGameTime", ui->showGameTime->isChecked());
|
|
||||||
m_settings->set("RecordGameTime", ui->recordGameTime->isChecked());
|
|
||||||
} else {
|
|
||||||
m_settings->reset("ShowGameTime");
|
|
||||||
m_settings->reset("RecordGameTime");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Join server on launch
|
|
||||||
bool joinServerOnLaunch = ui->serverJoinGroupBox->isChecked();
|
|
||||||
m_settings->set("JoinServerOnLaunch", joinServerOnLaunch);
|
|
||||||
if (joinServerOnLaunch) {
|
|
||||||
if (ui->serverJoinAddressButton->isChecked() || !m_world_quickplay_supported) {
|
|
||||||
m_settings->set("JoinServerOnLaunchAddress", ui->serverJoinAddress->text());
|
|
||||||
m_settings->reset("JoinWorldOnLaunch");
|
|
||||||
} else {
|
|
||||||
m_settings->set("JoinWorldOnLaunch", ui->worldsCb->currentText());
|
|
||||||
m_settings->reset("JoinServerOnLaunchAddress");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
m_settings->reset("JoinServerOnLaunchAddress");
|
|
||||||
m_settings->reset("JoinWorldOnLaunch");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Use an account for this instance
|
|
||||||
bool useAccountForInstance = ui->instanceAccountGroupBox->isChecked();
|
|
||||||
m_settings->set("UseAccountForInstance", useAccountForInstance);
|
|
||||||
if (!useAccountForInstance) {
|
|
||||||
m_settings->reset("InstanceAccountId");
|
|
||||||
}
|
|
||||||
|
|
||||||
bool overrideLegacySettings = ui->legacySettingsGroupBox->isChecked();
|
|
||||||
m_settings->set("OverrideLegacySettings", overrideLegacySettings);
|
|
||||||
if (overrideLegacySettings) {
|
|
||||||
m_settings->set("OnlineFixes", ui->onlineFixes->isChecked());
|
|
||||||
} else {
|
|
||||||
m_settings->reset("OnlineFixes");
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIXME: This should probably be called by a signal instead
|
|
||||||
m_instance->updateRuntimeContext();
|
|
||||||
}
|
|
||||||
|
|
||||||
void InstanceSettingsPage::loadSettings()
|
|
||||||
{
|
|
||||||
// Miscellaneous
|
|
||||||
ui->miscellaneousSettingsBox->setChecked(m_settings->get("OverrideMiscellaneous").toBool());
|
|
||||||
ui->closeAfterLaunchCheck->setChecked(m_settings->get("CloseAfterLaunch").toBool());
|
|
||||||
ui->quitAfterGameStopCheck->setChecked(m_settings->get("QuitAfterGameStop").toBool());
|
|
||||||
|
|
||||||
// Console
|
|
||||||
ui->consoleSettingsBox->setChecked(m_settings->get("OverrideConsole").toBool());
|
|
||||||
ui->showConsoleCheck->setChecked(m_settings->get("ShowConsole").toBool());
|
|
||||||
ui->autoCloseConsoleCheck->setChecked(m_settings->get("AutoCloseConsole").toBool());
|
|
||||||
ui->showConsoleErrorCheck->setChecked(m_settings->get("ShowConsoleOnError").toBool());
|
|
||||||
|
|
||||||
// Window Size
|
|
||||||
ui->windowSizeGroupBox->setChecked(m_settings->get("OverrideWindow").toBool());
|
|
||||||
ui->maximizedCheckBox->setChecked(m_settings->get("LaunchMaximized").toBool());
|
|
||||||
ui->maximizedWarning->setVisible(m_settings->get("LaunchMaximized").toBool() && !m_instance->isLegacy());
|
|
||||||
ui->windowWidthSpinBox->setValue(m_settings->get("MinecraftWinWidth").toInt());
|
|
||||||
ui->windowHeightSpinBox->setValue(m_settings->get("MinecraftWinHeight").toInt());
|
|
||||||
|
|
||||||
// Memory
|
|
||||||
ui->memoryGroupBox->setChecked(m_settings->get("OverrideMemory").toBool());
|
|
||||||
int min = m_settings->get("MinMemAlloc").toInt();
|
|
||||||
int max = m_settings->get("MaxMemAlloc").toInt();
|
|
||||||
if (min < max) {
|
|
||||||
ui->minMemSpinBox->setValue(min);
|
|
||||||
ui->maxMemSpinBox->setValue(max);
|
|
||||||
} else {
|
|
||||||
ui->minMemSpinBox->setValue(max);
|
|
||||||
ui->maxMemSpinBox->setValue(min);
|
|
||||||
}
|
|
||||||
ui->permGenSpinBox->setValue(m_settings->get("PermGen").toInt());
|
|
||||||
bool permGenVisible = m_settings->get("PermGenVisible").toBool();
|
|
||||||
ui->permGenSpinBox->setVisible(permGenVisible);
|
|
||||||
ui->labelPermGen->setVisible(permGenVisible);
|
|
||||||
ui->labelPermgenNote->setVisible(permGenVisible);
|
|
||||||
|
|
||||||
// Java Settings
|
|
||||||
bool overrideLocation = m_settings->get("OverrideJavaLocation").toBool();
|
|
||||||
bool overrideArgs = m_settings->get("OverrideJavaArgs").toBool();
|
|
||||||
|
|
||||||
connect(m_settings->getSetting("OverrideJavaLocation").get(), &Setting::SettingChanged, ui->javaSettingsGroupBox,
|
|
||||||
[this] { ui->javaSettingsGroupBox->setChecked(m_settings->get("OverrideJavaLocation").toBool()); });
|
|
||||||
ui->javaSettingsGroupBox->setChecked(overrideLocation);
|
|
||||||
ui->javaPathTextBox->setText(m_settings->get("JavaPath").toString());
|
|
||||||
connect(m_settings->getSetting("JavaPath").get(), &Setting::SettingChanged, ui->javaSettingsGroupBox,
|
|
||||||
[this] { ui->javaPathTextBox->setText(m_settings->get("JavaPath").toString()); });
|
|
||||||
|
|
||||||
ui->skipCompatibilityCheckbox->setChecked(m_settings->get("IgnoreJavaCompatibility").toBool());
|
|
||||||
|
|
||||||
ui->javaArgumentsGroupBox->setChecked(overrideArgs);
|
|
||||||
ui->jvmArgsTextBox->setPlainText(m_settings->get("JvmArgs").toString());
|
|
||||||
|
|
||||||
// Custom commands
|
|
||||||
ui->customCommands->initialize(true, m_settings->get("OverrideCommands").toBool(), m_settings->get("PreLaunchCommand").toString(),
|
|
||||||
m_settings->get("WrapperCommand").toString(), m_settings->get("PostExitCommand").toString());
|
|
||||||
|
|
||||||
// Environment variables
|
|
||||||
ui->environmentVariables->initialize(true, m_settings->get("OverrideEnv").toBool(), m_settings->get("Env").toMap());
|
|
||||||
|
|
||||||
// Workarounds
|
|
||||||
ui->nativeWorkaroundsGroupBox->setChecked(m_settings->get("OverrideNativeWorkarounds").toBool());
|
|
||||||
ui->useNativeGLFWCheck->setChecked(m_settings->get("UseNativeGLFW").toBool());
|
|
||||||
ui->lineEditGLFWPath->setText(m_settings->get("CustomGLFWPath").toString());
|
|
||||||
#ifdef Q_OS_LINUX
|
|
||||||
ui->lineEditGLFWPath->setPlaceholderText(APPLICATION->m_detectedGLFWPath);
|
|
||||||
#else
|
|
||||||
ui->lineEditGLFWPath->setPlaceholderText(tr("Path to %1 library file").arg(BuildConfig.GLFW_LIBRARY_NAME));
|
|
||||||
#endif
|
|
||||||
ui->useNativeOpenALCheck->setChecked(m_settings->get("UseNativeOpenAL").toBool());
|
|
||||||
ui->lineEditOpenALPath->setText(m_settings->get("CustomOpenALPath").toString());
|
|
||||||
#ifdef Q_OS_LINUX
|
|
||||||
ui->lineEditOpenALPath->setPlaceholderText(APPLICATION->m_detectedOpenALPath);
|
|
||||||
#else
|
|
||||||
ui->lineEditOpenALPath->setPlaceholderText(tr("Path to %1 library file").arg(BuildConfig.OPENAL_LIBRARY_NAME));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Performance
|
|
||||||
ui->perfomanceGroupBox->setChecked(m_settings->get("OverridePerformance").toBool());
|
|
||||||
ui->enableFeralGamemodeCheck->setChecked(m_settings->get("EnableFeralGamemode").toBool());
|
|
||||||
ui->enableMangoHud->setChecked(m_settings->get("EnableMangoHud").toBool());
|
|
||||||
ui->useDiscreteGpuCheck->setChecked(m_settings->get("UseDiscreteGpu").toBool());
|
|
||||||
ui->useZink->setChecked(m_settings->get("UseZink").toBool());
|
|
||||||
|
|
||||||
#if !defined(Q_OS_LINUX)
|
|
||||||
ui->settingsTabs->setTabVisible(ui->settingsTabs->indexOf(ui->performancePage), false);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!(APPLICATION->capabilities() & Application::SupportsGameMode)) {
|
|
||||||
ui->enableFeralGamemodeCheck->setDisabled(true);
|
|
||||||
ui->enableFeralGamemodeCheck->setToolTip(tr("Feral Interactive's GameMode could not be found on your system."));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(APPLICATION->capabilities() & Application::SupportsMangoHud)) {
|
|
||||||
ui->enableMangoHud->setDisabled(true);
|
|
||||||
ui->enableMangoHud->setToolTip(tr("MangoHud could not be found on your system."));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Miscellanous
|
|
||||||
ui->gameTimeGroupBox->setChecked(m_settings->get("OverrideGameTime").toBool());
|
|
||||||
ui->showGameTime->setChecked(m_settings->get("ShowGameTime").toBool());
|
|
||||||
ui->recordGameTime->setChecked(m_settings->get("RecordGameTime").toBool());
|
|
||||||
|
|
||||||
ui->serverJoinGroupBox->setChecked(m_settings->get("JoinServerOnLaunch").toBool());
|
|
||||||
|
|
||||||
if (auto server = m_settings->get("JoinServerOnLaunchAddress").toString(); !server.isEmpty()) {
|
|
||||||
ui->serverJoinAddress->setText(server);
|
|
||||||
ui->serverJoinAddressButton->setChecked(true);
|
|
||||||
ui->worldJoinButton->setChecked(false);
|
|
||||||
ui->serverJoinAddress->setEnabled(true);
|
|
||||||
ui->worldsCb->setEnabled(false);
|
|
||||||
} else if (auto world = m_settings->get("JoinWorldOnLaunch").toString(); !world.isEmpty() && m_world_quickplay_supported) {
|
|
||||||
ui->worldsCb->setCurrentText(world);
|
|
||||||
ui->serverJoinAddressButton->setChecked(false);
|
|
||||||
ui->worldJoinButton->setChecked(true);
|
|
||||||
ui->serverJoinAddress->setEnabled(false);
|
|
||||||
ui->worldsCb->setEnabled(true);
|
|
||||||
} else {
|
|
||||||
ui->serverJoinAddressButton->setChecked(true);
|
|
||||||
ui->worldJoinButton->setChecked(false);
|
|
||||||
ui->serverJoinAddress->setEnabled(true);
|
|
||||||
ui->worldsCb->setEnabled(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
ui->instanceAccountGroupBox->setChecked(m_settings->get("UseAccountForInstance").toBool());
|
|
||||||
updateAccountsMenu();
|
|
||||||
|
|
||||||
ui->legacySettingsGroupBox->setChecked(m_settings->get("OverrideLegacySettings").toBool());
|
|
||||||
ui->onlineFixes->setChecked(m_settings->get("OnlineFixes").toBool());
|
|
||||||
}
|
|
||||||
|
|
||||||
void InstanceSettingsPage::on_javaDownloadBtn_clicked()
|
|
||||||
{
|
|
||||||
auto jdialog = new Java::InstallDialog({}, m_instance, this);
|
|
||||||
jdialog->exec();
|
|
||||||
}
|
|
||||||
|
|
||||||
void InstanceSettingsPage::on_javaDetectBtn_clicked()
|
|
||||||
{
|
|
||||||
if (JavaUtils::getJavaCheckPath().isEmpty()) {
|
|
||||||
JavaCommon::javaCheckNotFound(this);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
JavaInstallPtr java;
|
|
||||||
|
|
||||||
VersionSelectDialog vselect(APPLICATION->javalist().get(), tr("Select a Java version"), this, true);
|
|
||||||
vselect.setResizeOn(2);
|
|
||||||
vselect.exec();
|
|
||||||
|
|
||||||
if (vselect.result() == QDialog::Accepted && vselect.selectedVersion()) {
|
|
||||||
java = std::dynamic_pointer_cast<JavaInstall>(vselect.selectedVersion());
|
|
||||||
ui->javaPathTextBox->setText(java->path);
|
|
||||||
bool visible = java->id.requiresPermGen() && m_settings->get("OverrideMemory").toBool();
|
|
||||||
ui->permGenSpinBox->setVisible(visible);
|
|
||||||
ui->labelPermGen->setVisible(visible);
|
|
||||||
ui->labelPermgenNote->setVisible(visible);
|
|
||||||
m_settings->set("PermGenVisible", visible);
|
|
||||||
|
|
||||||
if (!java->is_64bit && m_settings->get("MaxMemAlloc").toInt() > 2048) {
|
|
||||||
CustomMessageBox::selectable(this, tr("Confirm Selection"),
|
|
||||||
tr("You selected a 32-bit version of Java.\n"
|
|
||||||
"This installation does not support more than 2048MiB of RAM.\n"
|
|
||||||
"Please make sure that the maximum memory value is lower."),
|
|
||||||
QMessageBox::Warning, QMessageBox::Ok, QMessageBox::Ok)
|
|
||||||
->exec();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void InstanceSettingsPage::on_javaBrowseBtn_clicked()
|
|
||||||
{
|
|
||||||
QString raw_path = QFileDialog::getOpenFileName(this, tr("Find Java executable"));
|
|
||||||
|
|
||||||
// do not allow current dir - it's dirty. Do not allow dirs that don't exist
|
|
||||||
if (raw_path.isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
QString cooked_path = FS::NormalizePath(raw_path);
|
|
||||||
|
|
||||||
QFileInfo javaInfo(cooked_path);
|
|
||||||
if (!javaInfo.exists() || !javaInfo.isExecutable()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ui->javaPathTextBox->setText(cooked_path);
|
|
||||||
|
|
||||||
// custom Java could be anything... enable perm gen option
|
|
||||||
ui->permGenSpinBox->setVisible(true);
|
|
||||||
ui->labelPermGen->setVisible(true);
|
|
||||||
ui->labelPermgenNote->setVisible(true);
|
|
||||||
m_settings->set("PermGenVisible", true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void InstanceSettingsPage::on_javaTestBtn_clicked()
|
|
||||||
{
|
|
||||||
if (checker) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
checker.reset(new JavaCommon::TestCheck(this, ui->javaPathTextBox->text(), ui->jvmArgsTextBox->toPlainText().replace("\n", " "),
|
|
||||||
ui->minMemSpinBox->value(), ui->maxMemSpinBox->value(), ui->permGenSpinBox->value()));
|
|
||||||
connect(checker.get(), SIGNAL(finished()), SLOT(checkerFinished()));
|
|
||||||
checker->run();
|
|
||||||
}
|
|
||||||
|
|
||||||
void InstanceSettingsPage::onUseNativeGLFWChanged(bool checked)
|
|
||||||
{
|
|
||||||
ui->lineEditGLFWPath->setEnabled(checked);
|
|
||||||
}
|
|
||||||
|
|
||||||
void InstanceSettingsPage::onUseNativeOpenALChanged(bool checked)
|
|
||||||
{
|
|
||||||
ui->lineEditOpenALPath->setEnabled(checked);
|
|
||||||
}
|
|
||||||
|
|
||||||
void InstanceSettingsPage::updateAccountsMenu()
|
|
||||||
{
|
|
||||||
ui->instanceAccountSelector->clear();
|
|
||||||
auto accounts = APPLICATION->accounts();
|
|
||||||
int accountIndex = accounts->findAccountByProfileId(m_settings->get("InstanceAccountId").toString());
|
|
||||||
|
|
||||||
for (int i = 0; i < accounts->count(); i++) {
|
|
||||||
MinecraftAccountPtr account = accounts->at(i);
|
|
||||||
ui->instanceAccountSelector->addItem(getFaceForAccount(account), account->profileName(), i);
|
|
||||||
if (i == accountIndex)
|
|
||||||
ui->instanceAccountSelector->setCurrentIndex(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QIcon InstanceSettingsPage::getFaceForAccount(MinecraftAccountPtr account)
|
|
||||||
{
|
|
||||||
if (auto face = account->getFace(); !face.isNull()) {
|
|
||||||
return face;
|
|
||||||
}
|
|
||||||
|
|
||||||
return APPLICATION->getThemedIcon("noaccount");
|
|
||||||
}
|
|
||||||
|
|
||||||
void InstanceSettingsPage::changeInstanceAccount(int index)
|
|
||||||
{
|
|
||||||
auto accounts = APPLICATION->accounts();
|
|
||||||
if (index != -1 && accounts->at(index) && ui->instanceAccountGroupBox->isChecked()) {
|
|
||||||
auto account = accounts->at(index);
|
|
||||||
m_settings->set("InstanceAccountId", account->profileId());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void InstanceSettingsPage::on_maxMemSpinBox_valueChanged([[maybe_unused]] int i)
|
|
||||||
{
|
|
||||||
updateThresholds();
|
|
||||||
}
|
|
||||||
|
|
||||||
void InstanceSettingsPage::checkerFinished()
|
|
||||||
{
|
|
||||||
checker.reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
void InstanceSettingsPage::retranslate()
|
|
||||||
{
|
|
||||||
ui->retranslateUi(this);
|
|
||||||
ui->customCommands->retranslate(); // TODO: why is this seperate from the others?
|
|
||||||
ui->environmentVariables->retranslate();
|
|
||||||
}
|
|
||||||
|
|
||||||
void InstanceSettingsPage::updateThresholds()
|
|
||||||
{
|
|
||||||
auto sysMiB = Sys::getSystemRam() / Sys::mebibyte;
|
|
||||||
unsigned int maxMem = ui->maxMemSpinBox->value();
|
|
||||||
unsigned int minMem = ui->minMemSpinBox->value();
|
|
||||||
|
|
||||||
QString iconName;
|
|
||||||
|
|
||||||
if (maxMem >= sysMiB) {
|
|
||||||
iconName = "status-bad";
|
|
||||||
ui->labelMaxMemIcon->setToolTip(tr("Your maximum memory allocation exceeds your system memory capacity."));
|
|
||||||
} else if (maxMem > (sysMiB * 0.9)) {
|
|
||||||
iconName = "status-yellow";
|
|
||||||
ui->labelMaxMemIcon->setToolTip(tr("Your maximum memory allocation approaches your system memory capacity."));
|
|
||||||
} else if (maxMem < minMem) {
|
|
||||||
iconName = "status-yellow";
|
|
||||||
ui->labelMaxMemIcon->setToolTip(tr("Your maximum memory allocation is smaller than the minimum value"));
|
|
||||||
} else {
|
|
||||||
iconName = "status-good";
|
|
||||||
ui->labelMaxMemIcon->setToolTip("");
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
auto height = ui->labelMaxMemIcon->fontInfo().pixelSize();
|
|
||||||
QIcon icon = APPLICATION->getThemedIcon(iconName);
|
|
||||||
QPixmap pix = icon.pixmap(height, height);
|
|
||||||
ui->labelMaxMemIcon->setPixmap(pix);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void InstanceSettingsPage::on_serverJoinAddressButton_toggled(bool checked)
|
|
||||||
{
|
|
||||||
ui->serverJoinAddress->setEnabled(checked);
|
|
||||||
}
|
|
||||||
|
|
||||||
void InstanceSettingsPage::on_worldJoinButton_toggled(bool checked)
|
|
||||||
{
|
|
||||||
ui->worldsCb->setEnabled(checked);
|
|
||||||
}
|
|
@ -35,63 +35,29 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <QWidget>
|
|
||||||
|
|
||||||
#include <QObjectPtr.h>
|
|
||||||
#include <QMenu>
|
|
||||||
#include "Application.h"
|
#include "Application.h"
|
||||||
#include "BaseInstance.h"
|
#include "BaseInstance.h"
|
||||||
#include "JavaCommon.h"
|
|
||||||
#include "java/JavaChecker.h"
|
|
||||||
#include "ui/pages/BasePage.h"
|
#include "ui/pages/BasePage.h"
|
||||||
|
#include "ui/widgets/MinecraftSettingsWidget.h"
|
||||||
|
#include <QWidget>
|
||||||
|
|
||||||
class JavaChecker;
|
class InstanceSettingsPage : public MinecraftSettingsWidget, public BasePage {
|
||||||
namespace Ui {
|
|
||||||
class InstanceSettingsPage;
|
|
||||||
}
|
|
||||||
|
|
||||||
class InstanceSettingsPage : public QWidget, public BasePage {
|
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit InstanceSettingsPage(BaseInstance* inst, QWidget* parent = 0);
|
explicit InstanceSettingsPage(MinecraftInstancePtr instance, QWidget* parent = nullptr) : MinecraftSettingsWidget(std::move(instance), parent)
|
||||||
virtual ~InstanceSettingsPage();
|
{
|
||||||
virtual QString displayName() const override { return tr("Settings"); }
|
connect(APPLICATION, &Application::globalSettingsAboutToOpen, this, &InstanceSettingsPage::saveSettings);
|
||||||
virtual QIcon icon() const override { return APPLICATION->getThemedIcon("instance-settings"); }
|
connect(APPLICATION, &Application::globalSettingsClosed, this, &InstanceSettingsPage::loadSettings);
|
||||||
virtual QString id() const override { return "settings"; }
|
}
|
||||||
virtual bool apply() override;
|
~InstanceSettingsPage() override {}
|
||||||
virtual QString helpPage() const override { return "Instance-settings"; }
|
QString displayName() const override { return tr("Settings"); }
|
||||||
void retranslate() override;
|
QIcon icon() const override { return APPLICATION->getThemedIcon("instance-settings"); }
|
||||||
|
QString id() const override { return "settings"; }
|
||||||
void updateThresholds();
|
bool apply() override
|
||||||
|
{
|
||||||
private slots:
|
saveSettings();
|
||||||
void on_javaDetectBtn_clicked();
|
return true;
|
||||||
void on_javaTestBtn_clicked();
|
}
|
||||||
void on_javaBrowseBtn_clicked();
|
QString helpPage() const override { return "Instance-settings"; }
|
||||||
void on_javaDownloadBtn_clicked();
|
|
||||||
void on_maxMemSpinBox_valueChanged(int i);
|
|
||||||
void on_serverJoinAddressButton_toggled(bool checked);
|
|
||||||
void on_worldJoinButton_toggled(bool checked);
|
|
||||||
|
|
||||||
void onUseNativeGLFWChanged(bool checked);
|
|
||||||
void onUseNativeOpenALChanged(bool checked);
|
|
||||||
|
|
||||||
void applySettings();
|
|
||||||
void loadSettings();
|
|
||||||
|
|
||||||
void checkerFinished();
|
|
||||||
|
|
||||||
void globalSettingsButtonClicked(bool checked);
|
|
||||||
|
|
||||||
void updateAccountsMenu();
|
|
||||||
QIcon getFaceForAccount(MinecraftAccountPtr account);
|
|
||||||
void changeInstanceAccount(int index);
|
|
||||||
|
|
||||||
private:
|
|
||||||
Ui::InstanceSettingsPage* ui;
|
|
||||||
BaseInstance* m_instance;
|
|
||||||
SettingsObjectPtr m_settings;
|
|
||||||
unique_qobject_ptr<JavaCommon::TestCheck> checker;
|
|
||||||
bool m_world_quickplay_supported;
|
|
||||||
};
|
};
|
||||||
|
@ -1,824 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<ui version="4.0">
|
|
||||||
<class>InstanceSettingsPage</class>
|
|
||||||
<widget class="QWidget" name="InstanceSettingsPage">
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>691</width>
|
|
||||||
<height>581</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
|
||||||
<property name="leftMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="topMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="rightMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="bottomMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<item>
|
|
||||||
<widget class="QCommandLinkButton" name="openGlobalJavaSettingsButton">
|
|
||||||
<property name="text">
|
|
||||||
<string>Open Global Settings</string>
|
|
||||||
</property>
|
|
||||||
<property name="description">
|
|
||||||
<string>The settings here are overrides for global settings.</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QTabWidget" name="settingsTabs">
|
|
||||||
<property name="currentIndex">
|
|
||||||
<number>1</number>
|
|
||||||
</property>
|
|
||||||
<widget class="QWidget" name="minecraftPage">
|
|
||||||
<attribute name="title">
|
|
||||||
<string notr="true">Java</string>
|
|
||||||
</attribute>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_5">
|
|
||||||
<item>
|
|
||||||
<widget class="QGroupBox" name="javaSettingsGroupBox">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="title">
|
|
||||||
<string>Java insta&llation</string>
|
|
||||||
</property>
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="checked">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<layout class="QGridLayout" name="gridLayout">
|
|
||||||
<item row="4" column="0">
|
|
||||||
<widget class="QCheckBox" name="skipCompatibilityCheckbox">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>If enabled, the launcher will not check if an instance is compatible with the selected Java version.</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Skip Java compatibility checks</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
|
||||||
<item>
|
|
||||||
<widget class="QLineEdit" name="javaPathTextBox"/>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="javaBrowseBtn">
|
|
||||||
<property name="text">
|
|
||||||
<string>Browse</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="0">
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="javaDownloadBtn">
|
|
||||||
<property name="text">
|
|
||||||
<string>Download Java</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="javaDetectBtn">
|
|
||||||
<property name="text">
|
|
||||||
<string>Auto-detect...</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="javaTestBtn">
|
|
||||||
<property name="text">
|
|
||||||
<string>Test</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QGroupBox" name="memoryGroupBox">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="title">
|
|
||||||
<string>Memor&y</string>
|
|
||||||
</property>
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="checked">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<layout class="QGridLayout" name="gridLayout_2" columnstretch="1,0,0,0">
|
|
||||||
<item row="2" column="0">
|
|
||||||
<widget class="QLabel" name="labelPermGen">
|
|
||||||
<property name="text">
|
|
||||||
<string>PermGen:</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="QLabel" name="labelMinMem">
|
|
||||||
<property name="text">
|
|
||||||
<string>Minimum memory allocation:</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QLabel" name="labelMaxMem">
|
|
||||||
<property name="text">
|
|
||||||
<string>Maximum memory allocation:</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="0" colspan="3">
|
|
||||||
<widget class="QLabel" name="labelPermgenNote">
|
|
||||||
<property name="text">
|
|
||||||
<string>Note: Permgen is set automatically by Java 8 and later</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="2">
|
|
||||||
<widget class="QSpinBox" name="minMemSpinBox">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>The amount of memory Minecraft is started with.</string>
|
|
||||||
</property>
|
|
||||||
<property name="suffix">
|
|
||||||
<string notr="true"> MiB</string>
|
|
||||||
</property>
|
|
||||||
<property name="minimum">
|
|
||||||
<number>8</number>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<number>1048576</number>
|
|
||||||
</property>
|
|
||||||
<property name="singleStep">
|
|
||||||
<number>128</number>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
|
||||||
<number>256</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="2">
|
|
||||||
<widget class="QSpinBox" name="maxMemSpinBox">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>The maximum amount of memory Minecraft is allowed to use.</string>
|
|
||||||
</property>
|
|
||||||
<property name="suffix">
|
|
||||||
<string notr="true"> MiB</string>
|
|
||||||
</property>
|
|
||||||
<property name="minimum">
|
|
||||||
<number>8</number>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<number>1048576</number>
|
|
||||||
</property>
|
|
||||||
<property name="singleStep">
|
|
||||||
<number>128</number>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
|
||||||
<number>1024</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="2">
|
|
||||||
<widget class="QSpinBox" name="permGenSpinBox">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>The amount of memory available to store loaded Java classes.</string>
|
|
||||||
</property>
|
|
||||||
<property name="suffix">
|
|
||||||
<string notr="true"> MiB</string>
|
|
||||||
</property>
|
|
||||||
<property name="minimum">
|
|
||||||
<number>4</number>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<number>999999999</number>
|
|
||||||
</property>
|
|
||||||
<property name="singleStep">
|
|
||||||
<number>8</number>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
|
||||||
<number>64</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="3">
|
|
||||||
<widget class="QLabel" name="labelMaxMemIcon">
|
|
||||||
<property name="text">
|
|
||||||
<string notr="true"/>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignCenter</set>
|
|
||||||
</property>
|
|
||||||
<property name="buddy">
|
|
||||||
<cstring>maxMemSpinBox</cstring>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QGroupBox" name="javaArgumentsGroupBox">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="title">
|
|
||||||
<string>Java argumen&ts</string>
|
|
||||||
</property>
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="checked">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<layout class="QGridLayout" name="gridLayout_5">
|
|
||||||
<item row="1" column="1">
|
|
||||||
<widget class="QPlainTextEdit" name="jvmArgsTextBox"/>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<widget class="QWidget" name="javaPage">
|
|
||||||
<attribute name="title">
|
|
||||||
<string>Game windows</string>
|
|
||||||
</attribute>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_3">
|
|
||||||
<item>
|
|
||||||
<widget class="QGroupBox" name="windowSizeGroupBox">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="title">
|
|
||||||
<string>Game Window</string>
|
|
||||||
</property>
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="checked">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_4">
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="maximizedCheckBox">
|
|
||||||
<property name="text">
|
|
||||||
<string>Start Minecraft maximized</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="maximizedWarning">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>The base game only supports resolution. In order to simulate the maximized behaviour the current implementation approximates the maximum display size..</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string><html><head/><body><p><span style=" font-weight:600; color:#f5c211;">Warning</span><span style=" color:#f5c211;">: The maximized option may not be fully supported for the current minecraft version.</span></p></body></html></string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QGridLayout" name="gridLayoutWindowSize">
|
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QLabel" name="labelWindowHeight">
|
|
||||||
<property name="text">
|
|
||||||
<string>Window height:</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="QLabel" name="labelWindowWidth">
|
|
||||||
<property name="text">
|
|
||||||
<string>Window width:</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="1">
|
|
||||||
<widget class="QSpinBox" name="windowWidthSpinBox">
|
|
||||||
<property name="minimum">
|
|
||||||
<number>1</number>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<number>65536</number>
|
|
||||||
</property>
|
|
||||||
<property name="singleStep">
|
|
||||||
<number>1</number>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
|
||||||
<number>854</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="1">
|
|
||||||
<widget class="QSpinBox" name="windowHeightSpinBox">
|
|
||||||
<property name="minimum">
|
|
||||||
<number>1</number>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<number>65536</number>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
|
||||||
<number>480</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QGroupBox" name="consoleSettingsBox">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="title">
|
|
||||||
<string>Conso&le Settings</string>
|
|
||||||
</property>
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="checked">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="showConsoleCheck">
|
|
||||||
<property name="text">
|
|
||||||
<string>Show console while the game is running</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="autoCloseConsoleCheck">
|
|
||||||
<property name="text">
|
|
||||||
<string>Automatically close console when the game quits</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="showConsoleErrorCheck">
|
|
||||||
<property name="text">
|
|
||||||
<string>Show console when the game crashes</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QGroupBox" name="miscellaneousSettingsBox">
|
|
||||||
<property name="title">
|
|
||||||
<string>Miscellaneous</string>
|
|
||||||
</property>
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="checked">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_12">
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="closeAfterLaunchCheck">
|
|
||||||
<property name="text">
|
|
||||||
<string>Close the launcher after game window opens</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="quitAfterGameStopCheck">
|
|
||||||
<property name="text">
|
|
||||||
<string>Quit the launcher after game window closes</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="verticalSpacerMinecraft_2">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Vertical</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>88</width>
|
|
||||||
<height>125</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<widget class="QWidget" name="customCommandsPage">
|
|
||||||
<attribute name="title">
|
|
||||||
<string>Custom commands</string>
|
|
||||||
</attribute>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_6">
|
|
||||||
<item>
|
|
||||||
<widget class="CustomCommands" name="customCommands" native="true"/>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<widget class="QWidget" name="environmentVariablesPage">
|
|
||||||
<attribute name="title">
|
|
||||||
<string>Environment variables</string>
|
|
||||||
</attribute>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_16">
|
|
||||||
<item>
|
|
||||||
<widget class="EnvironmentVariables" name="environmentVariables" native="true"/>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<widget class="QWidget" name="workaroundsPage">
|
|
||||||
<attribute name="title">
|
|
||||||
<string>Workarounds</string>
|
|
||||||
</attribute>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_8">
|
|
||||||
<item>
|
|
||||||
<widget class="QGroupBox" name="nativeWorkaroundsGroupBox">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="title">
|
|
||||||
<string>Native libraries</string>
|
|
||||||
</property>
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="checked">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<layout class="QGridLayout" name="gridLayout_3">
|
|
||||||
<item row="2" column="0">
|
|
||||||
<widget class="QCheckBox" name="useNativeOpenALCheck">
|
|
||||||
<property name="text">
|
|
||||||
<string>Use system installation of OpenAL</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QLabel" name="labelGLFWPath">
|
|
||||||
<property name="text">
|
|
||||||
<string>&GLFW library path</string>
|
|
||||||
</property>
|
|
||||||
<property name="buddy">
|
|
||||||
<cstring>lineEditGLFWPath</cstring>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="QCheckBox" name="useNativeGLFWCheck">
|
|
||||||
<property name="text">
|
|
||||||
<string>Use system installation of GLFW</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="1">
|
|
||||||
<widget class="QLineEdit" name="lineEditGLFWPath">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="0">
|
|
||||||
<widget class="QLabel" name="labelOpenALPath">
|
|
||||||
<property name="text">
|
|
||||||
<string>&OpenAL library path</string>
|
|
||||||
</property>
|
|
||||||
<property name="buddy">
|
|
||||||
<cstring>lineEditOpenALPath</cstring>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="1">
|
|
||||||
<widget class="QLineEdit" name="lineEditOpenALPath">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="verticalSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Vertical</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>20</width>
|
|
||||||
<height>40</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<widget class="QWidget" name="performancePage">
|
|
||||||
<attribute name="title">
|
|
||||||
<string>Performance</string>
|
|
||||||
</attribute>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_14">
|
|
||||||
<item>
|
|
||||||
<widget class="QGroupBox" name="perfomanceGroupBox">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="title">
|
|
||||||
<string>Performance</string>
|
|
||||||
</property>
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="checked">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_13">
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="enableFeralGamemodeCheck">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Enable Feral Interactive's GameMode, to potentially improve gaming performance.</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Enable Feral GameMode</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="enableMangoHud">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Enable MangoHud's advanced performance overlay.</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Enable MangoHud</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="useDiscreteGpuCheck">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Use the discrete GPU instead of the primary GPU.</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Use discrete GPU</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="useZink">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Use Zink, a Mesa OpenGL driver that implements OpenGL on top of Vulkan. Performance may vary depending on the situation. Note: If no suitable Vulkan driver is found, software rendering will be used.</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Use Zink</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="verticalSpacer_2">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Vertical</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>20</width>
|
|
||||||
<height>40</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<widget class="QWidget" name="miscellaneousPage">
|
|
||||||
<attribute name="title">
|
|
||||||
<string>Miscellaneous</string>
|
|
||||||
</attribute>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_9">
|
|
||||||
<item>
|
|
||||||
<widget class="QGroupBox" name="legacySettingsGroupBox">
|
|
||||||
<property name="title">
|
|
||||||
<string>Legacy settings</string>
|
|
||||||
</property>
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="checked">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_17">
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="onlineFixes">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Emulates usages of old online services which are no longer operating.</p><p>Current fixes include: skin and online mode support.</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Enable online fixes (experimental)</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QGroupBox" name="gameTimeGroupBox">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="title">
|
|
||||||
<string>Override global game time settings</string>
|
|
||||||
</property>
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="checked">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_10">
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="showGameTime">
|
|
||||||
<property name="text">
|
|
||||||
<string>Show time spent playing this instance</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="recordGameTime">
|
|
||||||
<property name="text">
|
|
||||||
<string>Record time spent playing this instance</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QGroupBox" name="serverJoinGroupBox">
|
|
||||||
<property name="title">
|
|
||||||
<string>Set a target to join on launch</string>
|
|
||||||
</property>
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="checked">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<layout class="QGridLayout" name="gridLayout_4">
|
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="QRadioButton" name="serverJoinAddressButton">
|
|
||||||
<property name="text">
|
|
||||||
<string>Server address:</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="2">
|
|
||||||
<widget class="QLineEdit" name="serverJoinAddress"/>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QRadioButton" name="worldJoinButton">
|
|
||||||
<property name="text">
|
|
||||||
<string>Singleplayer world</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="2">
|
|
||||||
<widget class="QComboBox" name="worldsCb"/>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QGroupBox" name="instanceAccountGroupBox">
|
|
||||||
<property name="title">
|
|
||||||
<string>Override default account</string>
|
|
||||||
</property>
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="checked">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_15">
|
|
||||||
<item>
|
|
||||||
<layout class="QGridLayout" name="instanceAccountLayout">
|
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="QLabel" name="instanceAccountNameLabel">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Account:</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="1">
|
|
||||||
<widget class="QComboBox" name="instanceAccountSelector"/>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="verticalSpacerMiscellaneous">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Vertical</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>20</width>
|
|
||||||
<height>40</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<customwidgets>
|
|
||||||
<customwidget>
|
|
||||||
<class>CustomCommands</class>
|
|
||||||
<extends>QWidget</extends>
|
|
||||||
<header>ui/widgets/CustomCommands.h</header>
|
|
||||||
<container>1</container>
|
|
||||||
</customwidget>
|
|
||||||
<customwidget>
|
|
||||||
<class>EnvironmentVariables</class>
|
|
||||||
<extends>QWidget</extends>
|
|
||||||
<header>ui/widgets/EnvironmentVariables.h</header>
|
|
||||||
<container>1</container>
|
|
||||||
</customwidget>
|
|
||||||
</customwidgets>
|
|
||||||
<tabstops>
|
|
||||||
<tabstop>openGlobalJavaSettingsButton</tabstop>
|
|
||||||
<tabstop>settingsTabs</tabstop>
|
|
||||||
<tabstop>javaSettingsGroupBox</tabstop>
|
|
||||||
<tabstop>javaPathTextBox</tabstop>
|
|
||||||
<tabstop>javaBrowseBtn</tabstop>
|
|
||||||
<tabstop>javaDownloadBtn</tabstop>
|
|
||||||
<tabstop>javaDetectBtn</tabstop>
|
|
||||||
<tabstop>javaTestBtn</tabstop>
|
|
||||||
<tabstop>skipCompatibilityCheckbox</tabstop>
|
|
||||||
<tabstop>memoryGroupBox</tabstop>
|
|
||||||
<tabstop>minMemSpinBox</tabstop>
|
|
||||||
<tabstop>maxMemSpinBox</tabstop>
|
|
||||||
<tabstop>permGenSpinBox</tabstop>
|
|
||||||
<tabstop>javaArgumentsGroupBox</tabstop>
|
|
||||||
<tabstop>jvmArgsTextBox</tabstop>
|
|
||||||
<tabstop>windowSizeGroupBox</tabstop>
|
|
||||||
<tabstop>maximizedCheckBox</tabstop>
|
|
||||||
<tabstop>windowWidthSpinBox</tabstop>
|
|
||||||
<tabstop>windowHeightSpinBox</tabstop>
|
|
||||||
<tabstop>consoleSettingsBox</tabstop>
|
|
||||||
<tabstop>showConsoleCheck</tabstop>
|
|
||||||
<tabstop>autoCloseConsoleCheck</tabstop>
|
|
||||||
<tabstop>showConsoleErrorCheck</tabstop>
|
|
||||||
<tabstop>nativeWorkaroundsGroupBox</tabstop>
|
|
||||||
<tabstop>useNativeGLFWCheck</tabstop>
|
|
||||||
<tabstop>useNativeOpenALCheck</tabstop>
|
|
||||||
<tabstop>showGameTime</tabstop>
|
|
||||||
<tabstop>recordGameTime</tabstop>
|
|
||||||
<tabstop>miscellaneousSettingsBox</tabstop>
|
|
||||||
<tabstop>closeAfterLaunchCheck</tabstop>
|
|
||||||
<tabstop>quitAfterGameStopCheck</tabstop>
|
|
||||||
<tabstop>perfomanceGroupBox</tabstop>
|
|
||||||
<tabstop>enableFeralGamemodeCheck</tabstop>
|
|
||||||
<tabstop>enableMangoHud</tabstop>
|
|
||||||
<tabstop>useDiscreteGpuCheck</tabstop>
|
|
||||||
<tabstop>gameTimeGroupBox</tabstop>
|
|
||||||
<tabstop>serverJoinGroupBox</tabstop>
|
|
||||||
<tabstop>serverJoinAddress</tabstop>
|
|
||||||
<tabstop>instanceAccountGroupBox</tabstop>
|
|
||||||
<tabstop>instanceAccountSelector</tabstop>
|
|
||||||
</tabstops>
|
|
||||||
<resources/>
|
|
||||||
<connections/>
|
|
||||||
</ui>
|
|
@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
#include "JavaCommon.h"
|
#include "JavaCommon.h"
|
||||||
|
|
||||||
#include "ui/widgets/JavaSettingsWidget.h"
|
#include "ui/widgets/JavaWizardWidget.h"
|
||||||
#include "ui/widgets/VersionSelectWidget.h"
|
#include "ui/widgets/VersionSelectWidget.h"
|
||||||
|
|
||||||
JavaWizardPage::JavaWizardPage(QWidget* parent) : BaseWizardPage(parent)
|
JavaWizardPage::JavaWizardPage(QWidget* parent) : BaseWizardPage(parent)
|
||||||
@ -27,7 +27,7 @@ void JavaWizardPage::setupUi()
|
|||||||
setObjectName(QStringLiteral("javaPage"));
|
setObjectName(QStringLiteral("javaPage"));
|
||||||
QVBoxLayout* layout = new QVBoxLayout(this);
|
QVBoxLayout* layout = new QVBoxLayout(this);
|
||||||
|
|
||||||
m_java_widget = new JavaSettingsWidget(this);
|
m_java_widget = new JavaWizardWidget(this);
|
||||||
layout->addWidget(m_java_widget);
|
layout->addWidget(m_java_widget);
|
||||||
setLayout(layout);
|
setLayout(layout);
|
||||||
|
|
||||||
@ -58,13 +58,13 @@ bool JavaWizardPage::validatePage()
|
|||||||
settings->set("UserAskedAboutAutomaticJavaDownload", true);
|
settings->set("UserAskedAboutAutomaticJavaDownload", true);
|
||||||
switch (result) {
|
switch (result) {
|
||||||
default:
|
default:
|
||||||
case JavaSettingsWidget::ValidationStatus::Bad: {
|
case JavaWizardWidget::ValidationStatus::Bad: {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
case JavaSettingsWidget::ValidationStatus::AllOK: {
|
case JavaWizardWidget::ValidationStatus::AllOK: {
|
||||||
settings->set("JavaPath", m_java_widget->javaPath());
|
settings->set("JavaPath", m_java_widget->javaPath());
|
||||||
} /* fallthrough */
|
} /* fallthrough */
|
||||||
case JavaSettingsWidget::ValidationStatus::JavaBad: {
|
case JavaWizardWidget::ValidationStatus::JavaBad: {
|
||||||
// Memory
|
// Memory
|
||||||
auto s = APPLICATION->settings();
|
auto s = APPLICATION->settings();
|
||||||
s->set("MinMemAlloc", m_java_widget->minHeapSize());
|
s->set("MinMemAlloc", m_java_widget->minHeapSize());
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
#include "BaseWizardPage.h"
|
#include "BaseWizardPage.h"
|
||||||
|
|
||||||
class JavaSettingsWidget;
|
class JavaWizardWidget;
|
||||||
|
|
||||||
class JavaWizardPage : public BaseWizardPage {
|
class JavaWizardPage : public BaseWizardPage {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@ -21,5 +21,5 @@ class JavaWizardPage : public BaseWizardPage {
|
|||||||
void retranslate() override;
|
void retranslate() override;
|
||||||
|
|
||||||
private: /* data */
|
private: /* data */
|
||||||
JavaSettingsWidget* m_java_widget = nullptr;
|
JavaWizardWidget* m_java_widget = nullptr;
|
||||||
};
|
};
|
||||||
|
@ -40,7 +40,7 @@ class CheckComboModel : public QIdentityProxyModel {
|
|||||||
{
|
{
|
||||||
if (role == Qt::CheckStateRole) {
|
if (role == Qt::CheckStateRole) {
|
||||||
auto txt = QIdentityProxyModel::data(index, Qt::DisplayRole).toString();
|
auto txt = QIdentityProxyModel::data(index, Qt::DisplayRole).toString();
|
||||||
return checked.contains(txt) ? Qt::Checked : Qt::Unchecked;
|
return m_checked.contains(txt) ? Qt::Checked : Qt::Unchecked;
|
||||||
}
|
}
|
||||||
if (role == Qt::DisplayRole)
|
if (role == Qt::DisplayRole)
|
||||||
return QIdentityProxyModel::data(index, Qt::DisplayRole);
|
return QIdentityProxyModel::data(index, Qt::DisplayRole);
|
||||||
@ -50,10 +50,10 @@ class CheckComboModel : public QIdentityProxyModel {
|
|||||||
{
|
{
|
||||||
if (role == Qt::CheckStateRole) {
|
if (role == Qt::CheckStateRole) {
|
||||||
auto txt = QIdentityProxyModel::data(index, Qt::DisplayRole).toString();
|
auto txt = QIdentityProxyModel::data(index, Qt::DisplayRole).toString();
|
||||||
if (checked.contains(txt)) {
|
if (m_checked.contains(txt)) {
|
||||||
checked.removeOne(txt);
|
m_checked.removeOne(txt);
|
||||||
} else {
|
} else {
|
||||||
checked.push_back(txt);
|
m_checked.push_back(txt);
|
||||||
}
|
}
|
||||||
emit dataChanged(index, index);
|
emit dataChanged(index, index);
|
||||||
emit checkStateChanged();
|
emit checkStateChanged();
|
||||||
@ -61,13 +61,13 @@ class CheckComboModel : public QIdentityProxyModel {
|
|||||||
}
|
}
|
||||||
return QIdentityProxyModel::setData(index, value, role);
|
return QIdentityProxyModel::setData(index, value, role);
|
||||||
}
|
}
|
||||||
QStringList getChecked() { return checked; }
|
QStringList getChecked() { return m_checked; }
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void checkStateChanged();
|
void checkStateChanged();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QStringList checked;
|
QStringList m_checked;
|
||||||
};
|
};
|
||||||
|
|
||||||
CheckComboBox::CheckComboBox(QWidget* parent) : QComboBox(parent), m_separator(", ")
|
CheckComboBox::CheckComboBox(QWidget* parent) : QComboBox(parent), m_separator(", ")
|
||||||
@ -92,7 +92,7 @@ void CheckComboBox::setSourceModel(QAbstractItemModel* new_model)
|
|||||||
|
|
||||||
void CheckComboBox::hidePopup()
|
void CheckComboBox::hidePopup()
|
||||||
{
|
{
|
||||||
if (!containerMousePress)
|
if (!m_containerMousePress)
|
||||||
QComboBox::hidePopup();
|
QComboBox::hidePopup();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,7 +138,7 @@ bool CheckComboBox::eventFilter(QObject* receiver, QEvent* event)
|
|||||||
}
|
}
|
||||||
case QEvent::MouseButtonPress: {
|
case QEvent::MouseButtonPress: {
|
||||||
auto ev = static_cast<QMouseEvent*>(event);
|
auto ev = static_cast<QMouseEvent*>(event);
|
||||||
containerMousePress = ev && view()->indexAt(ev->pos()).isValid();
|
m_containerMousePress = ev && view()->indexAt(ev->pos()).isValid();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case QEvent::Wheel:
|
case QEvent::Wheel:
|
||||||
|
@ -60,5 +60,5 @@ class CheckComboBox : public QComboBox {
|
|||||||
private:
|
private:
|
||||||
QString m_default_text;
|
QString m_default_text;
|
||||||
QString m_separator;
|
QString m_separator;
|
||||||
bool containerMousePress;
|
bool m_containerMousePress = false;
|
||||||
};
|
};
|
@ -1,559 +1,314 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
/*
|
||||||
|
* Prism Launcher - Minecraft Launcher
|
||||||
|
* Copyright (c) 2022 Jamie Mansfield <jmansfield@cadixdev.org>
|
||||||
|
* Copyright (C) 2022 Sefa Eyeoglu <contact@scrumplex.net>
|
||||||
|
* Copyright (C) 2024 TheKodeToad <TheKodeToad@proton.me>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, version 3.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This file incorporates work covered by the following copyright and
|
||||||
|
* permission notice:
|
||||||
|
*
|
||||||
|
* Copyright 2013-2021 MultiMC Contributors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
#include "JavaSettingsWidget.h"
|
#include "JavaSettingsWidget.h"
|
||||||
|
|
||||||
#include <QFileDialog>
|
#include <QFileDialog>
|
||||||
#include <QGroupBox>
|
#include <QFileInfo>
|
||||||
#include <QLabel>
|
|
||||||
#include <QLayoutItem>
|
|
||||||
#include <QLineEdit>
|
|
||||||
#include <QMessageBox>
|
|
||||||
#include <QPushButton>
|
|
||||||
#include <QSizePolicy>
|
|
||||||
#include <QSpinBox>
|
|
||||||
#include <QToolButton>
|
|
||||||
#include <QVBoxLayout>
|
|
||||||
|
|
||||||
#include <sys.h>
|
|
||||||
|
|
||||||
#include "DesktopServices.h"
|
|
||||||
#include "FileSystem.h"
|
|
||||||
#include "JavaCommon.h"
|
|
||||||
#include "java/JavaChecker.h"
|
|
||||||
#include "java/JavaInstall.h"
|
|
||||||
#include "java/JavaInstallList.h"
|
|
||||||
#include "java/JavaUtils.h"
|
|
||||||
|
|
||||||
#include "ui/dialogs/CustomMessageBox.h"
|
|
||||||
#include "ui/java/InstallJavaDialog.h"
|
|
||||||
#include "ui/widgets/VersionSelectWidget.h"
|
|
||||||
|
|
||||||
#include "Application.h"
|
#include "Application.h"
|
||||||
#include "BuildConfig.h"
|
#include "BuildConfig.h"
|
||||||
|
#include "FileSystem.h"
|
||||||
|
#include "JavaCommon.h"
|
||||||
|
#include "java/JavaInstallList.h"
|
||||||
|
#include "java/JavaUtils.h"
|
||||||
|
#include "settings/Setting.h"
|
||||||
|
#include "sys.h"
|
||||||
|
#include "ui/dialogs/CustomMessageBox.h"
|
||||||
|
#include "ui/dialogs/VersionSelectDialog.h"
|
||||||
|
#include "ui/java/InstallJavaDialog.h"
|
||||||
|
|
||||||
JavaSettingsWidget::JavaSettingsWidget(QWidget* parent) : QWidget(parent)
|
#include "ui_JavaSettingsWidget.h"
|
||||||
|
|
||||||
|
JavaSettingsWidget::JavaSettingsWidget(InstancePtr instance, QWidget* parent)
|
||||||
|
: QWidget(parent), m_instance(std::move(instance)), m_ui(new Ui::JavaSettingsWidget)
|
||||||
{
|
{
|
||||||
m_availableMemory = Sys::getSystemRam() / Sys::mebibyte;
|
m_ui->setupUi(this);
|
||||||
|
|
||||||
goodIcon = APPLICATION->getThemedIcon("status-good");
|
if (m_instance == nullptr) {
|
||||||
yellowIcon = APPLICATION->getThemedIcon("status-yellow");
|
m_ui->javaDownloadBtn->hide();
|
||||||
badIcon = APPLICATION->getThemedIcon("status-bad");
|
if (BuildConfig.JAVA_DOWNLOADER_ENABLED) {
|
||||||
m_memoryTimer = new QTimer(this);
|
connect(m_ui->autodetectJavaCheckBox, &QCheckBox::stateChanged, this, [this](bool state) {
|
||||||
setupUi();
|
m_ui->autodownloadJavaCheckBox->setEnabled(state);
|
||||||
|
if (!state)
|
||||||
|
m_ui->autodownloadJavaCheckBox->setChecked(false);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
m_ui->autodownloadJavaCheckBox->hide();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
m_ui->javaDownloadBtn->setVisible(BuildConfig.JAVA_DOWNLOADER_ENABLED);
|
||||||
|
m_ui->skipWizardCheckBox->hide();
|
||||||
|
m_ui->autodetectJavaCheckBox->hide();
|
||||||
|
m_ui->autodownloadJavaCheckBox->hide();
|
||||||
|
|
||||||
connect(m_minMemSpinBox, SIGNAL(valueChanged(int)), this, SLOT(onSpinBoxValueChanged(int)));
|
m_ui->javaInstallationGroupBox->setCheckable(true);
|
||||||
connect(m_maxMemSpinBox, SIGNAL(valueChanged(int)), this, SLOT(onSpinBoxValueChanged(int)));
|
m_ui->memoryGroupBox->setCheckable(true);
|
||||||
connect(m_permGenSpinBox, SIGNAL(valueChanged(int)), this, SLOT(onSpinBoxValueChanged(int)));
|
m_ui->javaArgumentsGroupBox->setCheckable(true);
|
||||||
connect(m_memoryTimer, &QTimer::timeout, this, &JavaSettingsWidget::memoryValueChanged);
|
|
||||||
connect(m_versionWidget, &VersionSelectWidget::selectedVersionChanged, this, &JavaSettingsWidget::javaVersionSelected);
|
|
||||||
connect(m_javaBrowseBtn, &QPushButton::clicked, this, &JavaSettingsWidget::on_javaBrowseBtn_clicked);
|
|
||||||
connect(m_javaPathTextBox, &QLineEdit::textEdited, this, &JavaSettingsWidget::javaPathEdited);
|
|
||||||
connect(m_javaStatusBtn, &QToolButton::clicked, this, &JavaSettingsWidget::on_javaStatusBtn_clicked);
|
|
||||||
if (BuildConfig.JAVA_DOWNLOADER_ENABLED) {
|
|
||||||
connect(m_javaDownloadBtn, &QPushButton::clicked, this, &JavaSettingsWidget::javaDownloadBtn_clicked);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void JavaSettingsWidget::setupUi()
|
SettingsObjectPtr settings = m_instance->settings();
|
||||||
{
|
|
||||||
setObjectName(QStringLiteral("javaSettingsWidget"));
|
|
||||||
m_verticalLayout = new QVBoxLayout(this);
|
|
||||||
m_verticalLayout->setObjectName(QStringLiteral("verticalLayout"));
|
|
||||||
|
|
||||||
m_versionWidget = new VersionSelectWidget(this);
|
connect(settings->getSetting("OverrideJavaLocation").get(), &Setting::SettingChanged, m_ui->javaInstallationGroupBox,
|
||||||
|
[this, settings] { m_ui->javaInstallationGroupBox->setChecked(settings->get("OverrideJavaLocation").toBool()); });
|
||||||
|
connect(settings->getSetting("JavaPath").get(), &Setting::SettingChanged, m_ui->javaInstallationGroupBox,
|
||||||
|
[this, settings] { m_ui->javaPathTextBox->setText(settings->get("JavaPath").toString()); });
|
||||||
|
|
||||||
m_horizontalLayout = new QHBoxLayout();
|
connect(m_ui->javaDownloadBtn, &QPushButton::clicked, this, [this] {
|
||||||
m_horizontalLayout->setObjectName(QStringLiteral("horizontalLayout"));
|
auto javaDialog = new Java::InstallDialog({}, m_instance.get(), this);
|
||||||
m_javaPathTextBox = new QLineEdit(this);
|
javaDialog->exec();
|
||||||
m_javaPathTextBox->setObjectName(QStringLiteral("javaPathTextBox"));
|
|
||||||
|
|
||||||
m_horizontalLayout->addWidget(m_javaPathTextBox);
|
|
||||||
|
|
||||||
m_javaBrowseBtn = new QPushButton(this);
|
|
||||||
m_javaBrowseBtn->setObjectName(QStringLiteral("javaBrowseBtn"));
|
|
||||||
|
|
||||||
m_horizontalLayout->addWidget(m_javaBrowseBtn);
|
|
||||||
|
|
||||||
m_javaStatusBtn = new QToolButton(this);
|
|
||||||
m_javaStatusBtn->setIcon(yellowIcon);
|
|
||||||
m_horizontalLayout->addWidget(m_javaStatusBtn);
|
|
||||||
|
|
||||||
m_memoryGroupBox = new QGroupBox(this);
|
|
||||||
m_memoryGroupBox->setObjectName(QStringLiteral("memoryGroupBox"));
|
|
||||||
m_gridLayout_2 = new QGridLayout(m_memoryGroupBox);
|
|
||||||
m_gridLayout_2->setObjectName(QStringLiteral("gridLayout_2"));
|
|
||||||
m_gridLayout_2->setColumnStretch(0, 1);
|
|
||||||
|
|
||||||
m_labelMinMem = new QLabel(m_memoryGroupBox);
|
|
||||||
m_labelMinMem->setObjectName(QStringLiteral("labelMinMem"));
|
|
||||||
m_gridLayout_2->addWidget(m_labelMinMem, 0, 0, 1, 1);
|
|
||||||
|
|
||||||
m_minMemSpinBox = new QSpinBox(m_memoryGroupBox);
|
|
||||||
m_minMemSpinBox->setObjectName(QStringLiteral("minMemSpinBox"));
|
|
||||||
m_minMemSpinBox->setSuffix(QStringLiteral(" MiB"));
|
|
||||||
m_minMemSpinBox->setMinimum(8);
|
|
||||||
m_minMemSpinBox->setMaximum(1048576);
|
|
||||||
m_minMemSpinBox->setSingleStep(128);
|
|
||||||
m_labelMinMem->setBuddy(m_minMemSpinBox);
|
|
||||||
m_gridLayout_2->addWidget(m_minMemSpinBox, 0, 1, 1, 1);
|
|
||||||
|
|
||||||
m_labelMaxMem = new QLabel(m_memoryGroupBox);
|
|
||||||
m_labelMaxMem->setObjectName(QStringLiteral("labelMaxMem"));
|
|
||||||
m_gridLayout_2->addWidget(m_labelMaxMem, 1, 0, 1, 1);
|
|
||||||
|
|
||||||
m_maxMemSpinBox = new QSpinBox(m_memoryGroupBox);
|
|
||||||
m_maxMemSpinBox->setObjectName(QStringLiteral("maxMemSpinBox"));
|
|
||||||
m_maxMemSpinBox->setSuffix(QStringLiteral(" MiB"));
|
|
||||||
m_maxMemSpinBox->setMinimum(8);
|
|
||||||
m_maxMemSpinBox->setMaximum(1048576);
|
|
||||||
m_maxMemSpinBox->setSingleStep(128);
|
|
||||||
m_labelMaxMem->setBuddy(m_maxMemSpinBox);
|
|
||||||
m_gridLayout_2->addWidget(m_maxMemSpinBox, 1, 1, 1, 1);
|
|
||||||
|
|
||||||
m_labelMaxMemIcon = new QLabel(m_memoryGroupBox);
|
|
||||||
m_labelMaxMemIcon->setObjectName(QStringLiteral("labelMaxMemIcon"));
|
|
||||||
m_gridLayout_2->addWidget(m_labelMaxMemIcon, 1, 2, 1, 1);
|
|
||||||
|
|
||||||
m_labelPermGen = new QLabel(m_memoryGroupBox);
|
|
||||||
m_labelPermGen->setObjectName(QStringLiteral("labelPermGen"));
|
|
||||||
m_labelPermGen->setText(QStringLiteral("PermGen:"));
|
|
||||||
m_gridLayout_2->addWidget(m_labelPermGen, 2, 0, 1, 1);
|
|
||||||
m_labelPermGen->setVisible(false);
|
|
||||||
|
|
||||||
m_permGenSpinBox = new QSpinBox(m_memoryGroupBox);
|
|
||||||
m_permGenSpinBox->setObjectName(QStringLiteral("permGenSpinBox"));
|
|
||||||
m_permGenSpinBox->setSuffix(QStringLiteral(" MiB"));
|
|
||||||
m_permGenSpinBox->setMinimum(4);
|
|
||||||
m_permGenSpinBox->setMaximum(1048576);
|
|
||||||
m_permGenSpinBox->setSingleStep(8);
|
|
||||||
m_gridLayout_2->addWidget(m_permGenSpinBox, 2, 1, 1, 1);
|
|
||||||
m_permGenSpinBox->setVisible(false);
|
|
||||||
|
|
||||||
m_verticalLayout->addWidget(m_memoryGroupBox);
|
|
||||||
|
|
||||||
m_horizontalBtnLayout = new QHBoxLayout();
|
|
||||||
m_horizontalBtnLayout->setObjectName(QStringLiteral("horizontalBtnLayout"));
|
|
||||||
|
|
||||||
if (BuildConfig.JAVA_DOWNLOADER_ENABLED) {
|
|
||||||
m_javaDownloadBtn = new QPushButton(tr("Download Java"), this);
|
|
||||||
m_horizontalBtnLayout->addWidget(m_javaDownloadBtn);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_autoJavaGroupBox = new QGroupBox(this);
|
|
||||||
m_autoJavaGroupBox->setObjectName(QStringLiteral("autoJavaGroupBox"));
|
|
||||||
m_veriticalJavaLayout = new QVBoxLayout(m_autoJavaGroupBox);
|
|
||||||
m_veriticalJavaLayout->setObjectName(QStringLiteral("veriticalJavaLayout"));
|
|
||||||
|
|
||||||
m_autodetectJavaCheckBox = new QCheckBox(m_autoJavaGroupBox);
|
|
||||||
m_autodetectJavaCheckBox->setObjectName("autodetectJavaCheckBox");
|
|
||||||
m_autodetectJavaCheckBox->setChecked(true);
|
|
||||||
m_veriticalJavaLayout->addWidget(m_autodetectJavaCheckBox);
|
|
||||||
|
|
||||||
if (BuildConfig.JAVA_DOWNLOADER_ENABLED) {
|
|
||||||
m_autodownloadCheckBox = new QCheckBox(m_autoJavaGroupBox);
|
|
||||||
m_autodownloadCheckBox->setObjectName("autodownloadCheckBox");
|
|
||||||
m_autodownloadCheckBox->setEnabled(m_autodetectJavaCheckBox->isChecked());
|
|
||||||
m_veriticalJavaLayout->addWidget(m_autodownloadCheckBox);
|
|
||||||
connect(m_autodetectJavaCheckBox, &QCheckBox::stateChanged, this, [this] {
|
|
||||||
m_autodownloadCheckBox->setEnabled(m_autodetectJavaCheckBox->isChecked());
|
|
||||||
if (!m_autodetectJavaCheckBox->isChecked())
|
|
||||||
m_autodownloadCheckBox->setChecked(false);
|
|
||||||
});
|
});
|
||||||
|
connect(m_ui->javaPathTextBox, &QLineEdit::textChanged, [this](QString newValue) {
|
||||||
connect(m_autodownloadCheckBox, &QCheckBox::stateChanged, this, [this] {
|
if (m_instance->settings()->get("JavaPath").toString() != newValue) {
|
||||||
auto isChecked = m_autodownloadCheckBox->isChecked();
|
m_instance->settings()->set("AutomaticJava", false);
|
||||||
m_versionWidget->setVisible(!isChecked);
|
|
||||||
m_javaStatusBtn->setVisible(!isChecked);
|
|
||||||
m_javaBrowseBtn->setVisible(!isChecked);
|
|
||||||
m_javaPathTextBox->setVisible(!isChecked);
|
|
||||||
m_javaDownloadBtn->setVisible(!isChecked);
|
|
||||||
if (!isChecked) {
|
|
||||||
m_verticalLayout->removeItem(m_verticalSpacer);
|
|
||||||
} else {
|
|
||||||
m_verticalLayout->addSpacerItem(m_verticalSpacer);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
m_verticalLayout->addWidget(m_autoJavaGroupBox);
|
|
||||||
|
|
||||||
m_verticalLayout->addLayout(m_horizontalBtnLayout);
|
connect(m_ui->javaTestBtn, &QPushButton::clicked, this, &JavaSettingsWidget::onJavaTest);
|
||||||
|
connect(m_ui->javaDetectBtn, &QPushButton::clicked, this, &JavaSettingsWidget::onJavaAutodetect);
|
||||||
|
connect(m_ui->javaBrowseBtn, &QPushButton::clicked, this, &JavaSettingsWidget::onJavaBrowse);
|
||||||
|
|
||||||
m_verticalLayout->addWidget(m_versionWidget);
|
connect(m_ui->maxMemSpinBox, QOverload<int>::of(&QSpinBox::valueChanged), this, &JavaSettingsWidget::updateThresholds);
|
||||||
m_verticalLayout->addLayout(m_horizontalLayout);
|
connect(m_ui->minMemSpinBox, QOverload<int>::of(&QSpinBox::valueChanged), this, &JavaSettingsWidget::updateThresholds);
|
||||||
m_verticalSpacer = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding);
|
|
||||||
|
|
||||||
retranslate();
|
loadSettings();
|
||||||
}
|
|
||||||
|
|
||||||
void JavaSettingsWidget::initialize()
|
|
||||||
{
|
|
||||||
m_versionWidget->initialize(APPLICATION->javalist().get());
|
|
||||||
m_versionWidget->selectSearch();
|
|
||||||
m_versionWidget->setResizeOn(2);
|
|
||||||
auto s = APPLICATION->settings();
|
|
||||||
// Memory
|
|
||||||
observedMinMemory = s->get("MinMemAlloc").toInt();
|
|
||||||
observedMaxMemory = s->get("MaxMemAlloc").toInt();
|
|
||||||
observedPermGenMemory = s->get("PermGen").toInt();
|
|
||||||
m_minMemSpinBox->setValue(observedMinMemory);
|
|
||||||
m_maxMemSpinBox->setValue(observedMaxMemory);
|
|
||||||
m_permGenSpinBox->setValue(observedPermGenMemory);
|
|
||||||
updateThresholds();
|
updateThresholds();
|
||||||
if (BuildConfig.JAVA_DOWNLOADER_ENABLED) {
|
|
||||||
m_autodownloadCheckBox->setChecked(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void JavaSettingsWidget::refresh()
|
|
||||||
{
|
|
||||||
if (BuildConfig.JAVA_DOWNLOADER_ENABLED && m_autodownloadCheckBox->isChecked()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (JavaUtils::getJavaCheckPath().isEmpty()) {
|
|
||||||
JavaCommon::javaCheckNotFound(this);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
m_versionWidget->loadList();
|
|
||||||
}
|
|
||||||
|
|
||||||
JavaSettingsWidget::ValidationStatus JavaSettingsWidget::validate()
|
|
||||||
{
|
|
||||||
switch (javaStatus) {
|
|
||||||
default:
|
|
||||||
case JavaStatus::NotSet:
|
|
||||||
/* fallthrough */
|
|
||||||
case JavaStatus::DoesNotExist:
|
|
||||||
/* fallthrough */
|
|
||||||
case JavaStatus::DoesNotStart:
|
|
||||||
/* fallthrough */
|
|
||||||
case JavaStatus::ReturnedInvalidData: {
|
|
||||||
if (!(BuildConfig.JAVA_DOWNLOADER_ENABLED && m_autodownloadCheckBox->isChecked())) { // the java will not be autodownloaded
|
|
||||||
int button = QMessageBox::No;
|
|
||||||
if (m_result.mojangPlatform == "32" && maxHeapSize() > 2048) {
|
|
||||||
button = CustomMessageBox::selectable(
|
|
||||||
this, tr("32-bit Java detected"),
|
|
||||||
tr("You selected a 32-bit installation of Java, but allocated more than 2048MiB as maximum memory.\n"
|
|
||||||
"%1 will not be able to start Minecraft.\n"
|
|
||||||
"Do you wish to proceed?"
|
|
||||||
"\n\n"
|
|
||||||
"You can change the Java version in the settings later.\n")
|
|
||||||
.arg(BuildConfig.LAUNCHER_DISPLAYNAME),
|
|
||||||
QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No | QMessageBox::Help, QMessageBox::NoButton)
|
|
||||||
->exec();
|
|
||||||
|
|
||||||
} else {
|
|
||||||
button = CustomMessageBox::selectable(this, tr("No Java version selected"),
|
|
||||||
tr("You either didn't select a Java version or selected one that does not work.\n"
|
|
||||||
"%1 will not be able to start Minecraft.\n"
|
|
||||||
"Do you wish to proceed without a functional version of Java?"
|
|
||||||
"\n\n"
|
|
||||||
"You can change the Java version in the settings later.\n")
|
|
||||||
.arg(BuildConfig.LAUNCHER_DISPLAYNAME),
|
|
||||||
QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No | QMessageBox::Help,
|
|
||||||
QMessageBox::NoButton)
|
|
||||||
->exec();
|
|
||||||
}
|
|
||||||
switch (button) {
|
|
||||||
case QMessageBox::Yes:
|
|
||||||
return ValidationStatus::JavaBad;
|
|
||||||
case QMessageBox::Help:
|
|
||||||
DesktopServices::openUrl(QUrl(BuildConfig.HELP_URL.arg("java-wizard")));
|
|
||||||
/* fallthrough */
|
|
||||||
case QMessageBox::No:
|
|
||||||
/* fallthrough */
|
|
||||||
default:
|
|
||||||
return ValidationStatus::Bad;
|
|
||||||
}
|
|
||||||
if (button == QMessageBox::No) {
|
|
||||||
return ValidationStatus::Bad;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ValidationStatus::JavaBad;
|
|
||||||
} break;
|
|
||||||
case JavaStatus::Pending: {
|
|
||||||
return ValidationStatus::Bad;
|
|
||||||
}
|
|
||||||
case JavaStatus::Good: {
|
|
||||||
return ValidationStatus::AllOK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QString JavaSettingsWidget::javaPath() const
|
|
||||||
{
|
|
||||||
return m_javaPathTextBox->text();
|
|
||||||
}
|
|
||||||
|
|
||||||
int JavaSettingsWidget::maxHeapSize() const
|
|
||||||
{
|
|
||||||
auto min = m_minMemSpinBox->value();
|
|
||||||
auto max = m_maxMemSpinBox->value();
|
|
||||||
if (max < min)
|
|
||||||
max = min;
|
|
||||||
return max;
|
|
||||||
}
|
|
||||||
|
|
||||||
int JavaSettingsWidget::minHeapSize() const
|
|
||||||
{
|
|
||||||
auto min = m_minMemSpinBox->value();
|
|
||||||
auto max = m_maxMemSpinBox->value();
|
|
||||||
if (min > max)
|
|
||||||
min = max;
|
|
||||||
return min;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool JavaSettingsWidget::permGenEnabled() const
|
|
||||||
{
|
|
||||||
return m_permGenSpinBox->isVisible();
|
|
||||||
}
|
|
||||||
|
|
||||||
int JavaSettingsWidget::permGenSize() const
|
|
||||||
{
|
|
||||||
return m_permGenSpinBox->value();
|
|
||||||
}
|
|
||||||
|
|
||||||
void JavaSettingsWidget::memoryValueChanged()
|
|
||||||
{
|
|
||||||
bool actuallyChanged = false;
|
|
||||||
unsigned int min = m_minMemSpinBox->value();
|
|
||||||
unsigned int max = m_maxMemSpinBox->value();
|
|
||||||
unsigned int permgen = m_permGenSpinBox->value();
|
|
||||||
if (min != observedMinMemory) {
|
|
||||||
observedMinMemory = min;
|
|
||||||
actuallyChanged = true;
|
|
||||||
}
|
|
||||||
if (max != observedMaxMemory) {
|
|
||||||
observedMaxMemory = max;
|
|
||||||
actuallyChanged = true;
|
|
||||||
}
|
|
||||||
if (permgen != observedPermGenMemory) {
|
|
||||||
observedPermGenMemory = permgen;
|
|
||||||
actuallyChanged = true;
|
|
||||||
}
|
|
||||||
if (actuallyChanged) {
|
|
||||||
checkJavaPathOnEdit(m_javaPathTextBox->text());
|
|
||||||
updateThresholds();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void JavaSettingsWidget::javaVersionSelected(BaseVersion::Ptr version)
|
|
||||||
{
|
|
||||||
auto java = std::dynamic_pointer_cast<JavaInstall>(version);
|
|
||||||
if (!java) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
auto visible = java->id.requiresPermGen();
|
|
||||||
m_labelPermGen->setVisible(visible);
|
|
||||||
m_permGenSpinBox->setVisible(visible);
|
|
||||||
m_javaPathTextBox->setText(java->path);
|
|
||||||
checkJavaPath(java->path);
|
|
||||||
}
|
|
||||||
|
|
||||||
void JavaSettingsWidget::on_javaBrowseBtn_clicked()
|
|
||||||
{
|
|
||||||
auto filter = QString("Java (%1)").arg(JavaUtils::javaExecutable);
|
|
||||||
auto raw_path = QFileDialog::getOpenFileName(this, tr("Find Java executable"), QString(), filter);
|
|
||||||
if (raw_path.isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
auto cooked_path = FS::NormalizePath(raw_path);
|
|
||||||
m_javaPathTextBox->setText(cooked_path);
|
|
||||||
checkJavaPath(cooked_path);
|
|
||||||
}
|
|
||||||
|
|
||||||
void JavaSettingsWidget::javaDownloadBtn_clicked()
|
|
||||||
{
|
|
||||||
auto jdialog = new Java::InstallDialog({}, nullptr, this);
|
|
||||||
jdialog->exec();
|
|
||||||
}
|
|
||||||
|
|
||||||
void JavaSettingsWidget::on_javaStatusBtn_clicked()
|
|
||||||
{
|
|
||||||
QString text;
|
|
||||||
bool failed = false;
|
|
||||||
switch (javaStatus) {
|
|
||||||
case JavaStatus::NotSet:
|
|
||||||
checkJavaPath(m_javaPathTextBox->text());
|
|
||||||
return;
|
|
||||||
case JavaStatus::DoesNotExist:
|
|
||||||
text += QObject::tr("The specified file either doesn't exist or is not a proper executable.");
|
|
||||||
failed = true;
|
|
||||||
break;
|
|
||||||
case JavaStatus::DoesNotStart: {
|
|
||||||
text += QObject::tr("The specified Java binary didn't start properly.<br />");
|
|
||||||
auto htmlError = m_result.errorLog;
|
|
||||||
if (!htmlError.isEmpty()) {
|
|
||||||
htmlError.replace('\n', "<br />");
|
|
||||||
text += QString("<font color=\"red\">%1</font>").arg(htmlError);
|
|
||||||
}
|
|
||||||
failed = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case JavaStatus::ReturnedInvalidData: {
|
|
||||||
text += QObject::tr("The specified Java binary returned unexpected results:<br />");
|
|
||||||
auto htmlOut = m_result.outLog;
|
|
||||||
if (!htmlOut.isEmpty()) {
|
|
||||||
htmlOut.replace('\n', "<br />");
|
|
||||||
text += QString("<font color=\"red\">%1</font>").arg(htmlOut);
|
|
||||||
}
|
|
||||||
failed = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case JavaStatus::Good:
|
|
||||||
text += QObject::tr(
|
|
||||||
"Java test succeeded!<br />Platform reported: %1<br />Java version "
|
|
||||||
"reported: %2<br />")
|
|
||||||
.arg(m_result.realPlatform, m_result.javaVersion.toString());
|
|
||||||
break;
|
|
||||||
case JavaStatus::Pending:
|
|
||||||
// TODO: abort here?
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
CustomMessageBox::selectable(this, failed ? QObject::tr("Java test failure") : QObject::tr("Java test success"), text,
|
|
||||||
failed ? QMessageBox::Critical : QMessageBox::Information)
|
|
||||||
->show();
|
|
||||||
}
|
|
||||||
|
|
||||||
void JavaSettingsWidget::setJavaStatus(JavaSettingsWidget::JavaStatus status)
|
|
||||||
{
|
|
||||||
javaStatus = status;
|
|
||||||
switch (javaStatus) {
|
|
||||||
case JavaStatus::Good:
|
|
||||||
m_javaStatusBtn->setIcon(goodIcon);
|
|
||||||
break;
|
|
||||||
case JavaStatus::NotSet:
|
|
||||||
case JavaStatus::Pending:
|
|
||||||
m_javaStatusBtn->setIcon(yellowIcon);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
m_javaStatusBtn->setIcon(badIcon);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void JavaSettingsWidget::javaPathEdited(const QString& path)
|
|
||||||
{
|
|
||||||
checkJavaPathOnEdit(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
void JavaSettingsWidget::checkJavaPathOnEdit(const QString& path)
|
|
||||||
{
|
|
||||||
auto realPath = FS::ResolveExecutable(path);
|
|
||||||
QFileInfo pathInfo(realPath);
|
|
||||||
if (pathInfo.baseName().toLower().contains("java")) {
|
|
||||||
checkJavaPath(path);
|
|
||||||
} else {
|
|
||||||
if (!m_checker) {
|
|
||||||
setJavaStatus(JavaStatus::NotSet);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void JavaSettingsWidget::checkJavaPath(const QString& path)
|
|
||||||
{
|
|
||||||
if (m_checker) {
|
|
||||||
queuedCheck = path;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
auto realPath = FS::ResolveExecutable(path);
|
|
||||||
if (realPath.isNull()) {
|
|
||||||
setJavaStatus(JavaStatus::DoesNotExist);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
setJavaStatus(JavaStatus::Pending);
|
|
||||||
m_checker.reset(
|
|
||||||
new JavaChecker(path, "", minHeapSize(), maxHeapSize(), m_permGenSpinBox->isVisible() ? m_permGenSpinBox->value() : 0, 0));
|
|
||||||
connect(m_checker.get(), &JavaChecker::checkFinished, this, &JavaSettingsWidget::checkFinished);
|
|
||||||
m_checker->start();
|
|
||||||
}
|
|
||||||
|
|
||||||
void JavaSettingsWidget::checkFinished(const JavaChecker::Result& result)
|
|
||||||
{
|
|
||||||
m_result = result;
|
|
||||||
switch (result.validity) {
|
|
||||||
case JavaChecker::Result::Validity::Valid: {
|
|
||||||
setJavaStatus(JavaStatus::Good);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case JavaChecker::Result::Validity::ReturnedInvalidData: {
|
|
||||||
setJavaStatus(JavaStatus::ReturnedInvalidData);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case JavaChecker::Result::Validity::Errored: {
|
|
||||||
setJavaStatus(JavaStatus::DoesNotStart);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
updateThresholds();
|
|
||||||
m_checker.reset();
|
|
||||||
if (!queuedCheck.isNull()) {
|
|
||||||
checkJavaPath(queuedCheck);
|
|
||||||
queuedCheck.clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void JavaSettingsWidget::retranslate()
|
|
||||||
{
|
|
||||||
m_memoryGroupBox->setTitle(tr("Memory"));
|
|
||||||
m_maxMemSpinBox->setToolTip(tr("The maximum amount of memory Minecraft is allowed to use."));
|
|
||||||
m_labelMinMem->setText(tr("Minimum memory allocation:"));
|
|
||||||
m_labelMaxMem->setText(tr("Maximum memory allocation:"));
|
|
||||||
m_minMemSpinBox->setToolTip(tr("The amount of memory Minecraft is started with."));
|
|
||||||
m_permGenSpinBox->setToolTip(tr("The amount of memory available to store loaded Java classes."));
|
|
||||||
m_javaBrowseBtn->setText(tr("Browse"));
|
|
||||||
if (BuildConfig.JAVA_DOWNLOADER_ENABLED) {
|
|
||||||
m_autodownloadCheckBox->setText(tr("Auto-download Mojang Java"));
|
|
||||||
}
|
|
||||||
m_autodetectJavaCheckBox->setText(tr("Autodetect Java version"));
|
|
||||||
m_autoJavaGroupBox->setTitle(tr("Autodetect Java"));
|
|
||||||
}
|
|
||||||
|
|
||||||
void JavaSettingsWidget::updateThresholds()
|
|
||||||
{
|
|
||||||
QString iconName;
|
|
||||||
|
|
||||||
if (observedMaxMemory >= m_availableMemory) {
|
|
||||||
iconName = "status-bad";
|
|
||||||
m_labelMaxMemIcon->setToolTip(tr("Your maximum memory allocation exceeds your system memory capacity."));
|
|
||||||
} else if (observedMaxMemory > (m_availableMemory * 0.9)) {
|
|
||||||
iconName = "status-yellow";
|
|
||||||
m_labelMaxMemIcon->setToolTip(tr("Your maximum memory allocation approaches your system memory capacity."));
|
|
||||||
} else if (observedMaxMemory < observedMinMemory) {
|
|
||||||
iconName = "status-yellow";
|
|
||||||
m_labelMaxMemIcon->setToolTip(tr("Your maximum memory allocation is smaller than the minimum value"));
|
|
||||||
} else if (BuildConfig.JAVA_DOWNLOADER_ENABLED && m_autodownloadCheckBox->isChecked()) {
|
|
||||||
iconName = "status-good";
|
|
||||||
m_labelMaxMemIcon->setToolTip("");
|
|
||||||
} else if (observedMaxMemory > 2048 && !m_result.is_64bit) {
|
|
||||||
iconName = "status-bad";
|
|
||||||
m_labelMaxMemIcon->setToolTip(tr("You are exceeding the maximum allocation supported by 32-bit installations of Java."));
|
|
||||||
} else {
|
|
||||||
iconName = "status-good";
|
|
||||||
m_labelMaxMemIcon->setToolTip("");
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
auto height = m_labelMaxMemIcon->fontInfo().pixelSize();
|
|
||||||
QIcon icon = APPLICATION->getThemedIcon(iconName);
|
|
||||||
QPixmap pix = icon.pixmap(height, height);
|
|
||||||
m_labelMaxMemIcon->setPixmap(pix);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool JavaSettingsWidget::autoDownloadJava() const
|
|
||||||
{
|
|
||||||
return m_autodownloadCheckBox && m_autodownloadCheckBox->isChecked();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool JavaSettingsWidget::autoDetectJava() const
|
|
||||||
{
|
|
||||||
return m_autodetectJavaCheckBox->isChecked();
|
|
||||||
}
|
|
||||||
|
|
||||||
void JavaSettingsWidget::onSpinBoxValueChanged(int)
|
|
||||||
{
|
|
||||||
m_memoryTimer->start(500);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
JavaSettingsWidget::~JavaSettingsWidget()
|
JavaSettingsWidget::~JavaSettingsWidget()
|
||||||
{
|
{
|
||||||
delete m_verticalSpacer;
|
delete m_ui;
|
||||||
};
|
}
|
||||||
|
|
||||||
|
void JavaSettingsWidget::loadSettings()
|
||||||
|
{
|
||||||
|
SettingsObjectPtr settings;
|
||||||
|
|
||||||
|
if (m_instance != nullptr)
|
||||||
|
settings = m_instance->settings();
|
||||||
|
else
|
||||||
|
settings = APPLICATION->settings();
|
||||||
|
|
||||||
|
// Java Settings
|
||||||
|
m_ui->javaInstallationGroupBox->setChecked(settings->get("OverrideJavaLocation").toBool());
|
||||||
|
m_ui->javaPathTextBox->setText(settings->get("JavaPath").toString());
|
||||||
|
|
||||||
|
m_ui->skipCompatibilityCheckBox->setChecked(settings->get("IgnoreJavaCompatibility").toBool());
|
||||||
|
|
||||||
|
m_ui->javaArgumentsGroupBox->setChecked(m_instance == nullptr || settings->get("OverrideJavaArgs").toBool());
|
||||||
|
m_ui->jvmArgsTextBox->setPlainText(settings->get("JvmArgs").toString());
|
||||||
|
|
||||||
|
if (m_instance == nullptr) {
|
||||||
|
m_ui->skipWizardCheckBox->setChecked(settings->get("IgnoreJavaWizard").toBool());
|
||||||
|
m_ui->autodetectJavaCheckBox->setChecked(settings->get("AutomaticJavaSwitch").toBool());
|
||||||
|
m_ui->autodetectJavaCheckBox->stateChanged(m_ui->autodetectJavaCheckBox->isChecked());
|
||||||
|
m_ui->autodownloadJavaCheckBox->setChecked(settings->get("AutomaticJavaDownload").toBool());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Memory
|
||||||
|
m_ui->memoryGroupBox->setChecked(m_instance == nullptr || settings->get("OverrideMemory").toBool());
|
||||||
|
int min = settings->get("MinMemAlloc").toInt();
|
||||||
|
int max = settings->get("MaxMemAlloc").toInt();
|
||||||
|
if (min < max) {
|
||||||
|
m_ui->minMemSpinBox->setValue(min);
|
||||||
|
m_ui->maxMemSpinBox->setValue(max);
|
||||||
|
} else {
|
||||||
|
m_ui->minMemSpinBox->setValue(max);
|
||||||
|
m_ui->maxMemSpinBox->setValue(min);
|
||||||
|
}
|
||||||
|
m_ui->permGenSpinBox->setValue(settings->get("PermGen").toInt());
|
||||||
|
|
||||||
|
// Java arguments
|
||||||
|
m_ui->javaArgumentsGroupBox->setChecked(m_instance == nullptr || settings->get("OverrideJavaArgs").toBool());
|
||||||
|
m_ui->jvmArgsTextBox->setPlainText(settings->get("JvmArgs").toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
void JavaSettingsWidget::saveSettings()
|
||||||
|
{
|
||||||
|
SettingsObjectPtr settings;
|
||||||
|
|
||||||
|
if (m_instance != nullptr)
|
||||||
|
settings = m_instance->settings();
|
||||||
|
else
|
||||||
|
settings = APPLICATION->settings();
|
||||||
|
|
||||||
|
SettingsObject::Lock lock(settings);
|
||||||
|
|
||||||
|
// Java Install Settings
|
||||||
|
bool javaInstall = m_instance == nullptr || m_ui->javaInstallationGroupBox->isChecked();
|
||||||
|
|
||||||
|
if (m_instance != nullptr)
|
||||||
|
settings->set("OverrideJavaLocation", javaInstall);
|
||||||
|
|
||||||
|
if (javaInstall) {
|
||||||
|
settings->set("JavaPath", m_ui->javaPathTextBox->text());
|
||||||
|
settings->set("IgnoreJavaCompatibility", m_ui->skipCompatibilityCheckBox->isChecked());
|
||||||
|
} else {
|
||||||
|
settings->reset("JavaPath");
|
||||||
|
settings->reset("IgnoreJavaCompatibility");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_instance == nullptr) {
|
||||||
|
settings->set("IgnoreJavaWizard", m_ui->skipWizardCheckBox->isChecked());
|
||||||
|
settings->set("AutomaticJavaSwitch", m_ui->autodetectJavaCheckBox->isChecked());
|
||||||
|
settings->set("AutomaticJavaDownload", m_ui->autodownloadJavaCheckBox->isChecked());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Memory
|
||||||
|
bool memory = m_instance == nullptr || m_ui->memoryGroupBox->isChecked();
|
||||||
|
|
||||||
|
if (m_instance != nullptr)
|
||||||
|
settings->set("OverrideMemory", memory);
|
||||||
|
|
||||||
|
if (memory) {
|
||||||
|
int min = m_ui->minMemSpinBox->value();
|
||||||
|
int max = m_ui->maxMemSpinBox->value();
|
||||||
|
if (min < max) {
|
||||||
|
settings->set("MinMemAlloc", min);
|
||||||
|
settings->set("MaxMemAlloc", max);
|
||||||
|
} else {
|
||||||
|
settings->set("MinMemAlloc", max);
|
||||||
|
settings->set("MaxMemAlloc", min);
|
||||||
|
}
|
||||||
|
settings->set("PermGen", m_ui->permGenSpinBox->value());
|
||||||
|
} else {
|
||||||
|
settings->reset("MinMemAlloc");
|
||||||
|
settings->reset("MaxMemAlloc");
|
||||||
|
settings->reset("PermGen");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Java arguments
|
||||||
|
bool javaArgs = m_instance == nullptr || m_ui->javaArgumentsGroupBox->isChecked();
|
||||||
|
|
||||||
|
if (m_instance != nullptr)
|
||||||
|
settings->set("OverrideJavaArgs", javaArgs);
|
||||||
|
|
||||||
|
if (javaArgs) {
|
||||||
|
settings->set("JvmArgs", m_ui->jvmArgsTextBox->toPlainText().replace("\n", " "));
|
||||||
|
} else {
|
||||||
|
settings->reset("JvmArgs");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void JavaSettingsWidget::onJavaBrowse()
|
||||||
|
{
|
||||||
|
QString rawPath = QFileDialog::getOpenFileName(this, tr("Find Java executable"));
|
||||||
|
|
||||||
|
// do not allow current dir - it's dirty. Do not allow dirs that don't exist
|
||||||
|
if (rawPath.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString cookedPath = FS::NormalizePath(rawPath);
|
||||||
|
QFileInfo javaInfo(cookedPath);
|
||||||
|
if (!javaInfo.exists() || !javaInfo.isExecutable()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_ui->javaPathTextBox->setText(cookedPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JavaSettingsWidget::onJavaTest()
|
||||||
|
{
|
||||||
|
if (m_checker != nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
|
QString jvmArgs;
|
||||||
|
|
||||||
|
if (m_instance == nullptr || m_ui->javaArgumentsGroupBox->isChecked())
|
||||||
|
jvmArgs = m_ui->jvmArgsTextBox->toPlainText().replace("\n", " ");
|
||||||
|
else
|
||||||
|
jvmArgs = APPLICATION->settings()->get("JvmArgs").toString();
|
||||||
|
|
||||||
|
m_checker.reset(new JavaCommon::TestCheck(this, m_ui->javaPathTextBox->text(), jvmArgs, m_ui->minMemSpinBox->value(),
|
||||||
|
m_ui->maxMemSpinBox->value(), m_ui->permGenSpinBox->value()));
|
||||||
|
connect(m_checker.get(), &JavaCommon::TestCheck::finished, this, [this] { m_checker.reset(); });
|
||||||
|
m_checker->run();
|
||||||
|
}
|
||||||
|
|
||||||
|
void JavaSettingsWidget::onJavaAutodetect()
|
||||||
|
{
|
||||||
|
if (JavaUtils::getJavaCheckPath().isEmpty()) {
|
||||||
|
JavaCommon::javaCheckNotFound(this);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
VersionSelectDialog versionDialog(APPLICATION->javalist().get(), tr("Select a Java version"), this, true);
|
||||||
|
versionDialog.setResizeOn(2);
|
||||||
|
versionDialog.exec();
|
||||||
|
|
||||||
|
if (versionDialog.result() == QDialog::Accepted && versionDialog.selectedVersion()) {
|
||||||
|
JavaInstallPtr java = std::dynamic_pointer_cast<JavaInstall>(versionDialog.selectedVersion());
|
||||||
|
m_ui->javaPathTextBox->setText(java->path);
|
||||||
|
|
||||||
|
if (!java->is_64bit && m_ui->maxMemSpinBox->value() > 2048) {
|
||||||
|
CustomMessageBox::selectable(this, tr("Confirm Selection"),
|
||||||
|
tr("You selected a 32-bit version of Java.\n"
|
||||||
|
"This installation does not support more than 2048MiB of RAM.\n"
|
||||||
|
"Please make sure that the maximum memory value is lower."),
|
||||||
|
QMessageBox::Warning, QMessageBox::Ok, QMessageBox::Ok)
|
||||||
|
->exec();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void JavaSettingsWidget::updateThresholds()
|
||||||
|
{
|
||||||
|
auto sysMiB = Sys::getSystemRam() / Sys::mebibyte;
|
||||||
|
unsigned int maxMem = m_ui->maxMemSpinBox->value();
|
||||||
|
unsigned int minMem = m_ui->minMemSpinBox->value();
|
||||||
|
|
||||||
|
QString iconName;
|
||||||
|
|
||||||
|
if (maxMem >= sysMiB) {
|
||||||
|
iconName = "status-bad";
|
||||||
|
m_ui->labelMaxMemIcon->setToolTip(tr("Your maximum memory allocation exceeds your system memory capacity."));
|
||||||
|
} else if (maxMem > (sysMiB * 0.9)) {
|
||||||
|
iconName = "status-yellow";
|
||||||
|
m_ui->labelMaxMemIcon->setToolTip(tr("Your maximum memory allocation approaches your system memory capacity."));
|
||||||
|
} else if (maxMem < minMem) {
|
||||||
|
iconName = "status-yellow";
|
||||||
|
m_ui->labelMaxMemIcon->setToolTip(tr("Your maximum memory allocation is smaller than the minimum value"));
|
||||||
|
} else {
|
||||||
|
iconName = "status-good";
|
||||||
|
m_ui->labelMaxMemIcon->setToolTip("");
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto height = m_ui->labelMaxMemIcon->fontInfo().pixelSize();
|
||||||
|
QIcon icon = APPLICATION->getThemedIcon(iconName);
|
||||||
|
QPixmap pix = icon.pixmap(height, height);
|
||||||
|
m_ui->labelMaxMemIcon->setPixmap(pix);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,106 +1,68 @@
|
|||||||
#pragma once
|
// SPDX-License-Identifier: GPL-3.0-only
|
||||||
#include <QWidget>
|
/*
|
||||||
|
* Prism Launcher - Minecraft Launcher
|
||||||
#include <BaseVersion.h>
|
* Copyright (c) 2022 Jamie Mansfield <jmansfield@cadixdev.org>
|
||||||
#include <QObjectPtr.h>
|
* Copyright (C) 2024 TheKodeToad <TheKodeToad@proton.me>
|
||||||
#include <java/JavaChecker.h>
|
*
|
||||||
#include <qcheckbox.h>
|
* This program is free software: you can redistribute it and/or modify
|
||||||
#include <QIcon>
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, version 3.
|
||||||
class QLineEdit;
|
*
|
||||||
class VersionSelectWidget;
|
* This program is distributed in the hope that it will be useful,
|
||||||
class QSpinBox;
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
class QPushButton;
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
class QVBoxLayout;
|
* GNU General Public License for more details.
|
||||||
class QHBoxLayout;
|
*
|
||||||
class QGroupBox;
|
* You should have received a copy of the GNU General Public License
|
||||||
class QGridLayout;
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
class QLabel;
|
*
|
||||||
class QToolButton;
|
* This file incorporates work covered by the following copyright and
|
||||||
class QSpacerItem;
|
* permission notice:
|
||||||
|
*
|
||||||
/**
|
* Copyright 2013-2021 MultiMC Contributors
|
||||||
* This is a widget for all the Java settings dialogs and pages.
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
#include "BaseInstance.h"
|
||||||
|
#include "JavaCommon.h"
|
||||||
|
|
||||||
|
namespace Ui {
|
||||||
|
class JavaSettingsWidget;
|
||||||
|
}
|
||||||
|
|
||||||
class JavaSettingsWidget : public QWidget {
|
class JavaSettingsWidget : public QWidget {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit JavaSettingsWidget(QWidget* parent);
|
explicit JavaSettingsWidget(QWidget* parent = nullptr) : JavaSettingsWidget(nullptr, nullptr) {}
|
||||||
virtual ~JavaSettingsWidget();
|
explicit JavaSettingsWidget(InstancePtr instance, QWidget* parent = nullptr);
|
||||||
|
~JavaSettingsWidget() override;
|
||||||
|
|
||||||
enum class JavaStatus { NotSet, Pending, Good, DoesNotExist, DoesNotStart, ReturnedInvalidData } javaStatus = JavaStatus::NotSet;
|
void loadSettings();
|
||||||
|
void saveSettings();
|
||||||
enum class ValidationStatus { Bad, JavaBad, AllOK };
|
|
||||||
|
|
||||||
void refresh();
|
|
||||||
void initialize();
|
|
||||||
ValidationStatus validate();
|
|
||||||
void retranslate();
|
|
||||||
|
|
||||||
bool permGenEnabled() const;
|
|
||||||
int permGenSize() const;
|
|
||||||
int minHeapSize() const;
|
|
||||||
int maxHeapSize() const;
|
|
||||||
QString javaPath() const;
|
|
||||||
bool autoDetectJava() const;
|
|
||||||
bool autoDownloadJava() const;
|
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void onJavaBrowse();
|
||||||
|
void onJavaAutodetect();
|
||||||
|
void onJavaTest();
|
||||||
void updateThresholds();
|
void updateThresholds();
|
||||||
|
|
||||||
protected slots:
|
private:
|
||||||
void onSpinBoxValueChanged(int);
|
InstancePtr m_instance;
|
||||||
void memoryValueChanged();
|
Ui::JavaSettingsWidget* m_ui;
|
||||||
void javaPathEdited(const QString& path);
|
unique_qobject_ptr<JavaCommon::TestCheck> m_checker;
|
||||||
void javaVersionSelected(BaseVersion::Ptr version);
|
|
||||||
void on_javaBrowseBtn_clicked();
|
|
||||||
void on_javaStatusBtn_clicked();
|
|
||||||
void javaDownloadBtn_clicked();
|
|
||||||
void checkFinished(const JavaChecker::Result& result);
|
|
||||||
|
|
||||||
protected: /* methods */
|
|
||||||
void checkJavaPathOnEdit(const QString& path);
|
|
||||||
void checkJavaPath(const QString& path);
|
|
||||||
void setJavaStatus(JavaStatus status);
|
|
||||||
void setupUi();
|
|
||||||
|
|
||||||
private: /* data */
|
|
||||||
VersionSelectWidget* m_versionWidget = nullptr;
|
|
||||||
QVBoxLayout* m_verticalLayout = nullptr;
|
|
||||||
QSpacerItem* m_verticalSpacer = nullptr;
|
|
||||||
|
|
||||||
QLineEdit* m_javaPathTextBox = nullptr;
|
|
||||||
QPushButton* m_javaBrowseBtn = nullptr;
|
|
||||||
QToolButton* m_javaStatusBtn = nullptr;
|
|
||||||
QHBoxLayout* m_horizontalLayout = nullptr;
|
|
||||||
|
|
||||||
QGroupBox* m_memoryGroupBox = nullptr;
|
|
||||||
QGridLayout* m_gridLayout_2 = nullptr;
|
|
||||||
QSpinBox* m_maxMemSpinBox = nullptr;
|
|
||||||
QLabel* m_labelMinMem = nullptr;
|
|
||||||
QLabel* m_labelMaxMem = nullptr;
|
|
||||||
QLabel* m_labelMaxMemIcon = nullptr;
|
|
||||||
QSpinBox* m_minMemSpinBox = nullptr;
|
|
||||||
QLabel* m_labelPermGen = nullptr;
|
|
||||||
QSpinBox* m_permGenSpinBox = nullptr;
|
|
||||||
|
|
||||||
QHBoxLayout* m_horizontalBtnLayout = nullptr;
|
|
||||||
QPushButton* m_javaDownloadBtn = nullptr;
|
|
||||||
QIcon goodIcon;
|
|
||||||
QIcon yellowIcon;
|
|
||||||
QIcon badIcon;
|
|
||||||
|
|
||||||
QGroupBox* m_autoJavaGroupBox = nullptr;
|
|
||||||
QVBoxLayout* m_veriticalJavaLayout = nullptr;
|
|
||||||
QCheckBox* m_autodetectJavaCheckBox = nullptr;
|
|
||||||
QCheckBox* m_autodownloadCheckBox = nullptr;
|
|
||||||
|
|
||||||
unsigned int observedMinMemory = 0;
|
|
||||||
unsigned int observedMaxMemory = 0;
|
|
||||||
unsigned int observedPermGenMemory = 0;
|
|
||||||
QString queuedCheck;
|
|
||||||
uint64_t m_availableMemory = 0ull;
|
|
||||||
shared_qobject_ptr<JavaChecker> m_checker;
|
|
||||||
JavaChecker::Result m_result;
|
|
||||||
QTimer* m_memoryTimer;
|
|
||||||
};
|
};
|
||||||
|
269
launcher/ui/widgets/JavaSettingsWidget.ui
Normal file
269
launcher/ui/widgets/JavaSettingsWidget.ui
Normal file
@ -0,0 +1,269 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>JavaSettingsWidget</class>
|
||||||
|
<widget class="QWidget" name="JavaSettingsWidget">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>500</width>
|
||||||
|
<height>600</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Form</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="javaInstallationGroupBox">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="title">
|
||||||
|
<string>Java Insta&llation</string>
|
||||||
|
</property>
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_2">
|
||||||
|
<item row="6" column="0">
|
||||||
|
<widget class="QCheckBox" name="autodetectJavaCheckBox">
|
||||||
|
<property name="text">
|
||||||
|
<string>Auto-&detect Java version</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="javaPathTextBox"/>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="javaBrowseBtn">
|
||||||
|
<property name="text">
|
||||||
|
<string>Browse</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="javaDownloadBtn">
|
||||||
|
<property name="text">
|
||||||
|
<string>Download Java</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="javaDetectBtn">
|
||||||
|
<property name="text">
|
||||||
|
<string>Auto-detect...</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="javaTestBtn">
|
||||||
|
<property name="text">
|
||||||
|
<string>Test</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item row="7" column="0">
|
||||||
|
<widget class="QCheckBox" name="autodownloadJavaCheckBox">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Automatically downloads and selects the Java build recommended by Mojang.</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Auto-download &Mojang Java</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="0">
|
||||||
|
<widget class="QCheckBox" name="skipWizardCheckBox">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>If enabled, the launcher won't prompt you to choose a Java version if one is not found on startup.</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Skip Java setup prompt on startup</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0">
|
||||||
|
<widget class="QCheckBox" name="skipCompatibilityCheckBox">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>If enabled, the launcher will not check if an instance is compatible with the selected Java version.</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Skip Java compatibility checks</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="memoryGroupBox">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="title">
|
||||||
|
<string>Memor&y</string>
|
||||||
|
</property>
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_5" columnstretch="1,0,0">
|
||||||
|
<item row="2" column="0">
|
||||||
|
<widget class="QLabel" name="labelPermGen">
|
||||||
|
<property name="text">
|
||||||
|
<string>PermGen (Java 7 and earlier):</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QLabel" name="labelMinMem">
|
||||||
|
<property name="text">
|
||||||
|
<string>Minimum memory allocation:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="1">
|
||||||
|
<widget class="QSpinBox" name="permGenSpinBox">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>The amount of memory available to store loaded Java classes.</string>
|
||||||
|
</property>
|
||||||
|
<property name="suffix">
|
||||||
|
<string notr="true"> MiB</string>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<number>4</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>999999999</number>
|
||||||
|
</property>
|
||||||
|
<property name="singleStep">
|
||||||
|
<number>8</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>64</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QLabel" name="labelMaxMem">
|
||||||
|
<property name="text">
|
||||||
|
<string>Maximum memory allocation:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="2">
|
||||||
|
<widget class="QLabel" name="labelMaxMemIcon">
|
||||||
|
<property name="text">
|
||||||
|
<string notr="true"/>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
<property name="buddy">
|
||||||
|
<cstring>maxMemSpinBox</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QSpinBox" name="maxMemSpinBox">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>The maximum amount of memory Minecraft is allowed to use.</string>
|
||||||
|
</property>
|
||||||
|
<property name="suffix">
|
||||||
|
<string notr="true"> MiB</string>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<number>8</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>1048576</number>
|
||||||
|
</property>
|
||||||
|
<property name="singleStep">
|
||||||
|
<number>128</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>1024</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QSpinBox" name="minMemSpinBox">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>The amount of memory Minecraft is started with.</string>
|
||||||
|
</property>
|
||||||
|
<property name="suffix">
|
||||||
|
<string notr="true"> MiB</string>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<number>8</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>1048576</number>
|
||||||
|
</property>
|
||||||
|
<property name="singleStep">
|
||||||
|
<number>128</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>256</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="javaArgumentsGroupBox">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="title">
|
||||||
|
<string>Java Argumen&ts</string>
|
||||||
|
</property>
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_6">
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QPlainTextEdit" name="jvmArgsTextBox"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<tabstops>
|
||||||
|
<tabstop>javaPathTextBox</tabstop>
|
||||||
|
<tabstop>javaBrowseBtn</tabstop>
|
||||||
|
<tabstop>javaDownloadBtn</tabstop>
|
||||||
|
<tabstop>javaDetectBtn</tabstop>
|
||||||
|
<tabstop>javaTestBtn</tabstop>
|
||||||
|
<tabstop>skipCompatibilityCheckBox</tabstop>
|
||||||
|
<tabstop>skipWizardCheckBox</tabstop>
|
||||||
|
<tabstop>autodetectJavaCheckBox</tabstop>
|
||||||
|
<tabstop>autodownloadJavaCheckBox</tabstop>
|
||||||
|
<tabstop>minMemSpinBox</tabstop>
|
||||||
|
<tabstop>maxMemSpinBox</tabstop>
|
||||||
|
<tabstop>permGenSpinBox</tabstop>
|
||||||
|
<tabstop>jvmArgsTextBox</tabstop>
|
||||||
|
</tabstops>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
559
launcher/ui/widgets/JavaWizardWidget.cpp
Normal file
559
launcher/ui/widgets/JavaWizardWidget.cpp
Normal file
@ -0,0 +1,559 @@
|
|||||||
|
#include "JavaWizardWidget.h"
|
||||||
|
|
||||||
|
#include <QFileDialog>
|
||||||
|
#include <QGroupBox>
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QLayoutItem>
|
||||||
|
#include <QLineEdit>
|
||||||
|
#include <QMessageBox>
|
||||||
|
#include <QPushButton>
|
||||||
|
#include <QSizePolicy>
|
||||||
|
#include <QSpinBox>
|
||||||
|
#include <QToolButton>
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
|
||||||
|
#include <sys.h>
|
||||||
|
|
||||||
|
#include "DesktopServices.h"
|
||||||
|
#include "FileSystem.h"
|
||||||
|
#include "JavaCommon.h"
|
||||||
|
#include "java/JavaChecker.h"
|
||||||
|
#include "java/JavaInstall.h"
|
||||||
|
#include "java/JavaInstallList.h"
|
||||||
|
#include "java/JavaUtils.h"
|
||||||
|
|
||||||
|
#include "ui/dialogs/CustomMessageBox.h"
|
||||||
|
#include "ui/java/InstallJavaDialog.h"
|
||||||
|
#include "ui/widgets/VersionSelectWidget.h"
|
||||||
|
|
||||||
|
#include "Application.h"
|
||||||
|
#include "BuildConfig.h"
|
||||||
|
|
||||||
|
JavaWizardWidget::JavaWizardWidget(QWidget* parent) : QWidget(parent)
|
||||||
|
{
|
||||||
|
m_availableMemory = Sys::getSystemRam() / Sys::mebibyte;
|
||||||
|
|
||||||
|
goodIcon = APPLICATION->getThemedIcon("status-good");
|
||||||
|
yellowIcon = APPLICATION->getThemedIcon("status-yellow");
|
||||||
|
badIcon = APPLICATION->getThemedIcon("status-bad");
|
||||||
|
m_memoryTimer = new QTimer(this);
|
||||||
|
setupUi();
|
||||||
|
|
||||||
|
connect(m_minMemSpinBox, SIGNAL(valueChanged(int)), this, SLOT(onSpinBoxValueChanged(int)));
|
||||||
|
connect(m_maxMemSpinBox, SIGNAL(valueChanged(int)), this, SLOT(onSpinBoxValueChanged(int)));
|
||||||
|
connect(m_permGenSpinBox, SIGNAL(valueChanged(int)), this, SLOT(onSpinBoxValueChanged(int)));
|
||||||
|
connect(m_memoryTimer, &QTimer::timeout, this, &JavaWizardWidget::memoryValueChanged);
|
||||||
|
connect(m_versionWidget, &VersionSelectWidget::selectedVersionChanged, this, &JavaWizardWidget::javaVersionSelected);
|
||||||
|
connect(m_javaBrowseBtn, &QPushButton::clicked, this, &JavaWizardWidget::on_javaBrowseBtn_clicked);
|
||||||
|
connect(m_javaPathTextBox, &QLineEdit::textEdited, this, &JavaWizardWidget::javaPathEdited);
|
||||||
|
connect(m_javaStatusBtn, &QToolButton::clicked, this, &JavaWizardWidget::on_javaStatusBtn_clicked);
|
||||||
|
if (BuildConfig.JAVA_DOWNLOADER_ENABLED) {
|
||||||
|
connect(m_javaDownloadBtn, &QPushButton::clicked, this, &JavaWizardWidget::javaDownloadBtn_clicked);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void JavaWizardWidget::setupUi()
|
||||||
|
{
|
||||||
|
setObjectName(QStringLiteral("javaSettingsWidget"));
|
||||||
|
m_verticalLayout = new QVBoxLayout(this);
|
||||||
|
m_verticalLayout->setObjectName(QStringLiteral("verticalLayout"));
|
||||||
|
|
||||||
|
m_versionWidget = new VersionSelectWidget(this);
|
||||||
|
|
||||||
|
m_horizontalLayout = new QHBoxLayout();
|
||||||
|
m_horizontalLayout->setObjectName(QStringLiteral("horizontalLayout"));
|
||||||
|
m_javaPathTextBox = new QLineEdit(this);
|
||||||
|
m_javaPathTextBox->setObjectName(QStringLiteral("javaPathTextBox"));
|
||||||
|
|
||||||
|
m_horizontalLayout->addWidget(m_javaPathTextBox);
|
||||||
|
|
||||||
|
m_javaBrowseBtn = new QPushButton(this);
|
||||||
|
m_javaBrowseBtn->setObjectName(QStringLiteral("javaBrowseBtn"));
|
||||||
|
|
||||||
|
m_horizontalLayout->addWidget(m_javaBrowseBtn);
|
||||||
|
|
||||||
|
m_javaStatusBtn = new QToolButton(this);
|
||||||
|
m_javaStatusBtn->setIcon(yellowIcon);
|
||||||
|
m_horizontalLayout->addWidget(m_javaStatusBtn);
|
||||||
|
|
||||||
|
m_memoryGroupBox = new QGroupBox(this);
|
||||||
|
m_memoryGroupBox->setObjectName(QStringLiteral("memoryGroupBox"));
|
||||||
|
m_gridLayout_2 = new QGridLayout(m_memoryGroupBox);
|
||||||
|
m_gridLayout_2->setObjectName(QStringLiteral("gridLayout_2"));
|
||||||
|
m_gridLayout_2->setColumnStretch(0, 1);
|
||||||
|
|
||||||
|
m_labelMinMem = new QLabel(m_memoryGroupBox);
|
||||||
|
m_labelMinMem->setObjectName(QStringLiteral("labelMinMem"));
|
||||||
|
m_gridLayout_2->addWidget(m_labelMinMem, 0, 0, 1, 1);
|
||||||
|
|
||||||
|
m_minMemSpinBox = new QSpinBox(m_memoryGroupBox);
|
||||||
|
m_minMemSpinBox->setObjectName(QStringLiteral("minMemSpinBox"));
|
||||||
|
m_minMemSpinBox->setSuffix(QStringLiteral(" MiB"));
|
||||||
|
m_minMemSpinBox->setMinimum(8);
|
||||||
|
m_minMemSpinBox->setMaximum(1048576);
|
||||||
|
m_minMemSpinBox->setSingleStep(128);
|
||||||
|
m_labelMinMem->setBuddy(m_minMemSpinBox);
|
||||||
|
m_gridLayout_2->addWidget(m_minMemSpinBox, 0, 1, 1, 1);
|
||||||
|
|
||||||
|
m_labelMaxMem = new QLabel(m_memoryGroupBox);
|
||||||
|
m_labelMaxMem->setObjectName(QStringLiteral("labelMaxMem"));
|
||||||
|
m_gridLayout_2->addWidget(m_labelMaxMem, 1, 0, 1, 1);
|
||||||
|
|
||||||
|
m_maxMemSpinBox = new QSpinBox(m_memoryGroupBox);
|
||||||
|
m_maxMemSpinBox->setObjectName(QStringLiteral("maxMemSpinBox"));
|
||||||
|
m_maxMemSpinBox->setSuffix(QStringLiteral(" MiB"));
|
||||||
|
m_maxMemSpinBox->setMinimum(8);
|
||||||
|
m_maxMemSpinBox->setMaximum(1048576);
|
||||||
|
m_maxMemSpinBox->setSingleStep(128);
|
||||||
|
m_labelMaxMem->setBuddy(m_maxMemSpinBox);
|
||||||
|
m_gridLayout_2->addWidget(m_maxMemSpinBox, 1, 1, 1, 1);
|
||||||
|
|
||||||
|
m_labelMaxMemIcon = new QLabel(m_memoryGroupBox);
|
||||||
|
m_labelMaxMemIcon->setObjectName(QStringLiteral("labelMaxMemIcon"));
|
||||||
|
m_gridLayout_2->addWidget(m_labelMaxMemIcon, 1, 2, 1, 1);
|
||||||
|
|
||||||
|
m_labelPermGen = new QLabel(m_memoryGroupBox);
|
||||||
|
m_labelPermGen->setObjectName(QStringLiteral("labelPermGen"));
|
||||||
|
m_labelPermGen->setText(QStringLiteral("PermGen:"));
|
||||||
|
m_gridLayout_2->addWidget(m_labelPermGen, 2, 0, 1, 1);
|
||||||
|
m_labelPermGen->setVisible(false);
|
||||||
|
|
||||||
|
m_permGenSpinBox = new QSpinBox(m_memoryGroupBox);
|
||||||
|
m_permGenSpinBox->setObjectName(QStringLiteral("permGenSpinBox"));
|
||||||
|
m_permGenSpinBox->setSuffix(QStringLiteral(" MiB"));
|
||||||
|
m_permGenSpinBox->setMinimum(4);
|
||||||
|
m_permGenSpinBox->setMaximum(1048576);
|
||||||
|
m_permGenSpinBox->setSingleStep(8);
|
||||||
|
m_gridLayout_2->addWidget(m_permGenSpinBox, 2, 1, 1, 1);
|
||||||
|
m_permGenSpinBox->setVisible(false);
|
||||||
|
|
||||||
|
m_verticalLayout->addWidget(m_memoryGroupBox);
|
||||||
|
|
||||||
|
m_horizontalBtnLayout = new QHBoxLayout();
|
||||||
|
m_horizontalBtnLayout->setObjectName(QStringLiteral("horizontalBtnLayout"));
|
||||||
|
|
||||||
|
if (BuildConfig.JAVA_DOWNLOADER_ENABLED) {
|
||||||
|
m_javaDownloadBtn = new QPushButton(tr("Download Java"), this);
|
||||||
|
m_horizontalBtnLayout->addWidget(m_javaDownloadBtn);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_autoJavaGroupBox = new QGroupBox(this);
|
||||||
|
m_autoJavaGroupBox->setObjectName(QStringLiteral("autoJavaGroupBox"));
|
||||||
|
m_veriticalJavaLayout = new QVBoxLayout(m_autoJavaGroupBox);
|
||||||
|
m_veriticalJavaLayout->setObjectName(QStringLiteral("veriticalJavaLayout"));
|
||||||
|
|
||||||
|
m_autodetectJavaCheckBox = new QCheckBox(m_autoJavaGroupBox);
|
||||||
|
m_autodetectJavaCheckBox->setObjectName("autodetectJavaCheckBox");
|
||||||
|
m_autodetectJavaCheckBox->setChecked(true);
|
||||||
|
m_veriticalJavaLayout->addWidget(m_autodetectJavaCheckBox);
|
||||||
|
|
||||||
|
if (BuildConfig.JAVA_DOWNLOADER_ENABLED) {
|
||||||
|
m_autodownloadCheckBox = new QCheckBox(m_autoJavaGroupBox);
|
||||||
|
m_autodownloadCheckBox->setObjectName("autodownloadCheckBox");
|
||||||
|
m_autodownloadCheckBox->setEnabled(m_autodetectJavaCheckBox->isChecked());
|
||||||
|
m_veriticalJavaLayout->addWidget(m_autodownloadCheckBox);
|
||||||
|
connect(m_autodetectJavaCheckBox, &QCheckBox::stateChanged, this, [this] {
|
||||||
|
m_autodownloadCheckBox->setEnabled(m_autodetectJavaCheckBox->isChecked());
|
||||||
|
if (!m_autodetectJavaCheckBox->isChecked())
|
||||||
|
m_autodownloadCheckBox->setChecked(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
connect(m_autodownloadCheckBox, &QCheckBox::stateChanged, this, [this] {
|
||||||
|
auto isChecked = m_autodownloadCheckBox->isChecked();
|
||||||
|
m_versionWidget->setVisible(!isChecked);
|
||||||
|
m_javaStatusBtn->setVisible(!isChecked);
|
||||||
|
m_javaBrowseBtn->setVisible(!isChecked);
|
||||||
|
m_javaPathTextBox->setVisible(!isChecked);
|
||||||
|
m_javaDownloadBtn->setVisible(!isChecked);
|
||||||
|
if (!isChecked) {
|
||||||
|
m_verticalLayout->removeItem(m_verticalSpacer);
|
||||||
|
} else {
|
||||||
|
m_verticalLayout->addSpacerItem(m_verticalSpacer);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
m_verticalLayout->addWidget(m_autoJavaGroupBox);
|
||||||
|
|
||||||
|
m_verticalLayout->addLayout(m_horizontalBtnLayout);
|
||||||
|
|
||||||
|
m_verticalLayout->addWidget(m_versionWidget);
|
||||||
|
m_verticalLayout->addLayout(m_horizontalLayout);
|
||||||
|
m_verticalSpacer = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding);
|
||||||
|
|
||||||
|
retranslate();
|
||||||
|
}
|
||||||
|
|
||||||
|
void JavaWizardWidget::initialize()
|
||||||
|
{
|
||||||
|
m_versionWidget->initialize(APPLICATION->javalist().get());
|
||||||
|
m_versionWidget->selectSearch();
|
||||||
|
m_versionWidget->setResizeOn(2);
|
||||||
|
auto s = APPLICATION->settings();
|
||||||
|
// Memory
|
||||||
|
observedMinMemory = s->get("MinMemAlloc").toInt();
|
||||||
|
observedMaxMemory = s->get("MaxMemAlloc").toInt();
|
||||||
|
observedPermGenMemory = s->get("PermGen").toInt();
|
||||||
|
m_minMemSpinBox->setValue(observedMinMemory);
|
||||||
|
m_maxMemSpinBox->setValue(observedMaxMemory);
|
||||||
|
m_permGenSpinBox->setValue(observedPermGenMemory);
|
||||||
|
updateThresholds();
|
||||||
|
if (BuildConfig.JAVA_DOWNLOADER_ENABLED) {
|
||||||
|
m_autodownloadCheckBox->setChecked(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void JavaWizardWidget::refresh()
|
||||||
|
{
|
||||||
|
if (BuildConfig.JAVA_DOWNLOADER_ENABLED && m_autodownloadCheckBox->isChecked()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (JavaUtils::getJavaCheckPath().isEmpty()) {
|
||||||
|
JavaCommon::javaCheckNotFound(this);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_versionWidget->loadList();
|
||||||
|
}
|
||||||
|
|
||||||
|
JavaWizardWidget::ValidationStatus JavaWizardWidget::validate()
|
||||||
|
{
|
||||||
|
switch (javaStatus) {
|
||||||
|
default:
|
||||||
|
case JavaStatus::NotSet:
|
||||||
|
/* fallthrough */
|
||||||
|
case JavaStatus::DoesNotExist:
|
||||||
|
/* fallthrough */
|
||||||
|
case JavaStatus::DoesNotStart:
|
||||||
|
/* fallthrough */
|
||||||
|
case JavaStatus::ReturnedInvalidData: {
|
||||||
|
if (!(BuildConfig.JAVA_DOWNLOADER_ENABLED && m_autodownloadCheckBox->isChecked())) { // the java will not be autodownloaded
|
||||||
|
int button = QMessageBox::No;
|
||||||
|
if (m_result.mojangPlatform == "32" && maxHeapSize() > 2048) {
|
||||||
|
button = CustomMessageBox::selectable(
|
||||||
|
this, tr("32-bit Java detected"),
|
||||||
|
tr("You selected a 32-bit installation of Java, but allocated more than 2048MiB as maximum memory.\n"
|
||||||
|
"%1 will not be able to start Minecraft.\n"
|
||||||
|
"Do you wish to proceed?"
|
||||||
|
"\n\n"
|
||||||
|
"You can change the Java version in the settings later.\n")
|
||||||
|
.arg(BuildConfig.LAUNCHER_DISPLAYNAME),
|
||||||
|
QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No | QMessageBox::Help, QMessageBox::NoButton)
|
||||||
|
->exec();
|
||||||
|
|
||||||
|
} else {
|
||||||
|
button = CustomMessageBox::selectable(this, tr("No Java version selected"),
|
||||||
|
tr("You either didn't select a Java version or selected one that does not work.\n"
|
||||||
|
"%1 will not be able to start Minecraft.\n"
|
||||||
|
"Do you wish to proceed without a functional version of Java?"
|
||||||
|
"\n\n"
|
||||||
|
"You can change the Java version in the settings later.\n")
|
||||||
|
.arg(BuildConfig.LAUNCHER_DISPLAYNAME),
|
||||||
|
QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No | QMessageBox::Help,
|
||||||
|
QMessageBox::NoButton)
|
||||||
|
->exec();
|
||||||
|
}
|
||||||
|
switch (button) {
|
||||||
|
case QMessageBox::Yes:
|
||||||
|
return ValidationStatus::JavaBad;
|
||||||
|
case QMessageBox::Help:
|
||||||
|
DesktopServices::openUrl(QUrl(BuildConfig.HELP_URL.arg("java-wizard")));
|
||||||
|
/* fallthrough */
|
||||||
|
case QMessageBox::No:
|
||||||
|
/* fallthrough */
|
||||||
|
default:
|
||||||
|
return ValidationStatus::Bad;
|
||||||
|
}
|
||||||
|
if (button == QMessageBox::No) {
|
||||||
|
return ValidationStatus::Bad;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ValidationStatus::JavaBad;
|
||||||
|
} break;
|
||||||
|
case JavaStatus::Pending: {
|
||||||
|
return ValidationStatus::Bad;
|
||||||
|
}
|
||||||
|
case JavaStatus::Good: {
|
||||||
|
return ValidationStatus::AllOK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QString JavaWizardWidget::javaPath() const
|
||||||
|
{
|
||||||
|
return m_javaPathTextBox->text();
|
||||||
|
}
|
||||||
|
|
||||||
|
int JavaWizardWidget::maxHeapSize() const
|
||||||
|
{
|
||||||
|
auto min = m_minMemSpinBox->value();
|
||||||
|
auto max = m_maxMemSpinBox->value();
|
||||||
|
if (max < min)
|
||||||
|
max = min;
|
||||||
|
return max;
|
||||||
|
}
|
||||||
|
|
||||||
|
int JavaWizardWidget::minHeapSize() const
|
||||||
|
{
|
||||||
|
auto min = m_minMemSpinBox->value();
|
||||||
|
auto max = m_maxMemSpinBox->value();
|
||||||
|
if (min > max)
|
||||||
|
min = max;
|
||||||
|
return min;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool JavaWizardWidget::permGenEnabled() const
|
||||||
|
{
|
||||||
|
return m_permGenSpinBox->isVisible();
|
||||||
|
}
|
||||||
|
|
||||||
|
int JavaWizardWidget::permGenSize() const
|
||||||
|
{
|
||||||
|
return m_permGenSpinBox->value();
|
||||||
|
}
|
||||||
|
|
||||||
|
void JavaWizardWidget::memoryValueChanged()
|
||||||
|
{
|
||||||
|
bool actuallyChanged = false;
|
||||||
|
unsigned int min = m_minMemSpinBox->value();
|
||||||
|
unsigned int max = m_maxMemSpinBox->value();
|
||||||
|
unsigned int permgen = m_permGenSpinBox->value();
|
||||||
|
if (min != observedMinMemory) {
|
||||||
|
observedMinMemory = min;
|
||||||
|
actuallyChanged = true;
|
||||||
|
}
|
||||||
|
if (max != observedMaxMemory) {
|
||||||
|
observedMaxMemory = max;
|
||||||
|
actuallyChanged = true;
|
||||||
|
}
|
||||||
|
if (permgen != observedPermGenMemory) {
|
||||||
|
observedPermGenMemory = permgen;
|
||||||
|
actuallyChanged = true;
|
||||||
|
}
|
||||||
|
if (actuallyChanged) {
|
||||||
|
checkJavaPathOnEdit(m_javaPathTextBox->text());
|
||||||
|
updateThresholds();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void JavaWizardWidget::javaVersionSelected(BaseVersion::Ptr version)
|
||||||
|
{
|
||||||
|
auto java = std::dynamic_pointer_cast<JavaInstall>(version);
|
||||||
|
if (!java) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
auto visible = java->id.requiresPermGen();
|
||||||
|
m_labelPermGen->setVisible(visible);
|
||||||
|
m_permGenSpinBox->setVisible(visible);
|
||||||
|
m_javaPathTextBox->setText(java->path);
|
||||||
|
checkJavaPath(java->path);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JavaWizardWidget::on_javaBrowseBtn_clicked()
|
||||||
|
{
|
||||||
|
auto filter = QString("Java (%1)").arg(JavaUtils::javaExecutable);
|
||||||
|
auto raw_path = QFileDialog::getOpenFileName(this, tr("Find Java executable"), QString(), filter);
|
||||||
|
if (raw_path.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
auto cooked_path = FS::NormalizePath(raw_path);
|
||||||
|
m_javaPathTextBox->setText(cooked_path);
|
||||||
|
checkJavaPath(cooked_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JavaWizardWidget::javaDownloadBtn_clicked()
|
||||||
|
{
|
||||||
|
auto jdialog = new Java::InstallDialog({}, nullptr, this);
|
||||||
|
jdialog->exec();
|
||||||
|
}
|
||||||
|
|
||||||
|
void JavaWizardWidget::on_javaStatusBtn_clicked()
|
||||||
|
{
|
||||||
|
QString text;
|
||||||
|
bool failed = false;
|
||||||
|
switch (javaStatus) {
|
||||||
|
case JavaStatus::NotSet:
|
||||||
|
checkJavaPath(m_javaPathTextBox->text());
|
||||||
|
return;
|
||||||
|
case JavaStatus::DoesNotExist:
|
||||||
|
text += QObject::tr("The specified file either doesn't exist or is not a proper executable.");
|
||||||
|
failed = true;
|
||||||
|
break;
|
||||||
|
case JavaStatus::DoesNotStart: {
|
||||||
|
text += QObject::tr("The specified Java binary didn't start properly.<br />");
|
||||||
|
auto htmlError = m_result.errorLog;
|
||||||
|
if (!htmlError.isEmpty()) {
|
||||||
|
htmlError.replace('\n', "<br />");
|
||||||
|
text += QString("<font color=\"red\">%1</font>").arg(htmlError);
|
||||||
|
}
|
||||||
|
failed = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case JavaStatus::ReturnedInvalidData: {
|
||||||
|
text += QObject::tr("The specified Java binary returned unexpected results:<br />");
|
||||||
|
auto htmlOut = m_result.outLog;
|
||||||
|
if (!htmlOut.isEmpty()) {
|
||||||
|
htmlOut.replace('\n', "<br />");
|
||||||
|
text += QString("<font color=\"red\">%1</font>").arg(htmlOut);
|
||||||
|
}
|
||||||
|
failed = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case JavaStatus::Good:
|
||||||
|
text += QObject::tr(
|
||||||
|
"Java test succeeded!<br />Platform reported: %1<br />Java version "
|
||||||
|
"reported: %2<br />")
|
||||||
|
.arg(m_result.realPlatform, m_result.javaVersion.toString());
|
||||||
|
break;
|
||||||
|
case JavaStatus::Pending:
|
||||||
|
// TODO: abort here?
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
CustomMessageBox::selectable(this, failed ? QObject::tr("Java test failure") : QObject::tr("Java test success"), text,
|
||||||
|
failed ? QMessageBox::Critical : QMessageBox::Information)
|
||||||
|
->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
void JavaWizardWidget::setJavaStatus(JavaWizardWidget::JavaStatus status)
|
||||||
|
{
|
||||||
|
javaStatus = status;
|
||||||
|
switch (javaStatus) {
|
||||||
|
case JavaStatus::Good:
|
||||||
|
m_javaStatusBtn->setIcon(goodIcon);
|
||||||
|
break;
|
||||||
|
case JavaStatus::NotSet:
|
||||||
|
case JavaStatus::Pending:
|
||||||
|
m_javaStatusBtn->setIcon(yellowIcon);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
m_javaStatusBtn->setIcon(badIcon);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void JavaWizardWidget::javaPathEdited(const QString& path)
|
||||||
|
{
|
||||||
|
checkJavaPathOnEdit(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JavaWizardWidget::checkJavaPathOnEdit(const QString& path)
|
||||||
|
{
|
||||||
|
auto realPath = FS::ResolveExecutable(path);
|
||||||
|
QFileInfo pathInfo(realPath);
|
||||||
|
if (pathInfo.baseName().toLower().contains("java")) {
|
||||||
|
checkJavaPath(path);
|
||||||
|
} else {
|
||||||
|
if (!m_checker) {
|
||||||
|
setJavaStatus(JavaStatus::NotSet);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void JavaWizardWidget::checkJavaPath(const QString& path)
|
||||||
|
{
|
||||||
|
if (m_checker) {
|
||||||
|
queuedCheck = path;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
auto realPath = FS::ResolveExecutable(path);
|
||||||
|
if (realPath.isNull()) {
|
||||||
|
setJavaStatus(JavaStatus::DoesNotExist);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
setJavaStatus(JavaStatus::Pending);
|
||||||
|
m_checker.reset(
|
||||||
|
new JavaChecker(path, "", minHeapSize(), maxHeapSize(), m_permGenSpinBox->isVisible() ? m_permGenSpinBox->value() : 0, 0));
|
||||||
|
connect(m_checker.get(), &JavaChecker::checkFinished, this, &JavaWizardWidget::checkFinished);
|
||||||
|
m_checker->start();
|
||||||
|
}
|
||||||
|
|
||||||
|
void JavaWizardWidget::checkFinished(const JavaChecker::Result& result)
|
||||||
|
{
|
||||||
|
m_result = result;
|
||||||
|
switch (result.validity) {
|
||||||
|
case JavaChecker::Result::Validity::Valid: {
|
||||||
|
setJavaStatus(JavaStatus::Good);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case JavaChecker::Result::Validity::ReturnedInvalidData: {
|
||||||
|
setJavaStatus(JavaStatus::ReturnedInvalidData);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case JavaChecker::Result::Validity::Errored: {
|
||||||
|
setJavaStatus(JavaStatus::DoesNotStart);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
updateThresholds();
|
||||||
|
m_checker.reset();
|
||||||
|
if (!queuedCheck.isNull()) {
|
||||||
|
checkJavaPath(queuedCheck);
|
||||||
|
queuedCheck.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void JavaWizardWidget::retranslate()
|
||||||
|
{
|
||||||
|
m_memoryGroupBox->setTitle(tr("Memory"));
|
||||||
|
m_maxMemSpinBox->setToolTip(tr("The maximum amount of memory Minecraft is allowed to use."));
|
||||||
|
m_labelMinMem->setText(tr("Minimum memory allocation:"));
|
||||||
|
m_labelMaxMem->setText(tr("Maximum memory allocation:"));
|
||||||
|
m_minMemSpinBox->setToolTip(tr("The amount of memory Minecraft is started with."));
|
||||||
|
m_permGenSpinBox->setToolTip(tr("The amount of memory available to store loaded Java classes."));
|
||||||
|
m_javaBrowseBtn->setText(tr("Browse"));
|
||||||
|
if (BuildConfig.JAVA_DOWNLOADER_ENABLED) {
|
||||||
|
m_autodownloadCheckBox->setText(tr("Auto-download Mojang Java"));
|
||||||
|
}
|
||||||
|
m_autodetectJavaCheckBox->setText(tr("Auto-detect Java version"));
|
||||||
|
m_autoJavaGroupBox->setTitle(tr("Autodetect Java"));
|
||||||
|
}
|
||||||
|
|
||||||
|
void JavaWizardWidget::updateThresholds()
|
||||||
|
{
|
||||||
|
QString iconName;
|
||||||
|
|
||||||
|
if (observedMaxMemory >= m_availableMemory) {
|
||||||
|
iconName = "status-bad";
|
||||||
|
m_labelMaxMemIcon->setToolTip(tr("Your maximum memory allocation exceeds your system memory capacity."));
|
||||||
|
} else if (observedMaxMemory > (m_availableMemory * 0.9)) {
|
||||||
|
iconName = "status-yellow";
|
||||||
|
m_labelMaxMemIcon->setToolTip(tr("Your maximum memory allocation approaches your system memory capacity."));
|
||||||
|
} else if (observedMaxMemory < observedMinMemory) {
|
||||||
|
iconName = "status-yellow";
|
||||||
|
m_labelMaxMemIcon->setToolTip(tr("Your maximum memory allocation is smaller than the minimum value"));
|
||||||
|
} else if (BuildConfig.JAVA_DOWNLOADER_ENABLED && m_autodownloadCheckBox->isChecked()) {
|
||||||
|
iconName = "status-good";
|
||||||
|
m_labelMaxMemIcon->setToolTip("");
|
||||||
|
} else if (observedMaxMemory > 2048 && !m_result.is_64bit) {
|
||||||
|
iconName = "status-bad";
|
||||||
|
m_labelMaxMemIcon->setToolTip(tr("You are exceeding the maximum allocation supported by 32-bit installations of Java."));
|
||||||
|
} else {
|
||||||
|
iconName = "status-good";
|
||||||
|
m_labelMaxMemIcon->setToolTip("");
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto height = m_labelMaxMemIcon->fontInfo().pixelSize();
|
||||||
|
QIcon icon = APPLICATION->getThemedIcon(iconName);
|
||||||
|
QPixmap pix = icon.pixmap(height, height);
|
||||||
|
m_labelMaxMemIcon->setPixmap(pix);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool JavaWizardWidget::autoDownloadJava() const
|
||||||
|
{
|
||||||
|
return m_autodownloadCheckBox && m_autodownloadCheckBox->isChecked();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool JavaWizardWidget::autoDetectJava() const
|
||||||
|
{
|
||||||
|
return m_autodetectJavaCheckBox->isChecked();
|
||||||
|
}
|
||||||
|
|
||||||
|
void JavaWizardWidget::onSpinBoxValueChanged(int)
|
||||||
|
{
|
||||||
|
m_memoryTimer->start(500);
|
||||||
|
}
|
||||||
|
|
||||||
|
JavaWizardWidget::~JavaWizardWidget()
|
||||||
|
{
|
||||||
|
delete m_verticalSpacer;
|
||||||
|
};
|
103
launcher/ui/widgets/JavaWizardWidget.h
Normal file
103
launcher/ui/widgets/JavaWizardWidget.h
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <QWidget>
|
||||||
|
|
||||||
|
#include <BaseVersion.h>
|
||||||
|
#include <QObjectPtr.h>
|
||||||
|
#include <java/JavaChecker.h>
|
||||||
|
#include <qcheckbox.h>
|
||||||
|
#include <QIcon>
|
||||||
|
|
||||||
|
class QLineEdit;
|
||||||
|
class VersionSelectWidget;
|
||||||
|
class QSpinBox;
|
||||||
|
class QPushButton;
|
||||||
|
class QVBoxLayout;
|
||||||
|
class QHBoxLayout;
|
||||||
|
class QGroupBox;
|
||||||
|
class QGridLayout;
|
||||||
|
class QLabel;
|
||||||
|
class QToolButton;
|
||||||
|
class QSpacerItem;
|
||||||
|
|
||||||
|
class JavaWizardWidget : public QWidget {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit JavaWizardWidget(QWidget* parent);
|
||||||
|
virtual ~JavaWizardWidget();
|
||||||
|
|
||||||
|
enum class JavaStatus { NotSet, Pending, Good, DoesNotExist, DoesNotStart, ReturnedInvalidData } javaStatus = JavaStatus::NotSet;
|
||||||
|
|
||||||
|
enum class ValidationStatus { Bad, JavaBad, AllOK };
|
||||||
|
|
||||||
|
void refresh();
|
||||||
|
void initialize();
|
||||||
|
ValidationStatus validate();
|
||||||
|
void retranslate();
|
||||||
|
|
||||||
|
bool permGenEnabled() const;
|
||||||
|
int permGenSize() const;
|
||||||
|
int minHeapSize() const;
|
||||||
|
int maxHeapSize() const;
|
||||||
|
QString javaPath() const;
|
||||||
|
bool autoDetectJava() const;
|
||||||
|
bool autoDownloadJava() const;
|
||||||
|
|
||||||
|
void updateThresholds();
|
||||||
|
|
||||||
|
protected slots:
|
||||||
|
void onSpinBoxValueChanged(int);
|
||||||
|
void memoryValueChanged();
|
||||||
|
void javaPathEdited(const QString& path);
|
||||||
|
void javaVersionSelected(BaseVersion::Ptr version);
|
||||||
|
void on_javaBrowseBtn_clicked();
|
||||||
|
void on_javaStatusBtn_clicked();
|
||||||
|
void javaDownloadBtn_clicked();
|
||||||
|
void checkFinished(const JavaChecker::Result& result);
|
||||||
|
|
||||||
|
protected: /* methods */
|
||||||
|
void checkJavaPathOnEdit(const QString& path);
|
||||||
|
void checkJavaPath(const QString& path);
|
||||||
|
void setJavaStatus(JavaStatus status);
|
||||||
|
void setupUi();
|
||||||
|
|
||||||
|
private: /* data */
|
||||||
|
VersionSelectWidget* m_versionWidget = nullptr;
|
||||||
|
QVBoxLayout* m_verticalLayout = nullptr;
|
||||||
|
QSpacerItem* m_verticalSpacer = nullptr;
|
||||||
|
|
||||||
|
QLineEdit* m_javaPathTextBox = nullptr;
|
||||||
|
QPushButton* m_javaBrowseBtn = nullptr;
|
||||||
|
QToolButton* m_javaStatusBtn = nullptr;
|
||||||
|
QHBoxLayout* m_horizontalLayout = nullptr;
|
||||||
|
|
||||||
|
QGroupBox* m_memoryGroupBox = nullptr;
|
||||||
|
QGridLayout* m_gridLayout_2 = nullptr;
|
||||||
|
QSpinBox* m_maxMemSpinBox = nullptr;
|
||||||
|
QLabel* m_labelMinMem = nullptr;
|
||||||
|
QLabel* m_labelMaxMem = nullptr;
|
||||||
|
QLabel* m_labelMaxMemIcon = nullptr;
|
||||||
|
QSpinBox* m_minMemSpinBox = nullptr;
|
||||||
|
QLabel* m_labelPermGen = nullptr;
|
||||||
|
QSpinBox* m_permGenSpinBox = nullptr;
|
||||||
|
|
||||||
|
QHBoxLayout* m_horizontalBtnLayout = nullptr;
|
||||||
|
QPushButton* m_javaDownloadBtn = nullptr;
|
||||||
|
QIcon goodIcon;
|
||||||
|
QIcon yellowIcon;
|
||||||
|
QIcon badIcon;
|
||||||
|
|
||||||
|
QGroupBox* m_autoJavaGroupBox = nullptr;
|
||||||
|
QVBoxLayout* m_veriticalJavaLayout = nullptr;
|
||||||
|
QCheckBox* m_autodetectJavaCheckBox = nullptr;
|
||||||
|
QCheckBox* m_autodownloadCheckBox = nullptr;
|
||||||
|
|
||||||
|
unsigned int observedMinMemory = 0;
|
||||||
|
unsigned int observedMaxMemory = 0;
|
||||||
|
unsigned int observedPermGenMemory = 0;
|
||||||
|
QString queuedCheck;
|
||||||
|
uint64_t m_availableMemory = 0ull;
|
||||||
|
shared_qobject_ptr<JavaChecker> m_checker;
|
||||||
|
JavaChecker::Result m_result;
|
||||||
|
QTimer* m_memoryTimer;
|
||||||
|
};
|
460
launcher/ui/widgets/MinecraftSettingsWidget.cpp
Normal file
460
launcher/ui/widgets/MinecraftSettingsWidget.cpp
Normal file
@ -0,0 +1,460 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
/*
|
||||||
|
* Prism Launcher - Minecraft Launcher
|
||||||
|
* Copyright (c) 2022 Jamie Mansfield <jmansfield@cadixdev.org>
|
||||||
|
* Copyright (C) 2022 Sefa Eyeoglu <contact@scrumplex.net>
|
||||||
|
* Copyright (C) 2024 TheKodeToad <TheKodeToad@proton.me>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, version 3.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This file incorporates work covered by the following copyright and
|
||||||
|
* permission notice:
|
||||||
|
*
|
||||||
|
* Copyright 2013-2021 MultiMC Contributors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "MinecraftSettingsWidget.h"
|
||||||
|
|
||||||
|
#include "Application.h"
|
||||||
|
#include "BuildConfig.h"
|
||||||
|
#include "minecraft/WorldList.h"
|
||||||
|
#include "minecraft/auth/AccountList.h"
|
||||||
|
#include "settings/Setting.h"
|
||||||
|
#include "ui_MinecraftSettingsWidget.h"
|
||||||
|
|
||||||
|
MinecraftSettingsWidget::MinecraftSettingsWidget(MinecraftInstancePtr instance, QWidget* parent)
|
||||||
|
: QWidget(parent), m_instance(std::move(instance)), m_ui(new Ui::MinecraftSettingsWidget)
|
||||||
|
{
|
||||||
|
m_ui->setupUi(this);
|
||||||
|
|
||||||
|
if (m_instance == nullptr) {
|
||||||
|
for (int i = m_ui->settingsTabs->count() - 1; i >= 0; --i) {
|
||||||
|
const QString name = m_ui->settingsTabs->widget(i)->objectName();
|
||||||
|
|
||||||
|
if (name == "javaPage" || name == "launchPage")
|
||||||
|
m_ui->settingsTabs->removeTab(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_ui->openGlobalSettingsButton->setVisible(false);
|
||||||
|
} else {
|
||||||
|
m_javaSettings = new JavaSettingsWidget(m_instance, this);
|
||||||
|
m_ui->javaScrollArea->setWidget(m_javaSettings);
|
||||||
|
|
||||||
|
m_ui->showGameTime->setText(tr("Show time &playing this instance"));
|
||||||
|
m_ui->recordGameTime->setText(tr("&Record time playing this instance"));
|
||||||
|
m_ui->showGlobalGameTime->hide();
|
||||||
|
m_ui->showGameTimeWithoutDays->hide();
|
||||||
|
|
||||||
|
m_ui->maximizedWarning->setText(
|
||||||
|
tr("<span style=\" font-weight:600; color:#f5c211;\">Warning</span><span style=\" color:#f5c211;\">: The maximized option is "
|
||||||
|
"not fully supported on this Minecraft version.</span>"));
|
||||||
|
|
||||||
|
m_ui->miscellaneousSettingsBox->setCheckable(true);
|
||||||
|
m_ui->consoleSettingsBox->setCheckable(true);
|
||||||
|
m_ui->windowSizeGroupBox->setCheckable(true);
|
||||||
|
m_ui->nativeWorkaroundsGroupBox->setCheckable(true);
|
||||||
|
m_ui->perfomanceGroupBox->setCheckable(true);
|
||||||
|
m_ui->gameTimeGroupBox->setCheckable(true);
|
||||||
|
m_ui->legacySettingsGroupBox->setCheckable(true);
|
||||||
|
|
||||||
|
m_quickPlaySingleplayer = m_instance->traits().contains("feature:is_quick_play_singleplayer");
|
||||||
|
if (m_quickPlaySingleplayer) {
|
||||||
|
auto worlds = m_instance->worldList();
|
||||||
|
worlds->update();
|
||||||
|
for (const auto& world : worlds->allWorlds()) {
|
||||||
|
m_ui->worldsCb->addItem(world.folderName());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
m_ui->worldsCb->hide();
|
||||||
|
m_ui->worldJoinButton->hide();
|
||||||
|
m_ui->serverJoinAddressButton->setChecked(true);
|
||||||
|
m_ui->serverJoinAddress->setEnabled(true);
|
||||||
|
m_ui->serverJoinAddressButton->setStyleSheet("QRadioButton::indicator { width: 0px; height: 0px; }");
|
||||||
|
}
|
||||||
|
|
||||||
|
connect(m_ui->openGlobalSettingsButton, &QCommandLinkButton::clicked, this, &MinecraftSettingsWidget::openGlobalSettings);
|
||||||
|
connect(m_ui->serverJoinAddressButton, &QAbstractButton::toggled, m_ui->serverJoinAddress, &QWidget::setEnabled);
|
||||||
|
connect(m_ui->worldJoinButton, &QAbstractButton::toggled, m_ui->worldsCb, &QWidget::setEnabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_ui->maximizedWarning->hide();
|
||||||
|
|
||||||
|
connect(m_ui->maximizedCheckBox, &QCheckBox::toggled, this,
|
||||||
|
[this](const bool value) { m_ui->maximizedWarning->setVisible(value && (m_instance == nullptr || !m_instance->isLegacy())); });
|
||||||
|
|
||||||
|
#if !defined(Q_OS_LINUX)
|
||||||
|
m_ui->perfomanceGroupBox->hide();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (!(APPLICATION->capabilities() & Application::SupportsGameMode)) {
|
||||||
|
m_ui->enableFeralGamemodeCheck->setDisabled(true);
|
||||||
|
m_ui->enableFeralGamemodeCheck->setToolTip(tr("Feral Interactive's GameMode could not be found on your system."));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(APPLICATION->capabilities() & Application::SupportsMangoHud)) {
|
||||||
|
m_ui->enableMangoHud->setEnabled(false);
|
||||||
|
m_ui->enableMangoHud->setToolTip(tr("MangoHud could not be found on your system."));
|
||||||
|
}
|
||||||
|
|
||||||
|
connect(m_ui->useNativeOpenALCheck, &QAbstractButton::toggled, m_ui->lineEditOpenALPath, &QWidget::setEnabled);
|
||||||
|
connect(m_ui->useNativeGLFWCheck, &QAbstractButton::toggled, m_ui->lineEditGLFWPath, &QWidget::setEnabled);
|
||||||
|
|
||||||
|
loadSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
MinecraftSettingsWidget::~MinecraftSettingsWidget()
|
||||||
|
{
|
||||||
|
delete m_ui;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MinecraftSettingsWidget::loadSettings()
|
||||||
|
{
|
||||||
|
SettingsObjectPtr settings;
|
||||||
|
|
||||||
|
if (m_instance != nullptr)
|
||||||
|
settings = m_instance->settings();
|
||||||
|
else
|
||||||
|
settings = APPLICATION->settings();
|
||||||
|
|
||||||
|
// Game Window
|
||||||
|
m_ui->windowSizeGroupBox->setChecked(m_instance == nullptr || settings->get("OverrideWindow").toBool());
|
||||||
|
m_ui->windowSizeGroupBox->setChecked(settings->get("OverrideWindow").toBool());
|
||||||
|
m_ui->maximizedCheckBox->setChecked(settings->get("LaunchMaximized").toBool());
|
||||||
|
m_ui->windowWidthSpinBox->setValue(settings->get("MinecraftWinWidth").toInt());
|
||||||
|
m_ui->windowHeightSpinBox->setValue(settings->get("MinecraftWinHeight").toInt());
|
||||||
|
|
||||||
|
// Game Time
|
||||||
|
m_ui->gameTimeGroupBox->setChecked(m_instance == nullptr || settings->get("OverrideGameTime").toBool());
|
||||||
|
m_ui->showGameTime->setChecked(settings->get("ShowGameTime").toBool());
|
||||||
|
m_ui->recordGameTime->setChecked(settings->get("RecordGameTime").toBool());
|
||||||
|
m_ui->showGlobalGameTime->setChecked(m_instance == nullptr && settings->get("ShowGlobalGameTime").toBool());
|
||||||
|
m_ui->showGameTimeWithoutDays->setChecked(m_instance == nullptr && settings->get("ShowGameTimeWithoutDays").toBool());
|
||||||
|
|
||||||
|
// Console
|
||||||
|
m_ui->consoleSettingsBox->setChecked(m_instance == nullptr || settings->get("OverrideConsole").toBool());
|
||||||
|
m_ui->showConsoleCheck->setChecked(settings->get("ShowConsole").toBool());
|
||||||
|
m_ui->autoCloseConsoleCheck->setChecked(settings->get("AutoCloseConsole").toBool());
|
||||||
|
m_ui->showConsoleErrorCheck->setChecked(settings->get("ShowConsoleOnError").toBool());
|
||||||
|
|
||||||
|
// Miscellaneous
|
||||||
|
m_ui->miscellaneousSettingsBox->setChecked(settings->get("OverrideMiscellaneous").toBool());
|
||||||
|
m_ui->closeAfterLaunchCheck->setChecked(settings->get("CloseAfterLaunch").toBool());
|
||||||
|
m_ui->quitAfterGameStopCheck->setChecked(settings->get("QuitAfterGameStop").toBool());
|
||||||
|
|
||||||
|
if (m_javaSettings != nullptr)
|
||||||
|
m_javaSettings->loadSettings();
|
||||||
|
|
||||||
|
// Custom commands
|
||||||
|
m_ui->customCommands->initialize(m_instance != nullptr, m_instance == nullptr || settings->get("OverrideCommands").toBool(),
|
||||||
|
settings->get("PreLaunchCommand").toString(), settings->get("WrapperCommand").toString(),
|
||||||
|
settings->get("PostExitCommand").toString());
|
||||||
|
|
||||||
|
// Environment variables
|
||||||
|
m_ui->environmentVariables->initialize(m_instance != nullptr, m_instance == nullptr || settings->get("OverrideEnv").toBool(),
|
||||||
|
settings->get("Env").toMap());
|
||||||
|
|
||||||
|
// Legacy Tweaks
|
||||||
|
m_ui->legacySettingsGroupBox->setChecked(m_instance == nullptr || settings->get("OverrideLegacySettings").toBool());
|
||||||
|
m_ui->onlineFixes->setChecked(settings->get("OnlineFixes").toBool());
|
||||||
|
|
||||||
|
// Native Libraries
|
||||||
|
m_ui->nativeWorkaroundsGroupBox->setChecked(m_instance == nullptr || settings->get("OverrideNativeWorkarounds").toBool());
|
||||||
|
m_ui->useNativeGLFWCheck->setChecked(settings->get("UseNativeGLFW").toBool());
|
||||||
|
m_ui->lineEditGLFWPath->setText(settings->get("CustomGLFWPath").toString());
|
||||||
|
#ifdef Q_OS_LINUX
|
||||||
|
m_ui->lineEditGLFWPath->setPlaceholderText(APPLICATION->m_detectedGLFWPath);
|
||||||
|
#else
|
||||||
|
m_ui->lineEditGLFWPath->setPlaceholderText(tr("Path to %1 library file").arg(BuildConfig.GLFW_LIBRARY_NAME));
|
||||||
|
#endif
|
||||||
|
m_ui->useNativeOpenALCheck->setChecked(settings->get("UseNativeOpenAL").toBool());
|
||||||
|
m_ui->lineEditOpenALPath->setText(settings->get("CustomOpenALPath").toString());
|
||||||
|
#ifdef Q_OS_LINUX
|
||||||
|
m_ui->lineEditOpenALPath->setPlaceholderText(APPLICATION->m_detectedOpenALPath);
|
||||||
|
#else
|
||||||
|
m_ui->lineEditOpenALPath->setPlaceholderText(tr("Path to %1 library file").arg(BuildConfig.OPENAL_LIBRARY_NAME));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Performance
|
||||||
|
m_ui->perfomanceGroupBox->setChecked(m_instance == nullptr || settings->get("OverridePerformance").toBool());
|
||||||
|
m_ui->enableFeralGamemodeCheck->setChecked(settings->get("EnableFeralGamemode").toBool());
|
||||||
|
m_ui->enableMangoHud->setChecked(settings->get("EnableMangoHud").toBool());
|
||||||
|
m_ui->useDiscreteGpuCheck->setChecked(settings->get("UseDiscreteGpu").toBool());
|
||||||
|
m_ui->useZink->setChecked(settings->get("UseZink").toBool());
|
||||||
|
|
||||||
|
m_ui->serverJoinGroupBox->setChecked(settings->get("JoinServerOnLaunch").toBool());
|
||||||
|
|
||||||
|
if (m_instance != nullptr) {
|
||||||
|
if (auto server = settings->get("JoinServerOnLaunchAddress").toString(); !server.isEmpty()) {
|
||||||
|
m_ui->serverJoinAddress->setText(server);
|
||||||
|
m_ui->serverJoinAddressButton->setChecked(true);
|
||||||
|
m_ui->worldJoinButton->setChecked(false);
|
||||||
|
m_ui->serverJoinAddress->setEnabled(true);
|
||||||
|
m_ui->worldsCb->setEnabled(false);
|
||||||
|
} else if (auto world = settings->get("JoinWorldOnLaunch").toString(); !world.isEmpty() && m_quickPlaySingleplayer) {
|
||||||
|
m_ui->worldsCb->setCurrentText(world);
|
||||||
|
m_ui->serverJoinAddressButton->setChecked(false);
|
||||||
|
m_ui->worldJoinButton->setChecked(true);
|
||||||
|
m_ui->serverJoinAddress->setEnabled(false);
|
||||||
|
m_ui->worldsCb->setEnabled(true);
|
||||||
|
} else {
|
||||||
|
m_ui->serverJoinAddressButton->setChecked(true);
|
||||||
|
m_ui->worldJoinButton->setChecked(false);
|
||||||
|
m_ui->serverJoinAddress->setEnabled(true);
|
||||||
|
m_ui->worldsCb->setEnabled(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_ui->instanceAccountGroupBox->setChecked(settings->get("UseAccountForInstance").toBool());
|
||||||
|
updateAccountsMenu(*settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_ui->legacySettingsGroupBox->setChecked(settings->get("OverrideLegacySettings").toBool());
|
||||||
|
m_ui->onlineFixes->setChecked(settings->get("OnlineFixes").toBool());
|
||||||
|
}
|
||||||
|
|
||||||
|
void MinecraftSettingsWidget::saveSettings()
|
||||||
|
{
|
||||||
|
SettingsObjectPtr settings;
|
||||||
|
|
||||||
|
if (m_instance != nullptr)
|
||||||
|
settings = m_instance->settings();
|
||||||
|
else
|
||||||
|
settings = APPLICATION->settings();
|
||||||
|
|
||||||
|
{
|
||||||
|
SettingsObject::Lock lock(settings);
|
||||||
|
|
||||||
|
// Miscellaneous
|
||||||
|
bool miscellaneous = m_instance == nullptr || m_ui->miscellaneousSettingsBox->isChecked();
|
||||||
|
|
||||||
|
if (m_instance != nullptr)
|
||||||
|
settings->set("OverrideMiscellaneous", miscellaneous);
|
||||||
|
|
||||||
|
if (miscellaneous) {
|
||||||
|
settings->set("CloseAfterLaunch", m_ui->closeAfterLaunchCheck->isChecked());
|
||||||
|
settings->set("QuitAfterGameStop", m_ui->quitAfterGameStopCheck->isChecked());
|
||||||
|
} else {
|
||||||
|
settings->reset("CloseAfterLaunch");
|
||||||
|
settings->reset("QuitAfterGameStop");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Console
|
||||||
|
bool console = m_instance == nullptr || m_ui->consoleSettingsBox->isChecked();
|
||||||
|
|
||||||
|
if (m_instance != nullptr)
|
||||||
|
settings->set("OverrideConsole", console);
|
||||||
|
|
||||||
|
if (console) {
|
||||||
|
settings->set("ShowConsole", m_ui->showConsoleCheck->isChecked());
|
||||||
|
settings->set("AutoCloseConsole", m_ui->autoCloseConsoleCheck->isChecked());
|
||||||
|
settings->set("ShowConsoleOnError", m_ui->showConsoleErrorCheck->isChecked());
|
||||||
|
} else {
|
||||||
|
settings->reset("ShowConsole");
|
||||||
|
settings->reset("AutoCloseConsole");
|
||||||
|
settings->reset("ShowConsoleOnError");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Window Size
|
||||||
|
bool window = m_instance == nullptr || m_ui->windowSizeGroupBox->isChecked();
|
||||||
|
|
||||||
|
if (m_instance != nullptr)
|
||||||
|
settings->set("OverrideWindow", window);
|
||||||
|
|
||||||
|
if (window) {
|
||||||
|
settings->set("LaunchMaximized", m_ui->maximizedCheckBox->isChecked());
|
||||||
|
settings->set("MinecraftWinWidth", m_ui->windowWidthSpinBox->value());
|
||||||
|
settings->set("MinecraftWinHeight", m_ui->windowHeightSpinBox->value());
|
||||||
|
} else {
|
||||||
|
settings->reset("LaunchMaximized");
|
||||||
|
settings->reset("MinecraftWinWidth");
|
||||||
|
settings->reset("MinecraftWinHeight");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Custom Commands
|
||||||
|
bool custcmd = m_instance == nullptr || m_ui->customCommands->checked();
|
||||||
|
|
||||||
|
if (m_instance != nullptr)
|
||||||
|
settings->set("OverrideCommands", custcmd);
|
||||||
|
|
||||||
|
if (custcmd) {
|
||||||
|
settings->set("PreLaunchCommand", m_ui->customCommands->prelaunchCommand());
|
||||||
|
settings->set("WrapperCommand", m_ui->customCommands->wrapperCommand());
|
||||||
|
settings->set("PostExitCommand", m_ui->customCommands->postexitCommand());
|
||||||
|
} else {
|
||||||
|
settings->reset("PreLaunchCommand");
|
||||||
|
settings->reset("WrapperCommand");
|
||||||
|
settings->reset("PostExitCommand");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Environment Variables
|
||||||
|
auto env = m_instance == nullptr || m_ui->environmentVariables->override();
|
||||||
|
|
||||||
|
if (m_instance != nullptr)
|
||||||
|
settings->set("OverrideEnv", env);
|
||||||
|
|
||||||
|
if (env)
|
||||||
|
settings->set("Env", m_ui->environmentVariables->value());
|
||||||
|
else
|
||||||
|
settings->reset("Env");
|
||||||
|
|
||||||
|
// Workarounds
|
||||||
|
bool workarounds = m_instance == nullptr || m_ui->nativeWorkaroundsGroupBox->isChecked();
|
||||||
|
|
||||||
|
if (m_instance != nullptr)
|
||||||
|
settings->set("OverrideNativeWorkarounds", workarounds);
|
||||||
|
|
||||||
|
if (workarounds) {
|
||||||
|
settings->set("UseNativeGLFW", m_ui->useNativeGLFWCheck->isChecked());
|
||||||
|
settings->set("CustomGLFWPath", m_ui->lineEditGLFWPath->text());
|
||||||
|
settings->set("UseNativeOpenAL", m_ui->useNativeOpenALCheck->isChecked());
|
||||||
|
settings->set("CustomOpenALPath", m_ui->lineEditOpenALPath->text());
|
||||||
|
} else {
|
||||||
|
settings->reset("UseNativeGLFW");
|
||||||
|
settings->reset("CustomGLFWPath");
|
||||||
|
settings->reset("UseNativeOpenAL");
|
||||||
|
settings->reset("CustomOpenALPath");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Performance
|
||||||
|
bool performance = m_instance == nullptr || m_ui->perfomanceGroupBox->isChecked();
|
||||||
|
|
||||||
|
if (m_instance != nullptr)
|
||||||
|
settings->set("OverridePerformance", performance);
|
||||||
|
|
||||||
|
if (performance) {
|
||||||
|
settings->set("EnableFeralGamemode", m_ui->enableFeralGamemodeCheck->isChecked());
|
||||||
|
settings->set("EnableMangoHud", m_ui->enableMangoHud->isChecked());
|
||||||
|
settings->set("UseDiscreteGpu", m_ui->useDiscreteGpuCheck->isChecked());
|
||||||
|
settings->set("UseZink", m_ui->useZink->isChecked());
|
||||||
|
} else {
|
||||||
|
settings->reset("EnableFeralGamemode");
|
||||||
|
settings->reset("EnableMangoHud");
|
||||||
|
settings->reset("UseDiscreteGpu");
|
||||||
|
settings->reset("UseZink");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Game time
|
||||||
|
bool gameTime = m_instance == nullptr || m_ui->gameTimeGroupBox->isChecked();
|
||||||
|
|
||||||
|
if (m_instance != nullptr)
|
||||||
|
settings->set("OverrideGameTime", gameTime);
|
||||||
|
|
||||||
|
if (gameTime) {
|
||||||
|
settings->set("ShowGameTime", m_ui->showGameTime->isChecked());
|
||||||
|
settings->set("RecordGameTime", m_ui->recordGameTime->isChecked());
|
||||||
|
} else {
|
||||||
|
settings->reset("ShowGameTime");
|
||||||
|
settings->reset("RecordGameTime");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_instance == nullptr) {
|
||||||
|
settings->set("ShowGlobalGameTime", m_ui->showGlobalGameTime->isChecked());
|
||||||
|
settings->set("ShowGameTimeWithoutDays", m_ui->showGameTimeWithoutDays->isChecked());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_instance != nullptr) {
|
||||||
|
// Join server on launch
|
||||||
|
bool joinServerOnLaunch = m_ui->serverJoinGroupBox->isChecked();
|
||||||
|
settings->set("JoinServerOnLaunch", joinServerOnLaunch);
|
||||||
|
if (joinServerOnLaunch) {
|
||||||
|
if (m_ui->serverJoinAddressButton->isChecked() || !m_quickPlaySingleplayer) {
|
||||||
|
settings->set("JoinServerOnLaunchAddress", m_ui->serverJoinAddress->text());
|
||||||
|
settings->reset("JoinWorldOnLaunch");
|
||||||
|
} else {
|
||||||
|
settings->set("JoinWorldOnLaunch", m_ui->worldsCb->currentText());
|
||||||
|
settings->reset("JoinServerOnLaunchAddress");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
settings->reset("JoinServerOnLaunchAddress");
|
||||||
|
settings->reset("JoinWorldOnLaunch");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use an account for this instance
|
||||||
|
bool useAccountForInstance = m_ui->instanceAccountGroupBox->isChecked();
|
||||||
|
settings->set("UseAccountForInstance", useAccountForInstance);
|
||||||
|
if (useAccountForInstance) {
|
||||||
|
int accountIndex = m_ui->instanceAccountSelector->currentIndex();
|
||||||
|
|
||||||
|
if (accountIndex != -1) {
|
||||||
|
const MinecraftAccountPtr account = APPLICATION->accounts()->at(accountIndex);
|
||||||
|
if (account != nullptr)
|
||||||
|
settings->set("InstanceAccountId", account->profileId());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
settings->reset("InstanceAccountId");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool overrideLegacySettings = m_instance == nullptr || m_ui->legacySettingsGroupBox->isChecked();
|
||||||
|
|
||||||
|
if (m_instance != nullptr)
|
||||||
|
settings->set("OverrideLegacySettings", overrideLegacySettings);
|
||||||
|
|
||||||
|
if (overrideLegacySettings) {
|
||||||
|
settings->set("OnlineFixes", m_ui->onlineFixes->isChecked());
|
||||||
|
} else {
|
||||||
|
settings->reset("OnlineFixes");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_javaSettings != nullptr)
|
||||||
|
m_javaSettings->saveSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MinecraftSettingsWidget::openGlobalSettings()
|
||||||
|
{
|
||||||
|
const QString id = m_ui->settingsTabs->currentWidget()->objectName();
|
||||||
|
|
||||||
|
qDebug() << id;
|
||||||
|
|
||||||
|
if (id == "javaPage")
|
||||||
|
APPLICATION->ShowGlobalSettings(this, "java-settings");
|
||||||
|
else // TODO select tab
|
||||||
|
APPLICATION->ShowGlobalSettings(this, "minecraft-settings");
|
||||||
|
}
|
||||||
|
|
||||||
|
void MinecraftSettingsWidget::updateAccountsMenu(const SettingsObject& settings)
|
||||||
|
{
|
||||||
|
m_ui->instanceAccountSelector->clear();
|
||||||
|
auto accounts = APPLICATION->accounts();
|
||||||
|
int accountIndex = accounts->findAccountByProfileId(settings.get("InstanceAccountId").toString());
|
||||||
|
|
||||||
|
for (int i = 0; i < accounts->count(); i++) {
|
||||||
|
MinecraftAccountPtr account = accounts->at(i);
|
||||||
|
|
||||||
|
QIcon face = account->getFace();
|
||||||
|
|
||||||
|
if (face.isNull())
|
||||||
|
face = APPLICATION->getThemedIcon("noaccount");
|
||||||
|
|
||||||
|
m_ui->instanceAccountSelector->addItem(face, account->profileName(), i);
|
||||||
|
if (i == accountIndex)
|
||||||
|
m_ui->instanceAccountSelector->setCurrentIndex(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MinecraftSettingsWidget::isQuickPlaySupported()
|
||||||
|
{
|
||||||
|
return m_instance->traits().contains("feature:is_quick_play_singleplayer");
|
||||||
|
}
|
@ -2,6 +2,7 @@
|
|||||||
/*
|
/*
|
||||||
* Prism Launcher - Minecraft Launcher
|
* Prism Launcher - Minecraft Launcher
|
||||||
* Copyright (c) 2022 Jamie Mansfield <jmansfield@cadixdev.org>
|
* Copyright (c) 2022 Jamie Mansfield <jmansfield@cadixdev.org>
|
||||||
|
* Copyright (C) 2024 TheKodeToad <TheKodeToad@proton.me>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -35,29 +36,29 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <QDialog>
|
#include <QWidget>
|
||||||
#include <memory>
|
#include "JavaSettingsWidget.h"
|
||||||
|
#include "minecraft/MinecraftInstance.h"
|
||||||
|
|
||||||
#include <Application.h>
|
namespace Ui {
|
||||||
#include "ui/pages/BasePage.h"
|
class MinecraftSettingsWidget;
|
||||||
#include "ui/widgets/CustomCommands.h"
|
}
|
||||||
|
|
||||||
class CustomCommandsPage : public QWidget, public BasePage {
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
|
class MinecraftSettingsWidget : public QWidget {
|
||||||
public:
|
public:
|
||||||
explicit CustomCommandsPage(QWidget* parent = 0);
|
MinecraftSettingsWidget(MinecraftInstancePtr instance, QWidget* parent = nullptr);
|
||||||
~CustomCommandsPage();
|
~MinecraftSettingsWidget() override;
|
||||||
|
|
||||||
QString displayName() const override { return tr("Custom Commands"); }
|
void loadSettings();
|
||||||
QIcon icon() const override { return APPLICATION->getThemedIcon("custom-commands"); }
|
void saveSettings();
|
||||||
QString id() const override { return "custom-commands"; }
|
|
||||||
QString helpPage() const override { return "Custom-commands"; }
|
|
||||||
bool apply() override;
|
|
||||||
void retranslate() override;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void applySettings();
|
void openGlobalSettings();
|
||||||
void loadSettings();
|
void updateAccountsMenu(const SettingsObject& settings);
|
||||||
CustomCommands* commands;
|
bool isQuickPlaySupported();
|
||||||
|
|
||||||
|
MinecraftInstancePtr m_instance;
|
||||||
|
Ui::MinecraftSettingsWidget* m_ui;
|
||||||
|
JavaSettingsWidget* m_javaSettings = nullptr;
|
||||||
|
bool m_quickPlaySingleplayer = false;
|
||||||
};
|
};
|
686
launcher/ui/widgets/MinecraftSettingsWidget.ui
Normal file
686
launcher/ui/widgets/MinecraftSettingsWidget.ui
Normal file
@ -0,0 +1,686 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>MinecraftSettingsWidget</class>
|
||||||
|
<widget class="QWidget" name="MinecraftSettingsWidget">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>648</width>
|
||||||
|
<height>400</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QCommandLinkButton" name="openGlobalSettingsButton">
|
||||||
|
<property name="text">
|
||||||
|
<string>Open &Global Settings</string>
|
||||||
|
</property>
|
||||||
|
<property name="description">
|
||||||
|
<string>The settings here are overrides for global settings.</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QTabWidget" name="settingsTabs">
|
||||||
|
<property name="currentIndex">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<widget class="QWidget" name="generalPage">
|
||||||
|
<attribute name="title">
|
||||||
|
<string>General</string>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||||
|
<item>
|
||||||
|
<widget class="QScrollArea" name="scrollArea">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Minimum" vsizetype="Expanding">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="horizontalScrollBarPolicy">
|
||||||
|
<enum>Qt::ScrollBarAlwaysOff</enum>
|
||||||
|
</property>
|
||||||
|
<property name="widgetResizable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<widget class="QWidget" name="scrollAreaWidgetContents">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>-253</y>
|
||||||
|
<width>610</width>
|
||||||
|
<height>550</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_5">
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="windowSizeGroupBox">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="title">
|
||||||
|
<string>Game &Window</string>
|
||||||
|
</property>
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_4">
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="maximizedCheckBox">
|
||||||
|
<property name="text">
|
||||||
|
<string>Start Minecraft maximized</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="maximizedWarning">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>The base game only supports resolution. In order to simulate the maximized behaviour the current implementation approximates the maximum display size.</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string><html><head/><body><p><span style=" font-weight:600; color:#f5c211;">Warning</span><span style=" color:#f5c211;">: The maximized option may not be fully supported on all Minecraft versions.</span></p></body></html></string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QGridLayout" name="gridLayoutWindowSize">
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QLabel" name="labelWindowHeight">
|
||||||
|
<property name="text">
|
||||||
|
<string>Window height:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QLabel" name="labelWindowWidth">
|
||||||
|
<property name="text">
|
||||||
|
<string>Window width:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QSpinBox" name="windowWidthSpinBox">
|
||||||
|
<property name="minimum">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>65536</number>
|
||||||
|
</property>
|
||||||
|
<property name="singleStep">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>854</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QSpinBox" name="windowHeightSpinBox">
|
||||||
|
<property name="minimum">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>65536</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>480</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="gameTimeGroupBox">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="title">
|
||||||
|
<string>Game &Time</string>
|
||||||
|
</property>
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_10">
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="showGameTime">
|
||||||
|
<property name="text">
|
||||||
|
<string>Show time spent &playing instances</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="recordGameTime">
|
||||||
|
<property name="text">
|
||||||
|
<string>&Record time spent playing instances</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="showGlobalGameTime">
|
||||||
|
<property name="text">
|
||||||
|
<string>Show the &total time played across instances</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="showGameTimeWithoutDays">
|
||||||
|
<property name="text">
|
||||||
|
<string>Always show durations in &hours</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="consoleSettingsBox">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="title">
|
||||||
|
<string>&Console</string>
|
||||||
|
</property>
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="showConsoleCheck">
|
||||||
|
<property name="text">
|
||||||
|
<string>Show console while the game is running</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="autoCloseConsoleCheck">
|
||||||
|
<property name="text">
|
||||||
|
<string>Automatically close console when the game quits</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="showConsoleErrorCheck">
|
||||||
|
<property name="text">
|
||||||
|
<string>Show console when the game crashes</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="miscellaneousSettingsBox">
|
||||||
|
<property name="title">
|
||||||
|
<string>&Miscellaneous</string>
|
||||||
|
</property>
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_12">
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="closeAfterLaunchCheck">
|
||||||
|
<property name="text">
|
||||||
|
<string>Close the launcher after game window opens</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="quitAfterGameStopCheck">
|
||||||
|
<property name="text">
|
||||||
|
<string>Quit the launcher after game window closes</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="verticalSpacer_2">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QWidget" name="javaPage">
|
||||||
|
<attribute name="title">
|
||||||
|
<string>Java</string>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_11">
|
||||||
|
<item>
|
||||||
|
<widget class="QScrollArea" name="javaScrollArea">
|
||||||
|
<property name="widgetResizable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<widget class="QWidget" name="scrollAreaWidgetContents_3">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>624</width>
|
||||||
|
<height>297</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QWidget" name="tweaksPage">
|
||||||
|
<attribute name="title">
|
||||||
|
<string>Tweaks</string>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_8">
|
||||||
|
<item>
|
||||||
|
<widget class="QScrollArea" name="scrollArea_2">
|
||||||
|
<property name="horizontalScrollBarPolicy">
|
||||||
|
<enum>Qt::ScrollBarAlwaysOff</enum>
|
||||||
|
</property>
|
||||||
|
<property name="widgetResizable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<widget class="QWidget" name="scrollAreaWidgetContents_2">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>-101</y>
|
||||||
|
<width>610</width>
|
||||||
|
<height>398</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_7">
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="legacySettingsGroupBox">
|
||||||
|
<property name="title">
|
||||||
|
<string>&Legacy Tweaks</string>
|
||||||
|
</property>
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_17">
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="onlineFixes">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Emulates usages of old online services which are no longer operating.</p><p>Current fixes include: skin and online mode support.</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Enable online fixes (experimental)</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="nativeWorkaroundsGroupBox">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="title">
|
||||||
|
<string>&Native Libraries</string>
|
||||||
|
</property>
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_3">
|
||||||
|
<item row="2" column="0">
|
||||||
|
<widget class="QCheckBox" name="useNativeOpenALCheck">
|
||||||
|
<property name="text">
|
||||||
|
<string>Use system installation of OpenAL</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QLabel" name="labelGLFWPath">
|
||||||
|
<property name="text">
|
||||||
|
<string>&GLFW library path</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy">
|
||||||
|
<cstring>lineEditGLFWPath</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QCheckBox" name="useNativeGLFWCheck">
|
||||||
|
<property name="text">
|
||||||
|
<string>Use system installation of GLFW</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QLineEdit" name="lineEditGLFWPath">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0">
|
||||||
|
<widget class="QLabel" name="labelOpenALPath">
|
||||||
|
<property name="text">
|
||||||
|
<string>&OpenAL library path</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy">
|
||||||
|
<cstring>lineEditOpenALPath</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="1">
|
||||||
|
<widget class="QLineEdit" name="lineEditOpenALPath">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="perfomanceGroupBox">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="title">
|
||||||
|
<string>&Performance</string>
|
||||||
|
</property>
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_13">
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="enableFeralGamemodeCheck">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Enable Feral Interactive's GameMode, to potentially improve gaming performance.</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Enable Feral GameMode</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="enableMangoHud">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Enable MangoHud's advanced performance overlay.</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Enable MangoHud</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="useDiscreteGpuCheck">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Use the discrete GPU instead of the primary GPU.</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Use discrete GPU</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="useZink">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Use Zink, a Mesa OpenGL driver that implements OpenGL on top of Vulkan. Performance may vary depending on the situation. Note: If no suitable Vulkan driver is found, software rendering will be used.</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Use Zink</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="verticalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QWidget" name="launchPage">
|
||||||
|
<attribute name="title">
|
||||||
|
<string>Launch</string>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_9">
|
||||||
|
<item>
|
||||||
|
<widget class="QScrollArea" name="scrollArea_3">
|
||||||
|
<property name="widgetResizable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<widget class="QWidget" name="scrollAreaWidgetContents_5">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>624</width>
|
||||||
|
<height>297</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_14">
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="instanceAccountGroupBox">
|
||||||
|
<property name="title">
|
||||||
|
<string>Override default &account</string>
|
||||||
|
</property>
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_15">
|
||||||
|
<item>
|
||||||
|
<layout class="QGridLayout" name="instanceAccountLayout">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QLabel" name="instanceAccountNameLabel">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Account:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QComboBox" name="instanceAccountSelector"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="serverJoinGroupBox">
|
||||||
|
<property name="title">
|
||||||
|
<string>Set a &target to join on launch</string>
|
||||||
|
</property>
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_4">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QRadioButton" name="serverJoinAddressButton">
|
||||||
|
<property name="text">
|
||||||
|
<string>Server address:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="2">
|
||||||
|
<widget class="QLineEdit" name="serverJoinAddress"/>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QRadioButton" name="worldJoinButton">
|
||||||
|
<property name="text">
|
||||||
|
<string>Singleplayer world</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="2">
|
||||||
|
<widget class="QComboBox" name="worldsCb"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="verticalSpacer_3">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QWidget" name="customCommandsPage">
|
||||||
|
<attribute name="title">
|
||||||
|
<string>Custom Commands</string>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_6">
|
||||||
|
<item>
|
||||||
|
<widget class="CustomCommands" name="customCommands" native="true"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QWidget" name="environmentVariablesPage">
|
||||||
|
<attribute name="title">
|
||||||
|
<string>Environment Variables</string>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_16">
|
||||||
|
<item>
|
||||||
|
<widget class="EnvironmentVariables" name="environmentVariables" native="true"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<customwidgets>
|
||||||
|
<customwidget>
|
||||||
|
<class>CustomCommands</class>
|
||||||
|
<extends>QWidget</extends>
|
||||||
|
<header>ui/widgets/CustomCommands.h</header>
|
||||||
|
<container>1</container>
|
||||||
|
</customwidget>
|
||||||
|
<customwidget>
|
||||||
|
<class>EnvironmentVariables</class>
|
||||||
|
<extends>QWidget</extends>
|
||||||
|
<header>ui/widgets/EnvironmentVariables.h</header>
|
||||||
|
<container>1</container>
|
||||||
|
</customwidget>
|
||||||
|
</customwidgets>
|
||||||
|
<tabstops>
|
||||||
|
<tabstop>openGlobalSettingsButton</tabstop>
|
||||||
|
<tabstop>settingsTabs</tabstop>
|
||||||
|
<tabstop>scrollArea</tabstop>
|
||||||
|
<tabstop>maximizedCheckBox</tabstop>
|
||||||
|
<tabstop>windowWidthSpinBox</tabstop>
|
||||||
|
<tabstop>windowHeightSpinBox</tabstop>
|
||||||
|
<tabstop>showGameTime</tabstop>
|
||||||
|
<tabstop>recordGameTime</tabstop>
|
||||||
|
<tabstop>showGlobalGameTime</tabstop>
|
||||||
|
<tabstop>showGameTimeWithoutDays</tabstop>
|
||||||
|
<tabstop>showConsoleCheck</tabstop>
|
||||||
|
<tabstop>autoCloseConsoleCheck</tabstop>
|
||||||
|
<tabstop>showConsoleErrorCheck</tabstop>
|
||||||
|
<tabstop>closeAfterLaunchCheck</tabstop>
|
||||||
|
<tabstop>quitAfterGameStopCheck</tabstop>
|
||||||
|
<tabstop>javaScrollArea</tabstop>
|
||||||
|
<tabstop>scrollArea_2</tabstop>
|
||||||
|
<tabstop>onlineFixes</tabstop>
|
||||||
|
<tabstop>useNativeGLFWCheck</tabstop>
|
||||||
|
<tabstop>lineEditGLFWPath</tabstop>
|
||||||
|
<tabstop>useNativeOpenALCheck</tabstop>
|
||||||
|
<tabstop>lineEditOpenALPath</tabstop>
|
||||||
|
<tabstop>perfomanceGroupBox</tabstop>
|
||||||
|
<tabstop>enableFeralGamemodeCheck</tabstop>
|
||||||
|
<tabstop>enableMangoHud</tabstop>
|
||||||
|
<tabstop>useDiscreteGpuCheck</tabstop>
|
||||||
|
<tabstop>useZink</tabstop>
|
||||||
|
<tabstop>scrollArea_3</tabstop>
|
||||||
|
<tabstop>instanceAccountGroupBox</tabstop>
|
||||||
|
<tabstop>instanceAccountSelector</tabstop>
|
||||||
|
<tabstop>serverJoinGroupBox</tabstop>
|
||||||
|
<tabstop>serverJoinAddressButton</tabstop>
|
||||||
|
<tabstop>serverJoinAddress</tabstop>
|
||||||
|
<tabstop>worldJoinButton</tabstop>
|
||||||
|
<tabstop>worldsCb</tabstop>
|
||||||
|
</tabstops>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
@ -279,16 +279,17 @@ void ModFilterWidget::onSideFilterChanged()
|
|||||||
{
|
{
|
||||||
QString side;
|
QString side;
|
||||||
|
|
||||||
if (ui->clientSide->isChecked() != ui->serverSide->isChecked()) {
|
if (ui->clientSide->isChecked() && !ui->serverSide->isChecked()) {
|
||||||
if (ui->clientSide->isChecked())
|
side = "client";
|
||||||
side = "client";
|
} else if (!ui->clientSide->isChecked() && ui->serverSide->isChecked()) {
|
||||||
else
|
side = "server";
|
||||||
side = "server";
|
} else if (ui->clientSide->isChecked() && ui->serverSide->isChecked()) {
|
||||||
|
side = "both";
|
||||||
} else {
|
} else {
|
||||||
// both are checked or none are checked; in either case no filtering will happen
|
|
||||||
side = "";
|
side = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
m_filter_changed = side != m_filter->side;
|
m_filter_changed = side != m_filter->side;
|
||||||
m_filter->side = side;
|
m_filter->side = side;
|
||||||
if (m_filter_changed)
|
if (m_filter_changed)
|
||||||
|
@ -47,6 +47,9 @@
|
|||||||
<property name="wordWrap">
|
<property name="wordWrap">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
@ -68,6 +71,9 @@
|
|||||||
<property name="alignment">
|
<property name="alignment">
|
||||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit 8fbf029685482827828b5858444157052f1b0a5f
|
Subproject commit 3460cd809b6dd311b58e92733ece2fc956224fd2
|
@ -1 +1 @@
|
|||||||
Subproject commit bbcbaff78283270c2beee69afd8d5b91da854af8
|
Subproject commit a3d9394aba4b35789293378e04fb7473d65edf97
|
@ -1 +1 @@
|
|||||||
Subproject commit 2fc4b463759e043476fc0036da094e5877e3dd50
|
Subproject commit 076592ce6e64568521b88a11881aa36b3d3f7048
|
@ -1 +1 @@
|
|||||||
Subproject commit 9d3aa3ee948c1cde5a9f873ecbc3bb229c1182ee
|
Subproject commit 8aeb3f7d8254f4bf1f7c6cf2a8f59c2ca141a552
|
@ -1 +1 @@
|
|||||||
Subproject commit 7eb2ffcc09f8e9890dc0b77ff8ab00fc53b1f2b8
|
Subproject commit c4369ae1d8955cae20c4ab40b9813ef4b60e48be
|
@ -1 +1 @@
|
|||||||
Subproject commit 04f42ceca40f73e2978b50e93806c2a18c1281fc
|
Subproject commit 51b7f2abdade71cd9bb0e7a373ef2610ec6f9daf
|
@ -7,7 +7,7 @@ Terminal=false
|
|||||||
Exec=@Launcher_APP_BINARY_NAME@ %U
|
Exec=@Launcher_APP_BINARY_NAME@ %U
|
||||||
StartupNotify=true
|
StartupNotify=true
|
||||||
Icon=org.@Launcher_APP_BINARY_NAME@.@Launcher_CommonName@
|
Icon=org.@Launcher_APP_BINARY_NAME@.@Launcher_CommonName@
|
||||||
Categories=Game;ActionGame;AdventureGame;Simulation;
|
Categories=Game;ActionGame;AdventureGame;Simulation;PackageManager;
|
||||||
Keywords=game;minecraft;mc;
|
Keywords=game;minecraft;mc;
|
||||||
StartupWMClass=@Launcher_CommonName@
|
StartupWMClass=@Launcher_CommonName@
|
||||||
MimeType=application/zip;application/x-modrinth-modpack+zip;x-scheme-handler/curseforge;x-scheme-handler/@Launcher_APP_BINARY_NAME@;
|
MimeType=application/zip;application/x-modrinth-modpack+zip;x-scheme-handler/curseforge;x-scheme-handler/@Launcher_APP_BINARY_NAME@;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user