Compare commits

..

No commits in common. "e340327e323663357b2089e4b5b096613640eb09" and "6566108994371f149720b330447422605227356b" have entirely different histories.

4 changed files with 128 additions and 139 deletions

View file

@ -1,5 +1,4 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/generated/l10n.dart';
import 'package:lightmeter/res/dimens.dart'; import 'package:lightmeter/res/dimens.dart';
@ -35,20 +34,18 @@ class _DialogFilterState<T> extends State<DialogFilter<T>> {
bool get _hasAnySelected => checkboxValues.contains(true); bool get _hasAnySelected => checkboxValues.contains(true);
bool get _hasAnyUnselected => checkboxValues.contains(false); bool get _hasAnyUnselected => checkboxValues.contains(false);
final ScrollController _scrollController = ScrollController(); late final ScrollController _scrollController;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
SchedulerBinding.instance.addPostFrameCallback((_) { int i = 0;
int i = 0; for (; i < checkboxValues.length; i++) {
for (; i < checkboxValues.length; i++) { if (checkboxValues[i]) {
if (checkboxValues[i]) { break;
break;
}
} }
_scrollController.jumpTo((Dimens.grid56 * i).clamp(0, _scrollController.position.maxScrollExtent)); }
}); _scrollController = ScrollController(initialScrollOffset: Dimens.grid56 * i);
} }
@override @override
@ -64,80 +61,79 @@ class _DialogFilterState<T> extends State<DialogFilter<T>> {
titlePadding: Dimens.dialogIconTitlePadding, titlePadding: Dimens.dialogIconTitlePadding,
title: Text(widget.title), title: Text(widget.title),
contentPadding: EdgeInsets.zero, contentPadding: EdgeInsets.zero,
content: SizedBox( content: Column(
width: double.maxFinite, children: [
child: Column( Padding(
children: [ padding: Dimens.dialogIconTitlePadding,
Padding( child: Text(widget.description),
padding: Dimens.dialogIconTitlePadding, ),
child: Text(widget.description), const Divider(),
), Expanded(
const Divider(), child: SingleChildScrollView(
Expanded( controller: _scrollController,
child: SingleChildScrollView( child: Column(
controller: _scrollController, crossAxisAlignment: CrossAxisAlignment.stretch,
child: Column( mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.stretch, children: List.generate(
mainAxisSize: MainAxisSize.min, widget.values.length,
children: List.generate( (index) => CheckboxListTile(
widget.values.length, value: checkboxValues[index],
(index) => CheckboxListTile( controlAffinity: ListTileControlAffinity.leading,
value: checkboxValues[index], title: Text(
controlAffinity: ListTileControlAffinity.leading, widget.titleAdapter(context, widget.values[index]),
title: Text( style: Theme.of(context).textTheme.bodyLarge,
widget.titleAdapter(context, widget.values[index]),
style: Theme.of(context).textTheme.bodyLarge,
),
onChanged: (value) {
if (value != null) {
setState(() {
checkboxValues[index] = value;
});
}
},
), ),
onChanged: (value) {
if (value != null) {
setState(() {
checkboxValues[index] = value;
});
}
},
), ),
), ),
), ),
), ),
const Divider(), ),
Padding( const Divider(),
padding: Dimens.dialogActionsPadding, Padding(
child: Row( padding: Dimens.dialogActionsPadding,
children: [ child: Row(
SizedBox( children: [
width: 40, SizedBox(
child: IconButton( width: 40,
padding: EdgeInsets.zero, child: IconButton(
icon: Icon(_hasAnyUnselected ? Icons.select_all : Icons.deselect), padding: EdgeInsets.zero,
onPressed: _toggleAll, icon: Icon(_hasAnyUnselected ? Icons.select_all : Icons.deselect),
tooltip: _hasAnyUnselected ? S.of(context).tooltipSelectAll : S.of(context).tooltipDesecelectAll, onPressed: _toggleAll,
), tooltip: _hasAnyUnselected
? S.of(context).tooltipSelectAll
: S.of(context).tooltipDesecelectAll,
), ),
const Spacer(), ),
TextButton( const Spacer(),
onPressed: Navigator.of(context).pop, TextButton(
child: Text(S.of(context).cancel), onPressed: Navigator.of(context).pop,
), child: Text(S.of(context).cancel),
TextButton( ),
onPressed: _hasAnySelected TextButton(
? () { onPressed: _hasAnySelected
final List<T> selectedValues = []; ? () {
for (int i = 0; i < widget.values.length; i++) { final List<T> selectedValues = [];
if (checkboxValues[i]) { for (int i = 0; i < widget.values.length; i++) {
selectedValues.add(widget.values[i]); if (checkboxValues[i]) {
} selectedValues.add(widget.values[i]);
} }
Navigator.of(context).pop(selectedValues);
} }
: null, Navigator.of(context).pop(selectedValues);
child: Text(S.of(context).save), }
), : null,
], child: Text(S.of(context).save),
), ),
) ],
], ),
), )
],
), ),
); );
} }

View file

@ -32,28 +32,24 @@ class _DialogPickerState<T> extends State<DialogPicker<T>> {
titlePadding: Dimens.dialogIconTitlePadding, titlePadding: Dimens.dialogIconTitlePadding,
title: Text(widget.title), title: Text(widget.title),
contentPadding: EdgeInsets.zero, contentPadding: EdgeInsets.zero,
content: SizedBox( content: Column(
width: double.maxFinite, mainAxisSize: MainAxisSize.min,
child: Column( children: widget.values
crossAxisAlignment: CrossAxisAlignment.stretch, .map(
mainAxisSize: MainAxisSize.min, (e) => RadioListTile(
children: widget.values value: e,
.map( groupValue: _selected,
(e) => RadioListTile( title: Text(widget.titleAdapter(context, e)),
value: e, onChanged: (T? value) {
groupValue: _selected, if (value != null) {
title: Text(widget.titleAdapter(context, e)), setState(() {
onChanged: (T? value) { _selected = value;
if (value != null) { });
setState(() { }
_selected = value; },
}); ),
} )
}, .toList(),
),
)
.toList(),
),
), ),
actionsPadding: Dimens.dialogActionsPadding, actionsPadding: Dimens.dialogActionsPadding,
actions: [ actions: [

View file

@ -36,50 +36,47 @@ class _DialogRangePickerState<T extends PhotographyValue> extends State<DialogRa
titlePadding: Dimens.dialogIconTitlePadding, titlePadding: Dimens.dialogIconTitlePadding,
title: Text(widget.title), title: Text(widget.title),
contentPadding: EdgeInsets.zero, contentPadding: EdgeInsets.zero,
content: SizedBox( content: Column(
width: double.maxFinite, mainAxisSize: MainAxisSize.min,
child: Column( children: [
mainAxisSize: MainAxisSize.min, Padding(
children: [ padding: Dimens.dialogIconTitlePadding,
Padding( child: Text(widget.description),
padding: Dimens.dialogIconTitlePadding, ),
child: Text(widget.description), Padding(
), padding: const EdgeInsets.symmetric(horizontal: Dimens.paddingL),
Padding( child: DefaultTextStyle(
padding: const EdgeInsets.symmetric(horizontal: Dimens.paddingL), style: Theme.of(context).textTheme.bodyLarge!,
child: DefaultTextStyle( child: Row(
style: Theme.of(context).textTheme.bodyLarge!, mainAxisAlignment: MainAxisAlignment.spaceBetween,
child: Row( children: [
mainAxisAlignment: MainAxisAlignment.spaceBetween, Text(widget.values[_start].toString()),
children: [ Text(widget.values[_end].toString()),
Text(widget.values[_start].toString()), ],
Text(widget.values[_end].toString()),
],
),
), ),
), ),
Row( ),
children: [ Row(
Expanded( children: [
child: RangeSlider( Expanded(
values: RangeValues( child: RangeSlider(
_start.toDouble(), values: RangeValues(
_end.toDouble(), _start.toDouble(),
), _end.toDouble(),
max: widget.values.length.toDouble() - 1,
divisions: widget.values.length - 1,
onChanged: (value) {
setState(() {
_start = value.start.round();
_end = value.end.round();
});
},
), ),
max: widget.values.length.toDouble() - 1,
divisions: widget.values.length - 1,
onChanged: (value) {
setState(() {
_start = value.start.round();
_end = value.end.round();
});
},
), ),
], ),
), ],
], ),
), ],
), ),
actionsPadding: Dimens.dialogActionsPadding, actionsPadding: Dimens.dialogActionsPadding,
actions: [ actions: [

View file

@ -1,7 +1,7 @@
name: lightmeter name: lightmeter
description: Lightmeter app inspired by Material 3 design system. description: Lightmeter app inspired by Material 3 design system.
publish_to: "none" publish_to: "none"
version: 0.16.0+45 version: 0.15.3+44
environment: environment:
sdk: ">=3.0.0 <4.0.0" sdk: ">=3.0.0 <4.0.0"