Line data Source code
1 : import 'package:flutter/material.dart';
2 : import 'package:flutter/services.dart';
3 :
4 : import 'package:flutter_redux/flutter_redux.dart';
5 :
6 : import '../../adventures/models/adventure_model.dart';
7 : import '../../app_state.dart';
8 : import '../../challenges/models/challenge_model.dart';
9 : import '../actions/create_adventure_node_action.dart';
10 : import '../extensions/build_context_extension.dart';
11 : import '../models/adventure_node.dart';
12 : import '../models/drop_down_model.dart';
13 : import '../widgets/adventure_nodes_drop_down.dart';
14 :
15 0 : Future<void> showNewItemDialog(BuildContext context) async {
16 0 : return showDialog<void>(
17 : context: context,
18 0 : builder: (BuildContext context) {
19 0 : var controller = TextEditingController();
20 0 : return AlertDialog(
21 : title: const Text('Make a New Item?'),
22 0 : content: NewItemDialogContent(controller),
23 0 : actions: <Widget>[
24 0 : TextButton(
25 : child: const Text('Cancel'),
26 0 : onPressed: () {
27 0 : Navigator.of(context).pop();
28 : },
29 : ),
30 0 : TextButton(
31 : child: const Text('OK'),
32 0 : onPressed: () {
33 0 : context.dispatch(CreateAdventureNodeAction(controller.text));
34 0 : Navigator.of(context).pop();
35 : },
36 : ),
37 : ],
38 : );
39 : });
40 : }
41 :
42 : class NewItemDialogContent extends StatelessWidget {
43 1 : const NewItemDialogContent(
44 : this.controller, {
45 : Key? key,
46 1 : }) : super(key: key);
47 :
48 : final TextEditingController controller;
49 :
50 1 : @override
51 : Widget build(BuildContext context) {
52 1 : return StoreConnector<AppState, AdventureNode?>(
53 : distinct: true,
54 : // Get the 'last' selection, ie. furtherst from the root of the tree.
55 4 : converter: (store) => (store.state.steps.selected ??
56 3 : store.state.tasks.selected ??
57 3 : store.state.challenges.selected ??
58 3 : store.state.adventures.selected) as AdventureNode?,
59 1 : builder: (context, lastSelection) {
60 : var seenEnter = false; // only perform dispatch on Enter once
61 1 : return SingleChildScrollView(
62 1 : child: ListBody(
63 1 : children: <Widget>[
64 1 : Focus(
65 0 : onKeyEvent: (node, event) {
66 : if (!seenEnter &&
67 0 : event.physicalKey == PhysicalKeyboardKey.enter) {
68 : seenEnter = true;
69 : context
70 0 : .dispatch(CreateAdventureNodeAction(controller.text));
71 0 : Navigator.of(context).pop();
72 : return KeyEventResult.handled;
73 : }
74 : return KeyEventResult.ignored;
75 : },
76 1 : child: TextField(
77 1 : controller: controller,
78 1 : decoration: InputDecoration(
79 : helperText:
80 2 : 'name of ${AdventureNode.nextName(lastSelection)}',
81 : border: const OutlineInputBorder()),
82 : autofocus: true,
83 : ),
84 : ),
85 : const SizedBox(height: 20),
86 1 : if (lastSelection != null) ...[
87 : const NewItemDialogText('Located In...'),
88 : const SizedBox(height: 20),
89 1 : Container(
90 1 : color: Colors.blue[100],
91 2 : child: Stack(children: [
92 1 : Text('Adventure',
93 1 : style: TextStyle(
94 1 : color: Colors.blue.shade900, fontSize: 12)),
95 1 : Center(
96 1 : child: AdventureNodesDropDown<AdventureModel>(
97 2 : converter: (store) => DropDownModel<AdventureModel>(
98 3 : store.state.adventures.selected,
99 3 : store.state.adventures.all),
100 : ),
101 : )
102 : ]),
103 : ),
104 2 : if (lastSelection.isChallenge()) ...[
105 : const SizedBox(height: 20),
106 1 : Container(
107 1 : color: Colors.green[100],
108 2 : child: Stack(children: [
109 1 : Text('Challenge',
110 1 : style: TextStyle(
111 1 : color: Colors.green.shade900, fontSize: 12)),
112 1 : Center(
113 1 : child: AdventureNodesDropDown<ChallengeModel>(
114 2 : converter: (store) => DropDownModel<ChallengeModel>(
115 3 : store.state.challenges.selected,
116 3 : store.state.challenges.all),
117 : ),
118 : )
119 : ]),
120 : ),
121 : ]
122 : ]
123 : ],
124 : ));
125 : });
126 : }
127 : }
128 :
129 : class NewItemDialogText extends StatelessWidget {
130 5 : const NewItemDialogText(
131 : this.text, {
132 : Key? key,
133 0 : }) : super(key: key);
134 :
135 : final String text;
136 :
137 1 : @override
138 : Widget build(BuildContext context) {
139 1 : return Center(
140 2 : child: Text(text,
141 2 : style: TextStyle(color: Colors.grey.shade600, fontSize: 12)));
142 : }
143 : }
|