diff --git a/lib/main/framework/ui/basic_configuration_tab.dart b/lib/main/framework/ui/basic_configuration_tab.dart index 7a8392a..8069e03 100644 --- a/lib/main/framework/ui/basic_configuration_tab.dart +++ b/lib/main/framework/ui/basic_configuration_tab.dart @@ -1,10 +1,10 @@ +import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:gap/gap.dart'; import 'package:minecraft_server_installer/main/adapter/presentation/installation_bloc.dart'; import 'package:minecraft_server_installer/main/adapter/presentation/installation_state.dart'; import 'package:minecraft_server_installer/main/constants.dart'; -import 'package:minecraft_server_installer/main/framework/ui/path_browsing_field.dart'; import 'package:minecraft_server_installer/main/framework/ui/strings.dart'; import 'package:minecraft_server_installer/vanilla/framework/ui/game_version_dropdown.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -17,7 +17,7 @@ class BasicConfigurationTab extends StatelessWidget { children: [ const GameVersionDropdown(), const Gap(16), - const PathBrowsingField(), + _pathBrowsingField, const Gap(16), _eulaCheckbox, const Spacer(), @@ -25,6 +25,36 @@ class BasicConfigurationTab extends StatelessWidget { ], ); + Widget get _pathBrowsingField => BlocConsumer( + listener: (_, __) {}, + builder: (context, state) => Row( + children: [ + Expanded( + child: TextField( + controller: TextEditingController(text: state.savePath ?? ''), + readOnly: true, + canRequestFocus: false, + decoration: InputDecoration( + border: OutlineInputBorder(borderRadius: BorderRadius.circular(4)), + label: const Text('${Strings.fieldPath} *'), + ), + ), + ), + const Gap(8), + SizedBox( + height: 48, + child: OutlinedButton( + onPressed: () => _browseDirectory(context, initialPath: state.savePath), + style: OutlinedButton.styleFrom( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(4)), + ), + child: const Text(Strings.buttonBrowse), + ), + ), + ], + ), + ); + Widget get _eulaCheckbox => Row( children: [ Expanded( @@ -71,6 +101,22 @@ class BasicConfigurationTab extends StatelessWidget { ), ); + Future _browseDirectory(BuildContext context, {String? initialPath}) async { + final hasInitialPath = initialPath?.isNotEmpty ?? false; + final directory = await FilePicker.platform.getDirectoryPath( + dialogTitle: Strings.dialogTitleSelectDirectory, + initialDirectory: hasInitialPath ? initialPath : null, + ); + + if (!context.mounted || directory == null) { + return; + } + + context.read().add(InstallationConfigurationUpdatedEvent( + savePath: directory, + )); + } + void _downloadServerFile(BuildContext context) { context.read().add((InstallationStartedEvent())); } diff --git a/lib/main/framework/ui/path_browsing_field.dart b/lib/main/framework/ui/path_browsing_field.dart deleted file mode 100644 index ec86dad..0000000 --- a/lib/main/framework/ui/path_browsing_field.dart +++ /dev/null @@ -1,58 +0,0 @@ -import 'package:file_picker/file_picker.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:gap/gap.dart'; -import 'package:minecraft_server_installer/main/adapter/presentation/installation_bloc.dart'; -import 'package:minecraft_server_installer/main/adapter/presentation/installation_state.dart'; -import 'package:minecraft_server_installer/main/framework/ui/strings.dart'; - -class PathBrowsingField extends StatelessWidget { - const PathBrowsingField({super.key}); - - @override - Widget build(BuildContext context) => BlocConsumer( - listener: (_, __) {}, - builder: (_, state) => Row( - children: [ - Expanded( - child: TextField( - controller: TextEditingController(text: state.savePath ?? ''), - readOnly: true, - canRequestFocus: false, - decoration: InputDecoration( - border: OutlineInputBorder(borderRadius: BorderRadius.circular(4)), - label: const Text('${Strings.fieldPath} *'), - ), - ), - ), - const Gap(8), - SizedBox( - height: 48, - child: OutlinedButton( - onPressed: () => _browseDirectory(context, initialPath: state.savePath), - style: OutlinedButton.styleFrom( - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(4)), - ), - child: const Text(Strings.buttonBrowse), - ), - ), - ], - ), - ); - - Future _browseDirectory(BuildContext context, {String? initialPath}) async { - final hasInitialPath = initialPath?.isNotEmpty ?? false; - final directory = await FilePicker.platform.getDirectoryPath( - dialogTitle: Strings.dialogTitleSelectDirectory, - initialDirectory: hasInitialPath ? initialPath : null, - ); - - if (!context.mounted || directory == null) { - return; - } - - context.read().add(InstallationConfigurationUpdatedEvent( - savePath: directory, - )); - } -}