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
enable: Parse Inline Tags
prefixes: Inline Tags Prefixes
misc:
title: Misc Settings
swipe: Swipe to Delete Note
listView: List View
editors:
checklist:

View File

@ -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<FolderListView> {
Note note,
Animation<double> animation,
) {
var viewItem = IconDismissable(
key: ValueKey("FolderListView_" + note.filePath),
child: Hero(
tag: note.filePath,
child: widget.noteTileBuilder(context, note),
flightShuttleBuilder: (BuildContext flightContext,
Animation<double> 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<StateContainer>(context, listen: false);
stateContainer.removeNote(note);
var snackBar = buildUndoDeleteSnackbar(stateContainer, note);
Scaffold.of(context)
..removeCurrentSnackBar()
..showSnackBar(snackBar);
},
var settings = Provider.of<Settings>(context);
Widget viewItem = Hero(
tag: note.filePath,
child: widget.noteTileBuilder(context, note),
flightShuttleBuilder: (BuildContext flightContext,
Animation<double> 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<StateContainer>(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,

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_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<SettingsList> {
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")),

View File

@ -67,6 +67,8 @@ class Settings extends ChangeNotifier {
bool zenMode = false;
bool saveTitleInH1 = true;
bool swipeToDelete = true;
Set<String> 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(' '),
};
}