diff --git a/mobile/assets/about.md b/mobile/assets/about.md new file mode 100644 index 0000000..563e40e --- /dev/null +++ b/mobile/assets/about.md @@ -0,0 +1,25 @@ +# Introduction + +Musicus is a classical music player and organizer. + +# Contact + +Please contact me [via e-mail](mailto:johrpan@gmail.com?subject=Musicus), if +you have any questions or need help. I'm also open to ideas for the future of +Musicus! Musicus is free and open source software. You can study the source +code and contribute to it on [GitHub](https://github.com/johrpan/musicus). + +# License + +© 2019–2020 Elias Projahn + +This program is free software: you can redistribute it and/or modify it under +the terms of the GNU Affero General Public License as published by the Free +Software Foundation, either version 3 of the License, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the +[GNU Affero General Public License](https://www.gnu.org/licenses/agpl-3.0.html) +for more details. \ No newline at end of file diff --git a/mobile/lib/screens/about.dart b/mobile/lib/screens/about.dart new file mode 100644 index 0000000..c80aa2c --- /dev/null +++ b/mobile/lib/screens/about.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_markdown/flutter_markdown.dart'; +import 'package:url_launcher/url_launcher.dart' as url; + +class AboutScreen extends StatelessWidget { + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final textTheme = theme.textTheme; + + return Scaffold( + appBar: AppBar( + title: Text('About'), + ), + body: FutureBuilder( + future: rootBundle.loadString('assets/about.md'), + builder: (context, snapshot) { + if (snapshot.hasData) { + return Markdown( + data: snapshot.data, + styleSheet: MarkdownStyleSheet( + h1: textTheme.headline6.copyWith( + height: 2.0, + ), + a: textTheme.bodyText1.copyWith( + color: theme.accentColor, + decoration: TextDecoration.underline, + ), + ), + onTapLink: (link) => url.launch(link), + ); + } else { + return Container(); + } + }, + ), + ); + } +} diff --git a/mobile/lib/screens/home.dart b/mobile/lib/screens/home.dart index 387959e..07269a6 100644 --- a/mobile/lib/screens/home.dart +++ b/mobile/lib/screens/home.dart @@ -4,6 +4,7 @@ import 'package:musicus_database/musicus_database.dart'; import '../icons.dart'; +import 'about.dart'; import 'person.dart'; import 'settings.dart'; @@ -48,6 +49,10 @@ class _HomeScreenState extends State { value: 2, child: Text('Settings'), ), + PopupMenuItem( + value: 3, + child: Text('About'), + ), ], onSelected: (selected) { if (selected == 1) { @@ -65,6 +70,13 @@ class _HomeScreenState extends State { builder: (context) => SettingsScreen(), ), ); + } else if (selected == 3) { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => AboutScreen(), + ), + ); } }, ), diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index 16eb29c..80891f5 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -12,6 +12,7 @@ dependencies: audio_service: flutter: sdk: flutter + flutter_markdown: meta: moor: moor_ffi: @@ -27,9 +28,12 @@ dependencies: path_provider: rxdart: shared_preferences: + url_launcher: flutter: uses-material-design: true + assets: + - assets/about.md fonts: - family: Libertinus Sans fonts: