Skip to content

Commit 63f51ed

Browse files
committed
make input window usable on low-height screens
1 parent 57a353f commit 63f51ed

1 file changed

Lines changed: 92 additions & 46 deletions

File tree

rentnerend/lib/input_window.dart

Lines changed: 92 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -569,13 +569,13 @@ class _InputWindowState extends State<InputWindow> {
569569
});
570570
},
571571
children: const [
572-
Column(mainAxisAlignment: MainAxisAlignment.center, children: [Icon(Icons.scoreboard_rounded), Text("Scoreboard")]),
573-
Column(mainAxisAlignment: MainAxisAlignment.center, children: [Icon(Icons.table_rows_rounded), Text("Gameplan")]),
574-
Column(mainAxisAlignment: MainAxisAlignment.center, children: [Icon(Icons.leaderboard), Text("Liveplan")]),
575-
Column(mainAxisAlignment: MainAxisAlignment.center, children: [Icon(Icons.card_membership_rounded), Text("Gamestart")]),
576-
Column(mainAxisAlignment: MainAxisAlignment.center, children: [Icon(Icons.campaign_rounded), Text("Ad")]),
577-
Column(mainAxisAlignment: MainAxisAlignment.center, children: [Icon(Icons.podcasts_rounded), Text("Stream Started")]),
578-
Column(mainAxisAlignment: MainAxisAlignment.center, children: [Icon(Icons.replay_rounded), Text("Replay Started")]),
572+
Column(mainAxisAlignment: MainAxisAlignment.center, children: [Icon(Icons.scoreboard_rounded), Text("Scoreboard", maxLines: 1, overflow: TextOverflow.ellipsis)]),
573+
Column(mainAxisAlignment: MainAxisAlignment.center, children: [Icon(Icons.table_rows_rounded), Text("Gameplan", maxLines: 1, overflow: TextOverflow.ellipsis)]),
574+
Column(mainAxisAlignment: MainAxisAlignment.center, children: [Icon(Icons.leaderboard), Text("Liveplan", maxLines: 1, overflow: TextOverflow.ellipsis)]),
575+
Column(mainAxisAlignment: MainAxisAlignment.center, children: [Icon(Icons.card_membership_rounded), Text("Gamestart", maxLines: 1, overflow: TextOverflow.ellipsis)]),
576+
Column(mainAxisAlignment: MainAxisAlignment.center, children: [Icon(Icons.campaign_rounded), Text("Ad", maxLines: 1, overflow: TextOverflow.ellipsis)]),
577+
Column(mainAxisAlignment: MainAxisAlignment.center, children: [Icon(Icons.podcasts_rounded), Text("Stream Started", maxLines: 1, overflow: TextOverflow.ellipsis)]),
578+
Column(mainAxisAlignment: MainAxisAlignment.center, children: [Icon(Icons.replay_rounded), Text("Replay Started", maxLines: 1, overflow: TextOverflow.ellipsis)]),
579579
],
580580
);
581581
}));
@@ -598,19 +598,20 @@ class _InputWindowState extends State<InputWindow> {
598598
c = Colors.orange;
599599
}
600600

601-
final size = error == null ? 1 : 5;
602-
return Expanded(flex: size, child:
603-
Material(color: c, child: InkWell(
601+
if(error == null)
602+
return SizedBox.fromSize(size: Size.fromHeight(10), child: ColoredBox(color: c));
603+
604+
return Material(color: c, child: InkWell(
604605
onTap: f as void Function()?, child:
605-
Padding(padding: const EdgeInsets.symmetric(horizontal: 4, vertical: 2), child:
606-
Stack(fit: StackFit.expand, alignment: Alignment.center, children: [
607-
Center(child: Text(error ?? "",
608-
textAlign: TextAlign.center,
609-
style: const TextStyle( fontWeight: FontWeight.bold, fontSize: 18,),
610-
)),
611-
]),
612-
),
613-
))
606+
SizedBox(height: 30, child:
607+
Padding(padding: const EdgeInsets.symmetric(horizontal: 4, vertical: 2), child:
608+
Center(child: Text(error,
609+
textAlign: TextAlign.center,
610+
style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 18),
611+
)),
612+
),
613+
)
614+
)
614615
);
615616
}
616617

@@ -690,6 +691,71 @@ class _InputWindowState extends State<InputWindow> {
690691
};
691692
}
692693

694+
Widget widgets(Matchday md) {
695+
return CustomScrollView(slivers: [
696+
SliverToBoxAdapter(child:
697+
AnimatedBuilder(
698+
animation: Listenable.merge([ws.connection, ws.client.boss, ws.server.clientsConnected]),
699+
builder: (conext, _) { return blockWSStatus(md); }),
700+
),
701+
SliverLayoutBuilder( builder: (context, constraints) {
702+
final double visibleHeight = constraints.remainingPaintExtent;
703+
704+
final double teamMinHeight = 120;
705+
final double goalsMinHeight = 120;
706+
final double timeMinHeight = 120;
707+
final double toggleButtonMinHeight = 10;
708+
final double widgetsMinHeight = 60;
709+
710+
final double allMinHeight
711+
= teamMinHeight + goalsMinHeight + timeMinHeight
712+
+ toggleButtonMinHeight + widgetsMinHeight;
713+
714+
final double minRequiredHeight = _showWidgets
715+
? allMinHeight
716+
: allMinHeight - widgetsMinHeight;
717+
718+
final double safeHeight = visibleHeight > minRequiredHeight
719+
? visibleHeight
720+
: minRequiredHeight;
721+
722+
return SliverToBoxAdapter(child: SizedBox(height: safeHeight, child:
723+
Column(children: [
724+
Expanded(flex: 20, child: Container(
725+
constraints: BoxConstraints(minHeight: teamMinHeight),
726+
child: blockTeams(md, recAct))),
727+
Expanded(flex: 28, child: Container(
728+
constraints: BoxConstraints(minHeight: goalsMinHeight),
729+
child: blockGoals(md, recAct))),
730+
Expanded(flex: 35, child: Container(
731+
constraints: BoxConstraints(minHeight: timeMinHeight),
732+
child: blockTime(md, recAct))),
733+
Expanded(flex: 5, child: Container(
734+
constraints: BoxConstraints(minHeight: toggleButtonMinHeight, maxWidth: 40),
735+
child: TextButton(
736+
style: TextButton.styleFrom(
737+
padding: EdgeInsets.zero,
738+
tapTargetSize: MaterialTapTargetSize.shrinkWrap,
739+
),
740+
onPressed: () => setState(() => _showWidgets = !_showWidgets),
741+
child: LayoutBuilder(builder: (context, constraints) {
742+
return
743+
Icon(
744+
_showWidgets
745+
? Icons.keyboard_arrow_down
746+
: Icons.keyboard_arrow_up,
747+
size: constraints.biggest.shortestSide);}
748+
))
749+
)),
750+
if (_showWidgets)
751+
Expanded(flex: 12, child: Container(
752+
constraints: BoxConstraints(minHeight: widgetsMinHeight),
753+
child: blockWidgets(md, recAct))),
754+
])));
755+
})
756+
]);
757+
}
758+
693759
@override
694760
Widget build(BuildContext context) {
695761
// debugPrint("Matchday: ${mdl.value}\n\n");
@@ -709,33 +775,13 @@ class _InputWindowState extends State<InputWindow> {
709775
body: ValueListenableBuilder<Matchday>(
710776
valueListenable: mdl,
711777
builder: (context, md, _) {
712-
if(md.meta.game.ended) return Column();
713-
return Column(
714-
children: [
715-
AnimatedBuilder(
716-
animation: Listenable.merge([ws.connection, ws.client.boss, ws.server.clientsConnected]),
717-
builder: (conext, _) { return blockWSStatus(md); }),
718-
Expanded(flex: 18, child: blockTeams(md, recAct)),
719-
Expanded(flex: 25, child: blockGoals(md, recAct)),
720-
Expanded(flex: 35, child: blockTime(md, recAct)),
721-
Expanded(flex: 5, child: TextButton(
722-
style: TextButton.styleFrom(
723-
padding: EdgeInsets.zero,
724-
tapTargetSize: MaterialTapTargetSize.shrinkWrap,
725-
),
726-
onPressed: () => setState(() => _showWidgets = !_showWidgets),
727-
child: LayoutBuilder(builder: (context, constraints) {
728-
return
729-
Icon(
730-
_showWidgets
731-
? Icons.keyboard_arrow_down
732-
: Icons.keyboard_arrow_up,
733-
size: constraints.biggest.shortestSide);}
734-
))),
735-
if (_showWidgets)
736-
Expanded(flex: 10, child: blockWidgets(md, recAct)),
737-
]
738-
);
778+
if(md.meta.game.ended) {
779+
return TextButton(
780+
child: Text("UNEND GAME"),
781+
onPressed: () => mdl.value.setEnded(false, send: ws.sendSignal)
782+
);
783+
}
784+
return widgets(md);
739785
}
740786
)
741787
)

0 commit comments

Comments
 (0)