From 13849aa439afee52ba8231105bda3b89725e16e4 Mon Sep 17 00:00:00 2001 From: Stefan Dresselhaus Date: Fri, 13 Jan 2023 18:17:22 +0100 Subject: [PATCH] theming & streamlining a bit. --- lib/addReminder.dart | 144 ++++++++++++++++++++++++++++--------------- lib/main.dart | 4 +- pubspec.lock | 7 +++ pubspec.yaml | 1 + 4 files changed, 106 insertions(+), 50 deletions(-) diff --git a/lib/addReminder.dart b/lib/addReminder.dart index 3d8c8a7..7d21aab 100644 --- a/lib/addReminder.dart +++ b/lib/addReminder.dart @@ -1,6 +1,8 @@ import 'package:date_field/date_field.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:gap/gap.dart'; import 'package:nextcloud_reminder/repeating_task.dart'; import 'package:nextcloud_reminder/types/repeat.dart'; import 'package:nextcloud_reminder/types/tasks.dart'; @@ -35,29 +37,60 @@ class _AddTaskWidgetState extends State { String _prettyInterval(DateInterval d) { switch (d) { - default: - return d.toString(); + case DateInterval.daily: return "day"; + case DateInterval.weekly: return "week"; + case DateInterval.monthly: return "month"; + case DateInterval.monday: return "monday"; + case DateInterval.tuesday: return "tuesday"; + case DateInterval.wednesday: return "wednesday"; + case DateInterval.thursday: return "thursday"; + case DateInterval.friday: return "friday"; + case DateInterval.saturday: return "saturday"; + case DateInterval.sunday: return "sunday"; + case DateInterval.dayOfMonth: return "day of the month"; + case DateInterval.dayOfYear: return "day of the year"; } } Widget _repeatBuilder(BuildContext context, Tuple2> data) { - return Row( + return IntrinsicHeight(child: Row( + crossAxisAlignment: CrossAxisAlignment.center, children: [ - Text("Repeat every " ), - Expanded( - flex: 1, + SizedBox( + width: 200, child: TextFormField( controller: data.item1, - decoration: const InputDecoration( - hintText: "1", + decoration: InputDecoration( + prefix: const Text("Repeat every "), + suffix: () { + if (data.item1.value.text.isEmpty) return const Text(""); + switch (data.item1.value.text.substring(data.item1.value.text.length - 1)) { + case "1": + return const Text("st"); + case "2": + return const Text("nd"); + case "3": + return const Text("rd"); + default: + return const Text("th"); + }}(), + border: const OutlineInputBorder() ), + textAlign: TextAlign.end, keyboardType: const TextInputType.numberWithOptions(signed: false, decimal: false), inputFormatters: [FilteringTextInputFormatter.digitsOnly], + onChanged: (_) {setState(() { + //nothing just rerender. + });}, ), ), + const Gap(4), Expanded( - flex: 3, - child: DropdownButton( + //padding: const EdgeInsets.only(left: 30, right: 20), + child: DropdownButtonFormField( + decoration: const InputDecoration( + border: OutlineInputBorder(), + ), items: DateInterval.values.map((v) => DropdownMenuItem(value: v, child: Text(_prettyInterval(v)))).toList(), onChanged: (v) => setState(() { data.item2.value = v ?? data.item2.value; @@ -65,11 +98,21 @@ class _AddTaskWidgetState extends State { value: data.item2.value, ), ), - IconButton(onPressed: () => setState(() { - _repeatEveryController.remove(data); - }), icon: Icon(Icons.remove, color: Theme.of(context).errorColor,)), + PreferredSize( + preferredSize: const Size.square(40), + child: IconButton( + alignment: Alignment.topCenter, + onPressed: () => setState(() { + _repeatEveryController.remove(data); + }), + icon: Icon(Icons.remove, color: Theme.of(context).errorColor,) + )), ], - ); + )); + } + + Widget _addPadding(Widget w) { + return Padding(padding: EdgeInsets.all(4), child: w); } @override @@ -83,7 +126,7 @@ class _AddTaskWidgetState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - TextFormField( + _addPadding(TextFormField( // The validator receives the text that the user has entered. validator: (value) { if (value == null || value.isEmpty) { @@ -91,13 +134,14 @@ class _AddTaskWidgetState extends State { } return null; }, + autofocus: true, controller: _titleController, decoration: const InputDecoration( labelText: "Taskname" ), - ), + )), - DateTimeField( + _addPadding(DateTimeField( onDateSelected: (v) => setState(() { _beginDate = v; }), selectedDate: _beginDate, decoration: const InputDecoration( @@ -105,39 +149,41 @@ class _AddTaskWidgetState extends State { labelText: "Begin" ), mode: DateTimeFieldPickerMode.date, - ), - ] + _repeatEveryController.map((c) => _repeatBuilder(context,c)).toList() + )), + ] + _repeatEveryController.map((c) => _addPadding(_repeatBuilder(context,c))).toList() + [ - ElevatedButton(onPressed: () => setState(() { - _repeatEveryController.add(_emptyRepetition()); - }), child: const Text("add repetition")), - Padding( - padding: const EdgeInsets.symmetric(vertical: 16.0), - child: ElevatedButton( - onPressed: () { - // Validate returns true if the form is valid, or false otherwise. - if (_formKey.currentState!.validate()) { - // If the form is valid, display a snackbar. In the real world, - // you'd often call a server or save the information in a database. - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Task added.')), - ); - var repeats = _repeatEveryController.map((e) => RepeatInterval(interval: e.item2.value, every: int.parse(e.item1.text))).toList(); - var meta = repeats.map((e) => e.toString()).join("/"); - widget.onSave(RepeatingTask( - task: TaskExtra( - title: _titleController.text, - begin: _beginDate, - meta: {"repeat": meta}, - repeat: repeats, - ) - )); - Navigator.pop(context); - } - }, - child: const Text('Submit'), - ), - ), + _addPadding(_addPadding(Row( + children: [ + ElevatedButton(onPressed: () => setState(() { + _repeatEveryController.add(_emptyRepetition()); + }), child: const Text("add repetition")), + Expanded(child: Container()), + ElevatedButton( + onPressed: () { + // Validate returns true if the form is valid, or false otherwise. + if (_formKey.currentState!.validate()) { + // If the form is valid, display a snackbar. In the real world, + // you'd often call a server or save the information in a database. + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Task added.')), + ); + var repeats = _repeatEveryController.map((e) => RepeatInterval(interval: e.item2.value, every: int.parse(e.item1.text))).toList(); + var meta = repeats.map((e) => e.toString()).join("/"); + widget.onSave(RepeatingTask( + task: TaskExtra( + title: _titleController.text, + begin: _beginDate, + meta: {"repeat": meta}, + repeat: repeats, + ) + )); + Navigator.pop(context); + } + }, + child: const Text('Submit'), + ), + ] + ))), ], ), ) diff --git a/lib/main.dart b/lib/main.dart index 52cf98c..8482097 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -16,7 +16,9 @@ class TodoTxtReminderApp extends StatelessWidget { title: 'Nextcloud Reminder', theme: ThemeData( // This is the theme of your application. - primarySwatch: Colors.blue, + primarySwatch: Colors.pink, + inputDecorationTheme: const InputDecorationTheme(border: OutlineInputBorder(), ), + ), home: const HomeWidget(title: 'todo.txt reminder'), ); diff --git a/pubspec.lock b/pubspec.lock index c636f4b..dd2a70e 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -100,6 +100,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.2.2" + gap: + dependency: "direct main" + description: + name: gap + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" intl: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 169aae4..930291f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -42,6 +42,7 @@ dependencies: flutter_window_close: ^0.2.2 collection: ^1.16.0 date_field: ^3.0.2 + gap: ^2.0.1 dev_dependencies: flutter_test: