reload files after poping from drawing page
add delete item in top menu bar add feature to rename file by tapping on title bar
This commit is contained in:
parent
192884c902
commit
f532deb5ad
76
lib/app.dart
76
lib/app.dart
@ -1,9 +1,7 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import 'canvas/document_types.dart';
|
||||
import 'canvas/drawing_page.dart';
|
||||
import 'context/file_change_notifier.dart';
|
||||
import 'pages/all_notes_page.dart';
|
||||
import 'widgets/collapse_drawer.dart';
|
||||
|
||||
@ -19,26 +17,21 @@ class _AppState extends State<App> {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return ChangeNotifierProvider(
|
||||
create: (ctx) {
|
||||
return FileChangeNotifier()..loadAllNotes();
|
||||
},
|
||||
child: Scaffold(
|
||||
floatingActionButton: _fab(),
|
||||
body: Row(
|
||||
children: [
|
||||
CollapseDrawer(
|
||||
onPageChange: (View newPage) =>
|
||||
setState(() => activePage = newPage),
|
||||
activePage: activePage,
|
||||
),
|
||||
Expanded(
|
||||
child: Container(
|
||||
color: const Color(0xff000000),
|
||||
child: _buildPage(),
|
||||
))
|
||||
],
|
||||
),
|
||||
return Scaffold(
|
||||
floatingActionButton: _fab(),
|
||||
body: Row(
|
||||
children: [
|
||||
CollapseDrawer(
|
||||
onPageChange: (View newPage) =>
|
||||
setState(() => activePage = newPage),
|
||||
activePage: activePage,
|
||||
),
|
||||
Expanded(
|
||||
child: Container(
|
||||
color: const Color(0xff000000),
|
||||
child: _buildPage(),
|
||||
))
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
@ -47,27 +40,28 @@ class _AppState extends State<App> {
|
||||
switch (activePage) {
|
||||
case View.all:
|
||||
case View.folders:
|
||||
return Consumer<FileChangeNotifier>(
|
||||
builder: (ctx, notifier, child) => FloatingActionButton(
|
||||
onPressed: () async {
|
||||
final now = DateTime.now();
|
||||
final name =
|
||||
'note-${now.year}_${now.month}_${now.day}-${now.hour}_${now.minute}_${now.second}';
|
||||
final filename = '$name.dbnote';
|
||||
return FloatingActionButton(
|
||||
onPressed: () async {
|
||||
final now = DateTime.now();
|
||||
final name =
|
||||
'note-${now.year}_${now.month}_${now.day}-${now.hour}_${now.minute}_${now.second}';
|
||||
final filename = '$name.dbnote';
|
||||
|
||||
Navigator.push(
|
||||
ctx,
|
||||
MaterialPageRoute(
|
||||
builder: (ctx) => DrawingPage(
|
||||
meta: NoteMetaData(filename, name, DateTime.now()),
|
||||
),
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(
|
||||
builder: (ctx) => DrawingPage(
|
||||
meta: NoteMetaData(
|
||||
name: name,
|
||||
relativePath: filename,
|
||||
lastModified: DateTime.now()),
|
||||
),
|
||||
).then((v) => notifier.loadAllNotes());
|
||||
},
|
||||
backgroundColor: const Color(0xff3f3f3f),
|
||||
child: const Icon(Icons.edit_calendar_outlined,
|
||||
color: Color(0xffff7300)),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
backgroundColor: const Color(0xff3f3f3f),
|
||||
child: const Icon(Icons.edit_calendar_outlined,
|
||||
color: Color(0xffff7300)),
|
||||
);
|
||||
default:
|
||||
return Container();
|
||||
|
@ -51,5 +51,8 @@ class NoteMetaData {
|
||||
final String relativePath;
|
||||
final DateTime lastModified;
|
||||
|
||||
NoteMetaData(this.name, this.relativePath, this.lastModified);
|
||||
NoteMetaData(
|
||||
{required this.name,
|
||||
required this.relativePath,
|
||||
required this.lastModified});
|
||||
}
|
||||
|
@ -2,7 +2,9 @@ import 'dart:ui';
|
||||
|
||||
import 'package:flutter/gestures.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import '../context/file_change_notifier.dart';
|
||||
import '../savesystem/note_file.dart';
|
||||
import '../widgets/drawing_page_top_actions.dart';
|
||||
import '../widgets/tool_bar.dart';
|
||||
@ -29,6 +31,8 @@ class _DrawingPageState extends State<DrawingPage> {
|
||||
|
||||
late PaintController controller;
|
||||
late NoteFile noteFile = NoteFile(widget.meta.relativePath);
|
||||
late TextEditingController titleController =
|
||||
TextEditingController(text: widget.meta.name);
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
@ -45,27 +49,47 @@ class _DrawingPageState extends State<DrawingPage> {
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
void dispose() async {
|
||||
super.dispose();
|
||||
|
||||
noteFile.close();
|
||||
titleController.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(title: Text(widget.meta.name), actions: [
|
||||
DrawingPageTopActions(controller: controller, noteMetaData: widget.meta)
|
||||
]),
|
||||
body: Row(
|
||||
children: [
|
||||
ToolBar(
|
||||
onPenChange: (pen) {
|
||||
controller.changePen(pen);
|
||||
},
|
||||
),
|
||||
Expanded(child: RepaintBoundary(child: _buildCanvas())),
|
||||
],
|
||||
return WillPopScope(
|
||||
onWillPop: () async {
|
||||
await noteFile.close().then((value) =>
|
||||
Provider.of<FileChangeNotifier>(context, listen: false)
|
||||
.loadAllNotes());
|
||||
|
||||
return true;
|
||||
},
|
||||
child: Scaffold(
|
||||
appBar: AppBar(
|
||||
title: TextField(
|
||||
onChanged: (value) {
|
||||
noteFile.rename('$value.dbnote');
|
||||
},
|
||||
controller: titleController,
|
||||
style: const TextStyle(color: Colors.white, fontSize: 20),
|
||||
decoration: const InputDecoration(
|
||||
border: InputBorder.none,
|
||||
),
|
||||
),
|
||||
actions: [
|
||||
DrawingPageTopActions(
|
||||
controller: controller, noteMetaData: widget.meta)
|
||||
]),
|
||||
body: Row(
|
||||
children: [
|
||||
ToolBar(
|
||||
onPenChange: (pen) {
|
||||
controller.changePen(pen);
|
||||
},
|
||||
),
|
||||
Expanded(child: RepaintBoundary(child: _buildCanvas())),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
@ -23,7 +23,8 @@ class FileChangeNotifier extends ChangeNotifier {
|
||||
final lastmodified = (await fsentity.stat()).modified;
|
||||
final filename = fsentity.path.split(Platform.pathSeparator).last;
|
||||
final name = filename.substring(0, filename.length - 7);
|
||||
return NoteMetaData(name, filename, lastmodified);
|
||||
return NoteMetaData(
|
||||
name: name, relativePath: filename, lastModified: lastmodified);
|
||||
}).toList();
|
||||
dta.sort(
|
||||
(a, b) => b.lastModified.compareTo(a.lastModified),
|
||||
|
@ -1,10 +1,12 @@
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:permission_handler/permission_handler.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:sqflite/sqflite.dart';
|
||||
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
|
||||
|
||||
import 'app.dart';
|
||||
import 'context/file_change_notifier.dart';
|
||||
|
||||
void main() async {
|
||||
if (defaultTargetPlatform != TargetPlatform.android &&
|
||||
@ -22,8 +24,13 @@ void main() async {
|
||||
}
|
||||
}
|
||||
|
||||
runApp(MaterialApp(
|
||||
home: const App(),
|
||||
theme: ThemeData(appBarTheme: const AppBarTheme(color: Colors.blueGrey)),
|
||||
));
|
||||
runApp(ChangeNotifierProvider(
|
||||
create: (ctx) {
|
||||
return FileChangeNotifier()..loadAllNotes();
|
||||
},
|
||||
child: MaterialApp(
|
||||
home: const App(),
|
||||
theme:
|
||||
ThemeData(appBarTheme: const AppBarTheme(color: Colors.blueGrey)),
|
||||
)));
|
||||
}
|
||||
|
@ -7,16 +7,20 @@ import 'path.dart';
|
||||
|
||||
class NoteFile {
|
||||
late Database _db;
|
||||
String filepath;
|
||||
String filename;
|
||||
late String _basePath;
|
||||
|
||||
String? _newFileName;
|
||||
|
||||
Database db() {
|
||||
return _db;
|
||||
}
|
||||
|
||||
NoteFile(this.filepath);
|
||||
NoteFile(this.filename);
|
||||
|
||||
Future<void> init() async {
|
||||
final path = (await getSavePath()).path + Platform.pathSeparator + filepath;
|
||||
_basePath = (await getSavePath()).path;
|
||||
final path = _basePath + Platform.pathSeparator + filename;
|
||||
_db = await openDatabase(
|
||||
path,
|
||||
onCreate: (db, version) async {
|
||||
@ -38,8 +42,13 @@ class NoteFile {
|
||||
);
|
||||
}
|
||||
|
||||
void delete() {
|
||||
// todo remove db file
|
||||
Future<void> delete() async {
|
||||
await close();
|
||||
await File(_basePath + Platform.pathSeparator + filename).delete();
|
||||
}
|
||||
|
||||
void rename(String newname) {
|
||||
_newFileName = newname;
|
||||
}
|
||||
|
||||
Future<void> close() async {
|
||||
@ -50,5 +59,13 @@ class NoteFile {
|
||||
} else {
|
||||
debugPrint('db file unexpectedly closed before shrinking');
|
||||
}
|
||||
|
||||
// perform qued file renaming operations
|
||||
if (_newFileName != null) {
|
||||
File(_basePath + Platform.pathSeparator + filename)
|
||||
.rename(_basePath + Platform.pathSeparator + _newFileName!);
|
||||
filename = _newFileName!;
|
||||
_newFileName = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3,12 +3,14 @@ import 'dart:math';
|
||||
import 'package:fluentui_system_icons/fluentui_system_icons.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:fluttertoast/fluttertoast.dart';
|
||||
import 'wip_toast.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import '../canvas/document_types.dart';
|
||||
import '../canvas/paint_controller.dart';
|
||||
import '../context/file_change_notifier.dart';
|
||||
import '../export/export_pdf.dart';
|
||||
import 'icon_material_button.dart';
|
||||
import 'wip_toast.dart';
|
||||
|
||||
class DrawingPageTopActions extends StatefulWidget {
|
||||
const DrawingPageTopActions(
|
||||
@ -159,6 +161,20 @@ class _DrawingPageTopActionsState extends State<DrawingPageTopActions> {
|
||||
);
|
||||
},
|
||||
),
|
||||
PopupMenuItem<int>(
|
||||
value: 0,
|
||||
child: const Text(
|
||||
'Delete',
|
||||
style: TextStyle(color: Color(0xffe5e5e5)),
|
||||
),
|
||||
onTap: () {
|
||||
widget.controller.file.delete().then((value) {
|
||||
Provider.of<FileChangeNotifier>(context, listen: false)
|
||||
.loadAllNotes();
|
||||
Navigator.of(context).pop();
|
||||
});
|
||||
},
|
||||
),
|
||||
]);
|
||||
},
|
||||
),
|
||||
|
@ -1,9 +1,7 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import '../canvas/document_types.dart';
|
||||
import '../canvas/drawing_page.dart';
|
||||
import '../context/file_change_notifier.dart';
|
||||
|
||||
class NoteTile extends StatelessWidget {
|
||||
const NoteTile({Key? key, required this.data}) : super(key: key);
|
||||
@ -19,9 +17,7 @@ class NoteTile extends StatelessWidget {
|
||||
MaterialPageRoute(
|
||||
builder: (context) => DrawingPage(meta: data),
|
||||
),
|
||||
).then((value) =>
|
||||
Provider.of<FileChangeNotifier>(context, listen: false)
|
||||
.loadAllNotes());
|
||||
);
|
||||
},
|
||||
child: SizedBox(
|
||||
width: 100,
|
||||
|
Loading…
Reference in New Issue
Block a user