From 0f5bb345d35eb903d2dbd290ee971e2c7575515a Mon Sep 17 00:00:00 2001 From: Vishesh Handa Date: Mon, 31 Aug 2020 10:40:49 +0200 Subject: [PATCH] Allow Swipe to delete to be configurable --- assets/langs/en.yaml | 4 +++ lib/folder_views/list_view.dart | 58 ++++++++++++++++++-------------- lib/screens/settings_misc.dart | 47 ++++++++++++++++++++++++++ lib/screens/settings_screen.dart | 11 ++++++ lib/settings.dart | 6 ++++ 5 files changed, 100 insertions(+), 26 deletions(-) create mode 100644 lib/screens/settings_misc.dart diff --git a/assets/langs/en.yaml b/assets/langs/en.yaml index 0a3e0640..ebd6b151 100644 --- a/assets/langs/en.yaml +++ b/assets/langs/en.yaml @@ -95,6 +95,10 @@ settings: subtitle: Configure how inline tags are parsed enable: Parse Inline Tags prefixes: Inline Tags Prefixes + misc: + title: Misc Settings + swipe: Swipe to Delete Note + listView: List View editors: checklist: diff --git a/lib/folder_views/list_view.dart b/lib/folder_views/list_view.dart index 0160dec2..2f03f4de 100644 --- a/lib/folder_views/list_view.dart +++ b/lib/folder_views/list_view.dart @@ -5,6 +5,7 @@ import 'package:provider/provider.dart'; import 'package:gitjournal/core/note.dart'; import 'package:gitjournal/core/notes_folder.dart'; +import 'package:gitjournal/settings.dart'; import 'package:gitjournal/state_container.dart'; import 'package:gitjournal/utils.dart'; import 'package:gitjournal/widgets/icon_dismissable.dart'; @@ -129,34 +130,39 @@ class _FolderListViewState extends State { Note note, Animation animation, ) { - var viewItem = IconDismissable( - key: ValueKey("FolderListView_" + note.filePath), - child: Hero( - tag: note.filePath, - child: widget.noteTileBuilder(context, note), - flightShuttleBuilder: (BuildContext flightContext, - Animation animation, - HeroFlightDirection flightDirection, - BuildContext fromHeroContext, - BuildContext toHeroContext) => - Material(child: toHeroContext.widget), - ), - backgroundColor: Colors.red[800], - iconData: Icons.delete, - onDismissed: (direction) { - deletedViaDismissed.add(note.filePath); - - var stateContainer = - Provider.of(context, listen: false); - stateContainer.removeNote(note); - - var snackBar = buildUndoDeleteSnackbar(stateContainer, note); - Scaffold.of(context) - ..removeCurrentSnackBar() - ..showSnackBar(snackBar); - }, + var settings = Provider.of(context); + Widget viewItem = Hero( + tag: note.filePath, + child: widget.noteTileBuilder(context, note), + flightShuttleBuilder: (BuildContext flightContext, + Animation animation, + HeroFlightDirection flightDirection, + BuildContext fromHeroContext, + BuildContext toHeroContext) => + Material(child: toHeroContext.widget), ); + if (settings.swipeToDelete) { + viewItem = IconDismissable( + key: ValueKey("FolderListView_" + note.filePath), + child: viewItem, + backgroundColor: Colors.red[800], + iconData: Icons.delete, + onDismissed: (direction) { + deletedViaDismissed.add(note.filePath); + + var stateContainer = + Provider.of(context, listen: false); + stateContainer.removeNote(note); + + var snackBar = buildUndoDeleteSnackbar(stateContainer, note); + Scaffold.of(context) + ..removeCurrentSnackBar() + ..showSnackBar(snackBar); + }, + ); + } + return SizeTransition( key: ValueKey("FolderListView_tr_" + note.filePath), axis: Axis.vertical, diff --git a/lib/screens/settings_misc.dart b/lib/screens/settings_misc.dart new file mode 100644 index 00000000..1b705600 --- /dev/null +++ b/lib/screens/settings_misc.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:provider/provider.dart'; + +import 'package:gitjournal/screens/settings_screen.dart'; +import 'package:gitjournal/settings.dart'; + +class SettingsMisc extends StatefulWidget { + @override + _SettingsMiscState createState() => _SettingsMiscState(); +} + +class _SettingsMiscState extends State { + @override + Widget build(BuildContext context) { + var settings = Provider.of(context); + + var body = Column( + children: [ + SettingsHeader(tr('settings.misc.listView')), + SwitchListTile( + title: Text(tr('settings.misc.swipe')), + value: settings.swipeToDelete, + onChanged: (bool newVal) { + settings.swipeToDelete = newVal; + settings.save(); + }, + ), + ], + crossAxisAlignment: CrossAxisAlignment.start, + ); + + return Scaffold( + appBar: AppBar( + title: Text(tr("settings.misc.title")), + leading: IconButton( + icon: const Icon(Icons.arrow_back), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ), + body: body, + ); + } +} diff --git a/lib/screens/settings_screen.dart b/lib/screens/settings_screen.dart index 529dbbb3..fd4072cb 100644 --- a/lib/screens/settings_screen.dart +++ b/lib/screens/settings_screen.dart @@ -13,6 +13,7 @@ import 'package:gitjournal/screens/settings_editors.dart'; import 'package:gitjournal/screens/settings_experimental.dart'; import 'package:gitjournal/screens/settings_git_remote.dart'; import 'package:gitjournal/screens/settings_images.dart'; +import 'package:gitjournal/screens/settings_misc.dart'; import 'package:gitjournal/screens/settings_note_metadata.dart'; import 'package:gitjournal/screens/settings_tags.dart'; import 'package:gitjournal/screens/settings_widgets.dart'; @@ -265,6 +266,16 @@ class SettingsListState extends State { Navigator.of(context).push(route); }, ), + ListTile( + title: Text(tr('settings.misc.title')), + onTap: () { + var route = MaterialPageRoute( + builder: (context) => SettingsMisc(), + settings: const RouteSettings(name: '/settings/misc'), + ); + Navigator.of(context).push(route); + }, + ), const SizedBox(height: 16.0), ListTile( title: Text(tr("feature_timeline.title")), diff --git a/lib/settings.dart b/lib/settings.dart index bd3dfcc4..47def8c6 100644 --- a/lib/settings.dart +++ b/lib/settings.dart @@ -67,6 +67,8 @@ class Settings extends ChangeNotifier { bool zenMode = false; bool saveTitleInH1 = true; + bool swipeToDelete = true; + Set inlineTagPrefixes = {'#'}; void load(SharedPreferences pref) { @@ -145,6 +147,8 @@ class Settings extends ChangeNotifier { zenMode = pref.getBool("zenMode") ?? zenMode; saveTitleInH1 = pref.getBool("saveTitleInH1") ?? saveTitleInH1; + swipeToDelete = pref.getBool("swipeToDelete") ?? swipeToDelete; + inlineTagPrefixes = pref.getStringList("inlineTagPrefixes")?.toSet() ?? inlineTagPrefixes; } @@ -225,6 +229,7 @@ class Settings extends ChangeNotifier { defaultSet.experimentalMarkdownToolbar); _setBool(pref, "zenMode", zenMode, defaultSet.zenMode); _setBool(pref, "saveTitleInH1", saveTitleInH1, defaultSet.saveTitleInH1); + _setBool(pref, "swipeToDelete", swipeToDelete, defaultSet.swipeToDelete); _setStringSet(pref, "inlineTagPrefixes", inlineTagPrefixes, defaultSet.inlineTagPrefixes); @@ -311,6 +316,7 @@ class Settings extends ChangeNotifier { 'experimentalMarkdownToolbar': experimentalMarkdownToolbar.toString(), 'zenMode': zenMode.toString(), 'saveTitleInH1': saveTitleInH1.toString(), + 'swipeToDelete': swipeToDelete.toString(), 'inlineTagPrefixes': inlineTagPrefixes.join(' '), }; }