LCOV - code coverage report
Current view: top level - lib/shared/pages - new_item_dialog.dart (source / functions) Hit Total Coverage
Test: lcov.info Lines: 46 65 70.8 %
Date: 2022-03-03 12:16:40 Functions: 0 0 -

          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             : }

Generated by: LCOV version 1.13