Skip to content

Commit

Permalink
update roll dice display + prevent accidental leave with dialogs
Browse files Browse the repository at this point in the history
  • Loading branch information
Chen Asraf committed Jun 23, 2020
1 parent 033bd3d commit f3b80be
Show file tree
Hide file tree
Showing 5 changed files with 124 additions and 64 deletions.
53 changes: 35 additions & 18 deletions lib/src/dialogs/roll_dice_dialog.dart
Original file line number Diff line number Diff line change
Expand Up @@ -31,27 +31,44 @@ class _RollDiceDialogState extends State<RollDiceDialog> {

@override
Widget build(BuildContext context) {
return SimpleDialog(
title: Text('Roll Dice'),
titlePadding: EdgeInsets.all(16).copyWith(bottom: 0),
return Column(
children: [
for (var list in enumerate(controllers))
Padding(
padding: list.index > 0
? const EdgeInsets.symmetric(vertical: 16)
: EdgeInsets.only(bottom: 16),
child: DiceRollBox(
key: Key('dice-${list.value.hash}'),
diceList: list.value.value,
controller: controllers[list.index],
onRemove: () => _removeAt(list.index),
Container(
height: 52,
child: Center(
child: Text(
'Roll Dice',
style: Theme.of(context).textTheme.headline4.copyWith(
color: Theme.of(context).canvasColor,
),
),
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: DiceRollBuilder(
character: widget.character,
onChanged: _add,
),
Expanded(
child: SingleChildScrollView(
child: Column(
children: [
for (var list in enumerate(controllers))
Padding(
padding: list.index > 0
? const EdgeInsets.symmetric(vertical: 16)
: EdgeInsets.only(bottom: 16),
child: DiceRollBox(
key: Key('dice-${list.value.hash}'),
diceList: list.value.value,
controller: controllers[list.index],
onRemove: () => _removeAt(list.index),
),
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: DiceRollBuilder(
character: widget.character,
onChanged: _add,
),
),
],
),
),
),
],
Expand Down
24 changes: 19 additions & 5 deletions lib/src/pages/character_wizard/character_wizard_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ class _CharacterWizardViewState extends State<CharacterWizardView>
ValueNotifier<bool> raceValid;
ValueNotifier<bool> looksValid;
ValueNotifier<bool> statsValid;
bool dirty;

static const Map<CreateCharacterTab, String> TAB_TITLES = {
CreateCharacterTab.BasicInfo: 'General',
Expand Down Expand Up @@ -77,6 +78,7 @@ class _CharacterWizardViewState extends State<CharacterWizardView>
raceValid = ValueNotifier(character.race != null);
looksValid = ValueNotifier(true);
statsValid = ValueNotifier(true);
dirty = false;

tabController = TabController(length: _tabs.keys.length, vsync: this);

Expand Down Expand Up @@ -158,40 +160,46 @@ class _CharacterWizardViewState extends State<CharacterWizardView>
character: character,
mode: DialogMode.Create,
onUpdate: (char) => setState(() {
dirty = true;
character = char;
}),
),
CreateCharacterTab.MainClass: ClassSelectView(
character: character,
mode: DialogMode.Create,
onSave: (char) => setState(() {
onUpdate: (char) => setState(() {
dirty = true;
character = char;
}),
),
CreateCharacterTab.Alignment: ChangeAlignmentDialog(
character: character,
mode: DialogMode.Create,
onUpdate: (char) => setState(() {
dirty = true;
character = char;
}),
),
CreateCharacterTab.Race: ChangeRaceDialog(
character: character,
mode: DialogMode.Create,
onUpdate: (char) => setState(() {
dirty = true;
character = char;
}),
),
CreateCharacterTab.Looks: ChangeLooksDialog(
character: character,
mode: DialogMode.Create,
onSave: (char) => setState(() {
onUpdate: (char) => setState(() {
dirty = true;
character = char;
}),
),
CreateCharacterTab.Stats: EditStats(
character: character,
onUpdate: (char) => setState(() {
dirty = true;
character = char;
}),
),
Expand Down Expand Up @@ -234,16 +242,22 @@ class _CharacterWizardViewState extends State<CharacterWizardView>
Navigator.pop(context);
}

void _confirmExit() async {
Future<bool> _confirmExit() async {
var verb = widget.mode == DialogMode.Edit ? 'edit' : 'creation';
if (await await showDialog(
if (!dirty) {
return true;
}
if (await showDialog(
context: context,
builder: (ctx) => ConfirmationDialog(
text: Text('Are you sure you want to quit character $verb?')),
text: Text(
'Are you sure you want to quit character $verb?\nYour changes will not be saved.')),
) ==
true) {
Navigator.pop(context, true);
return true;
}
return false;
}
}

Expand Down
6 changes: 3 additions & 3 deletions lib/src/pages/character_wizard/edit_looks.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ import 'package:flutter/material.dart';
class ChangeLooksDialog extends StatefulWidget {
final Character character;
final DialogMode mode;
final VoidCallbackDelegate<Character> onSave;
final VoidCallbackDelegate<Character> onUpdate;

const ChangeLooksDialog({
Key key,
@required this.character,
@required this.onSave,
@required this.onUpdate,
this.mode = DialogMode.Edit,
}) : super(key: key);

Expand Down Expand Up @@ -146,7 +146,7 @@ class _ChangeLooksDialogState extends State<ChangeLooksDialog> {
void changeLooks(List<String> def) async {
var char = widget.character;
char.looks = def;
widget.onSave?.call(char);
widget.onUpdate?.call(char);
}

void _setValue(int i, String val) {
Expand Down
6 changes: 3 additions & 3 deletions lib/src/scaffolds/class_select_scaffold.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,12 @@ import 'package:flutter/material.dart';
class ClassSelectView extends StatelessWidget {
final Character character;
final DialogMode mode;
final VoidCallbackDelegate<Character> onSave;
final VoidCallbackDelegate<Character> onUpdate;

const ClassSelectView({
Key key,
@required this.character,
@required this.onSave,
@required this.onUpdate,
this.mode = DialogMode.Edit,
}) : super(key: key);

Expand Down Expand Up @@ -74,7 +74,7 @@ class ClassSelectView extends StatelessWidget {
ChangeClassConfirmationOptions options) {
var result = options.applyToCharacter(character, def);
character.mainClass = def;
onSave?.call(result.character);
onUpdate?.call(result.character);
}

Function() previewClass(BuildContext context, PlayerClass def) {
Expand Down
99 changes: 64 additions & 35 deletions lib/src/scaffolds/custom_class_wizard/custom_class_wizard.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:dungeon_paper/db/models/custom_class.dart';
import 'package:dungeon_paper/src/dialogs/confirmation_dialog.dart';
import 'package:dungeon_paper/src/dialogs/dialogs.dart';
import 'package:dungeon_paper/src/lists/custom_class_moves_list.dart';
import 'package:dungeon_paper/src/molecules/custom_class_alignments.dart';
Expand Down Expand Up @@ -36,6 +37,7 @@ class _CustomClassWizardState extends State<CustomClassWizard>
ValueNotifier<bool> racesValid;
ValueNotifier<bool> looksValid;
ValueNotifier<bool> alignmentsValid;
bool dirty;

static const Map<CustomClassWizardTab, String> TAB_TITLES = {
CustomClassWizardTab.BasicInfo: 'General',
Expand Down Expand Up @@ -63,6 +65,7 @@ class _CustomClassWizardState extends State<CustomClassWizard>
movesValid = ValueNotifier(true);
looksValid = ValueNotifier(true);
alignmentsValid = ValueNotifier(true);
dirty = false;

tabController = TabController(length: _tabs.keys.length, vsync: this);

Expand All @@ -71,46 +74,49 @@ class _CustomClassWizardState extends State<CustomClassWizard>

@override
Widget build(BuildContext context) {
return ScaffoldWithElevation.primaryBackground(
title: Text(def.name.isEmpty
? 'Custom Class'
: '${widget.mode == DialogMode.Create ? 'Creat' : 'Edit'}ing: ${def.name}'),
actions: [
IconButton(
icon: Icon(Icons.save),
tooltip: 'Save',
onPressed: _isClsValid ? _save : null,
)
],
wrapWithScrollable: false,
useElevation: false,
elevation: 0,
body: Column(
children: <Widget>[
Row(
children: <Widget>[
Expanded(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Container(
color: Theme.of(context).primaryColor,
child: TabBar(
isScrollable: true,
controller: tabController,
tabs: _tabs.keys.map(_mapTab).toList(),
return WillPopScope(
onWillPop: _confirmExit,
child: ScaffoldWithElevation.primaryBackground(
title: Text(def.name.isEmpty
? 'Custom Class'
: '${widget.mode == DialogMode.Create ? 'Creat' : 'Edit'}ing: ${def.name}'),
actions: [
IconButton(
icon: Icon(Icons.save),
tooltip: 'Save',
onPressed: _isClsValid ? _save : null,
)
],
wrapWithScrollable: false,
useElevation: false,
elevation: 0,
body: Column(
children: <Widget>[
Row(
children: <Widget>[
Expanded(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Container(
color: Theme.of(context).primaryColor,
child: TabBar(
isScrollable: true,
controller: tabController,
tabs: _tabs.keys.map(_mapTab).toList(),
),
),
),
),
],
),
Expanded(
child: TabBarView(
controller: tabController,
children: _tabs.values.toList(),
),
],
),
Expanded(
child: TabBarView(
controller: tabController,
children: _tabs.values.toList(),
),
),
],
],
),
),
);
}
Expand Down Expand Up @@ -142,6 +148,7 @@ class _CustomClassWizardState extends State<CustomClassWizard>
customClass: def,
validityNotifier: basicInfoValid,
onUpdate: (cls) => setState(() {
dirty = true;
def = cls;
}),
),
Expand All @@ -151,6 +158,7 @@ class _CustomClassWizardState extends State<CustomClassWizard>
validityNotifier: racesValid,
raceMoveMode: true,
onUpdate: (cls) => setState(() {
dirty = true;
def = cls;
}),
),
Expand All @@ -160,6 +168,7 @@ class _CustomClassWizardState extends State<CustomClassWizard>
validityNotifier: movesValid,
raceMoveMode: false,
onUpdate: (cls) => setState(() {
dirty = true;
def = cls;
}),
),
Expand All @@ -168,6 +177,7 @@ class _CustomClassWizardState extends State<CustomClassWizard>
looks: def.looks,
validityNotifier: looksValid,
onUpdate: (looks) => setState(() {
dirty = true;
def.looks = Map<String, List<String>>.from(
looks.asMap().map(
(k, v) => MapEntry(k.toString(), v),
Expand All @@ -179,6 +189,7 @@ class _CustomClassWizardState extends State<CustomClassWizard>
mode: widget.mode,
alignments: def.alignments,
onUpdate: (alignments) => setState(() {
dirty = true;
def.alignments = alignments;
}),
),
Expand Down Expand Up @@ -217,4 +228,22 @@ class _CustomClassWizardState extends State<CustomClassWizard>
}
Navigator.pop(context);
}

Future<bool> _confirmExit() async {
var verb = widget.mode == DialogMode.Edit ? 'edit' : 'creation';
if (!dirty) {
return true;
}
if (await showDialog(
context: context,
builder: (ctx) => ConfirmationDialog(
text: Text(
'Are you sure you want to quit custom class $verb?\nYour changes will not be saved.')),
) ==
true) {
Navigator.pop(context, true);
return true;
}
return false;
}
}

0 comments on commit f3b80be

Please sign in to comment.