1
0
Fork 0
mirror of https://github.com/Nioux/AideDeJeu.git synced 2025-10-29 06:26:02 +00:00

Réorg + menu

This commit is contained in:
Yan Maniez 2020-02-29 01:40:05 +01:00
parent e91e7e4a39
commit 9bb7055832
9 changed files with 358 additions and 309 deletions

View file

@ -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<Database> get database async {
@ -59,7 +61,7 @@ Future<Item> loadChildrenItems(Item item, List<Filter> 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) {

View file

@ -26,7 +26,7 @@ class MyApp extends StatelessWidget {
bodyText2: TextStyle(fontSize: 16.0),
),
),
home: MyHomePage(id: 'index.md'),
home: HomePage(),
);
}
}

View file

@ -0,0 +1,18 @@
import 'package:flutter/material.dart';
enum FilterType {
Choices, Range
}
class Filter {
String name;
FilterType type;
List<String> values;
Set<String> selectedValues = Set<String>();
RangeValues rangeValues;
Filter({this.name, this.type, this.values}) {
rangeValues = RangeValues(0, values.length.toDouble() - 1);
}
}

View file

@ -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<Item> children;
Item({this.id, this.name, this.alias, this.markdown, this.itemType});
Item.fromMap(Map<String, dynamic> map) {
Item(Map<String, dynamic> 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<String, dynamic> json) => new Item(
Id: json["Id"],
Name: json["Name"],
Alias: json["AltName"],
Markdown: json["Markdown"],
Discriminator: json["Discriminator"],
);*/
Map<String, dynamic> 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<String, dynamic> map)
: super.fromMap(map) {
MonsterItem(Map<String, dynamic> 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<String, dynamic> map)
: super.fromMap(map) {
Items(Map<String, dynamic> map)
: super(map) {
}
}
abstract class FilteredItems extends Items {
String family;
FilteredItems.fromMap(Map<String, dynamic> map)
: super.fromMap(map) {
FilteredItems(Map<String, dynamic> map)
: super(map) {
this.family = map["Family"];
}
List<Filter> toFilterList();
}
enum FilterType {
Choices, Range
}
class Filter {
String name;
FilterType type;
List<String> values;
Set<String> selectedValues = Set<String>();
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<String, dynamic> map)
: super.fromMap(map) {
MonsterItems(Map<String, dynamic> 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<String, dynamic> toMap() => {
//"Id": Id,
List<Filter> toFilterList() => {
types,
challenges,
@ -168,10 +131,10 @@ class MonsterItems extends FilteredItems {
Item itemFromMap(Map<String, dynamic> 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<Item> itemsFromMapList(List<Map<String, dynamic>> mapList) {

View file

View file

@ -8,7 +8,7 @@ class RangeFilter extends StatefulWidget {
final ValueChanged<RangeValues> updateRangeValues;
RangeFilter(
{@required this.values, this.rangeValues, this.updateRangeValues});
{Key key, @required this.values, this.rangeValues, this.updateRangeValues}) : super(key: key);
@override
State<StatefulWidget> createState() {
@ -40,7 +40,7 @@ class ChipListFilter extends StatefulWidget {
final Set<String> selectedChoices;
final ValueChanged<Set<String>> updateSelectedChoices;
ChipListFilter({this.choices, this.selectedChoices, this.updateSelectedChoices});
ChipListFilter({Key key, this.choices, this.selectedChoices, this.updateSelectedChoices}) : super(key: key);
@override
State<StatefulWidget> createState() {
@ -85,7 +85,7 @@ class _ChipListFilterState extends State<ChipListFilter> {
class ChipFilter extends StatefulWidget {
final String label;
ChipFilter({this.label});
ChipFilter({Key key, this.label}) : super(key: key);
@override
State<StatefulWidget> createState() {

View file

@ -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<MyHomePage> {
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) => 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: <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;
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: <Widget>[
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')),
),
),
],
));
}
}

View file

@ -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<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,
),
);
}
}