From 9bb70558326988a92c3b8844579534a50aeef88b Mon Sep 17 00:00:00 2001 From: Yan Maniez Date: Sat, 29 Feb 2020 01:40:05 +0100 Subject: [PATCH] =?UTF-8?q?R=C3=A9org=20+=20menu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- aidedejeu_flutter/lib/database.dart | 4 +- aidedejeu_flutter/lib/main.dart | 2 +- aidedejeu_flutter/lib/models/filters.dart | 18 ++ aidedejeu_flutter/lib/models/items.dart | 63 +--- aidedejeu_flutter/lib/widgets/about.dart | 0 aidedejeu_flutter/lib/widgets/filters.dart | 6 +- aidedejeu_flutter/lib/widgets/homepage.dart | 305 ++++---------------- aidedejeu_flutter/lib/widgets/library.dart | 269 +++++++++++++++++ aidedejeu_flutter/lib/widgets/pceditor.dart | 0 9 files changed, 358 insertions(+), 309 deletions(-) create mode 100644 aidedejeu_flutter/lib/models/filters.dart create mode 100644 aidedejeu_flutter/lib/widgets/about.dart create mode 100644 aidedejeu_flutter/lib/widgets/library.dart create mode 100644 aidedejeu_flutter/lib/widgets/pceditor.dart diff --git a/aidedejeu_flutter/lib/database.dart b/aidedejeu_flutter/lib/database.dart index c28a9819..1c74c89e 100644 --- a/aidedejeu_flutter/lib/database.dart +++ b/aidedejeu_flutter/lib/database.dart @@ -5,6 +5,8 @@ import 'package:flutter/services.dart'; import 'package:path/path.dart'; import 'package:sqflite/sqflite.dart'; +import 'models/filters.dart'; + Database _database; Future get database async { @@ -59,7 +61,7 @@ Future loadChildrenItems(Item item, List filters) async { item.itemType.substring(0, item.itemType.length - 1); String family = ""; if (item is FilteredItems) { - family = (item as FilteredItems)?.family ?? ""; + family = item.family ?? ""; } String whereFilter = ""; if(filters != null) { diff --git a/aidedejeu_flutter/lib/main.dart b/aidedejeu_flutter/lib/main.dart index a5ab0de3..6a79ca61 100644 --- a/aidedejeu_flutter/lib/main.dart +++ b/aidedejeu_flutter/lib/main.dart @@ -26,7 +26,7 @@ class MyApp extends StatelessWidget { bodyText2: TextStyle(fontSize: 16.0), ), ), - home: MyHomePage(id: 'index.md'), + home: HomePage(), ); } } diff --git a/aidedejeu_flutter/lib/models/filters.dart b/aidedejeu_flutter/lib/models/filters.dart new file mode 100644 index 00000000..cdecaea0 --- /dev/null +++ b/aidedejeu_flutter/lib/models/filters.dart @@ -0,0 +1,18 @@ + +import 'package:flutter/material.dart'; + +enum FilterType { + Choices, Range +} +class Filter { + String name; + FilterType type; + List values; + Set selectedValues = Set(); + RangeValues rangeValues; + + Filter({this.name, this.type, this.values}) { + rangeValues = RangeValues(0, values.length.toDouble() - 1); + } +} + diff --git a/aidedejeu_flutter/lib/models/items.dart b/aidedejeu_flutter/lib/models/items.dart index 8d4bcb8e..8f4e8284 100644 --- a/aidedejeu_flutter/lib/models/items.dart +++ b/aidedejeu_flutter/lib/models/items.dart @@ -1,4 +1,4 @@ -import 'package:flutter/material.dart'; +import 'package:aidedejeu_flutter/models/filters.dart'; class Item { String id; @@ -17,9 +17,7 @@ class Item { String itemType; List children; - Item({this.id, this.name, this.alias, this.markdown, this.itemType}); - - Item.fromMap(Map map) { + Item(Map map) { this.id = map["Id"]; this.rootId = map["RootId"]; this.name = map["Name"]; @@ -28,24 +26,6 @@ class Item { this.markdown = map["Markdown"]; this.itemType = map["ItemType"]; } - - /*factory Item.fromMap(Map json) => new Item( - Id: json["Id"], - Name: json["Name"], - Alias: json["AltName"], - Markdown: json["Markdown"], - Discriminator: json["Discriminator"], - );*/ - - Map toMap() => { - "Id": id, - "RootId": rootId, - "Name": name, - "AltName": alias, - "AltNameText": aliasText, - "Markdown": markdown, - "ItemType": itemType, - }; } class MonsterItem extends Item { @@ -75,8 +55,8 @@ class MonsterItem extends Item { String challenge; int xp; - MonsterItem.fromMap(Map map) - : super.fromMap(map) { + MonsterItem(Map map) + : super(map) { this.family = map["Family"]; this.type = map["Type"]; this.size = map["Size"]; @@ -107,37 +87,22 @@ class MonsterItem extends Item { class Items extends Item { - Items.fromMap(Map map) - : super.fromMap(map) { + Items(Map map) + : super(map) { } } abstract class FilteredItems extends Items { String family; - FilteredItems.fromMap(Map map) - : super.fromMap(map) { + FilteredItems(Map map) + : super(map) { this.family = map["Family"]; } List toFilterList(); } -enum FilterType { - Choices, Range -} -class Filter { - String name; - FilterType type; - List values; - Set selectedValues = Set(); - RangeValues rangeValues; - - Filter({this.name, this.type, this.values}) { - rangeValues = RangeValues(0, values.length.toDouble() - 1); - } -} - class MonsterItems extends FilteredItems { Filter types; Filter challenges; @@ -145,8 +110,8 @@ class MonsterItems extends FilteredItems { Filter sources; Filter terrains; - MonsterItems.fromMap(Map map) - : super.fromMap(map) { + MonsterItems(Map map) + : super(map) { this.types = Filter(name: "Type", type: FilterType.Choices, values: map["Types"].toString().split("|")); this.challenges = Filter(name: "Challenge", type: FilterType.Range, values: map["Challenges"].toString().split("|")); this.sizes = Filter(name: "Size", type: FilterType.Range, values: map["Sizes"].toString().split("|"));; @@ -154,8 +119,6 @@ class MonsterItems extends FilteredItems { this.terrains = Filter(name: "Terrain", type: FilterType.Choices, values: map["Terrains"].toString().split("|")); } -// Map toMap() => { - //"Id": Id, List toFilterList() => { types, challenges, @@ -168,10 +131,10 @@ class MonsterItems extends FilteredItems { Item itemFromMap(Map map) { switch(map["ItemType"]) { - case "MonsterItem": return MonsterItem.fromMap(map); - case "MonsterItems": return MonsterItems.fromMap(map); + case "MonsterItem": return MonsterItem(map); + case "MonsterItems": return MonsterItems(map); } - return Item.fromMap(map); + return Item(map); } List itemsFromMapList(List> mapList) { diff --git a/aidedejeu_flutter/lib/widgets/about.dart b/aidedejeu_flutter/lib/widgets/about.dart new file mode 100644 index 00000000..e69de29b diff --git a/aidedejeu_flutter/lib/widgets/filters.dart b/aidedejeu_flutter/lib/widgets/filters.dart index 07155187..5a23a42a 100644 --- a/aidedejeu_flutter/lib/widgets/filters.dart +++ b/aidedejeu_flutter/lib/widgets/filters.dart @@ -8,7 +8,7 @@ class RangeFilter extends StatefulWidget { final ValueChanged updateRangeValues; RangeFilter( - {@required this.values, this.rangeValues, this.updateRangeValues}); + {Key key, @required this.values, this.rangeValues, this.updateRangeValues}) : super(key: key); @override State createState() { @@ -40,7 +40,7 @@ class ChipListFilter extends StatefulWidget { final Set selectedChoices; final ValueChanged> updateSelectedChoices; - ChipListFilter({this.choices, this.selectedChoices, this.updateSelectedChoices}); + ChipListFilter({Key key, this.choices, this.selectedChoices, this.updateSelectedChoices}) : super(key: key); @override State createState() { @@ -85,7 +85,7 @@ class _ChipListFilterState extends State { class ChipFilter extends StatefulWidget { final String label; - ChipFilter({this.label}); + ChipFilter({Key key, this.label}) : super(key: key); @override State createState() { diff --git a/aidedejeu_flutter/lib/widgets/homepage.dart b/aidedejeu_flutter/lib/widgets/homepage.dart index ea1b478f..05d69237 100644 --- a/aidedejeu_flutter/lib/widgets/homepage.dart +++ b/aidedejeu_flutter/lib/widgets/homepage.dart @@ -1,268 +1,65 @@ 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:aidedejeu_flutter/widgets/library.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 MyHomePage extends StatefulWidget { - MyHomePage({Key key, @required this.id}) : super(key: key); - - final String id; - - @override - _MyHomePageState createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State { - 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 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 _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) => MyHomePage(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) => MyHomePage(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) => MyHomePage(id: item.id)), - ), - ); - } - - Widget _buildLibraryPage() { - return Stack( - children: [ - 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 [ - _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 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: [ - 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 _buildFilterList() { - return filters.map((filter) => _buildFilter(filter)).toList(); - } - - int indexPage = 0; +class HomePage extends StatelessWidget { + HomePage({Key key}) : super(key: key); @override Widget build(BuildContext context) { - print("build"); - Widget currentPage; - switch (indexPage) { - case 0: - currentPage = _buildLibraryPage(); - 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, - ), - ); + appBar: AppBar(title: Text("Haches & Dés"),), + body: Column( + children: [ + FlatButton.icon( + label: Text("Bibliothèque"), + icon: SvgPicture.asset( + "assets/spell-book.svg", + height: 100.0, + width: 100.0, + allowDrawingOutsideViewBox: true, + ), + onPressed: () => Navigator.push( + context, + MaterialPageRoute( + builder: (context) => LibraryPage(id: 'index.md')), + ), + ), + FlatButton.icon( + label: Text("Personnages"), + icon: SvgPicture.asset( + "assets/swordman.svg", + height: 100.0, + width: 100.0, + allowDrawingOutsideViewBox: true, + ), + onPressed: () => Navigator.push( + context, + MaterialPageRoute( + builder: (context) => LibraryPage(id: 'index.md')), + ), + ), + FlatButton.icon( + label: Text("A propos de..."), + icon: SvgPicture.asset( + "assets/wooden-sign.svg", + height: 100.0, + width: 100.0, + allowDrawingOutsideViewBox: true, + ), + onPressed: () => Navigator.push( + context, + MaterialPageRoute( + builder: (context) => LibraryPage(id: 'index.md')), + ), + ), + ], + )); } } diff --git a/aidedejeu_flutter/lib/widgets/library.dart b/aidedejeu_flutter/lib/widgets/library.dart new file mode 100644 index 00000000..9d1501b4 --- /dev/null +++ b/aidedejeu_flutter/lib/widgets/library.dart @@ -0,0 +1,269 @@ +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 { + 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 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 _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: [ + 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 [ + _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 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: [ + 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 _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, + ), + ); + } +} diff --git a/aidedejeu_flutter/lib/widgets/pceditor.dart b/aidedejeu_flutter/lib/widgets/pceditor.dart new file mode 100644 index 00000000..e69de29b