Add Folder creation

Folders for now can only be created under the root folder. I cannot seem
to figure out how to design a good interface for designing how to choose
the parent folder.
This commit is contained in:
Vishesh Handa
2019-12-05 17:08:02 +01:00
parent 8d1feb6f76
commit 975b235df3
4 changed files with 115 additions and 0 deletions

View File

@ -1,5 +1,6 @@
import 'dart:io'; import 'dart:io';
import 'package:path/path.dart' as p;
import 'package:path/path.dart'; import 'package:path/path.dart';
import 'note.dart'; import 'note.dart';
@ -107,4 +108,19 @@ class NotesFolder {
entities.removeAt(i); entities.removeAt(i);
} }
void create() {
// Git doesn't track Directories, only files, so we create an empty .gitignore file
// in the directory instead.
var gitIgnoreFilePath = p.join(folderPath, ".gitignore");
var file = File(gitIgnoreFilePath);
if (!file.existsSync()) {
file.createSync(recursive: true);
}
}
void addFolder(NotesFolder folder) {
assert(folder.parent == this);
entities.add(NoteFSEntity(folder: folder));
}
} }

View File

@ -33,6 +33,79 @@ class FolderListingScreen extends StatelessWidget {
), ),
body: treeView, body: treeView,
drawer: AppDrawer(), drawer: AppDrawer(),
floatingActionButton: CreateFolderButton(),
);
}
}
class CreateFolderButton extends StatefulWidget {
@override
_CreateFolderButtonState createState() => _CreateFolderButtonState();
}
class _CreateFolderButtonState extends State<CreateFolderButton> {
final TextEditingController _textController = TextEditingController();
@override
Widget build(BuildContext context) {
return FloatingActionButton(
key: const ValueKey("FAB"),
onPressed: () async {
var folderName =
await showDialog(context: context, builder: _buildAlert);
if (folderName is String) {
final container = StateContainer.of(context);
final appState = container.appState;
container.createFolder(appState.notesFolder, folderName);
}
},
child: Icon(Icons.add),
);
}
@override
void dispose() {
_textController.dispose();
super.dispose();
}
Widget _buildAlert(BuildContext context) {
var form = Form(
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
TextFormField(
decoration: const InputDecoration(labelText: 'Folder Name'),
validator: (value) {
if (value.isEmpty) return 'Please enter a name';
return "";
},
autofocus: true,
keyboardType: TextInputType.text,
textCapitalization: TextCapitalization.words,
controller: _textController,
),
],
),
);
return AlertDialog(
title: const Text("Create new Folder"),
actions: <Widget>[
FlatButton(
onPressed: () => Navigator.of(context).pop(false),
child: const Text("Discard"),
),
FlatButton(
onPressed: () {
var newFolderName = _textController.text;
return Navigator.of(context).pop(newFolderName);
},
child: const Text("Create"),
),
],
content: form,
); );
} }
} }

View File

@ -144,6 +144,22 @@ class StateContainerState extends State<StateContainer> {
}); });
} }
void createFolder(NotesFolder parent, String folderName) async {
var newFolderPath = p.join(parent.folderPath, folderName);
var newFolder = NotesFolder(parent, newFolderPath);
newFolder.create();
Fimber.d("Created New Folder: " + newFolderPath);
parent.addFolder(newFolder);
setState(() {
// Update the git repo
noteRepo.addFolder(newFolder).then((NoteRepoResult _) {
_syncNotes();
});
});
}
void addNote(Note note) { void addNote(Note note) {
insertNote(0, note); insertNote(0, note);
} }

View File

@ -4,6 +4,7 @@ import 'package:fimber/fimber.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:gitjournal/apis/git.dart'; import 'package:gitjournal/apis/git.dart';
import 'package:gitjournal/core/note.dart'; import 'package:gitjournal/core/note.dart';
import 'package:gitjournal/core/notes_folder.dart';
import 'package:gitjournal/settings.dart'; import 'package:gitjournal/settings.dart';
import 'package:path/path.dart' as p; import 'package:path/path.dart' as p;
@ -50,6 +51,15 @@ class GitNoteRepository {
return NoteRepoResult(noteFilePath: note.filePath, error: false); return NoteRepoResult(noteFilePath: note.filePath, error: false);
} }
Future<NoteRepoResult> addFolder(NotesFolder folder) async {
await _gitRepo.add(".");
await _gitRepo.commit(
message: "Created new folder",
);
return NoteRepoResult(noteFilePath: folder.folderPath, error: false);
}
Future<NoteRepoResult> removeNote(String noteFilePath) async { Future<NoteRepoResult> removeNote(String noteFilePath) async {
var gitDir = p.join(baseDirectory, dirName); var gitDir = p.join(baseDirectory, dirName);
var pathSpec = noteFilePath.replaceFirst(gitDir, "").substring(1); var pathSpec = noteFilePath.replaceFirst(gitDir, "").substring(1);