mirror of
				https://github.com/Nioux/AideDeJeu.git
				synced 2025-10-30 23:16:09 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			269 lines
		
	
	
	
		
			7 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			269 lines
		
	
	
	
		
			7 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'package:aidedejeu_flutter/database.dart';
 | |
| import 'package:aidedejeu_flutter/models/filters.dart';
 | |
| import 'package:aidedejeu_flutter/widgets/filters.dart';
 | |
| import 'package:aidedejeu_flutter/models/items.dart';
 | |
| import 'package:flutter/material.dart';
 | |
| import 'package:flutter/services.dart';
 | |
| import 'package:flutter_markdown/flutter_markdown.dart';
 | |
| import 'package:flutter_svg/flutter_svg.dart';
 | |
| 
 | |
| class LibraryPage extends StatefulWidget {
 | |
|   LibraryPage({Key key, @required this.id}) : super(key: key);
 | |
| 
 | |
|   final String id;
 | |
| 
 | |
|   @override
 | |
|   _LibraryPageState createState() => _LibraryPageState();
 | |
| }
 | |
| 
 | |
| class _LibraryPageState extends State<LibraryPage> {
 | |
|   void setItem(Item item) {
 | |
|     setState(() {
 | |
|       this.item = item;
 | |
|       if (item is FilteredItems) {
 | |
|         this.filters = (item as FilteredItems).toFilterList();
 | |
|       } else {
 | |
|         this.filters = null;
 | |
|       }
 | |
|       this.markdown =
 | |
|           item.markdown.replaceAllMapped(RegExp(r'<!--.*?-->'), (match) {
 | |
|             return '';
 | |
|           });
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   String markdown = "";
 | |
|   Item item = null;
 | |
|   MarkdownStyleSheet styleSheet;
 | |
|   List<Filter> filters = null;
 | |
| 
 | |
|   @override
 | |
|   void initState() {
 | |
|     super.initState();
 | |
| 
 | |
| 
 | |
|     _loadItem().then((item) => setItem(item));
 | |
|   }
 | |
| 
 | |
|   @protected
 | |
|   @mustCallSuper
 | |
|   void didChangeDependencies() {
 | |
|     styleSheet = MarkdownStyleSheet.fromTheme(Theme.of(context)).copyWith(
 | |
|       tableColumnWidth: IntrinsicColumnWidth(),
 | |
|       tableCellsPadding: EdgeInsets.all(0.2),
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   Future<Item> _loadItem() async {
 | |
|     var item = await getItemWithId(this.widget.id);
 | |
|     var items = await loadChildrenItems(item, filters);
 | |
|     //setItem(item);
 | |
|     return item;
 | |
|   }
 | |
| 
 | |
|   Widget _buildMarkdown(BuildContext context) {
 | |
|     return Markdown(
 | |
|       data: markdown,
 | |
|       styleSheet: styleSheet,
 | |
|       onTapLink: (link) => Navigator.push(
 | |
|         context,
 | |
|         MaterialPageRoute(builder: (context) => LibraryPage(id: link)),
 | |
|       ),
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   Widget _buildMarkdownBody(BuildContext context) {
 | |
|     return Container(
 | |
|         margin: const EdgeInsets.all(10.0),
 | |
|         child: MarkdownBody(
 | |
|           data: markdown,
 | |
|           styleSheet: styleSheet,
 | |
|           onTapLink: (link) => Navigator.push(
 | |
|             context,
 | |
|             MaterialPageRoute(builder: (context) => LibraryPage(id: link)),
 | |
|           ),
 | |
|         ));
 | |
|   }
 | |
| 
 | |
|   Widget _buildChildTile(BuildContext context, Item item) {
 | |
|     return ListTile(
 | |
|       title: Text(item.name),
 | |
|       subtitle: Text(item.aliasText ?? ""),
 | |
|       onTap: () => Navigator.push(
 | |
|         context,
 | |
|         MaterialPageRoute(builder: (context) => LibraryPage(id: item.id)),
 | |
|       ),
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   Widget _buildLibraryItemPage() {
 | |
|     return Stack(
 | |
|       children: <Widget>[
 | |
|         ListView.builder(
 | |
|             itemCount: (item?.children?.length ?? 0) + 1,
 | |
|             itemBuilder: (BuildContext context, int index) {
 | |
|               return index == 0
 | |
|                   ? _buildMarkdownBody(context)
 | |
|                   : _buildChildTile(context, item.children[index - 1]);
 | |
|             })
 | |
|       ],
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   Widget _buildBookmarksPage() {
 | |
|     return Text("Bookmarks");
 | |
|   }
 | |
| 
 | |
|   Widget _buildSearchPage() {
 | |
|     return Text("Search");
 | |
|   }
 | |
| 
 | |
|   BottomNavigationBarItem _buildBottomNavigationBarItem(
 | |
|       String title, String assetName) {
 | |
|     return BottomNavigationBarItem(
 | |
|       icon: SvgPicture.asset(
 | |
|         assetName,
 | |
|         height: 30.0,
 | |
|         width: 30.0,
 | |
|         allowDrawingOutsideViewBox: true,
 | |
|       ),
 | |
|       title: Text(title),
 | |
|       activeIcon: SvgPicture.asset(
 | |
|         assetName,
 | |
|         height: 40.0,
 | |
|         width: 40.0,
 | |
|         allowDrawingOutsideViewBox: true,
 | |
|       ),
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   List _buildBottomNavigationBarItems() {
 | |
|     return <BottomNavigationBarItem>[
 | |
|       _buildBottomNavigationBarItem("Bibliothèque", "assets/spell-book.svg"),
 | |
|       _buildBottomNavigationBarItem("Favoris", "assets/stars-stack.svg"),
 | |
|       _buildBottomNavigationBarItem("Recherche", "assets/crystal-ball.svg"),
 | |
|     ];
 | |
|   }
 | |
| 
 | |
|   Widget _buildChoiceFilter(Filter filter) {
 | |
|     return ChipListFilter(
 | |
|       choices: filter.values,
 | |
|       selectedChoices: filter.selectedValues,
 | |
|       updateSelectedChoices: (Set<String> choices) {
 | |
|         setState(() {
 | |
|           filter.selectedValues = choices;
 | |
|         });
 | |
|         loadChildrenItems(item, filters).then((value) => {
 | |
|           setState(() {
 | |
|             this.item = item;
 | |
|             this.filters = filters;
 | |
|           })
 | |
|         });
 | |
|       },
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   Widget _buildRangeFilter(Filter filter) {
 | |
|     return RangeFilter(
 | |
|         values: filter.values,
 | |
|         rangeValues: filter.rangeValues,
 | |
|         updateRangeValues: (RangeValues values) {
 | |
|           setState(() {
 | |
|             filter.rangeValues = values;
 | |
|           });
 | |
|           loadChildrenItems(item, filters).then((value) => {
 | |
|             setState(() {
 | |
|               this.item = item;
 | |
|               this.filters = filters;
 | |
|             })
 | |
|           });
 | |
|         });
 | |
|   }
 | |
| 
 | |
|   Widget _buildFilter(Filter filter) {
 | |
|     return Column(children: <Widget>[
 | |
|       Divider(
 | |
|         color: Colors.blueGrey,
 | |
|         height: 10.0,
 | |
|       ),
 | |
|       Align(
 | |
|         alignment: Alignment.centerLeft,
 | |
|         child: Padding(
 | |
|           padding: const EdgeInsets.all(8.0),
 | |
|           child: Text(filter.name),
 | |
|         ),
 | |
|       ),
 | |
|       Container(
 | |
|           child: filter.type == FilterType.Choices
 | |
|               ? _buildChoiceFilter(filter)
 | |
|               : _buildRangeFilter(filter))
 | |
|     ]);
 | |
|   }
 | |
| 
 | |
|   List<Widget> _buildFilterList() {
 | |
|     return filters.map((filter) => _buildFilter(filter)).toList();
 | |
|   }
 | |
| 
 | |
|   int indexPage = 0;
 | |
| 
 | |
|   @override
 | |
|   Widget build(BuildContext context) {
 | |
|     print("build");
 | |
|     Widget currentPage;
 | |
|     switch (indexPage) {
 | |
|       case 0:
 | |
|         currentPage = _buildLibraryItemPage();
 | |
|         break;
 | |
|       case 1:
 | |
|         currentPage = _buildBookmarksPage();
 | |
|         break;
 | |
|       case 2:
 | |
|         currentPage = _buildSearchPage();
 | |
|         break;
 | |
|     }
 | |
| 
 | |
|     return Scaffold(
 | |
|       //appBar: AppBar(
 | |
|       //  title: Text(widget.id),
 | |
|       //),
 | |
|       body: currentPage,
 | |
|       bottomNavigationBar: BottomNavigationBar(
 | |
|         currentIndex: indexPage,
 | |
|         onTap: (int index) {
 | |
|           setState(() {
 | |
|             this.indexPage = index;
 | |
|           });
 | |
|         },
 | |
|         items: _buildBottomNavigationBarItems(),
 | |
|       ),
 | |
|       endDrawer: filters != null
 | |
|           ? Drawer(
 | |
|         child: ListView(
 | |
|           // Important: Remove any padding from the ListView.
 | |
|             padding: EdgeInsets.zero,
 | |
|             children: _buildFilterList()),
 | |
|       )
 | |
|           : null,
 | |
|       appBar: AppBar(
 | |
|         title: Text(widget.id),
 | |
|         actions: filters != null
 | |
|             ? [
 | |
|           Builder(
 | |
|             builder: (context) => IconButton(
 | |
|               icon: SvgPicture.asset(
 | |
|                 "assets/funnel.svg",
 | |
|                 height: 30.0,
 | |
|                 width: 30.0,
 | |
|                 allowDrawingOutsideViewBox: true,
 | |
|               ), //Icon(Icons.filter),
 | |
|               onPressed: () => Scaffold.of(context).openEndDrawer(),
 | |
|               tooltip:
 | |
|               MaterialLocalizations.of(context).openAppDrawerTooltip,
 | |
|             ),
 | |
|           ),
 | |
|         ]
 | |
|             : null,
 | |
|       ),
 | |
|     );
 | |
|   }
 | |
| }
 | 
