mirror of
https://github.com/ALEZ-DEV/Babylonia-terminal.git
synced 2025-12-18 02:18:51 +00:00
Display the steps correctly in setup
This commit is contained in:
parent
a94215284a
commit
7e154b6d03
@ -26,6 +26,7 @@ class GameStateProvider with ChangeNotifier {
|
|||||||
|
|
||||||
bool hasToSetup() {
|
bool hasToSetup() {
|
||||||
return _gameState == States.ProtonNotInstalled ||
|
return _gameState == States.ProtonNotInstalled ||
|
||||||
_gameState == States.DXVKNotInstalled;
|
_gameState == States.DXVKNotInstalled ||
|
||||||
|
_gameState == States.DependecieNotInstalled;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,39 +1,23 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
import './../messages/game_state.pb.dart';
|
|
||||||
import './../providers/game_state_provider.dart';
|
|
||||||
import './../providers/settings_provider.dart';
|
import './../providers/settings_provider.dart';
|
||||||
import './setups/welcome_screen.dart';
|
import './setups/welcome_screen.dart';
|
||||||
import './setups/proton_screen.dart';
|
import 'setups/steps_screen.dart';
|
||||||
|
|
||||||
class SetupScreen extends StatelessWidget {
|
class SetupScreen extends StatelessWidget {
|
||||||
const SetupScreen({super.key});
|
const SetupScreen({super.key});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final gameStateProvider = Provider.of<GameStateProvider>(context);
|
|
||||||
final settingsProvider = Provider.of<SettingsProvider>(context);
|
final settingsProvider = Provider.of<SettingsProvider>(context);
|
||||||
final Widget content;
|
|
||||||
if (settingsProvider.firstTime) {
|
|
||||||
content = const WelcomeScreen();
|
|
||||||
} else {
|
|
||||||
switch (gameStateProvider.gameState) {
|
|
||||||
case States.ProtonNotInstalled:
|
|
||||||
content = const ProtonScreen();
|
|
||||||
case States.DXVKNotInstalled:
|
|
||||||
content = const Text('DXVK');
|
|
||||||
default:
|
|
||||||
content = const Text('???');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
title: const Text("Babylonia Terminal"),
|
title: const Text("Babylonia Terminal"),
|
||||||
centerTitle: true,
|
centerTitle: true,
|
||||||
),
|
),
|
||||||
body: content,
|
body: settingsProvider.firstTime ? const WelcomeScreen() : StepsScreen(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,28 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter/widgets.dart';
|
|
||||||
import 'package:yaru/yaru.dart';
|
|
||||||
|
|
||||||
class ProtonScreen extends StatelessWidget {
|
|
||||||
const ProtonScreen({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Center(
|
|
||||||
child: ConstrainedBox(
|
|
||||||
constraints: const BoxConstraints(
|
|
||||||
maxHeight: 600,
|
|
||||||
maxWidth: 750,
|
|
||||||
),
|
|
||||||
child: const Padding(
|
|
||||||
padding: EdgeInsets.symmetric(horizontal: 25.0),
|
|
||||||
child: YaruSection(
|
|
||||||
headline: Center(
|
|
||||||
child: Text('Proton'),
|
|
||||||
),
|
|
||||||
child: Text('Some content'),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -0,0 +1,72 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
|
import './../../messages/game_state.pb.dart';
|
||||||
|
import './../../providers/providers.dart';
|
||||||
|
import './../../widgets/selectable_yaru_expansion_panel.dart';
|
||||||
|
import './../../widgets/simple_button.dart';
|
||||||
|
|
||||||
|
class StepsScreen extends StatelessWidget {
|
||||||
|
StepsScreen({super.key});
|
||||||
|
final SectionController controller = SectionController(selectedItem: 0);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final gameStateProvider = Provider.of<GameStateProvider>(context);
|
||||||
|
switch (gameStateProvider.gameState) {
|
||||||
|
case States.ProtonNotInstalled:
|
||||||
|
controller.updateSection(0);
|
||||||
|
break;
|
||||||
|
case States.DXVKNotInstalled:
|
||||||
|
controller.updateSection(1);
|
||||||
|
break;
|
||||||
|
case States.DependecieNotInstalled:
|
||||||
|
controller.updateSection(2);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Center(
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
ConstrainedBox(
|
||||||
|
constraints: const BoxConstraints(
|
||||||
|
maxHeight: 600,
|
||||||
|
maxWidth: 750,
|
||||||
|
),
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 25.0),
|
||||||
|
child: SelectableYaruExpansionPanel(
|
||||||
|
controller: controller,
|
||||||
|
headers: const [
|
||||||
|
Text("Proton"),
|
||||||
|
Text("DXVK"),
|
||||||
|
Text("Dependecies"),
|
||||||
|
],
|
||||||
|
children: const [
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.all(40.0),
|
||||||
|
child: Text("Proton"),
|
||||||
|
),
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.all(40.0),
|
||||||
|
child: Text("DXVK"),
|
||||||
|
),
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.all(40.0),
|
||||||
|
child: Text("Dependecies"),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SimpleButton(
|
||||||
|
onPressed: () => gameStateProvider.updateGameState(),
|
||||||
|
child: const Text('update'),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,229 @@
|
|||||||
|
// This file has been literally copied from https://github.com/ubuntu/yaru.dart/blob/main/lib/src/widgets/yaru_expansion_panel.dart
|
||||||
|
// and https://github.com/ubuntu/yaru.dart/blob/main/lib/src/widgets/yaru_expandable.dart
|
||||||
|
// Just want to make some change to it for specific needs instead of contributing to it, because I'm too lazy for that and I think they don't want these change
|
||||||
|
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
import 'package:yaru/constants.dart';
|
||||||
|
import 'package:yaru/widgets.dart';
|
||||||
|
|
||||||
|
class SectionController extends ChangeNotifier {
|
||||||
|
int selectedItem = 0;
|
||||||
|
Function()? onChange;
|
||||||
|
|
||||||
|
SectionController({required this.selectedItem});
|
||||||
|
|
||||||
|
void updateSection(int newSelectedItem) {
|
||||||
|
selectedItem = newSelectedItem;
|
||||||
|
notifyListeners();
|
||||||
|
if (onChange != null) {
|
||||||
|
onChange!();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class SelectableYaruExpansionPanel extends StatefulWidget {
|
||||||
|
const SelectableYaruExpansionPanel({
|
||||||
|
super.key,
|
||||||
|
required this.controller,
|
||||||
|
required this.children,
|
||||||
|
this.borderRadius =
|
||||||
|
const BorderRadius.all(Radius.circular(kYaruContainerRadius)),
|
||||||
|
this.border,
|
||||||
|
required this.headers,
|
||||||
|
this.width,
|
||||||
|
this.height,
|
||||||
|
this.padding,
|
||||||
|
this.margin,
|
||||||
|
this.expandIconPadding = const EdgeInsets.all(10),
|
||||||
|
this.headerPadding = const EdgeInsets.only(left: 20),
|
||||||
|
this.color,
|
||||||
|
this.placeDividers = true,
|
||||||
|
this.expandIcon,
|
||||||
|
this.shrinkWrap = true,
|
||||||
|
this.scrollPhysics = const ClampingScrollPhysics(),
|
||||||
|
this.collapseOnExpand = true,
|
||||||
|
}) : assert(headers.length == children.length);
|
||||||
|
|
||||||
|
final SectionController controller;
|
||||||
|
final List<Widget> children;
|
||||||
|
final List<Widget> headers;
|
||||||
|
final BorderRadius borderRadius;
|
||||||
|
final BoxBorder? border;
|
||||||
|
final double? width;
|
||||||
|
final double? height;
|
||||||
|
final EdgeInsetsGeometry? padding;
|
||||||
|
final EdgeInsetsGeometry? margin;
|
||||||
|
final EdgeInsetsGeometry expandIconPadding;
|
||||||
|
final EdgeInsetsGeometry headerPadding;
|
||||||
|
final Color? color;
|
||||||
|
final bool placeDividers;
|
||||||
|
final Widget? expandIcon;
|
||||||
|
final bool shrinkWrap;
|
||||||
|
final ScrollPhysics scrollPhysics;
|
||||||
|
final bool collapseOnExpand;
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<SelectableYaruExpansionPanel> createState() =>
|
||||||
|
_SelectableYaruExpansionPanelState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _SelectableYaruExpansionPanelState
|
||||||
|
extends State<SelectableYaruExpansionPanel> {
|
||||||
|
late List<bool> _expandedStore;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
widget.controller.onChange = widget.collapseOnExpand
|
||||||
|
? () {
|
||||||
|
_expandedStore[widget.controller.selectedItem];
|
||||||
|
for (var n = 0; n < _expandedStore.length; n++) {
|
||||||
|
if (_expandedStore[n]) {
|
||||||
|
setState(() => _expandedStore[n] = false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
: null;
|
||||||
|
_expandedStore =
|
||||||
|
List<bool>.generate(widget.children.length, (index) => false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
assert(widget.children.length == widget.headers.length);
|
||||||
|
|
||||||
|
_expandedStore[widget.controller.selectedItem] = true;
|
||||||
|
|
||||||
|
return YaruBorderContainer(
|
||||||
|
border: widget.border,
|
||||||
|
borderRadius: widget.borderRadius,
|
||||||
|
color: widget.color,
|
||||||
|
width: widget.width,
|
||||||
|
height: widget.height,
|
||||||
|
padding: widget.padding,
|
||||||
|
margin: widget.margin,
|
||||||
|
child: widget.placeDividers
|
||||||
|
? ListView.separated(
|
||||||
|
shrinkWrap: widget.shrinkWrap,
|
||||||
|
physics: widget.scrollPhysics,
|
||||||
|
itemCount: widget.children.length,
|
||||||
|
itemBuilder: _itemBuilder,
|
||||||
|
separatorBuilder: (context, index) {
|
||||||
|
if (index != widget.children.length - 1) {
|
||||||
|
return const Padding(
|
||||||
|
padding: EdgeInsets.symmetric(vertical: 1),
|
||||||
|
child: Divider(),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
return const SizedBox.shrink();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
: ListView.builder(
|
||||||
|
shrinkWrap: widget.shrinkWrap,
|
||||||
|
physics: widget.scrollPhysics,
|
||||||
|
itemCount: widget.children.length,
|
||||||
|
itemBuilder: _itemBuilder,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget? _itemBuilder(context, index) {
|
||||||
|
return YaruExpandable(
|
||||||
|
expandIconPadding: widget.expandIconPadding,
|
||||||
|
isExpanded: _expandedStore[index],
|
||||||
|
header: Padding(
|
||||||
|
padding: widget.headerPadding,
|
||||||
|
child: widget.headers[index],
|
||||||
|
),
|
||||||
|
child: widget.children[index],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const _kAnimationDuration = Duration(milliseconds: 250);
|
||||||
|
const _kAnimationCurve = Curves.easeInOutCubic;
|
||||||
|
|
||||||
|
class YaruExpandable extends StatefulWidget {
|
||||||
|
const YaruExpandable({
|
||||||
|
super.key,
|
||||||
|
required this.header,
|
||||||
|
this.expandIconPadding = EdgeInsets.zero,
|
||||||
|
required this.child,
|
||||||
|
this.collapsedChild,
|
||||||
|
this.gapHeight = 4.0,
|
||||||
|
this.isExpanded = false,
|
||||||
|
this.onChange,
|
||||||
|
});
|
||||||
|
|
||||||
|
final Widget header;
|
||||||
|
final EdgeInsetsGeometry expandIconPadding;
|
||||||
|
final Widget child;
|
||||||
|
final Widget? collapsedChild;
|
||||||
|
final double gapHeight;
|
||||||
|
final bool isExpanded;
|
||||||
|
final ValueChanged<bool>? onChange;
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<YaruExpandable> createState() => _YaruExpandableState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _YaruExpandableState extends State<YaruExpandable> {
|
||||||
|
late bool _isExpanded;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
_isExpanded = widget.isExpanded;
|
||||||
|
super.initState();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void didUpdateWidget(YaruExpandable oldWidget) {
|
||||||
|
super.didUpdateWidget(oldWidget);
|
||||||
|
if (oldWidget.isExpanded != widget.isExpanded) {
|
||||||
|
_isExpanded = widget.isExpanded;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Column(
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
widget.header,
|
||||||
|
Padding(
|
||||||
|
padding: widget.expandIconPadding,
|
||||||
|
child: const SizedBox(
|
||||||
|
height: 36,
|
||||||
|
width: 36,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
AnimatedCrossFade(
|
||||||
|
firstChild: _buildChild(widget.child),
|
||||||
|
secondChild: widget.collapsedChild != null
|
||||||
|
? _buildChild(widget.collapsedChild!)
|
||||||
|
: Container(),
|
||||||
|
crossFadeState: _isExpanded
|
||||||
|
? CrossFadeState.showFirst
|
||||||
|
: CrossFadeState.showSecond,
|
||||||
|
sizeCurve: _kAnimationCurve,
|
||||||
|
duration: _kAnimationDuration,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildChild(Widget child) {
|
||||||
|
return Column(
|
||||||
|
children: [
|
||||||
|
SizedBox(height: widget.gapHeight),
|
||||||
|
child,
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user