mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-06-28 09:47:35 +08:00
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:
@ -1,5 +1,6 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:path/path.dart' as p;
|
||||
import 'package:path/path.dart';
|
||||
|
||||
import 'note.dart';
|
||||
@ -107,4 +108,19 @@ class NotesFolder {
|
||||
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
@ -33,6 +33,79 @@ class FolderListingScreen extends StatelessWidget {
|
||||
),
|
||||
body: treeView,
|
||||
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,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -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) {
|
||||
insertNote(0, note);
|
||||
}
|
||||
|
@ -4,6 +4,7 @@ import 'package:fimber/fimber.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:gitjournal/apis/git.dart';
|
||||
import 'package:gitjournal/core/note.dart';
|
||||
import 'package:gitjournal/core/notes_folder.dart';
|
||||
import 'package:gitjournal/settings.dart';
|
||||
import 'package:path/path.dart' as p;
|
||||
|
||||
@ -50,6 +51,15 @@ class GitNoteRepository {
|
||||
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 {
|
||||
var gitDir = p.join(baseDirectory, dirName);
|
||||
var pathSpec = noteFilePath.replaceFirst(gitDir, "").substring(1);
|
||||
|
Reference in New Issue
Block a user