Allow Swipe to delete to be configurable

This commit is contained in:
Vishesh Handa
2020-08-31 10:40:49 +02:00
parent d11c9e076d
commit 0f5bb345d3
5 changed files with 100 additions and 26 deletions

View File

@ -95,6 +95,10 @@ settings:
subtitle: Configure how inline tags are parsed subtitle: Configure how inline tags are parsed
enable: Parse Inline Tags enable: Parse Inline Tags
prefixes: Inline Tags Prefixes prefixes: Inline Tags Prefixes
misc:
title: Misc Settings
swipe: Swipe to Delete Note
listView: List View
editors: editors:
checklist: checklist:

View File

@ -5,6 +5,7 @@ import 'package:provider/provider.dart';
import 'package:gitjournal/core/note.dart'; import 'package:gitjournal/core/note.dart';
import 'package:gitjournal/core/notes_folder.dart'; import 'package:gitjournal/core/notes_folder.dart';
import 'package:gitjournal/settings.dart';
import 'package:gitjournal/state_container.dart'; import 'package:gitjournal/state_container.dart';
import 'package:gitjournal/utils.dart'; import 'package:gitjournal/utils.dart';
import 'package:gitjournal/widgets/icon_dismissable.dart'; import 'package:gitjournal/widgets/icon_dismissable.dart';
@ -129,34 +130,39 @@ class _FolderListViewState extends State<FolderListView> {
Note note, Note note,
Animation<double> animation, Animation<double> animation,
) { ) {
var viewItem = IconDismissable( var settings = Provider.of<Settings>(context);
key: ValueKey("FolderListView_" + note.filePath), Widget viewItem = Hero(
child: Hero( tag: note.filePath,
tag: note.filePath, child: widget.noteTileBuilder(context, note),
child: widget.noteTileBuilder(context, note), flightShuttleBuilder: (BuildContext flightContext,
flightShuttleBuilder: (BuildContext flightContext, Animation<double> animation,
Animation<double> animation, HeroFlightDirection flightDirection,
HeroFlightDirection flightDirection, BuildContext fromHeroContext,
BuildContext fromHeroContext, BuildContext toHeroContext) =>
BuildContext toHeroContext) => Material(child: toHeroContext.widget),
Material(child: toHeroContext.widget),
),
backgroundColor: Colors.red[800],
iconData: Icons.delete,
onDismissed: (direction) {
deletedViaDismissed.add(note.filePath);
var stateContainer =
Provider.of<StateContainer>(context, listen: false);
stateContainer.removeNote(note);
var snackBar = buildUndoDeleteSnackbar(stateContainer, note);
Scaffold.of(context)
..removeCurrentSnackBar()
..showSnackBar(snackBar);
},
); );
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<StateContainer>(context, listen: false);
stateContainer.removeNote(note);
var snackBar = buildUndoDeleteSnackbar(stateContainer, note);
Scaffold.of(context)
..removeCurrentSnackBar()
..showSnackBar(snackBar);
},
);
}
return SizeTransition( return SizeTransition(
key: ValueKey("FolderListView_tr_" + note.filePath), key: ValueKey("FolderListView_tr_" + note.filePath),
axis: Axis.vertical, axis: Axis.vertical,

View File

@ -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<SettingsMisc> {
@override
Widget build(BuildContext context) {
var settings = Provider.of<Settings>(context);
var body = Column(
children: <Widget>[
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,
);
}
}

View File

@ -13,6 +13,7 @@ import 'package:gitjournal/screens/settings_editors.dart';
import 'package:gitjournal/screens/settings_experimental.dart'; import 'package:gitjournal/screens/settings_experimental.dart';
import 'package:gitjournal/screens/settings_git_remote.dart'; import 'package:gitjournal/screens/settings_git_remote.dart';
import 'package:gitjournal/screens/settings_images.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_note_metadata.dart';
import 'package:gitjournal/screens/settings_tags.dart'; import 'package:gitjournal/screens/settings_tags.dart';
import 'package:gitjournal/screens/settings_widgets.dart'; import 'package:gitjournal/screens/settings_widgets.dart';
@ -265,6 +266,16 @@ class SettingsListState extends State<SettingsList> {
Navigator.of(context).push(route); 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), const SizedBox(height: 16.0),
ListTile( ListTile(
title: Text(tr("feature_timeline.title")), title: Text(tr("feature_timeline.title")),

View File

@ -67,6 +67,8 @@ class Settings extends ChangeNotifier {
bool zenMode = false; bool zenMode = false;
bool saveTitleInH1 = true; bool saveTitleInH1 = true;
bool swipeToDelete = true;
Set<String> inlineTagPrefixes = {'#'}; Set<String> inlineTagPrefixes = {'#'};
void load(SharedPreferences pref) { void load(SharedPreferences pref) {
@ -145,6 +147,8 @@ class Settings extends ChangeNotifier {
zenMode = pref.getBool("zenMode") ?? zenMode; zenMode = pref.getBool("zenMode") ?? zenMode;
saveTitleInH1 = pref.getBool("saveTitleInH1") ?? saveTitleInH1; saveTitleInH1 = pref.getBool("saveTitleInH1") ?? saveTitleInH1;
swipeToDelete = pref.getBool("swipeToDelete") ?? swipeToDelete;
inlineTagPrefixes = inlineTagPrefixes =
pref.getStringList("inlineTagPrefixes")?.toSet() ?? inlineTagPrefixes; pref.getStringList("inlineTagPrefixes")?.toSet() ?? inlineTagPrefixes;
} }
@ -225,6 +229,7 @@ class Settings extends ChangeNotifier {
defaultSet.experimentalMarkdownToolbar); defaultSet.experimentalMarkdownToolbar);
_setBool(pref, "zenMode", zenMode, defaultSet.zenMode); _setBool(pref, "zenMode", zenMode, defaultSet.zenMode);
_setBool(pref, "saveTitleInH1", saveTitleInH1, defaultSet.saveTitleInH1); _setBool(pref, "saveTitleInH1", saveTitleInH1, defaultSet.saveTitleInH1);
_setBool(pref, "swipeToDelete", swipeToDelete, defaultSet.swipeToDelete);
_setStringSet(pref, "inlineTagPrefixes", inlineTagPrefixes, _setStringSet(pref, "inlineTagPrefixes", inlineTagPrefixes,
defaultSet.inlineTagPrefixes); defaultSet.inlineTagPrefixes);
@ -311,6 +316,7 @@ class Settings extends ChangeNotifier {
'experimentalMarkdownToolbar': experimentalMarkdownToolbar.toString(), 'experimentalMarkdownToolbar': experimentalMarkdownToolbar.toString(),
'zenMode': zenMode.toString(), 'zenMode': zenMode.toString(),
'saveTitleInH1': saveTitleInH1.toString(), 'saveTitleInH1': saveTitleInH1.toString(),
'swipeToDelete': swipeToDelete.toString(),
'inlineTagPrefixes': inlineTagPrefixes.join(' '), 'inlineTagPrefixes': inlineTagPrefixes.join(' '),
}; };
} }