<feat: New release>

This commit is contained in:
Alessandro Autiero
2023-09-09 12:46:16 +02:00
parent badf41b044
commit 485e757e83
424 changed files with 37224 additions and 818815 deletions

View File

@@ -1,4 +1,5 @@
import 'package:fluent_ui/fluent_ui.dart' hide showDialog;
import 'package:fluent_ui/fluent_ui.dart';
import 'package:flutter/services.dart';
import 'package:get/get.dart';
import 'package:reboot_common/common.dart';
import 'package:reboot_launcher/src/controller/authenticator_controller.dart';
@@ -8,8 +9,8 @@ import 'package:url_launcher/url_launcher.dart';
import 'package:reboot_launcher/src/widget/common/setting_tile.dart';
import 'package:reboot_launcher/src/dialog/dialog.dart';
import 'package:reboot_launcher/src/dialog/dialog_button.dart';
import 'package:reboot_launcher/src/dialog/abstract/dialog.dart';
import 'package:reboot_launcher/src/dialog/abstract/dialog_button.dart';
class AuthenticatorPage extends StatefulWidget {
const AuthenticatorPage({Key? key}) : super(key: key);
@@ -46,8 +47,7 @@ class _AuthenticatorPageState extends State<AuthenticatorPage> with AutomaticKee
isChild: true,
content: TextFormBox(
placeholder: "Host",
controller: _authenticatorController.host,
readOnly: !_isRemote
controller: _authenticatorController.host
)
),
if(_authenticatorController.type.value != ServerType.embedded)
@@ -58,7 +58,10 @@ class _AuthenticatorPageState extends State<AuthenticatorPage> with AutomaticKee
content: TextFormBox(
placeholder: "Port",
controller: _authenticatorController.port,
readOnly: !_isRemote
keyboardType: TextInputType.number,
inputFormatters: [
FilteringTextInputFormatter.digitsOnly
]
)
),
if(_authenticatorController.type.value == ServerType.embedded)
@@ -92,7 +95,7 @@ class _AuthenticatorPageState extends State<AuthenticatorPage> with AutomaticKee
title: "Reset authenticator",
subtitle: "Resets the authenticator's settings to their default values",
content: Button(
onPressed: () => showDialog(
onPressed: () => showAppDialog(
builder: (context) => InfoDialog(
text: "Do you want to reset all the setting in this tab to their default values? This action is irreversible",
buttons: [

View File

@@ -7,7 +7,7 @@ import 'package:reboot_common/common.dart';
import 'package:reboot_launcher/src/controller/game_controller.dart';
import 'package:reboot_launcher/src/controller/matchmaker_controller.dart';
import 'package:reboot_launcher/src/interactive/server.dart';
import 'package:reboot_launcher/src/dialog/implementation/server.dart';
import 'package:reboot_launcher/src/widget/common/setting_tile.dart';
import 'package:skeletons/skeletons.dart';

View File

@@ -1,23 +1,24 @@
import 'dart:collection';
import 'package:fluent_ui/fluent_ui.dart' hide showDialog;
import 'package:bitsdojo_window/bitsdojo_window.dart';
import 'package:fluent_ui/fluent_ui.dart';
import 'package:flutter/material.dart' show MaterialPage;
import 'package:get/get.dart';
import 'package:reboot_launcher/src/page/browse_page.dart';
import 'package:reboot_launcher/src/page/authenticator_page.dart';
import 'package:reboot_launcher/src/page/matchmaker_page.dart';
import 'package:reboot_launcher/src/page/play_page.dart';
import 'package:reboot_launcher/src/page/settings_page.dart';
import 'package:reboot_launcher/src/util/os.dart';
import 'package:reboot_launcher/src/widget/home/pane.dart';
import 'package:reboot_launcher/src/widget/home/profile.dart';
import 'package:reboot_launcher/src/controller/settings_controller.dart';
import 'package:reboot_launcher/src/widget/os/border.dart';
import 'package:reboot_launcher/src/widget/os/title_bar.dart';
import 'package:reboot_launcher/src/page/hosting_page.dart';
import 'package:reboot_launcher/src/page/info_page.dart';
import 'package:window_manager/window_manager.dart';
import 'hosting_page.dart';
import 'info_page.dart';
GlobalKey appKey = GlobalKey();
const int pagesLength = 7;
final RxInt pageIndex = RxInt(0);
final Queue<int> _pagesStack = Queue();
@@ -39,14 +40,12 @@ class _HomePageState extends State<HomePage> with WindowListener, AutomaticKeepA
final FocusNode _searchFocusNode = FocusNode();
final TextEditingController _searchController = TextEditingController();
final RxBool _focused = RxBool(true);
final RxBool _fullScreen = RxBool(false);
@override
bool get wantKeepAlive => true;
@override
void initState() {
windowManager.show();
windowManager.addListener(this);
_searchController.addListener(_onSearch);
super.initState();
@@ -58,22 +57,12 @@ class _HomePageState extends State<HomePage> with WindowListener, AutomaticKeepA
@override
void dispose() {
windowManager.removeListener(this);
_searchFocusNode.dispose();
_searchController.dispose();
windowManager.removeListener(this);
super.dispose();
}
@override
void onWindowEnterFullScreen() {
_fullScreen.value = true;
}
@override
void onWindowLeaveFullScreen() {
_fullScreen.value = false;
}
@override
void onWindowFocus() {
_focused.value = true;
@@ -86,63 +75,63 @@ class _HomePageState extends State<HomePage> with WindowListener, AutomaticKeepA
@override
void onWindowResized() {
_settingsController.saveWindowSize();
super.onWindowResized();
_settingsController.saveWindowSize(appWindow.size);
}
@override
void onWindowMoved() {
windowManager.getPosition()
.then((value) => _settingsController.saveWindowOffset(value));
super.onWindowMoved();
_settingsController.saveWindowOffset(appWindow.position);
}
@override
Widget build(BuildContext context) {
super.build(context);
return Stack(
children: [
Obx(() => NavigationPaneTheme(
data: NavigationPaneThemeData(
backgroundColor: FluentTheme.of(context).micaBackgroundColor.withOpacity(0.9),
),
child: NavigationView(
paneBodyBuilder: (pane, body) => Padding(
padding: const EdgeInsets.all(_kDefaultPadding),
child: SizedBox(
key: pageKey,
child: body
)
),
appBar: NavigationAppBar(
height: 32,
title: _draggableArea,
actions: WindowTitleBar(focused: _focused()),
leading: _backButton,
automaticallyImplyLeading: false,
),
pane: NavigationPane(
selected: pageIndex.value,
onChanged: (index) {
_pagesStack.add(pageIndex.value);
pageIndex.value = index;
},
menuButton: const SizedBox(),
displayMode: PaneDisplayMode.open,
items: _items,
header: const ProfileWidget(),
autoSuggestBox: _autoSuggestBox,
autoSuggestBoxReplacement: const Icon(FluentIcons.search),
),
contentShape: const RoundedRectangleBorder(),
onOpenSearch: () => _searchFocusNode.requestFocus(),
transitionBuilder: (child, animation) => child
)
)),
if (isWin11)
Obx(() => !_fullScreen.value && _focused.value ? const WindowBorder() : const SizedBox())
]
);
windowManager.show();
return Obx(() => NavigationPaneTheme(
data: NavigationPaneThemeData(
backgroundColor: FluentTheme.of(context).micaBackgroundColor.withOpacity(0.93),
),
child: NavigationView(
paneBodyBuilder: (pane, body) => Navigator(
onPopPage: (page, data) => false,
pages: [
MaterialPage(
child: Padding(
padding: const EdgeInsets.all(_kDefaultPadding),
child: SizedBox(
key: pageKey,
child: body
)
)
)
],
),
appBar: NavigationAppBar(
height: 32,
title: _draggableArea,
actions: WindowTitleBar(focused: _focused()),
leading: _backButton,
automaticallyImplyLeading: false,
),
pane: NavigationPane(
key: appKey,
selected: pageIndex.value,
onChanged: (index) {
_pagesStack.add(pageIndex.value);
pageIndex.value = index;
},
menuButton: const SizedBox(),
displayMode: PaneDisplayMode.open,
items: _items,
header: const ProfileWidget(),
autoSuggestBox: _autoSuggestBox,
autoSuggestBoxReplacement: const Icon(FluentIcons.search),
),
contentShape: const RoundedRectangleBorder(),
onOpenSearch: () => _searchFocusNode.requestFocus(),
transitionBuilder: (child, animation) => child
)
));
}
Widget get _backButton => Obx(() {
@@ -159,9 +148,9 @@ class _HomePageState extends State<HomePage> with WindowListener, AutomaticKeepA
});
GestureDetector get _draggableArea => GestureDetector(
onDoubleTap: () async => await windowManager.isMaximized() ? await windowManager.restore() : await windowManager.maximize(),
onHorizontalDragStart: (event) => windowManager.startDragging(),
onVerticalDragStart: (event) => windowManager.startDragging()
onDoubleTap: appWindow.maximizeOrRestore,
onHorizontalDragStart: (_) => appWindow.startDragging(),
onVerticalDragStart: (_) => appWindow.startDragging()
);
Widget get _autoSuggestBox => Padding(

View File

@@ -1,12 +1,12 @@
import 'package:clipboard/clipboard.dart';
import 'package:dart_ipify/dart_ipify.dart';
import 'package:fluent_ui/fluent_ui.dart' hide showDialog;
import 'package:fluent_ui/fluent_ui.dart';
import 'package:get/get.dart';
import 'package:reboot_launcher/main.dart';
import 'package:reboot_launcher/src/controller/game_controller.dart';
import 'package:reboot_launcher/src/controller/hosting_controller.dart';
import 'package:reboot_launcher/src/controller/update_controller.dart';
import 'package:reboot_launcher/src/dialog/message.dart';
import 'package:reboot_launcher/src/dialog/abstract/info_bar.dart';
import 'package:reboot_launcher/src/widget/common/setting_tile.dart';
import 'package:flutter/material.dart' show Icons;
@@ -38,17 +38,6 @@ class _HostingPageState extends State<HostingPage> with AutomaticKeepAliveClient
Expanded(
child: ListView(
children: [
Obx(() => Column(
children: _updateController.status.value != UpdateStatus.error ? [] : [
SizedBox(
width: double.infinity,
child: _updateError
),
const SizedBox(
height: 8.0
),
],
)),
SettingTile(
title: "Game Server",
subtitle: "Provide basic information about your server",
@@ -150,7 +139,7 @@ class _HostingPageState extends State<HostingPage> with AutomaticKeepAliveClient
content: Button(
onPressed: () async {
FlutterClipboard.controlC("$kCustomUrlSchema://${_gameController.uuid}");
showMessage(
showInfoBar(
"Copied your link to the clipboard",
severity: InfoBarSeverity.success
);
@@ -165,19 +154,19 @@ class _HostingPageState extends State<HostingPage> with AutomaticKeepAliveClient
content: Button(
onPressed: () async {
try {
showMessage(
showInfoBar(
"Obtaining your public IP...",
loading: true,
duration: null
);
var ip = await Ipify.ipv4();
FlutterClipboard.controlC(ip);
showMessage(
showInfoBar(
"Copied your IP to the clipboard",
severity: InfoBarSeverity.success
);
}catch(error) {
showMessage(
showInfoBar(
"An error occurred while obtaining your public IP: $error",
severity: InfoBarSeverity.error,
duration: snackbarLongDuration
@@ -201,15 +190,4 @@ class _HostingPageState extends State<HostingPage> with AutomaticKeepAliveClient
],
);
}
Widget get _updateError => MouseRegion(
cursor: SystemMouseCursors.click,
child: GestureDetector(
onTap: _updateController.update,
child: const InfoBar(
title: Text("The reboot dll couldn't be downloaded: click here to try again"),
severity: InfoBarSeverity.info
),
),
);
}

View File

@@ -1,4 +1,4 @@
import 'package:fluent_ui/fluent_ui.dart' hide showDialog;
import 'package:fluent_ui/fluent_ui.dart';
import 'package:get/get.dart';
import 'package:reboot_launcher/src/widget/common/setting_tile.dart';

View File

@@ -1,4 +1,5 @@
import 'package:fluent_ui/fluent_ui.dart' hide showDialog;
import 'package:fluent_ui/fluent_ui.dart';
import 'package:flutter/services.dart';
import 'package:get/get.dart';
import 'package:reboot_common/common.dart';
import 'package:reboot_launcher/src/controller/matchmaker_controller.dart';
@@ -7,8 +8,8 @@ import 'package:url_launcher/url_launcher.dart';
import 'package:reboot_launcher/src/widget/common/setting_tile.dart';
import 'package:reboot_launcher/src/dialog/dialog.dart';
import 'package:reboot_launcher/src/dialog/dialog_button.dart';
import 'package:reboot_launcher/src/dialog/abstract/dialog.dart';
import 'package:reboot_launcher/src/dialog/abstract/dialog_button.dart';
import 'package:reboot_launcher/src/widget/server/start_button.dart';
class MatchmakerPage extends StatefulWidget {
@@ -46,8 +47,7 @@ class _MatchmakerPageState extends State<MatchmakerPage> with AutomaticKeepAlive
isChild: true,
content: TextFormBox(
placeholder: "Host",
controller: _matchmakerController.host,
readOnly: _matchmakerController.type.value != ServerType.remote
controller: _matchmakerController.host
)
),
if(_matchmakerController.type.value != ServerType.embedded)
@@ -58,7 +58,10 @@ class _MatchmakerPageState extends State<MatchmakerPage> with AutomaticKeepAlive
content: TextFormBox(
placeholder: "Port",
controller: _matchmakerController.port,
readOnly: _matchmakerController.type.value != ServerType.remote
keyboardType: TextInputType.number,
inputFormatters: [
FilteringTextInputFormatter.digitsOnly
]
)
),
if(_matchmakerController.type.value == ServerType.embedded)
@@ -91,7 +94,7 @@ class _MatchmakerPageState extends State<MatchmakerPage> with AutomaticKeepAlive
title: "Installation directory",
subtitle: "Opens the folder where the embedded matchmaker is located",
content: Button(
onPressed: () => launchUrl(authenticatorDirectory.uri),
onPressed: () => launchUrl(matchmakerDirectory.uri),
child: const Text("Show Files")
)
),
@@ -102,7 +105,7 @@ class _MatchmakerPageState extends State<MatchmakerPage> with AutomaticKeepAlive
title: "Reset matchmaker",
subtitle: "Resets the authenticator's settings to their default values",
content: Button(
onPressed: () => showDialog(
onPressed: () => showAppDialog(
builder: (context) => InfoDialog(
text: "Do you want to reset all the setting in this tab to their default values? This action is irreversible",
buttons: [

View File

@@ -1,5 +1,5 @@
import 'package:fluent_ui/fluent_ui.dart' hide showDialog;
import 'package:fluent_ui/fluent_ui.dart';
import 'package:get/get.dart';
import 'package:reboot_common/common.dart';
import 'package:reboot_launcher/src/controller/hosting_controller.dart';

View File

@@ -1,4 +1,5 @@
import 'package:fluent_ui/fluent_ui.dart' hide showDialog;
import 'package:fluent_ui/fluent_ui.dart';
import 'package:flutter/services.dart';
import 'package:get/get.dart';
import 'package:reboot_common/common.dart';
import 'package:reboot_launcher/src/controller/build_controller.dart';
@@ -7,12 +8,12 @@ import 'package:reboot_launcher/src/controller/hosting_controller.dart';
import 'package:reboot_launcher/src/controller/authenticator_controller.dart';
import 'package:reboot_launcher/src/controller/settings_controller.dart';
import 'package:reboot_launcher/src/controller/update_controller.dart';
import 'package:reboot_launcher/src/dialog/dialog_button.dart';
import 'package:reboot_launcher/src/dialog/abstract/dialog_button.dart';
import 'package:reboot_launcher/src/widget/common/file_selector.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:reboot_launcher/src/util/checks.dart';
import 'package:reboot_launcher/src/dialog/dialog.dart';
import 'package:reboot_launcher/src/dialog/abstract/dialog.dart';
import 'package:reboot_launcher/src/widget/common/setting_tile.dart';
class SettingsPage extends StatefulWidget {
@@ -45,12 +46,12 @@ class _SettingsPageState extends State<SettingsPage> with AutomaticKeepAliveClie
_createFileSetting(
title: "Unreal engine console",
description: "This file is injected to unlock the Unreal Engine Console",
controller: _settingsController.consoleDll
controller: _settingsController.unrealEngineConsoleDll
),
_createFileSetting(
title: "Authentication patcher",
description: "This file is injected to redirect all HTTP requests to the launcher's authenticator",
controller: _settingsController.authDll
controller: _settingsController.authenticatorDll
),
SettingTile(
title: "Custom launch arguments",
@@ -67,13 +68,26 @@ class _SettingsPageState extends State<SettingsPage> with AutomaticKeepAliveClie
height: 8.0,
),
SettingTile(
title: "Server settings",
title: "Game server settings",
subtitle: "This section contains settings related to the game server implementation",
expandedContent: [
_createFileSetting(
title: "Game server",
title: "Implementation",
description: "This file is injected to create a game server & host matches",
controller: _settingsController.rebootDll
controller: _settingsController.gameServerDll
),
SettingTile(
title: "Port",
subtitle: "The port used by the game server dll",
content: TextFormBox(
placeholder: "Port",
controller: _settingsController.gameServerPort,
keyboardType: TextInputType.number,
inputFormatters: [
FilteringTextInputFormatter.digitsOnly
]
),
isChild: true
),
SettingTile(
title: "Update mirror",
@@ -92,7 +106,10 @@ class _SettingsPageState extends State<SettingsPage> with AutomaticKeepAliveClie
leading: Text(_updateController.timer.value.text),
items: UpdateTimer.values.map((entry) => MenuFlyoutItem(
text: Text(entry.text),
onPressed: () => _updateController.timer.value = entry
onPressed: () {
_updateController.timer.value = entry;
_updateController.update(true);
}
)).toList()
)),
isChild: true
@@ -129,7 +146,7 @@ class _SettingsPageState extends State<SettingsPage> with AutomaticKeepAliveClie
subtitle: "Resets the launcher's settings to their default values",
isChild: true,
content: Button(
onPressed: () => showDialog(
onPressed: () => showAppDialog(
builder: (context) => InfoDialog(
text: "Do you want to reset all the launcher's settings to their default values? This action is irreversible",
buttons: [