mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-07-01 20:43:20 +08:00
Settings: Access it through the Provider
Make it a ChageNotifier and try to access it through the Provider instead of like a global variable. This way, the state is better managed and it'll be easier to split out Settings into smaller classes.
This commit is contained in:
31
lib/app.dart
31
lib/app.dart
@ -46,10 +46,11 @@ class JournalApp extends StatefulWidget {
|
|||||||
var appState = AppState(pref);
|
var appState = AppState(pref);
|
||||||
appState.dumpToLog();
|
appState.dumpToLog();
|
||||||
|
|
||||||
Log.i("Setting ${Settings.instance.toLoggableMap()}");
|
var settings = Settings.instance;
|
||||||
|
Log.i("Setting ${settings.toLoggableMap()}");
|
||||||
|
|
||||||
if (Settings.instance.collectUsageStatistics) {
|
if (settings.collectUsageStatistics) {
|
||||||
_enableAnalyticsIfPossible();
|
_enableAnalyticsIfPossible(settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (appState.gitBaseDirectory.isEmpty) {
|
if (appState.gitBaseDirectory.isEmpty) {
|
||||||
@ -79,16 +80,19 @@ class JournalApp extends StatefulWidget {
|
|||||||
appState.save(pref);
|
appState.save(pref);
|
||||||
}
|
}
|
||||||
|
|
||||||
var app = ChangeNotifierProvider(
|
var app = ChangeNotifierProvider.value(
|
||||||
create: (_) {
|
value: settings,
|
||||||
return StateContainer(appState);
|
|
||||||
},
|
|
||||||
child: ChangeNotifierProvider(
|
child: ChangeNotifierProvider(
|
||||||
child: JournalApp(appState),
|
|
||||||
create: (_) {
|
create: (_) {
|
||||||
assert(appState.notesFolder != null);
|
return StateContainer(appState);
|
||||||
return appState.notesFolder;
|
|
||||||
},
|
},
|
||||||
|
child: ChangeNotifierProvider(
|
||||||
|
child: JournalApp(appState),
|
||||||
|
create: (_) {
|
||||||
|
assert(appState.notesFolder != null);
|
||||||
|
return appState.notesFolder;
|
||||||
|
},
|
||||||
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -105,7 +109,7 @@ class JournalApp extends StatefulWidget {
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _enableAnalyticsIfPossible() async {
|
static void _enableAnalyticsIfPossible(Settings settings) async {
|
||||||
JournalApp.isInDebugMode = foundation.kDebugMode;
|
JournalApp.isInDebugMode = foundation.kDebugMode;
|
||||||
|
|
||||||
var isPhysicalDevice = true;
|
var isPhysicalDevice = true;
|
||||||
@ -136,7 +140,7 @@ class JournalApp extends StatefulWidget {
|
|||||||
if (enabled) {
|
if (enabled) {
|
||||||
JournalApp.analytics.logEvent(
|
JournalApp.analytics.logEvent(
|
||||||
name: "settings",
|
name: "settings",
|
||||||
parameters: Settings.instance.toLoggableMap(),
|
parameters: settings.toLoggableMap(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -281,12 +285,13 @@ class _JournalAppState extends State<JournalApp> {
|
|||||||
|
|
||||||
MaterialApp buildApp(BuildContext context, ThemeData themeData) {
|
MaterialApp buildApp(BuildContext context, ThemeData themeData) {
|
||||||
var stateContainer = Provider.of<StateContainer>(context);
|
var stateContainer = Provider.of<StateContainer>(context);
|
||||||
|
var settings = Provider.of<Settings>(context);
|
||||||
|
|
||||||
var initialRoute = '/';
|
var initialRoute = '/';
|
||||||
if (!stateContainer.appState.onBoardingCompleted) {
|
if (!stateContainer.appState.onBoardingCompleted) {
|
||||||
initialRoute = '/onBoarding';
|
initialRoute = '/onBoarding';
|
||||||
}
|
}
|
||||||
if (Settings.instance.homeScreen == SettingsHomeScreen.AllFolders) {
|
if (settings.homeScreen == SettingsHomeScreen.AllFolders) {
|
||||||
initialRoute = '/folders';
|
initialRoute = '/folders';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,6 +2,8 @@ import 'dart:io';
|
|||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
import 'package:gitjournal/core/note.dart';
|
import 'package:gitjournal/core/note.dart';
|
||||||
import 'package:gitjournal/editors/common.dart';
|
import 'package:gitjournal/editors/common.dart';
|
||||||
import 'package:gitjournal/editors/disposable_change_notifier.dart';
|
import 'package:gitjournal/editors/disposable_change_notifier.dart';
|
||||||
@ -129,7 +131,8 @@ class MarkdownEditorState extends State<MarkdownEditor>
|
|||||||
|
|
||||||
Widget body = editingMode ? editor : NoteViewer(note: note);
|
Widget body = editingMode ? editor : NoteViewer(note: note);
|
||||||
|
|
||||||
if (Settings.instance.experimentalMarkdownToolbar && editingMode) {
|
var settings = Provider.of<Settings>(context);
|
||||||
|
if (settings.experimentalMarkdownToolbar && editingMode) {
|
||||||
body = Container(
|
body = Container(
|
||||||
height: 600,
|
height: 600,
|
||||||
child: Column(
|
child: Column(
|
||||||
@ -165,19 +168,19 @@ class MarkdownEditorState extends State<MarkdownEditor>
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _switchMode() {
|
void _switchMode() {
|
||||||
|
var settings = Provider.of<Settings>(context);
|
||||||
|
|
||||||
setState(() {
|
setState(() {
|
||||||
editingMode = !editingMode;
|
editingMode = !editingMode;
|
||||||
switch (editingMode) {
|
switch (editingMode) {
|
||||||
case true:
|
case true:
|
||||||
Settings.instance.markdownLastUsedView =
|
settings.markdownLastUsedView = SettingsMarkdownDefaultView.Edit;
|
||||||
SettingsMarkdownDefaultView.Edit;
|
|
||||||
break;
|
break;
|
||||||
case false:
|
case false:
|
||||||
Settings.instance.markdownLastUsedView =
|
settings.markdownLastUsedView = SettingsMarkdownDefaultView.View;
|
||||||
SettingsMarkdownDefaultView.View;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Settings.instance.save();
|
settings.save();
|
||||||
_updateNote();
|
_updateNote();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
import 'package:gitjournal/core/notes_folder_fs.dart';
|
import 'package:gitjournal/core/notes_folder_fs.dart';
|
||||||
import 'package:gitjournal/editors/common.dart';
|
import 'package:gitjournal/editors/common.dart';
|
||||||
import 'package:gitjournal/settings.dart';
|
import 'package:gitjournal/settings.dart';
|
||||||
@ -46,7 +48,9 @@ class _EditorScaffoldState extends State<EditorScaffold> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _editorChanged() {
|
void _editorChanged() {
|
||||||
if (Settings.instance.zenMode && !hideUIElements) {
|
var settings = Provider.of<Settings>(context);
|
||||||
|
|
||||||
|
if (settings.zenMode && !hideUIElements) {
|
||||||
setState(() {
|
setState(() {
|
||||||
hideUIElements = true;
|
hideUIElements = true;
|
||||||
});
|
});
|
||||||
@ -55,11 +59,13 @@ class _EditorScaffoldState extends State<EditorScaffold> {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
var settings = Provider.of<Settings>(context);
|
||||||
|
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
body: GestureDetector(
|
body: GestureDetector(
|
||||||
behavior: HitTestBehavior.translucent,
|
behavior: HitTestBehavior.translucent,
|
||||||
onTap: () {
|
onTap: () {
|
||||||
if (Settings.instance.zenMode) {
|
if (settings.zenMode) {
|
||||||
setState(() {
|
setState(() {
|
||||||
hideUIElements = false;
|
hideUIElements = false;
|
||||||
});
|
});
|
||||||
@ -84,13 +90,13 @@ class _EditorScaffoldState extends State<EditorScaffold> {
|
|||||||
editorState: widget.editorState,
|
editorState: widget.editorState,
|
||||||
parentFolder: widget.parentFolder,
|
parentFolder: widget.parentFolder,
|
||||||
allowEdits: widget.allowEdits,
|
allowEdits: widget.allowEdits,
|
||||||
zenMode: Settings.instance.zenMode,
|
zenMode: settings.zenMode,
|
||||||
onZenModeChanged: () {
|
onZenModeChanged: () {
|
||||||
setState(() {
|
setState(() {
|
||||||
Settings.instance.zenMode = !Settings.instance.zenMode;
|
settings.zenMode = !settings.zenMode;
|
||||||
Settings.instance.save();
|
settings.save();
|
||||||
|
|
||||||
if (Settings.instance.zenMode) {
|
if (settings.zenMode) {
|
||||||
hideUIElements = true;
|
hideUIElements = true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
import 'package:gitjournal/settings.dart';
|
import 'package:gitjournal/settings.dart';
|
||||||
import 'package:gitjournal/utils/logger.dart';
|
import 'package:gitjournal/utils/logger.dart';
|
||||||
@ -12,7 +13,6 @@ class DebugScreen extends StatefulWidget {
|
|||||||
|
|
||||||
class _DebugScreenState extends State<DebugScreen> {
|
class _DebugScreenState extends State<DebugScreen> {
|
||||||
ScrollController _controller = ScrollController();
|
ScrollController _controller = ScrollController();
|
||||||
String filterLevel = Settings.instance.debugLogLevel;
|
|
||||||
|
|
||||||
List<LogMessage> _logs;
|
List<LogMessage> _logs;
|
||||||
|
|
||||||
@ -79,6 +79,9 @@ class _DebugScreenState extends State<DebugScreen> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool _shouldDisplay(LogMessage msg) {
|
bool _shouldDisplay(LogMessage msg) {
|
||||||
|
var settings = Provider.of<Settings>(context);
|
||||||
|
var filterLevel = settings.debugLogLevel;
|
||||||
|
|
||||||
if (filterLevel == null || filterLevel.isEmpty) {
|
if (filterLevel == null || filterLevel.isEmpty) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -196,6 +199,9 @@ class _DebugScreenState extends State<DebugScreen> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _showFilterSelection() async {
|
void _showFilterSelection() async {
|
||||||
|
var settings = Provider.of<Settings>(context);
|
||||||
|
var filterLevel = settings.debugLogLevel;
|
||||||
|
|
||||||
var dialog = AlertDialog(
|
var dialog = AlertDialog(
|
||||||
title: Text(tr('settings.debug.levels')),
|
title: Text(tr('settings.debug.levels')),
|
||||||
content: Column(
|
content: Column(
|
||||||
@ -211,12 +217,8 @@ class _DebugScreenState extends State<DebugScreen> {
|
|||||||
);
|
);
|
||||||
var l = await showDialog(context: context, builder: (context) => dialog);
|
var l = await showDialog(context: context, builder: (context) => dialog);
|
||||||
if (l != null) {
|
if (l != null) {
|
||||||
setState(() {
|
settings.debugLogLevel = l;
|
||||||
Settings.instance.debugLogLevel = l;
|
settings.save();
|
||||||
Settings.instance.save();
|
|
||||||
|
|
||||||
filterLevel = l;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
import 'package:gitjournal/core/notes_folder_fs.dart';
|
import 'package:gitjournal/core/notes_folder_fs.dart';
|
||||||
import 'package:gitjournal/screens/settings_screen.dart';
|
import 'package:gitjournal/screens/settings_screen.dart';
|
||||||
@ -18,9 +19,8 @@ class SettingsEditorsScreen extends StatefulWidget {
|
|||||||
class SettingsEditorsScreenState extends State<SettingsEditorsScreen> {
|
class SettingsEditorsScreenState extends State<SettingsEditorsScreen> {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
var settings = Settings.instance;
|
var settings = Provider.of<Settings>(context);
|
||||||
var defaultNewFolder =
|
var defaultNewFolder = settings.journalEditordefaultNewNoteFolderSpec;
|
||||||
Settings.instance.journalEditordefaultNewNoteFolderSpec;
|
|
||||||
if (defaultNewFolder.isEmpty) {
|
if (defaultNewFolder.isEmpty) {
|
||||||
defaultNewFolder = tr("rootFolder");
|
defaultNewFolder = tr("rootFolder");
|
||||||
} else {
|
} else {
|
||||||
@ -28,8 +28,8 @@ class SettingsEditorsScreenState extends State<SettingsEditorsScreen> {
|
|||||||
setState(() {
|
setState(() {
|
||||||
defaultNewFolder = tr("rootFolder");
|
defaultNewFolder = tr("rootFolder");
|
||||||
|
|
||||||
Settings.instance.journalEditordefaultNewNoteFolderSpec = "";
|
settings.journalEditordefaultNewNoteFolderSpec = "";
|
||||||
Settings.instance.save();
|
settings.save();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -42,8 +42,8 @@ class SettingsEditorsScreenState extends State<SettingsEditorsScreen> {
|
|||||||
SettingsEditorType.options.map((f) => f.toPublicString()).toList(),
|
SettingsEditorType.options.map((f) => f.toPublicString()).toList(),
|
||||||
onChange: (String publicStr) {
|
onChange: (String publicStr) {
|
||||||
var val = SettingsEditorType.fromPublicString(publicStr);
|
var val = SettingsEditorType.fromPublicString(publicStr);
|
||||||
Settings.instance.defaultEditor = val;
|
settings.defaultEditor = val;
|
||||||
Settings.instance.save();
|
settings.save();
|
||||||
setState(() {});
|
setState(() {});
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
@ -56,8 +56,8 @@ class SettingsEditorsScreenState extends State<SettingsEditorsScreen> {
|
|||||||
.toList(),
|
.toList(),
|
||||||
onChange: (String publicStr) {
|
onChange: (String publicStr) {
|
||||||
var val = SettingsMarkdownDefaultView.fromPublicString(publicStr);
|
var val = SettingsMarkdownDefaultView.fromPublicString(publicStr);
|
||||||
Settings.instance.markdownDefaultView = val;
|
settings.markdownDefaultView = val;
|
||||||
Settings.instance.save();
|
settings.save();
|
||||||
setState(() {});
|
setState(() {});
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
@ -72,9 +72,9 @@ class SettingsEditorsScreenState extends State<SettingsEditorsScreen> {
|
|||||||
builder: (context) => FolderSelectionDialog(),
|
builder: (context) => FolderSelectionDialog(),
|
||||||
);
|
);
|
||||||
|
|
||||||
Settings.instance.journalEditordefaultNewNoteFolderSpec =
|
settings.journalEditordefaultNewNoteFolderSpec =
|
||||||
destFolder != null ? destFolder.pathSpec() : "";
|
destFolder != null ? destFolder.pathSpec() : "";
|
||||||
Settings.instance.save();
|
settings.save();
|
||||||
setState(() {});
|
setState(() {});
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
@ -39,7 +39,7 @@ class _GitRemoteSettingsScreenState extends State<GitRemoteSettingsScreen> {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
var textTheme = Theme.of(context).textTheme;
|
var textTheme = Theme.of(context).textTheme;
|
||||||
var settings = Settings.instance;
|
var settings = Provider.of<Settings>(context);
|
||||||
|
|
||||||
var body = Column(
|
var body = Column(
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
@ -72,8 +72,8 @@ class _GitRemoteSettingsScreenState extends State<GitRemoteSettingsScreen> {
|
|||||||
.toList(),
|
.toList(),
|
||||||
onChange: (String publicStr) {
|
onChange: (String publicStr) {
|
||||||
var val = RemoteSyncFrequency.fromPublicString(publicStr);
|
var val = RemoteSyncFrequency.fromPublicString(publicStr);
|
||||||
Settings.instance.remoteSyncFrequency = val;
|
settings.remoteSyncFrequency = val;
|
||||||
Settings.instance.save();
|
settings.save();
|
||||||
setState(() {});
|
setState(() {});
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
@ -17,14 +17,14 @@ class SettingsImagesScreen extends StatefulWidget {
|
|||||||
class SettingsImagesScreenState extends State<SettingsImagesScreen> {
|
class SettingsImagesScreenState extends State<SettingsImagesScreen> {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
var settings = Settings.instance;
|
var settings = Provider.of<Settings>(context);
|
||||||
var folder = Provider.of<NotesFolderFS>(context)
|
var folder = Provider.of<NotesFolderFS>(context)
|
||||||
.getFolderWithSpec(settings.imageLocationSpec);
|
.getFolderWithSpec(settings.imageLocationSpec);
|
||||||
|
|
||||||
// If the Custom Folder specified no longer exists
|
// If the Custom Folder specified no longer exists
|
||||||
if (settings.imageLocationSpec != "." && folder == null) {
|
if (settings.imageLocationSpec != "." && folder == null) {
|
||||||
Settings.instance.imageLocationSpec = ".";
|
settings.imageLocationSpec = ".";
|
||||||
Settings.instance.save();
|
settings.save();
|
||||||
}
|
}
|
||||||
|
|
||||||
var sameFolder = tr("settings.images.currentFolder");
|
var sameFolder = tr("settings.images.currentFolder");
|
||||||
@ -38,11 +38,11 @@ class SettingsImagesScreenState extends State<SettingsImagesScreen> {
|
|||||||
options: [sameFolder, customFolder],
|
options: [sameFolder, customFolder],
|
||||||
onChange: (String publicStr) {
|
onChange: (String publicStr) {
|
||||||
if (publicStr == sameFolder) {
|
if (publicStr == sameFolder) {
|
||||||
Settings.instance.imageLocationSpec = ".";
|
settings.imageLocationSpec = ".";
|
||||||
} else {
|
} else {
|
||||||
Settings.instance.imageLocationSpec = "";
|
settings.imageLocationSpec = "";
|
||||||
}
|
}
|
||||||
Settings.instance.save();
|
settings.save();
|
||||||
setState(() {});
|
setState(() {});
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
@ -56,9 +56,9 @@ class SettingsImagesScreenState extends State<SettingsImagesScreen> {
|
|||||||
builder: (context) => FolderSelectionDialog(),
|
builder: (context) => FolderSelectionDialog(),
|
||||||
);
|
);
|
||||||
|
|
||||||
Settings.instance.imageLocationSpec =
|
settings.imageLocationSpec =
|
||||||
destFolder != null ? destFolder.pathSpec() : "";
|
destFolder != null ? destFolder.pathSpec() : "";
|
||||||
Settings.instance.save();
|
settings.save();
|
||||||
setState(() {});
|
setState(() {});
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
import 'package:gitjournal/core/md_yaml_doc.dart';
|
import 'package:gitjournal/core/md_yaml_doc.dart';
|
||||||
import 'package:gitjournal/core/md_yaml_doc_codec.dart';
|
import 'package:gitjournal/core/md_yaml_doc_codec.dart';
|
||||||
@ -23,6 +24,7 @@ class _NoteMetadataSettingsScreenState
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
var textTheme = Theme.of(context).textTheme;
|
var textTheme = Theme.of(context).textTheme;
|
||||||
|
var settings = Provider.of<Settings>(context);
|
||||||
|
|
||||||
var note = Note(null, "fileName.md");
|
var note = Note(null, "fileName.md");
|
||||||
note.title = tr("settings.noteMetaData.exampleTitle");
|
note.title = tr("settings.noteMetaData.exampleTitle");
|
||||||
@ -51,14 +53,14 @@ class _NoteMetadataSettingsScreenState
|
|||||||
const Divider(),
|
const Divider(),
|
||||||
SwitchListTile(
|
SwitchListTile(
|
||||||
title: Text(tr("settings.noteMetaData.enableHeader")),
|
title: Text(tr("settings.noteMetaData.enableHeader")),
|
||||||
value: Settings.instance.yamlHeaderEnabled,
|
value: settings.yamlHeaderEnabled,
|
||||||
onChanged: (bool newVal) {
|
onChanged: (bool newVal) {
|
||||||
setState(() {
|
setState(() {
|
||||||
Settings.instance.yamlHeaderEnabled = newVal;
|
settings.yamlHeaderEnabled = newVal;
|
||||||
if (newVal == false) {
|
if (newVal == false) {
|
||||||
Settings.instance.saveTitleInH1 = true;
|
settings.saveTitleInH1 = true;
|
||||||
}
|
}
|
||||||
Settings.instance.save();
|
settings.save();
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
@ -71,14 +73,14 @@ class _NoteMetadataSettingsScreenState
|
|||||||
"lastmodified",
|
"lastmodified",
|
||||||
"lastmod",
|
"lastmod",
|
||||||
],
|
],
|
||||||
currentOption: Settings.instance.yamlModifiedKey,
|
currentOption: settings.yamlModifiedKey,
|
||||||
onChange: (String newVal) {
|
onChange: (String newVal) {
|
||||||
setState(() {
|
setState(() {
|
||||||
Settings.instance.yamlModifiedKey = newVal;
|
settings.yamlModifiedKey = newVal;
|
||||||
Settings.instance.save();
|
settings.save();
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
enabled: Settings.instance.yamlHeaderEnabled,
|
enabled: settings.yamlHeaderEnabled,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
ProOverlay(
|
ProOverlay(
|
||||||
@ -88,14 +90,14 @@ class _NoteMetadataSettingsScreenState
|
|||||||
"created",
|
"created",
|
||||||
"date",
|
"date",
|
||||||
],
|
],
|
||||||
currentOption: Settings.instance.yamlCreatedKey,
|
currentOption: settings.yamlCreatedKey,
|
||||||
onChange: (String newVal) {
|
onChange: (String newVal) {
|
||||||
setState(() {
|
setState(() {
|
||||||
Settings.instance.yamlCreatedKey = newVal;
|
settings.yamlCreatedKey = newVal;
|
||||||
Settings.instance.save();
|
settings.save();
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
enabled: Settings.instance.yamlHeaderEnabled,
|
enabled: settings.yamlHeaderEnabled,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
ProOverlay(
|
ProOverlay(
|
||||||
@ -105,14 +107,14 @@ class _NoteMetadataSettingsScreenState
|
|||||||
"tags",
|
"tags",
|
||||||
"categories",
|
"categories",
|
||||||
],
|
],
|
||||||
currentOption: Settings.instance.yamlTagsKey,
|
currentOption: settings.yamlTagsKey,
|
||||||
onChange: (String newVal) {
|
onChange: (String newVal) {
|
||||||
setState(() {
|
setState(() {
|
||||||
Settings.instance.yamlTagsKey = newVal;
|
settings.yamlTagsKey = newVal;
|
||||||
Settings.instance.save();
|
settings.save();
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
enabled: Settings.instance.yamlHeaderEnabled,
|
enabled: settings.yamlHeaderEnabled,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
ProOverlay(
|
ProOverlay(
|
||||||
@ -120,17 +122,17 @@ class _NoteMetadataSettingsScreenState
|
|||||||
title: tr("settings.noteMetaData.titleMetaData.title"),
|
title: tr("settings.noteMetaData.titleMetaData.title"),
|
||||||
options: [
|
options: [
|
||||||
tr("settings.noteMetaData.titleMetaData.fromH1"),
|
tr("settings.noteMetaData.titleMetaData.fromH1"),
|
||||||
if (Settings.instance.yamlHeaderEnabled)
|
if (settings.yamlHeaderEnabled)
|
||||||
tr("settings.noteMetaData.titleMetaData.fromYaml"),
|
tr("settings.noteMetaData.titleMetaData.fromYaml"),
|
||||||
],
|
],
|
||||||
currentOption: Settings.instance.saveTitleInH1
|
currentOption: settings.saveTitleInH1
|
||||||
? tr("settings.noteMetaData.titleMetaData.fromH1")
|
? tr("settings.noteMetaData.titleMetaData.fromH1")
|
||||||
: tr("settings.noteMetaData.titleMetaData.fromYaml"),
|
: tr("settings.noteMetaData.titleMetaData.fromYaml"),
|
||||||
onChange: (String newVal) {
|
onChange: (String newVal) {
|
||||||
setState(() {
|
setState(() {
|
||||||
Settings.instance.saveTitleInH1 =
|
settings.saveTitleInH1 =
|
||||||
newVal == tr("settings.noteMetaData.titleMetaData.fromH1");
|
newVal == tr("settings.noteMetaData.titleMetaData.fromH1");
|
||||||
Settings.instance.save();
|
settings.save();
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
@ -54,11 +54,11 @@ class SettingsListState extends State<SettingsList> {
|
|||||||
var stateContainer = Provider.of<StateContainer>(context, listen: false);
|
var stateContainer = Provider.of<StateContainer>(context, listen: false);
|
||||||
|
|
||||||
var remoteGitConfigured = stateContainer.appState.remoteGitRepoConfigured;
|
var remoteGitConfigured = stateContainer.appState.remoteGitRepoConfigured;
|
||||||
var settings = Settings.instance;
|
var settings = Provider.of<Settings>(context);
|
||||||
|
|
||||||
var saveGitAuthor = (String gitAuthor) {
|
var saveGitAuthor = (String gitAuthor) {
|
||||||
Settings.instance.gitAuthor = gitAuthor;
|
settings.gitAuthor = gitAuthor;
|
||||||
Settings.instance.save();
|
settings.save();
|
||||||
};
|
};
|
||||||
|
|
||||||
var gitAuthorForm = Form(
|
var gitAuthorForm = Form(
|
||||||
@ -80,7 +80,7 @@ class SettingsListState extends State<SettingsList> {
|
|||||||
textInputAction: TextInputAction.done,
|
textInputAction: TextInputAction.done,
|
||||||
onFieldSubmitted: saveGitAuthor,
|
onFieldSubmitted: saveGitAuthor,
|
||||||
onSaved: saveGitAuthor,
|
onSaved: saveGitAuthor,
|
||||||
initialValue: Settings.instance.gitAuthor,
|
initialValue: settings.gitAuthor,
|
||||||
),
|
),
|
||||||
onChanged: () {
|
onChanged: () {
|
||||||
if (!gitAuthorKey.currentState.validate()) return;
|
if (!gitAuthorKey.currentState.validate()) return;
|
||||||
@ -90,8 +90,8 @@ class SettingsListState extends State<SettingsList> {
|
|||||||
);
|
);
|
||||||
|
|
||||||
var saveGitAuthorEmail = (String gitAuthorEmail) {
|
var saveGitAuthorEmail = (String gitAuthorEmail) {
|
||||||
Settings.instance.gitAuthorEmail = gitAuthorEmail;
|
settings.gitAuthorEmail = gitAuthorEmail;
|
||||||
Settings.instance.save();
|
settings.save();
|
||||||
};
|
};
|
||||||
var gitAuthorEmailForm = Form(
|
var gitAuthorEmailForm = Form(
|
||||||
child: TextFormField(
|
child: TextFormField(
|
||||||
@ -121,7 +121,7 @@ class SettingsListState extends State<SettingsList> {
|
|||||||
textInputAction: TextInputAction.done,
|
textInputAction: TextInputAction.done,
|
||||||
onFieldSubmitted: saveGitAuthorEmail,
|
onFieldSubmitted: saveGitAuthorEmail,
|
||||||
onSaved: saveGitAuthorEmail,
|
onSaved: saveGitAuthorEmail,
|
||||||
initialValue: Settings.instance.gitAuthorEmail,
|
initialValue: settings.gitAuthorEmail,
|
||||||
),
|
),
|
||||||
onChanged: () {
|
onChanged: () {
|
||||||
if (!gitAuthorEmailKey.currentState.validate()) return;
|
if (!gitAuthorEmailKey.currentState.validate()) return;
|
||||||
@ -131,7 +131,7 @@ class SettingsListState extends State<SettingsList> {
|
|||||||
);
|
);
|
||||||
|
|
||||||
var brightness = DynamicTheme.of(context).brightness;
|
var brightness = DynamicTheme.of(context).brightness;
|
||||||
var defaultNewFolder = Settings.instance.defaultNewNoteFolderSpec;
|
var defaultNewFolder = settings.defaultNewNoteFolderSpec;
|
||||||
if (defaultNewFolder.isEmpty) {
|
if (defaultNewFolder.isEmpty) {
|
||||||
defaultNewFolder = tr("rootFolder");
|
defaultNewFolder = tr("rootFolder");
|
||||||
} else {
|
} else {
|
||||||
@ -139,8 +139,8 @@ class SettingsListState extends State<SettingsList> {
|
|||||||
setState(() {
|
setState(() {
|
||||||
defaultNewFolder = tr("rootFolder");
|
defaultNewFolder = tr("rootFolder");
|
||||||
|
|
||||||
Settings.instance.defaultNewNoteFolderSpec = "";
|
settings.defaultNewNoteFolderSpec = "";
|
||||||
Settings.instance.save();
|
settings.save();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -165,8 +165,8 @@ class SettingsListState extends State<SettingsList> {
|
|||||||
.toList(),
|
.toList(),
|
||||||
onChange: (String publicStr) {
|
onChange: (String publicStr) {
|
||||||
var s = SettingsHomeScreen.fromPublicString(publicStr);
|
var s = SettingsHomeScreen.fromPublicString(publicStr);
|
||||||
Settings.instance.homeScreen = s;
|
settings.homeScreen = s;
|
||||||
Settings.instance.save();
|
settings.save();
|
||||||
setState(() {});
|
setState(() {});
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
@ -181,8 +181,8 @@ class SettingsListState extends State<SettingsList> {
|
|||||||
builder: (context) => FolderSelectionDialog(),
|
builder: (context) => FolderSelectionDialog(),
|
||||||
);
|
);
|
||||||
if (destFolder != null) {
|
if (destFolder != null) {
|
||||||
Settings.instance.defaultNewNoteFolderSpec = destFolder.pathSpec();
|
settings.defaultNewNoteFolderSpec = destFolder.pathSpec();
|
||||||
Settings.instance.save();
|
settings.save();
|
||||||
setState(() {});
|
setState(() {});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -222,8 +222,8 @@ class SettingsListState extends State<SettingsList> {
|
|||||||
NoteFileNameFormat.options.map((f) => f.toPublicString()).toList(),
|
NoteFileNameFormat.options.map((f) => f.toPublicString()).toList(),
|
||||||
onChange: (String publicStr) {
|
onChange: (String publicStr) {
|
||||||
var format = NoteFileNameFormat.fromPublicString(publicStr);
|
var format = NoteFileNameFormat.fromPublicString(publicStr);
|
||||||
Settings.instance.noteFileNameFormat = format;
|
settings.noteFileNameFormat = format;
|
||||||
Settings.instance.save();
|
settings.save();
|
||||||
setState(() {});
|
setState(() {});
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
@ -253,19 +253,19 @@ class SettingsListState extends State<SettingsList> {
|
|||||||
SettingsHeader(tr('settings.analytics')),
|
SettingsHeader(tr('settings.analytics')),
|
||||||
SwitchListTile(
|
SwitchListTile(
|
||||||
title: Text(tr('settings.usageStats')),
|
title: Text(tr('settings.usageStats')),
|
||||||
value: Settings.instance.collectUsageStatistics,
|
value: settings.collectUsageStatistics,
|
||||||
onChanged: (bool val) {
|
onChanged: (bool val) {
|
||||||
Settings.instance.collectUsageStatistics = val;
|
settings.collectUsageStatistics = val;
|
||||||
Settings.instance.save();
|
settings.save();
|
||||||
setState(() {});
|
setState(() {});
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
SwitchListTile(
|
SwitchListTile(
|
||||||
title: Text(tr('settings.crashReports')),
|
title: Text(tr('settings.crashReports')),
|
||||||
value: Settings.instance.collectCrashReports,
|
value: settings.collectCrashReports,
|
||||||
onChanged: (bool val) {
|
onChanged: (bool val) {
|
||||||
Settings.instance.collectCrashReports = val;
|
settings.collectCrashReports = val;
|
||||||
Settings.instance.save();
|
settings.save();
|
||||||
setState(() {});
|
setState(() {});
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
import 'package:uuid/uuid.dart';
|
import 'package:uuid/uuid.dart';
|
||||||
|
|
||||||
@ -5,7 +7,7 @@ import 'package:gitjournal/core/sorting_mode.dart';
|
|||||||
import 'package:gitjournal/folder_views/common.dart';
|
import 'package:gitjournal/folder_views/common.dart';
|
||||||
import 'package:gitjournal/screens/note_editor.dart';
|
import 'package:gitjournal/screens/note_editor.dart';
|
||||||
|
|
||||||
class Settings {
|
class Settings extends ChangeNotifier {
|
||||||
// singleton
|
// singleton
|
||||||
static final Settings _singleton = Settings._internal();
|
static final Settings _singleton = Settings._internal();
|
||||||
factory Settings() => _singleton;
|
factory Settings() => _singleton;
|
||||||
@ -203,6 +205,8 @@ class Settings {
|
|||||||
_setBool(pref, "saveTitleInH1", saveTitleInH1, defaultSet.saveTitleInH1);
|
_setBool(pref, "saveTitleInH1", saveTitleInH1, defaultSet.saveTitleInH1);
|
||||||
|
|
||||||
pref.setInt("settingsVersion", version);
|
pref.setInt("settingsVersion", version);
|
||||||
|
|
||||||
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _setString(
|
Future<void> _setString(
|
||||||
|
@ -514,10 +514,12 @@ class GitHostSetupScreenState extends State<GitHostSetupScreen> {
|
|||||||
folderPath: repoPath,
|
folderPath: repoPath,
|
||||||
);
|
);
|
||||||
await repo.add('.gitignore');
|
await repo.add('.gitignore');
|
||||||
|
|
||||||
|
var settings = Provider.of<Settings>(context, listen: false);
|
||||||
await repo.commit(
|
await repo.commit(
|
||||||
message: "Add gitignore file",
|
message: "Add gitignore file",
|
||||||
authorEmail: Settings.instance.gitAuthorEmail,
|
authorEmail: settings.gitAuthorEmail,
|
||||||
authorName: Settings.instance.gitAuthor,
|
authorName: settings.gitAuthor,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,6 +43,7 @@ class AppDrawer extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var divider = Row(children: <Widget>[const Expanded(child: Divider())]);
|
var divider = Row(children: <Widget>[const Expanded(child: Divider())]);
|
||||||
|
var settings = Provider.of<Settings>(context);
|
||||||
|
|
||||||
return Drawer(
|
return Drawer(
|
||||||
child: ListView(
|
child: ListView(
|
||||||
@ -51,7 +52,7 @@ class AppDrawer extends StatelessWidget {
|
|||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
_AppDrawerHeader(),
|
_AppDrawerHeader(),
|
||||||
if (setupGitButton != null) ...[setupGitButton, divider],
|
if (setupGitButton != null) ...[setupGitButton, divider],
|
||||||
if (!Settings.instance.proMode)
|
if (!settings.proMode)
|
||||||
_buildDrawerTile(
|
_buildDrawerTile(
|
||||||
context,
|
context,
|
||||||
icon: Icons.power,
|
icon: Icons.power,
|
||||||
@ -65,7 +66,7 @@ class AppDrawer extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
if (!Settings.instance.proMode) divider,
|
if (!settings.proMode) divider,
|
||||||
_buildDrawerTile(
|
_buildDrawerTile(
|
||||||
context,
|
context,
|
||||||
icon: Icons.note,
|
icon: Icons.note,
|
||||||
@ -80,7 +81,7 @@ class AppDrawer extends StatelessWidget {
|
|||||||
onTap: () => _navTopLevel(context, '/folders'),
|
onTap: () => _navTopLevel(context, '/folders'),
|
||||||
selected: currentRoute == "/folders",
|
selected: currentRoute == "/folders",
|
||||||
),
|
),
|
||||||
if (Settings.instance.experimentalFs)
|
if (settings.experimentalFs)
|
||||||
_buildDrawerTile(
|
_buildDrawerTile(
|
||||||
context,
|
context,
|
||||||
icon: FontAwesomeIcons.solidFolderOpen,
|
icon: FontAwesomeIcons.solidFolderOpen,
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
import 'package:gitjournal/settings.dart';
|
import 'package:gitjournal/settings.dart';
|
||||||
|
|
||||||
@ -11,9 +12,11 @@ class ProOverlay extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
if (Settings.instance.proMode) {
|
var settings = Provider.of<Settings>(context);
|
||||||
|
if (settings.proMode) {
|
||||||
return child;
|
return child;
|
||||||
}
|
}
|
||||||
|
|
||||||
return GestureDetector(
|
return GestureDetector(
|
||||||
behavior: HitTestBehavior.opaque,
|
behavior: HitTestBehavior.opaque,
|
||||||
child: Banner(
|
child: Banner(
|
||||||
|
@ -4,6 +4,7 @@ import 'dart:io';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'package:in_app_purchase/in_app_purchase.dart';
|
import 'package:in_app_purchase/in_app_purchase.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
import 'package:gitjournal/analytics.dart';
|
import 'package:gitjournal/analytics.dart';
|
||||||
import 'package:gitjournal/iap.dart';
|
import 'package:gitjournal/iap.dart';
|
||||||
@ -171,9 +172,10 @@ class _PurchaseWidgetState extends State<PurchaseWidget> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _deliverProduct(SubscriptionStatus status) {
|
void _deliverProduct(SubscriptionStatus status) {
|
||||||
Settings.instance.proMode = status.isPro;
|
var settings = Provider.of<Settings>(context);
|
||||||
Settings.instance.proExpirationDate = status.expiryDate.toIso8601String();
|
settings.proMode = status.isPro;
|
||||||
Settings.instance.save();
|
settings.proExpirationDate = status.expiryDate.toIso8601String();
|
||||||
|
settings.save();
|
||||||
|
|
||||||
getAnalytics().logEvent(
|
getAnalytics().logEvent(
|
||||||
name: "purchase_screen_thank_you",
|
name: "purchase_screen_thank_you",
|
||||||
|
Reference in New Issue
Block a user