Skip to content
This repository has been archived by the owner on Dec 23, 2024. It is now read-only.

Commit

Permalink
Merge pull request #133 from Myzel394/improve-timers-widget
Browse files Browse the repository at this point in the history
Make Timers sheet grow on height change
  • Loading branch information
Myzel394 authored Oct 18, 2023
2 parents b83bfb6 + 41b8c44 commit 753a83c
Show file tree
Hide file tree
Showing 6 changed files with 129 additions and 124 deletions.
13 changes: 9 additions & 4 deletions lib/screens/SharesOverviewScreen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,15 @@ class _SharesOverviewScreenState extends State<SharesOverviewScreen> {
floatingActionButton: OpenContainer(
transitionDuration: const Duration(milliseconds: 500),
transitionType: ContainerTransitionType.fadeThrough,
openBuilder: (_, action) => CreateTaskScreen(
onCreated: () {
Navigator.pop(context);
},
openBuilder: (_, action) => Scaffold(
appBar: AppBar(
title: Text(l10n.sharesOverviewScreen_createTask_action_create),
),
body: CreateTaskScreen(
onCreated: () {
Navigator.pop(context);
},
),
),
closedBuilder: (context, action) => InkWell(
onTap: action,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,10 +79,16 @@ class _EmptyScreenState extends State<EmptyScreen> {
OpenContainer(
transitionDuration: const Duration(milliseconds: 700),
transitionType: ContainerTransitionType.fade,
openBuilder: (context, action) => CreateTaskScreen(
onCreated: () {
Navigator.pop(context);
},
openBuilder: (context, action) => PlatformScaffold(
appBar: PlatformAppBar(
title: Text(
l10n.sharesOverviewScreen_createTask_action_create),
),
body: CreateTaskScreen(
onCreated: () {
Navigator.pop(context);
},
),
),
closedShape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(
Expand Down
4 changes: 2 additions & 2 deletions lib/widgets/ModalSheetContent.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import 'package:flutter/material.dart';
import 'package:flutter_platform_widgets/flutter_platform_widgets.dart';
import 'package:locus/services/settings_service/index.dart';
import 'package:locus/utils/theme.dart';
import 'package:provider/provider.dart';

import '../constants/spacing.dart';
import 'package:locus/services/settings_service/index.dart';

class ModalSheetContent extends StatelessWidget {
final String title;
Expand Down Expand Up @@ -61,7 +61,7 @@ class ModalSheetContent extends StatelessWidget {
style: getCaptionTextStyle(context),
),
],
const SizedBox(height: LARGE_SPACE),
if (isMaterial(context)) const SizedBox(height: LARGE_SPACE),
...children,
if (submitLabel != null) ...[
const SizedBox(height: LARGE_SPACE),
Expand Down
3 changes: 3 additions & 0 deletions lib/widgets/TimerWidget.dart
Original file line number Diff line number Diff line change
Expand Up @@ -65,12 +65,14 @@ class TimerController extends ChangeNotifier {

class TimerWidget extends StatefulWidget {
final TimerController? controller;
final ScrollController? scrollController;
final List<TaskRuntimeTimer> timers;
final bool allowEdit;
final ScrollPhysics? physics;

const TimerWidget({
this.controller,
this.scrollController,
this.timers = const [],
this.allowEdit = true,
this.physics,
Expand Down Expand Up @@ -126,6 +128,7 @@ class _TimerWidgetState extends State<TimerWidget> {
Widget build(BuildContext context) {
return ListView.builder(
shrinkWrap: true,
controller: widget.scrollController,
physics: widget.physics,
itemCount: _controller.timers.length,
itemBuilder: (_, index) {
Expand Down
185 changes: 84 additions & 101 deletions lib/widgets/TimerWidgetSheet.dart
Original file line number Diff line number Diff line change
Expand Up @@ -52,62 +52,45 @@ class _TimerWidgetSheetState extends State<TimerWidgetSheet> {
final l10n = AppLocalizations.of(context);

return DraggableScrollableSheet(
initialChildSize: 0.6,
minChildSize: 0.6,
maxChildSize: 0.6,
initialChildSize: 0.5,
minChildSize: 0.5,
maxChildSize: 1,
expand: false,
builder: (_, __) => ModalSheet(
child: ModalSheetContent(
title: l10n.detailsTimersLabel,
submitLabel: l10n.closePositiveSheetAction,
onSubmit: (widget.controller.timers.isEmpty && !widget.allowEmpty)
? null
: () {
Navigator.of(context).pop(widget.controller.timers);
},
children: [
if (widget.controller.timers.isNotEmpty) ...[
Expanded(
child: TimerWidget(
builder: (context, controller) => ModalSheet(
child: SingleChildScrollView(
controller: controller,
child: ModalSheetContent(
title: l10n.detailsTimersLabel,
submitLabel: l10n.closePositiveSheetAction,
onSubmit: (widget.controller.timers.isEmpty && !widget.allowEmpty)
? null
: () {
Navigator.of(context).pop(widget.controller.timers);
},
children: [
if (widget.controller.timers.isNotEmpty) ...[
TimerWidget(
controller: widget.controller,
physics: const NeverScrollableScrollPhysics(),
),
),
const SizedBox(height: SMALL_SPACE),
if (findNextStartDate(widget.controller.timers) == null)
Text(l10n.timer_executionStartsImmediately)
else
Text(l10n.timer_nextExecution(
findNextStartDate(widget.controller.timers)!)),
if (widget.controller.timers
.any((timer) => timer.isInfinite())) ...[
const SizedBox(height: SMALL_SPACE),
WarningText(l10n.timer_runsInfiniteMessage),
if (findNextStartDate(widget.controller.timers) == null)
Text(l10n.timer_executionStartsImmediately)
else
Text(l10n.timer_nextExecution(
findNextStartDate(widget.controller.timers)!)),
if (widget.controller.timers
.any((timer) => timer.isInfinite())) ...[
const SizedBox(height: SMALL_SPACE),
WarningText(l10n.timer_runsInfiniteMessage),
],
],
],
const SizedBox(height: MEDIUM_SPACE),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
PlatformPopup<String>(
type: PlatformPopupType.longPress,
items: List<PlatformPopupMenuItem<String>>.from(
WEEKDAY_TIMERS.entries.map(
(entry) => PlatformPopupMenuItem<String>(
label: Text(entry.value["name"] as String),
onPressed: () {
widget.controller.clear();

final timers =
entry.value["timers"] as List<WeekdayTimer>;
widget.controller.addAll(timers);

Navigator.pop(context);
},
),
),
),
child: PlatformTextButton(
const SizedBox(height: MEDIUM_SPACE),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
PlatformTextButton(
child: Text(l10n.timer_addWeekday),
material: (_, __) => MaterialTextButtonData(
icon: const Icon(Icons.date_range_rounded),
Expand All @@ -133,59 +116,59 @@ class _TimerWidgetSheetState extends State<TimerWidgetSheet> {
}
},
),
),
PlatformTextButton(
child: Text(l10n.timer_addDuration),
material: (_, __) => MaterialTextButtonData(
icon: const Icon(Icons.timelapse_rounded),
),
onPressed: () async {
Duration? duration;

if (isCupertino(context)) {
await showCupertinoModalPopup(
context: context,
builder: (context) => Container(
height: 300,
padding: const EdgeInsets.only(top: 6.0),
margin: EdgeInsets.only(
bottom: MediaQuery.of(context).viewInsets.bottom,
),
color: CupertinoColors.systemBackground
.resolveFrom(context),
child: SafeArea(
top: false,
child: CupertinoTimerPicker(
initialTimerDuration: Duration.zero,
minuteInterval: 5,
onTimerDurationChanged: (value) {
duration = value;
},
mode: CupertinoTimerPickerMode.hm,
PlatformTextButton(
child: Text(l10n.timer_addDuration),
material: (_, __) => MaterialTextButtonData(
icon: const Icon(Icons.timelapse_rounded),
),
onPressed: () async {
Duration? duration;

if (isCupertino(context)) {
await showCupertinoModalPopup(
context: context,
builder: (context) => Container(
height: 300,
padding: const EdgeInsets.only(top: 6.0),
margin: EdgeInsets.only(
bottom: MediaQuery.of(context).viewInsets.bottom,
),
color: CupertinoColors.systemBackground
.resolveFrom(context),
child: SafeArea(
top: false,
child: CupertinoTimerPicker(
initialTimerDuration: Duration.zero,
minuteInterval: 5,
onTimerDurationChanged: (value) {
duration = value;
},
mode: CupertinoTimerPickerMode.hm,
),
),
),
),
);
} else {
duration = await showDurationPicker(
context: context,
initialTime: Duration.zero,
snapToMins: 15.0,
);
}
);
} else {
duration = await showDurationPicker(
context: context,
initialTime: Duration.zero,
snapToMins: 15.0,
);
}

if (duration != null && duration!.inSeconds > 0) {
widget.controller.add(
DurationTimer(
duration: duration!,
),
);
}
},
),
],
),
],
if (duration != null && duration!.inSeconds > 0) {
widget.controller.add(
DurationTimer(
duration: duration!,
),
);
}
},
),
],
),
],
),
),
),
);
Expand Down
34 changes: 21 additions & 13 deletions pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -261,10 +261,10 @@ packages:
dependency: "direct main"
description:
name: collection
sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c"
sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687
url: "https://pub.dev"
source: hosted
version: "1.17.1"
version: "1.17.2"
convert:
dependency: transitive
description:
Expand Down Expand Up @@ -825,10 +825,10 @@ packages:
dependency: "direct main"
description:
name: intl
sha256: a3715e3bc90294e971cb7dc063fbf3cd9ee0ebf8604ffeafabd9e6f16abbdbe6
sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d"
url: "https://pub.dev"
source: hosted
version: "0.18.0"
version: "0.18.1"
io:
dependency: transitive
description:
Expand Down Expand Up @@ -953,18 +953,18 @@ packages:
dependency: transitive
description:
name: matcher
sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb"
sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e"
url: "https://pub.dev"
source: hosted
version: "0.12.15"
version: "0.12.16"
material_color_utilities:
dependency: transitive
description:
name: material_color_utilities
sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724
sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41"
url: "https://pub.dev"
source: hosted
version: "0.2.0"
version: "0.5.0"
material_design_icons_flutter:
dependency: "direct main"
description:
Expand Down Expand Up @@ -1366,10 +1366,10 @@ packages:
dependency: transitive
description:
name: source_span
sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250
sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
url: "https://pub.dev"
source: hosted
version: "1.9.1"
version: "1.10.0"
stack_trace:
dependency: transitive
description:
Expand Down Expand Up @@ -1414,10 +1414,10 @@ packages:
dependency: transitive
description:
name: test_api
sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb
sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8"
url: "https://pub.dev"
source: hosted
version: "0.5.1"
version: "0.6.0"
timezone:
dependency: transitive
description:
Expand Down Expand Up @@ -1650,6 +1650,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.1.0"
web:
dependency: transitive
description:
name: web
sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10
url: "https://pub.dev"
source: hosted
version: "0.1.4-beta"
web_socket_channel:
dependency: transitive
description:
Expand Down Expand Up @@ -1707,5 +1715,5 @@ packages:
source: hosted
version: "3.1.2"
sdks:
dart: ">=3.0.0 <4.0.0"
dart: ">=3.1.0-185.0.dev <4.0.0"
flutter: ">=3.10.0"

0 comments on commit 753a83c

Please sign in to comment.