From 8f467968b0fa0b1322a4d9d57d1349703b405367 Mon Sep 17 00:00:00 2001 From: Julian Mutter Date: Wed, 22 Feb 2023 17:18:56 +0100 Subject: [PATCH] Add sheet view page --- lib/main.dart | 88 +++++++++------------------------------------- lib/sheet.dart | 65 ++++++++++++++++++++++++++++++++++ lib/sheetview.dart | 23 ++++++++++++ 3 files changed, 104 insertions(+), 72 deletions(-) create mode 100644 lib/sheet.dart create mode 100644 lib/sheetview.dart diff --git a/lib/main.dart b/lib/main.dart index 46b09e4..dd30f99 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,7 +1,7 @@ -import 'dart:io'; - import 'package:flutter/material.dart'; -import 'package:path/path.dart' as p; +import 'package:sheetless/sheetview.dart'; + +import 'sheet.dart'; void main() { runApp(const MyApp()); @@ -18,100 +18,44 @@ class MyApp extends StatelessWidget { useMaterial3: true, primarySwatch: Colors.blue, ), - home: const MyHomePage(title: 'Sheetless'), + home: const MyHomePage(), ); } } class MyHomePage extends StatefulWidget { - const MyHomePage({super.key, required this.title}); - - final String title; + const MyHomePage({super.key}); @override State createState() => _MyHomePageState(); } -class Sheet { - final String author; - final String name; - - Sheet(this.author, this.name); -} - class _MyHomePageState extends State { - Future> loadSheets() async { - print("LOADING SHEETS!!! ###############################"); - // TODO: Handle directory not found - var dir = Directory("/home/julian/Nextcloud/jhome/Klavier-Noten/"); - final List sheets = List.empty(growable: true); - if (dir.existsSync()) { - await for (final FileSystemEntity x in dir.list()) { - if (x is Directory) { - var y = x; - var authorName = p.basename(y.path); - await for (final FileSystemEntity a in y.list()) { - if (a is File) { - var sheetName = p.basenameWithoutExtension(a.path); - sheets.add(Sheet(authorName, sheetName)); - } - } - } - } - } - return sheets; - } - @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text(widget.title), + title: const Text("My Sheets"), ), - // body: Center( - // child: Column( - // mainAxisAlignment: MainAxisAlignment.center, - // children: [ body: FutureBuilder( - future: loadSheets(), + future: loadSheetsSorted(), builder: (BuildContext context, AsyncSnapshot> snapshot) { if (snapshot.hasData) { - return SheetsWidget(sheets: snapshot.data!); + return SheetsWidget( + sheets: snapshot.data!, + callback: (sheet) => Navigator.push( + context, + MaterialPageRoute( + builder: (context) => SheetViewerPage(sheet: sheet), + ), + ), + ); } else if (snapshot.hasError) { return const Icon(Icons.error); } else { return const CircularProgressIndicator(); } }), - // const Text( - // 'You have pushed the button this many times:', - // ), - // Text( - // '$_counter', - // style: Theme.of(context).textTheme.headlineMedium, - // ), - // ], - // ), - // ), ); } } - -class SheetsWidget extends StatelessWidget { - final List sheets; - - const SheetsWidget({super.key, required this.sheets}); - - @override - Widget build(context) { - return ListView.builder( - itemCount: sheets.length, - itemBuilder: (context, index) { - var sheet = sheets[index]; - return ListTile( - title: Text(sheet.name), - subtitle: Text(sheet.author), - ); - }); - } -} diff --git a/lib/sheet.dart b/lib/sheet.dart new file mode 100644 index 0000000..3c6dd13 --- /dev/null +++ b/lib/sheet.dart @@ -0,0 +1,65 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:path/path.dart' as p; + +class Sheet { + final String author; + final String name; + + Sheet(this.author, this.name); +} + +Future> loadSheetsSorted() async { + var sheets = await _loadSheets(); + sheets.sort((left, right) => left.name.compareTo(right.name)); + return sheets; +} + +Future> _loadSheets() async { + // TODO: Handle directory not found + var dir = Directory("/home/julian/Nextcloud/jhome/Klavier-Noten/"); + final List sheets = List.empty(growable: true); + if (dir.existsSync()) { + await for (final FileSystemEntity x in dir.list()) { + if (x is Directory) { + var authorName = p.basename(x.path); + await for (final FileSystemEntity a in x.list()) { + if (a is File) { + var sheetName = p.basenameWithoutExtension(a.path); + sheetName = sheetName.capitalize(); + sheets.add(Sheet(authorName, sheetName)); + } + } + } + } + } + return sheets; +} + +extension StringExtension on String { + String capitalize() { + return "${this[0].toUpperCase()}${substring(1).toLowerCase()}"; + } +} + +class SheetsWidget extends StatelessWidget { + final List sheets; + final ValueSetter callback; + + const SheetsWidget({super.key, required this.sheets, required this.callback}); + + @override + Widget build(context) { + return ListView.builder( + itemCount: sheets.length, + itemBuilder: (context, index) { + var sheet = sheets[index]; + return ListTile( + title: Text(sheet.name), + subtitle: Text(sheet.author), + onTap: () => callback(sheet), + ); + }); + } +} diff --git a/lib/sheetview.dart b/lib/sheetview.dart new file mode 100644 index 0000000..09ffb13 --- /dev/null +++ b/lib/sheetview.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; +import 'package:sheetless/sheet.dart'; + +class SheetViewerPage extends StatefulWidget { + final Sheet sheet; + + const SheetViewerPage({super.key, required this.sheet}); + + @override + State createState() => _SheetViewerPageState(); +} + +class _SheetViewerPageState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(widget.sheet.name), + ), + body: Center(child: Text(widget.sheet.author)), + ); + } +}