From b7e274c9377907fd39cdbf1a604ef8bdab62cc5d Mon Sep 17 00:00:00 2001 From: Vishesh Handa Date: Fri, 12 Feb 2021 15:32:10 +0100 Subject: [PATCH] Add FileName option in Note title settings This doesn't do anything right now. It just shows the option. --- assets/langs/en.yaml | 1 + lib/core/note_serializer.dart | 9 ++-- lib/core/notes_folder_config.dart | 20 ++++---- lib/repository.dart | 2 +- lib/screens/settings_note_metadata.dart | 27 +++++----- lib/settings.dart | 66 ++++++++++++++++++++++--- lib/settings_migrations.dart | 11 +++++ test/note_serializer_test.dart | 10 ++-- test/notes_folder_config_test.dart | 2 +- 9 files changed, 105 insertions(+), 43 deletions(-) diff --git a/assets/langs/en.yaml b/assets/langs/en.yaml index e97e60c0..0db03b12 100644 --- a/assets/langs/en.yaml +++ b/assets/langs/en.yaml @@ -64,6 +64,7 @@ settings: title: Title fromH1: Text Header 1 fromYaml: From YAML 'title' + filename: FileName exampleTitle: Pigeons exampleBody: I think they might be evil. Even more evil than penguins. exampleTag1: Birds diff --git a/lib/core/note_serializer.dart b/lib/core/note_serializer.dart index ef6ed3de..739b6b3c 100644 --- a/lib/core/note_serializer.dart +++ b/lib/core/note_serializer.dart @@ -4,6 +4,7 @@ import 'package:flutter_emoji/flutter_emoji.dart'; import 'package:yaml/yaml.dart'; import 'package:gitjournal/core/notes_folder.dart'; +import 'package:gitjournal/settings.dart'; import 'package:gitjournal/utils/datetime.dart'; import 'package:gitjournal/utils/logger.dart'; import 'md_yaml_doc.dart'; @@ -26,7 +27,7 @@ class NoteSerializationSettings { bool tagsInString = false; bool tagsHaveHash = false; - bool saveTitleAsH1 = true; + SettingsTitle titleSettings = SettingsTitle.Default; } class NoteSerializer implements NoteSerializerInterface { @@ -36,7 +37,7 @@ class NoteSerializer implements NoteSerializerInterface { settings.modifiedKey = config.yamlModifiedKey; settings.createdKey = config.yamlCreatedKey; settings.tagsKey = config.yamlTagsKey; - settings.saveTitleAsH1 = config.saveTitleInH1; + settings.titleSettings = config.titleSettings; } NoteSerializer.raw(); @@ -59,7 +60,7 @@ class NoteSerializer implements NoteSerializerInterface { if (note.title != null) { var title = emojiParser.unemojify(note.title.trim()); - if (settings.saveTitleAsH1) { + if (settings.titleSettings == SettingsTitle.InH1) { if (title.isNotEmpty) { data.body = '# $title\n\n${data.body}'; data.props.remove(settings.titleKey); @@ -148,7 +149,7 @@ class NoteSerializer implements NoteSerializerInterface { note.title = emojiParser.emojify(title); propsUsed.add(settings.titleKey); - settings.saveTitleAsH1 = false; + settings.titleSettings = SettingsTitle.InYaml; } else { var startsWithH1 = false; for (var line in LineSplitter.split(note.body)) { diff --git a/lib/core/notes_folder_config.dart b/lib/core/notes_folder_config.dart index b6c3183e..9ab9be09 100644 --- a/lib/core/notes_folder_config.dart +++ b/lib/core/notes_folder_config.dart @@ -33,7 +33,7 @@ class NotesFolderConfig extends Equatable { final String yamlModifiedKey; final String yamlCreatedKey; final String yamlTagsKey; - final bool saveTitleInH1; + final SettingsTitle titleSettings; final Set inlineTagPrefixes; final String imageLocationSpec; @@ -51,7 +51,7 @@ class NotesFolderConfig extends Equatable { @required this.yamlModifiedKey, @required this.yamlCreatedKey, @required this.yamlTagsKey, - @required this.saveTitleInH1, + @required this.titleSettings, @required this.inlineTagPrefixes, @required this.imageLocationSpec, }); @@ -69,7 +69,7 @@ class NotesFolderConfig extends Equatable { yamlModifiedKey, yamlCreatedKey, yamlTagsKey, - saveTitleInH1, + titleSettings, inlineTagPrefixes, imageLocationSpec, ]; @@ -102,7 +102,7 @@ class NotesFolderConfig extends Equatable { yamlCreatedKey: settings.yamlCreatedKey, yamlModifiedKey: settings.yamlModifiedKey, yamlTagsKey: settings.yamlTagsKey, - saveTitleInH1: settings.saveTitleInH1, + titleSettings: settings.titleSettings, inlineTagPrefixes: settings.inlineTagPrefixes, imageLocationSpec: settings.imageLocationSpec, ); @@ -135,7 +135,7 @@ class NotesFolderConfig extends Equatable { settings.yamlCreatedKey = yamlCreatedKey; settings.yamlModifiedKey = yamlModifiedKey; settings.yamlTagsKey = yamlTagsKey; - settings.saveTitleInH1 = saveTitleInH1; + settings.titleSettings = titleSettings; settings.inlineTagPrefixes = inlineTagPrefixes; settings.imageLocationSpec = imageLocationSpec; settings.save(); @@ -154,7 +154,7 @@ class NotesFolderConfig extends Equatable { String yamlCreatedKey, String yamlModifiedKey, String yamlTagsKey, - bool saveTitleInH1, + SettingsTitle titleSettings, Set inlineTagPrefixes, String imageLocationSpec, }) { @@ -172,7 +172,7 @@ class NotesFolderConfig extends Equatable { yamlCreatedKey: yamlCreatedKey ?? this.yamlCreatedKey, yamlModifiedKey: yamlModifiedKey ?? this.yamlModifiedKey, yamlTagsKey: yamlTagsKey ?? this.yamlTagsKey, - saveTitleInH1: saveTitleInH1 ?? this.saveTitleInH1, + titleSettings: titleSettings ?? this.titleSettings, inlineTagPrefixes: inlineTagPrefixes ?? this.inlineTagPrefixes, imageLocationSpec: imageLocationSpec ?? this.imageLocationSpec, ); @@ -229,7 +229,7 @@ class NotesFolderConfig extends Equatable { var yamlCreatedKey = map['yamlCreatedKey']?.toString(); var yamlModifiedKey = map['yamlModifiedKey']?.toString(); var yamlTagsKey = map['yamlTagsKey']?.toString(); - var saveTitleInH1 = map['saveTitleInH1']?.toString() != "false"; + var titleSettings = map['titleSettings']?.toString(); // FIXME: What about inlineTagPrefixes? @@ -247,7 +247,7 @@ class NotesFolderConfig extends Equatable { yamlCreatedKey: yamlCreatedKey, yamlModifiedKey: yamlModifiedKey, yamlTagsKey: yamlTagsKey, - saveTitleInH1: saveTitleInH1, + titleSettings: SettingsTitle.fromInternalString(titleSettings), inlineTagPrefixes: {}, imageLocationSpec: "", ); @@ -282,7 +282,7 @@ class NotesFolderConfig extends Equatable { 'yamlModifiedKey': yamlModifiedKey, 'yamlCreatedKey': yamlCreatedKey, 'yamlTagsKey': yamlTagsKey, - 'saveTitleInH1': saveTitleInH1, + 'titleSettings': titleSettings.toInternalString(), }; var yaml = toYAML(map); diff --git a/lib/repository.dart b/lib/repository.dart index a69b44a4..5e0febd2 100644 --- a/lib/repository.dart +++ b/lib/repository.dart @@ -66,7 +66,7 @@ class Repository with ChangeNotifier { @required SharedPreferences pref, @required String id, }) async { - await migrateSettings(pref, gitBaseDir); + await migrateSettings(id, pref, gitBaseDir); var settings = Settings(id); settings.load(pref); diff --git a/lib/screens/settings_note_metadata.dart b/lib/screens/settings_note_metadata.dart index 71599215..abd346d9 100644 --- a/lib/screens/settings_note_metadata.dart +++ b/lib/screens/settings_note_metadata.dart @@ -82,8 +82,9 @@ class _NoteMetadataSettingsScreenState onChanged: (bool newVal) { setState(() { settings.yamlHeaderEnabled = newVal; - if (newVal == false) { - settings.saveTitleInH1 = true; + var titleInYaml = settings.titleSettings == SettingsTitle.InYaml; + if (newVal == false && titleInYaml) { + settings.titleSettings = SettingsTitle.Default; } settings.save(); }); @@ -138,20 +139,14 @@ class _NoteMetadataSettingsScreenState ), ListPreference( title: tr("settings.noteMetaData.titleMetaData.title"), - options: [ - tr("settings.noteMetaData.titleMetaData.fromH1"), - if (settings.yamlHeaderEnabled) - tr("settings.noteMetaData.titleMetaData.fromYaml"), - ], - currentOption: settings.saveTitleInH1 - ? tr("settings.noteMetaData.titleMetaData.fromH1") - : tr("settings.noteMetaData.titleMetaData.fromYaml"), - onChange: (String newVal) { - setState(() { - settings.saveTitleInH1 = - newVal == tr("settings.noteMetaData.titleMetaData.fromH1"); - settings.save(); - }); + options: + SettingsTitle.options.map((f) => f.toPublicString()).toList(), + currentOption: settings.titleSettings.toPublicString(), + onChange: (String publicStr) { + var format = SettingsTitle.fromPublicString(publicStr); + settings.titleSettings = format; + settings.save(); + setState(() {}); }, ), ProOverlay( diff --git a/lib/settings.dart b/lib/settings.dart index 92abc9cf..8e98fc0e 100644 --- a/lib/settings.dart +++ b/lib/settings.dart @@ -32,6 +32,7 @@ class Settings extends ChangeNotifier { String yamlCreatedKey = "created"; String yamlTagsKey = "tags"; String customMetaData = ""; + SettingsTitle titleSettings = SettingsTitle.Default; bool yamlHeaderEnabled = true; String defaultNewNoteFolderSpec = ""; @@ -45,7 +46,7 @@ class Settings extends ChangeNotifier { SettingsFolderViewType defaultView = SettingsFolderViewType.Default; bool showNoteSummary = true; String folderViewHeaderType = "TitleGenerated"; - int version = 2; + int version = 3; SettingsHomeScreen homeScreen = SettingsHomeScreen.Default; SettingsTheme theme = SettingsTheme.Default; @@ -58,7 +59,6 @@ class Settings extends ChangeNotifier { String imageLocationSpec = "."; // . means the same folder bool zenMode = false; - bool saveTitleInH1 = true; bool swipeToDelete = true; bool emojiParser = true; @@ -134,7 +134,8 @@ class Settings extends ChangeNotifier { _getString(pref, "imageLocationSpec") ?? imageLocationSpec; zenMode = _getBool(pref, "zenMode") ?? zenMode; - saveTitleInH1 = _getBool(pref, "saveTitleInH1") ?? saveTitleInH1; + titleSettings = + SettingsTitle.fromInternalString(_getString(pref, "titleSettings")); swipeToDelete = _getBool(pref, "swipeToDelete") ?? swipeToDelete; inlineTagPrefixes = @@ -239,8 +240,8 @@ class Settings extends ChangeNotifier { await _setString(pref, "imageLocationSpec", imageLocationSpec, defaultSet.imageLocationSpec); await _setBool(pref, "zenMode", zenMode, defaultSet.zenMode); - await _setBool( - pref, "saveTitleInH1", saveTitleInH1, defaultSet.saveTitleInH1); + await _setString(pref, "titleSettings", titleSettings.toInternalString(), + defaultSet.titleSettings.toInternalString()); await _setBool( pref, "swipeToDelete", swipeToDelete, defaultSet.swipeToDelete); await _setStringSet(pref, "inlineTagPrefixes", inlineTagPrefixes, @@ -356,7 +357,7 @@ class Settings extends ChangeNotifier { 'theme': theme.toInternalString(), 'imageLocationSpec': imageLocationSpec, 'zenMode': zenMode.toString(), - 'saveTitleInH1': saveTitleInH1.toString(), + 'titleSettings': titleSettings.toInternalString(), 'swipeToDelete': swipeToDelete.toString(), 'inlineTagPrefixes': inlineTagPrefixes.join(' '), 'emojiParser': emojiParser.toString(), @@ -849,3 +850,56 @@ class SettingsTheme { return ThemeMode.dark; } } + +class SettingsTitle { + static const InYaml = + SettingsTitle("settings.noteMetaData.titleMetaData.fromYaml", "yaml"); + static const InH1 = + SettingsTitle("settings.noteMetaData.titleMetaData.fromH1", "h1"); + static const InFileName = + SettingsTitle("settings.noteMetaData.titleMetaData.filename", "filename"); + + static const Default = InH1; + + final String _str; + final String _publicString; + const SettingsTitle(this._publicString, this._str); + + String toInternalString() { + return _str; + } + + String toPublicString() { + return tr(_publicString); + } + + static const options = [ + InH1, + InYaml, + InFileName, + ]; + + static SettingsTitle fromInternalString(String str) { + for (var opt in options) { + if (opt.toInternalString() == str) { + return opt; + } + } + return Default; + } + + static SettingsTitle fromPublicString(String str) { + for (var opt in options) { + if (opt.toPublicString() == str) { + return opt; + } + } + return Default; + } + + @override + String toString() { + assert(false, "SettingsTitle toString should never be called"); + return ""; + } +} diff --git a/lib/settings_migrations.dart b/lib/settings_migrations.dart index cfff53a2..dbbf67bc 100644 --- a/lib/settings_migrations.dart +++ b/lib/settings_migrations.dart @@ -7,6 +7,7 @@ import 'package:gitjournal/settings.dart'; import 'package:gitjournal/utils/logger.dart'; Future migrateSettings( + String id, SharedPreferences pref, String gitBaseDir, ) async { @@ -139,6 +140,16 @@ Future migrateSettings( await pref.remove("settingsVersion"); await pref.setInt(prefix + "settingsVersion", version); } + + if (version == 2) { + var saveTitleInH1 = pref.getBool(id + '_' + "saveTitleInH1"); + if (saveTitleInH1 == false) { + var key = id + "_" + "titleSettings"; + await pref.setString(key, "yaml"); + } + + version = 3; + } } Future migrateSshKeys( diff --git a/test/note_serializer_test.dart b/test/note_serializer_test.dart index 675cdfb0..d907bc99 100644 --- a/test/note_serializer_test.dart +++ b/test/note_serializer_test.dart @@ -18,7 +18,7 @@ void main() { var doc = MdYamlDoc(body: "I :heart: you", props: props); var serializer = NoteSerializer.raw(); - serializer.settings.saveTitleAsH1 = false; + serializer.settings.titleSettings = SettingsTitle.InYaml; var note = Note(parent, "file-path-not-important"); serializer.decode(doc, note); @@ -40,7 +40,7 @@ void main() { MdYamlDoc(body: "# Why not :coffee:?\n\nI :heart: you", props: props); var serializer = NoteSerializer.raw(); - serializer.settings.saveTitleAsH1 = true; + serializer.settings.titleSettings = SettingsTitle.InH1; var note = Note(parent, "file-path-not-important"); serializer.decode(doc, note); @@ -89,7 +89,7 @@ void main() { var doc = MdYamlDoc(body: "I :heart: you", props: props); var serializer = NoteSerializer.raw(); - serializer.settings.saveTitleAsH1 = true; + serializer.settings.titleSettings = SettingsTitle.InH1; var note = Note(parent, "file-path-not-important"); serializer.decode(doc, note); @@ -111,7 +111,7 @@ void main() { var doc = MdYamlDoc(body: "body", props: props); var serializer = NoteSerializer.raw(); - serializer.settings.saveTitleAsH1 = false; + serializer.settings.titleSettings = SettingsTitle.InYaml; var note = Note(parent, "file-path-not-important"); serializer.decode(doc, note); @@ -136,7 +136,7 @@ void main() { var doc = MdYamlDoc(body: "body", props: props); var serializer = NoteSerializer.raw(); - serializer.settings.saveTitleAsH1 = false; + serializer.settings.titleSettings = SettingsTitle.InYaml; var note = Note(parent, "file-path-not-important"); serializer.decode(doc, note); diff --git a/test/notes_folder_config_test.dart b/test/notes_folder_config_test.dart index c8028613..a3bd4704 100644 --- a/test/notes_folder_config_test.dart +++ b/test/notes_folder_config_test.dart @@ -39,7 +39,7 @@ void main() { yamlCreatedKey: 'created', yamlModifiedKey: 'modified', yamlTagsKey: 'tags', - saveTitleInH1: true, + titleSettings: SettingsTitle.InFileName, inlineTagPrefixes: {}, imageLocationSpec: "", );