diff --git a/lib/main/adapter/presentation/installation_bloc.dart b/lib/main/adapter/presentation/installation_bloc.dart index 2d3a76b..10706cc 100644 --- a/lib/main/adapter/presentation/installation_bloc.dart +++ b/lib/main/adapter/presentation/installation_bloc.dart @@ -1,5 +1,3 @@ -import 'dart:io'; - import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:minecraft_server_installer/main/adapter/presentation/installation_state.dart'; import 'package:minecraft_server_installer/main/adapter/presentation/progress_view_model.dart'; @@ -34,8 +32,9 @@ class InstallationBloc extends Bloc { ); final startScriptFilePath = path.join(savePath, Constants.startScriptFileName); + final serverFilePath = path.join('.', Constants.serverFileName); final startScriptContent = - 'java -Xmx${state.ramSize.max}M -Xms${state.ramSize.min}M -jar ${Platform.isWindows ? '.${Constants.serverFileName}\r\n' : './${Constants.serverFileName}\n'}'; + 'java -Xmx${state.ramSize.max}M -Xms${state.ramSize.min}M -jar $serverFilePath ${state.isGuiEnabled ? '' : 'nogui'}'; await writeFileUseCase(startScriptFilePath, startScriptContent); await grantFilePermissionUseCase(startScriptFilePath); @@ -67,6 +66,7 @@ class InstallationBloc extends Bloc { gameVersion: event.gameVersion, savePath: event.savePath, isEulaAgreed: event.isEulaAgreed, + isGuiEnabled: event.isGuiEnabled, isCustomRamSizeEnabled: event.isCustomRamSizeEnabled, customRamSize: event.customRamSize, ); @@ -89,6 +89,7 @@ class InstallationConfigurationUpdatedEvent extends InstallationEvent { final GameVersionViewModel? gameVersion; final String? savePath; final bool? isEulaAgreed; + final bool? isGuiEnabled; final bool? isCustomRamSizeEnabled; final RangeViewModel? customRamSize; @@ -96,6 +97,7 @@ class InstallationConfigurationUpdatedEvent extends InstallationEvent { this.gameVersion, this.savePath, this.isEulaAgreed, + this.isGuiEnabled, this.isCustomRamSizeEnabled, this.customRamSize, }); diff --git a/lib/main/adapter/presentation/installation_state.dart b/lib/main/adapter/presentation/installation_state.dart index 4a0a8c2..70c45a8 100644 --- a/lib/main/adapter/presentation/installation_state.dart +++ b/lib/main/adapter/presentation/installation_state.dart @@ -9,6 +9,7 @@ class InstallationState with EquatableMixin { final GameVersionViewModel? gameVersion; final String? savePath; final bool isEulaAgreed; + final bool isGuiEnabled; final bool isCustomRamSizeEnabled; final RangeViewModel? _customRamSize; final ProgressViewModel downloadProgress; @@ -18,6 +19,7 @@ class InstallationState with EquatableMixin { required this.gameVersion, required this.savePath, required this.isEulaAgreed, + required this.isGuiEnabled, required this.isCustomRamSizeEnabled, required RangeViewModel? customRamSize, required this.downloadProgress, @@ -29,6 +31,7 @@ class InstallationState with EquatableMixin { gameVersion: null, savePath: null, isEulaAgreed: false, + isGuiEnabled: false, isCustomRamSizeEnabled: false, customRamSize: _defaultRamSize, downloadProgress: const ProgressViewModel.zero(), @@ -40,6 +43,7 @@ class InstallationState with EquatableMixin { gameVersion, savePath, isEulaAgreed, + isGuiEnabled, isCustomRamSizeEnabled, _customRamSize, downloadProgress, @@ -50,6 +54,7 @@ class InstallationState with EquatableMixin { GameVersionViewModel? gameVersion, String? savePath, bool? isEulaAgreed, + bool? isGuiEnabled, bool? isCustomRamSizeEnabled, RangeViewModel? customRamSize, ProgressViewModel? downloadProgress, @@ -59,6 +64,7 @@ class InstallationState with EquatableMixin { gameVersion: gameVersion ?? this.gameVersion, savePath: savePath ?? this.savePath, isEulaAgreed: isEulaAgreed ?? this.isEulaAgreed, + isGuiEnabled: isGuiEnabled ?? this.isGuiEnabled, isCustomRamSizeEnabled: isCustomRamSizeEnabled ?? this.isCustomRamSizeEnabled, customRamSize: customRamSize ?? _customRamSize, downloadProgress: downloadProgress ?? this.downloadProgress, diff --git a/lib/main/framework/ui/basic_configuration_tab.dart b/lib/main/framework/ui/basic_configuration_tab.dart index f38736e..b7b267e 100644 --- a/lib/main/framework/ui/basic_configuration_tab.dart +++ b/lib/main/framework/ui/basic_configuration_tab.dart @@ -21,6 +21,7 @@ class BasicConfigurationTab extends StatelessWidget { _pathBrowsingField, const Gap(16), _eulaCheckbox, + _guiCheckBox, _enableCustomRamSizeCheckbox, _customRamSizeControl, const Spacer(), @@ -82,6 +83,19 @@ class BasicConfigurationTab extends StatelessWidget { ], ); + Widget get _guiCheckBox => BlocConsumer( + listener: (_, __) {}, + builder: (context, state) => CheckboxListTile( + title: const Text(Strings.fieldGui), + value: state.isGuiEnabled, + onChanged: (value) => + context.read().add(InstallationConfigurationUpdatedEvent(isGuiEnabled: value)), + controlAffinity: ListTileControlAffinity.leading, + contentPadding: EdgeInsets.zero, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(4)), + ), + ); + Widget get _enableCustomRamSizeCheckbox => BlocConsumer( listener: (_, __) {}, builder: (context, state) => CheckboxListTile( @@ -128,7 +142,7 @@ class BasicConfigurationTab extends StatelessWidget { canRequestFocus: false, readOnly: true, decoration: InputDecoration( - label: const Text('${Strings.labelMinRamSize} (MB)'), + label: const Text('${Strings.fieldMinRamSize} (MB)'), border: OutlineInputBorder(borderRadius: BorderRadius.circular(4)), ), ), @@ -140,7 +154,7 @@ class BasicConfigurationTab extends StatelessWidget { canRequestFocus: false, readOnly: true, decoration: InputDecoration( - label: const Text('${Strings.labelMaxRamSize} (MB)'), + label: const Text('${Strings.fieldMaxRamSize} (MB)'), border: OutlineInputBorder(borderRadius: BorderRadius.circular(4)), ), ), diff --git a/lib/main/framework/ui/strings.dart b/lib/main/framework/ui/strings.dart index 8210f2d..85205b0 100644 --- a/lib/main/framework/ui/strings.dart +++ b/lib/main/framework/ui/strings.dart @@ -2,11 +2,12 @@ abstract class Strings { static const fieldGameVersion = '遊戲版本'; static const fieldPath = '安裝路徑'; static const fieldEula = '我同意 EULA 條款'; + static const fieldGui = '啟用伺服器 GUI 介面'; static const fieldCustomRamSize = '啟用自定義 RAM 大小'; + static const fieldMinRamSize = '最小 RAM 大小'; + static const fieldMaxRamSize = '最大 RAM 大小'; static const buttonStartToInstall = '開始安裝'; static const buttonBrowse = '瀏覽'; - static const labelMinRamSize = '最小 RAM 大小'; - static const labelMaxRamSize = '最大 RAM 大小'; static const tooltipEulaInfo = '點擊查看 EULA 條款'; static const dialogTitleSelectDirectory = '選擇安裝目錄'; }