mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-06-28 18:03:14 +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 '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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
Reference in New Issue
Block a user