Initial commit

This commit is contained in:
Alessandro Autiero
2022-09-04 23:22:03 +02:00
commit a773c490cc
64 changed files with 3495 additions and 0 deletions

146
lib/src/page/home_page.dart Normal file
View File

@@ -0,0 +1,146 @@
import 'dart:convert';
import 'dart:io';
import 'package:fluent_ui/fluent_ui.dart';
import 'package:reboot_launcher/src/util/game_process_controller.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:reboot_launcher/src/page/info_page.dart';
import 'package:reboot_launcher/src/page/launcher_page.dart';
import 'package:reboot_launcher/src/page/server_page.dart';
import 'package:reboot_launcher/src/widget/window_buttons.dart';
import '../model/fortnite_version.dart';
import '../util/generic_controller.dart';
import '../util/version_controller.dart';
class HomePage extends StatefulWidget {
const HomePage({Key? key}) : super(key: key);
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
late final TextEditingController _usernameController;
late final VersionController _versionController;
late final GenericController<bool> _rebootController;
late final GenericController<bool> _localController;
late final TextEditingController _hostController;
late final TextEditingController _portController;
late final GameProcessController _gameProcessController;
late final GenericController<Process?> _serverController;
late final GenericController<bool> _startedServerController;
late final GenericController<bool> _startedGameController;
bool _loaded = false;
int _index = 0;
Future<bool> _load() async {
if (_loaded) {
return false;
}
var preferences = await SharedPreferences.getInstance();
Iterable json = jsonDecode(preferences.getString("versions") ?? "[]");
var versions =
json.map((entry) => FortniteVersion.fromJson(entry)).toList();
var selectedVersion = preferences.getString("version");
_versionController = VersionController(
versions: versions,
serializer: _saveVersions,
selectedVersion: selectedVersion != null
? versions.firstWhere((element) => element.name == selectedVersion)
: null);
_rebootController =
GenericController(initialValue: preferences.getBool("reboot") ?? false);
_usernameController =
TextEditingController(text: preferences.getString("${_rebootController.value ? "host" : "game"}_username"));
_localController =
GenericController(initialValue: preferences.getBool("local") ?? true);
_hostController =
TextEditingController(text: preferences.getString("host"));
_portController =
TextEditingController(text: preferences.getString("port"));
_gameProcessController = GameProcessController();
_serverController = GenericController(initialValue: null);
_startedServerController = GenericController(initialValue: false);
_startedGameController = GenericController(initialValue: false);
_loaded = true;
return true;
}
Future<void> _saveVersions() async {
var preferences = await SharedPreferences.getInstance();
var versions =
_versionController.versions.map((entry) => entry.toJson()).toList();
preferences.setString("versions", jsonEncode(versions));
}
@override
Widget build(BuildContext context) {
return NavigationView(
pane: NavigationPane(
selected: _index,
onChanged: (index) => setState(() => _index = index),
displayMode: PaneDisplayMode.top,
indicator: const EndNavigationIndicator(),
items: [
_createPane("Launcher", FluentIcons.game),
_createPane("Server", FluentIcons.server_enviroment),
_createPane("Info", FluentIcons.info),
],
trailing: const WindowTitleBar()),
content: FutureBuilder(
future: _load(),
builder: (context, snapshot) {
if (snapshot.hasError) {
return Center(
child: Text(
"An error occurred while loading the launcher: ${snapshot.error}",
textAlign: TextAlign.center));
}
if (!snapshot.hasData) {
return const Center(child: ProgressRing());
}
return NavigationBody(index: _index, children: [
LauncherPage(
usernameController: _usernameController,
versionController: _versionController,
rebootController: _rebootController,
serverController: _serverController,
localController: _localController,
gameProcessController: _gameProcessController,
startedGameController: _startedGameController,
startedServerController: _startedServerController
),
ServerPage(
localController: _localController,
hostController: _hostController,
portController: _portController,
serverController: _serverController,
startedServerController: _startedServerController
),
const InfoPage()
]);
}),
);
}
PaneItem _createPane(String label, IconData icon) {
return PaneItem(icon: Icon(icon), title: Text(label));
}
}

View File

@@ -0,0 +1,44 @@
import 'package:fluent_ui/fluent_ui.dart';
import 'package:url_launcher/url_launcher.dart';
const String _discordLink = "https://discord.gg/rTzBQH3N";
class InfoPage extends StatelessWidget {
const InfoPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Column(
children: [
const Expanded(
child: SizedBox()
),
Column(
children: [
const CircleAvatar(
radius: 48,
backgroundImage: AssetImage("assets/images/auties.png")),
const SizedBox(
height: 16.0,
),
const Text("Made by Auties00"),
const SizedBox(
height: 16.0,
),
Button(
child: const Text("Join the discord"),
onPressed: () => launchUrl(Uri.parse(_discordLink))),
],
),
const Expanded(
child: Align(
alignment: Alignment.bottomLeft,
child: Text("Version 1.0")
)
)
],
);
}
}

View File

@@ -0,0 +1,69 @@
import 'dart:async';
import 'dart:io';
import 'package:fluent_ui/fluent_ui.dart';
import 'package:reboot_launcher/src/util/game_process_controller.dart';
import 'package:reboot_launcher/src/util/generic_controller.dart';
import 'package:reboot_launcher/src/util/version_controller.dart';
import 'package:reboot_launcher/src/widget/deployment_selector.dart';
import 'package:reboot_launcher/src/widget/launch_button.dart';
import 'package:reboot_launcher/src/widget/username_box.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../widget/version_selector.dart';
class LauncherPage extends StatelessWidget {
final TextEditingController usernameController;
final VersionController versionController;
final GenericController<bool> rebootController;
final GenericController<Process?> serverController;
final GenericController<bool> localController;
final GameProcessController gameProcessController;
final GenericController<bool> startedGameController;
final GenericController<bool> startedServerController;
final StreamController _streamController = StreamController();
LauncherPage(
{Key? key,
required this.usernameController,
required this.versionController,
required this.rebootController,
required this.serverController,
required this.localController,
required this.gameProcessController,
required this.startedGameController,
required this.startedServerController})
: super(key: key);
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
StreamBuilder(
stream: _streamController.stream,
builder: (context, snapshot) => UsernameBox(
controller: usernameController,
rebootController: rebootController)),
VersionSelector(
controller: versionController,
),
DeploymentSelector(
controller: rebootController,
onSelected: () => _streamController.add(null),
enabled: false
),
LaunchButton(
usernameController: usernameController,
versionController: versionController,
rebootController: rebootController,
serverController: serverController,
localController: localController,
gameProcessController: gameProcessController,
startedGameController: startedGameController,
startedServerController: startedServerController)
],
);
}
}

View File

@@ -0,0 +1,62 @@
import 'dart:async';
import 'dart:io';
import 'package:fluent_ui/fluent_ui.dart';
import 'package:reboot_launcher/src/util/generic_controller.dart';
import 'package:reboot_launcher/src/widget/local_server_switch.dart';
import 'package:reboot_launcher/src/widget/port_input.dart';
import '../widget/host_input.dart';
import '../widget/server_button.dart';
class ServerPage extends StatefulWidget {
final GenericController<bool> localController;
final TextEditingController hostController;
final TextEditingController portController;
final GenericController<Process?> serverController;
final GenericController<bool> startedServerController;
const ServerPage(
{Key? key,
required this.localController,
required this.hostController,
required this.serverController,
required this.portController,
required this.startedServerController})
: super(key: key);
@override
State<ServerPage> createState() => _ServerPageState();
}
class _ServerPageState extends State<ServerPage> {
final StreamController _controller = StreamController.broadcast();
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
StreamBuilder(
stream: _controller.stream,
builder: (context, snapshot) => HostInput(
controller: widget.hostController,
localController: widget.localController)),
StreamBuilder(
stream: _controller.stream,
builder: (context, snapshot) => PortInput(
controller: widget.portController,
localController: widget.localController)),
LocalServerSwitch(
controller: widget.localController,
onSelected: (_) => _controller.add(null)),
ServerButton(
localController: widget.localController,
portController: widget.portController,
hostController: widget.hostController,
serverController: widget.serverController,
startController: widget.startedServerController)
]);
}
}