Skip to content

Commit

Permalink
Added padding between role filter checkboxes,
Browse files Browse the repository at this point in the history
reduced padding in group headers
split the combat group header components into their own classes
  • Loading branch information
Ariemeth committed Feb 4, 2024
1 parent fea7675 commit 635088d
Show file tree
Hide file tree
Showing 14 changed files with 391 additions and 254 deletions.
2 changes: 1 addition & 1 deletion lib/screens/roster/combatGroup/combat_group.dart
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ class _CombatGroupWidgetState extends State<CombatGroupWidget> {
List<Object?> candidateData,
List<dynamic> rejectedData,
) {
return SingleChildScrollView(child: table);
return table;
},
onAccept: (Unit u) {
group.addUnit(Unit.from(u));
Expand Down
50 changes: 50 additions & 0 deletions lib/screens/roster/combatGroup/combat_group_options_button.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import 'package:flutter/material.dart';
import 'package:gearforce/models/combatGroups/combat_group.dart';
import 'package:gearforce/models/rules/rule_set.dart';
import 'package:gearforce/screens/roster/combatGroup/combat_group_options_dialog.dart';

const _splashRadius = 20.0;

class CombatGroupOptionsButton extends StatelessWidget {
final CombatGroup cg;
final RuleSet ruleSet;

const CombatGroupOptionsButton({
super.key,
required this.cg,
required this.ruleSet,
});

@override
Widget build(BuildContext context) {
final settingsIcon = ruleSet.combatGroupSettings().length > 0
? Icons.settings_suggest
: Icons.settings;

final widget = IconButton(
constraints: BoxConstraints.tightForFinite(),
onPressed: () => {_showOptionsDialog(context)},
icon: Icon(
settingsIcon,
color: Colors.green,
),
splashRadius: _splashRadius,
padding: EdgeInsets.zero,
tooltip: 'Options for ${cg.name}',
);

return widget;
}

void _showOptionsDialog(BuildContext context) {
final settingsDialog = CombatGroupOptionsDialog(
cg: cg,
ruleSet: ruleSet,
);
showDialog(
context: context,
builder: (BuildContext context) {
return settingsDialog;
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ const double _optionSectionHeight = 33;
const int _maxVisibleOptions = 4;
const String _optionText = 'Rules Options';

class CombatGroupSettingsDialog extends StatefulWidget {
const CombatGroupSettingsDialog({
class CombatGroupOptionsDialog extends StatefulWidget {
const CombatGroupOptionsDialog({
super.key,
required this.cg,
required this.ruleSet,
Expand All @@ -22,11 +22,11 @@ class CombatGroupSettingsDialog extends StatefulWidget {
final RuleSet ruleSet;

@override
State<CombatGroupSettingsDialog> createState() =>
_CombatGroupSettingsDialogState();
State<CombatGroupOptionsDialog> createState() =>
_CombatGroupOptionsDialogState();
}

class _CombatGroupSettingsDialogState extends State<CombatGroupSettingsDialog> {
class _CombatGroupOptionsDialogState extends State<CombatGroupOptionsDialog> {
@override
Widget build(BuildContext context) {
final options = widget.cg.options;
Expand Down
30 changes: 0 additions & 30 deletions lib/screens/roster/combatGroup/combat_group_tv.dart

This file was deleted.

64 changes: 64 additions & 0 deletions lib/screens/roster/combatGroup/group_actions_display.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import 'package:flutter/material.dart';
import 'package:gearforce/models/combatGroups/group.dart';
import 'package:gearforce/models/mods/duelist/duelist_modification.dart';
import 'package:gearforce/models/rules/rule_set.dart';
import 'package:gearforce/widgets/display_value.dart';
import 'package:gearforce/widgets/settings.dart';
import 'package:provider/provider.dart';

class GroupActionsDisplay extends StatelessWidget {
final Group group;
final EdgeInsets padding;
final RuleSet ruleSet;

const GroupActionsDisplay({
super.key,
required this.group,
required this.padding,
required this.ruleSet,
});

@override
Widget build(BuildContext context) {
final settings = context.read<Settings>();

final isPrimary = group.groupType == GroupType.Primary;

final actions = group.totalActions();
final maxPrimaryActions = ruleSet.maxPrimaryActions;
final minPrimaryActions = ruleSet.minPrimaryActions;
final maxSecondaryAction =
ruleSet.maxSecondaryActions(group.combatGroup!.primary.totalActions());

final widget = Tooltip(
waitDuration: settings.tooltipDelay,
message: isPrimary
// a cg is only valid if the number of actions is greater then 4 and
// less then or equal to 6
? actions > maxPrimaryActions || actions < minPrimaryActions
? 'must have between $minPrimaryActions and $maxPrimaryActions actions'
: 'valid number of actions'
: actions > maxSecondaryAction
? 'cannot have more then $maxSecondaryAction actions'
: 'valid number of actions',
child: DisplayValue(
text: 'Actions',
value: actions,
textColor: group.combatGroup?.modCount(independentOperatorId) != 0
? Colors.green
: isPrimary
// a cg is only valid if the number of actions is greater then 4 and
// less then or equal to 6
? actions > maxPrimaryActions || actions < minPrimaryActions
? Colors.red
: Colors.green
: actions > maxSecondaryAction
? Colors.red
: Colors.green,
padding: padding,
),
);

return widget;
}
}
196 changes: 55 additions & 141 deletions lib/screens/roster/combatGroup/group_header.dart
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
import 'package:flutter/material.dart';
import 'package:gearforce/models/combatGroups/combat_group.dart';
import 'package:gearforce/models/combatGroups/group.dart';
import 'package:gearforce/models/mods/duelist/duelist_modification.dart';
import 'package:gearforce/models/roster/roster.dart';
import 'package:gearforce/screens/roster/combatGroup/combat_group_settings_dialog.dart';
import 'package:gearforce/screens/roster/combatGroup/combat_group_options_button.dart';
import 'package:gearforce/screens/roster/combatGroup/group_actions_display.dart';
import 'package:gearforce/screens/roster/combatGroup/veteran_group_checkbox_display.dart';
import 'package:gearforce/screens/roster/select_role.dart';
import 'package:gearforce/widgets/display_value.dart';
import 'package:gearforce/widgets/settings.dart';
import 'package:provider/provider.dart';

const _groupHeaderHeight = 35.0;
const _groupTypeNameWidth = 100.0;
const _selectRoleWidth = 75.0;
const _spaceBetweenItems = 15.0;

class GroupHeader extends StatelessWidget {
const GroupHeader({
Expand All @@ -25,145 +26,58 @@ class GroupHeader extends StatelessWidget {

@override
Widget build(BuildContext context) {
final settings = context.read<Settings>();
final actions = group.totalActions();
final maxPrimaryActions = roster.rulesetNotifer.value.maxPrimaryActions;
final minPrimaryActions = roster.rulesetNotifer.value.minPrimaryActions;
final maxSecondaryAction = roster.rulesetNotifer.value
.maxSecondaryActions(cg.primary.totalActions());
final settingsIcon =
roster.rulesetNotifer.value.combatGroupSettings().length > 0
? Icons.settings_suggest
: Icons.settings;
return Padding(
padding: const EdgeInsets.all(4.0),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
SizedBox(
width: 100,
child: Text(
group.groupType.name,
style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
),
),
Text(
"Role: ",
style: TextStyle(fontSize: 16),
),
SizedBox(
child: SelectRole(
group: group,
roster: roster,
),
width: 75,
),
SizedBox(
width: 20,
),
DisplayValue(text: 'TV:', value: group.totalTV()),
Tooltip(
waitDuration: settings.tooltipDelay,
message: group.groupType == GroupType.Primary
// a cg is only valid if the number of actions is greater then 4 and
// less then or equal to 6
? actions > maxPrimaryActions || actions < minPrimaryActions
? 'must have between $minPrimaryActions and $maxPrimaryActions actionss'
: 'valid number of actions'
: actions > maxSecondaryAction
? 'cannot have more then $maxSecondaryAction actions'
: 'valid number of actions',
child: DisplayValue(
text: 'Actions',
value: actions,
textColor: cg.modCount(independentOperatorId) != 0
? Colors.green
: group.groupType == GroupType.Primary
// a cg is only valid if the number of actions is greater then 4 and
// less then or equal to 6
? actions > maxPrimaryActions ||
actions < minPrimaryActions
? Colors.red
: Colors.green
: actions > maxSecondaryAction
? Colors.red
: Colors.green,
),
final isPrimary = group.groupType == GroupType.Primary;

final heading = Row(
children: [
SizedBox(
width: _groupTypeNameWidth,
child: Text(
group.groupType.name,
style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
),
group.groupType == GroupType.Primary
? SizedBox(
height: _groupHeaderHeight,
child: Align(
child: Row(
children: [
Padding(
padding: EdgeInsets.only(
right: 0, left: 5, top: 5, bottom: 5),
child: Text(
'Vet Group',
textAlign: TextAlign.right,
style: TextStyle(fontSize: 16),
),
),
SizedBox(
width: 35,
child: Padding(
padding: EdgeInsets.only(
right: 5, left: 5, top: 5, bottom: 5),
child: Tooltip(
child: Checkbox(
onChanged: (bool? newValue) {
cg.isVeteran =
newValue != null ? newValue : false;
},
value: cg.isVeteran,
),
message:
'Check to make this squad a veteran squad',
waitDuration: settings.tooltipDelay,
),
),
),
],
mainAxisAlignment: MainAxisAlignment.center,
),
),
)
: Container(),
group.groupType == GroupType.Primary
? Expanded(
child: SizedBox(
height: _groupHeaderHeight,
child: Align(
alignment: Alignment.centerRight,
child: IconButton(
onPressed: () => {_showSettingsDialog(context)},
icon: Icon(
settingsIcon,
color: Colors.green,
),
splashRadius: 20.0,
padding: EdgeInsets.zero,
tooltip: 'Options for ${cg.name}',
),
),
),
)
: Container(),
],
),
),
SelectRole(
group: group,
roster: roster,
width: _selectRoleWidth,
),
DisplayValue(
text: 'TV',
value: group.totalTV(),
padding: const EdgeInsets.only(left: _spaceBetweenItems),
),
GroupActionsDisplay(
group: group,
padding: const EdgeInsets.only(left: _spaceBetweenItems),
ruleSet: roster.rulesetNotifer.value,
)
],
);
}

void _showSettingsDialog(BuildContext context) {
final settingsDialog = CombatGroupSettingsDialog(
cg: cg,
ruleSet: roster.rulesetNotifer.value,
if (isPrimary) {
final vetCheckBox = VeteranGroupCheckboxDisplay(
cg: cg,
padding: const EdgeInsets.only(left: _spaceBetweenItems),
);

final cgOptions = Expanded(
child: Align(
alignment: Alignment.centerRight,
child: CombatGroupOptionsButton(
cg: cg,
ruleSet: roster.rulesetNotifer.value,
),
),
);

heading.children.add(vetCheckBox);
heading.children.add(cgOptions);
}

return Padding(
padding: const EdgeInsets.all(4.0),
child: heading,
);
showDialog(
context: context,
builder: (BuildContext context) {
return settingsDialog;
});
}
}
Loading

0 comments on commit 635088d

Please sign in to comment.