Line data Source code
1 : 2 : import 'package:flutter/material.dart'; 3 : import 'package:pal/src/database/entity/helper/helper_entity.dart'; 4 : import 'package:pal/src/database/entity/helper/helper_type.dart'; 5 : import 'package:pal/src/ui/editor/pages/create_helper/create_helper_viewmodel.dart'; 6 : import 'package:pal/src/ui/editor/pages/helper_editor/helper_editor.dart'; 7 : import 'package:pal/src/ui/editor/pages/media_gallery/media_gallery.dart'; 8 : import 'package:pal/src/ui/shared/utilities/element_finder.dart'; 9 : 10 : import '../../../../router.dart'; 11 : import 'font_editor/pickers/font_family_picker/font_family_picker.dart'; 12 : import 'font_editor/pickers/font_weight_picker/font_weight_picker.dart'; 13 : import 'helpers/editor_fullscreen_helper/editor_fullscreen_helper.dart'; 14 : import 'helpers/editor_simple_helper/editor_simple_helper.dart'; 15 : import 'helpers/editor_update_helper/editor_update_helper.dart'; 16 : 17 : /// this class will show the correct helper editor for each types 18 : /// we don't use a navigator push as we use the overlay feature for 19 : /// reaching the overlayed page elements (@see anchoredHelper) 20 : class EditorRouter { 21 : 22 : final GlobalKey<NavigatorState> hostedAppNavigatorKey; 23 : 24 0 : EditorRouter(this.hostedAppNavigatorKey); 25 : 26 : /// Open editor page as an overlay 27 0 : Future createHelper( 28 : final String currentPageRoute, 29 : final CreateHelperModel model) async 30 : { 31 0 : var elementFinder = ElementFinder(hostedAppNavigatorKey.currentContext); 32 0 : HelperEditorPageArguments args = HelperEditorPageArguments( 33 0 : hostedAppNavigatorKey, 34 : currentPageRoute, 35 0 : helperMinVersion: model.minVersionController?.value?.text, 36 : ); 37 : WidgetBuilder builder; 38 0 : switch(model.selectedHelperType) { 39 0 : case HelperType.SIMPLE_HELPER: 40 0 : builder = (context) => EditorSimpleHelperPage.create( 41 : parameters: args, 42 0 : helperViewModel: model.asHelperViewModel(), 43 : ); 44 : break; 45 0 : case HelperType.UPDATE_HELPER: 46 0 : builder = (context) => EditorUpdateHelperPage.create( 47 : parameters: args, 48 0 : helperViewModel: model.asHelperViewModel(), 49 : ); 50 : break; 51 0 : case HelperType.HELPER_FULL_SCREEN: 52 0 : builder = (context) => EditorFullScreenHelperPage.create( 53 : parameters: args, 54 0 : helperViewModel: model.asHelperViewModel(), 55 : ); 56 : break; 57 : default: 58 : throw 'HELPER TYPE NOT HANDLED'; 59 : } 60 0 : showOverlayed(hostedAppNavigatorKey, builder); 61 : } 62 : 63 0 : Future editHelper(final String currentPageRoute, final HelperEntity helperEntity) async { 64 0 : var elementFinder = ElementFinder(hostedAppNavigatorKey.currentContext); 65 0 : HelperEditorPageArguments args = HelperEditorPageArguments( 66 0 : hostedAppNavigatorKey, 67 : currentPageRoute, 68 : ); 69 : WidgetBuilder builder; 70 0 : switch(helperEntity.type) { 71 0 : case HelperType.SIMPLE_HELPER: 72 0 : builder = (context) => InnerEditorRouter( 73 0 : child: EditorSimpleHelperPage.edit( 74 : parameters: args, 75 : helperEntity: helperEntity, 76 : ), 77 : ); 78 : break; 79 0 : case HelperType.UPDATE_HELPER: 80 0 : builder = (context) => InnerEditorRouter( 81 0 : child: EditorUpdateHelperPage.edit( 82 : parameters: args, 83 : helperEntity: helperEntity, 84 : ), 85 : ); 86 : break; 87 0 : case HelperType.HELPER_FULL_SCREEN: 88 0 : builder = (context) => InnerEditorRouter( 89 0 : child: EditorFullScreenHelperPage.edit( 90 : parameters: args, 91 : helperEntity: helperEntity, 92 : ), 93 : ); 94 : break; 95 : default: 96 : throw 'HELPER TYPE NOT HANDLED'; 97 : } 98 0 : showOverlayed(hostedAppNavigatorKey, builder); 99 : } 100 : } 101 : 102 : /// Editor has some pages to show like change font, color... 103 : /// so it has his own routing strategy 104 : class InnerEditorRouter extends StatefulWidget { 105 : 106 : final Widget child; 107 : 108 0 : InnerEditorRouter({@required this.child}); 109 : 110 0 : @override 111 0 : _InnerEditorRouterState createState() => _InnerEditorRouterState(); 112 : } 113 : 114 : class _InnerEditorRouterState extends State<InnerEditorRouter> { 115 : 116 : final GlobalKey<NavigatorState> innerEditorNavKey = GlobalKey<NavigatorState>(); 117 : InnerEditorRouterDelegate _routerDelegate; 118 : 119 0 : void initState() { 120 0 : super.initState(); 121 0 : _routerDelegate = InnerEditorRouterDelegate( 122 0 : child: widget.child, 123 0 : innerEditorNavKey: innerEditorNavKey 124 : ); 125 : } 126 : 127 0 : @override 128 : void didUpdateWidget(covariant InnerEditorRouter oldWidget) { 129 0 : super.didUpdateWidget(oldWidget); 130 : } 131 : 132 0 : @override 133 : Widget build(BuildContext context) { 134 0 : return Router( 135 0 : routerDelegate: _routerDelegate, 136 : ); 137 : } 138 : } 139 : 140 : 141 : abstract class InnerEditorRoutePath {} 142 : 143 : 144 : class InnerEditorRouterDelegate extends RouterDelegate<InnerEditorRoutePath> with ChangeNotifier, PopNavigatorRouterDelegateMixin { 145 : 146 : final GlobalKey<NavigatorState> innerEditorNavKey; 147 : 148 : Widget child; 149 : 150 0 : InnerEditorRouterDelegate({this.child, this.innerEditorNavKey}); 151 : 152 0 : @override 153 : Widget build(BuildContext context) { 154 0 : return Navigator( 155 0 : key: innerEditorNavKey, 156 0 : onGenerateRoute: (RouteSettings settings) { 157 0 : switch (settings.name) { 158 0 : case '/editor/new/font-family': 159 0 : FontFamilyPickerArguments args = settings.arguments; 160 0 : return MaterialPageRoute( 161 0 : builder: (context) => FontFamilyPickerPage( 162 : arguments: args, 163 : )); 164 0 : case '/editor/new/font-weight': 165 0 : FontWeightPickerArguments args = settings.arguments; 166 0 : return MaterialPageRoute( 167 0 : builder: (context) => FontWeightPickerPage( 168 : arguments: args, 169 : )); 170 0 : case '/editor/media-gallery': 171 0 : MediaGalleryPageArguments args = settings.arguments; 172 0 : return MaterialPageRoute( 173 0 : builder: (context) => 174 0 : MediaGalleryPage( 175 0 : mediaId: args.mediaId, 176 : )); 177 : default: 178 0 : return MaterialPageRoute( 179 0 : builder: (context) => child, 180 : maintainState: true 181 : ); 182 : } 183 : }, 184 0 : onPopPage: (route, result) { 185 0 : notifyListeners(); 186 0 : return route.didPop(result); 187 : }, 188 : ); 189 : } 190 : 191 0 : @override 192 0 : GlobalKey<NavigatorState> get navigatorKey => innerEditorNavKey; 193 : 194 0 : @override 195 : Future<void> setNewRoutePath(InnerEditorRoutePath configuration) { 196 0 : throw UnimplementedError(); 197 : } 198 : 199 : }