mirror of
https://github.com/vodemn/m3_lightmeter.git
synced 2024-10-20 07:10:38 +00:00
5c27f726c5
* wip * added start/stop button * animated timeline * fixed timer stop state * added reset button (wip) * added `onExposurePairTap` callback * integrated `TimerScreen` to navigation * separated `TimerTimeline` * fixed timeline flickering * added milliseconds to timer * synchronized timeline with actual timer * reused `BottomControlsBar` * fixed default scaffold background color * moved center button size to the bar itself * display selected exposure pair on timer screen * separated reusable `AnimatedCircluarButton` * release camera when timer is opened * added `TimerInteractor` * added `TimerBloc` test * fixed hours parsing * added scenarios for timer golden test * adjusted timer timeline colors * show iso & nd values on timer screen * automatically close timer screen after timeout * added timer autostart * reverted theme changes * updated goldens * typo * removed timer screen auto-dismiss * increased timer vibration duration * replaced outlined locks * increased 1/3 values font size
89 lines
2.8 KiB
Dart
89 lines
2.8 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:lightmeter/data/models/ev_source_type.dart';
|
|
import 'package:lightmeter/generated/l10n.dart';
|
|
import 'package:lightmeter/providers/user_preferences_provider.dart';
|
|
import 'package:lightmeter/screens/shared/animated_circular_button/widget_button_circular_animated.dart';
|
|
import 'package:lightmeter/screens/shared/bottom_controls_bar/widget_bottom_controls_bar.dart';
|
|
import 'package:lightmeter/utils/context_utils.dart';
|
|
|
|
class MeteringBottomControls extends StatelessWidget {
|
|
final double? ev;
|
|
final double? ev100;
|
|
final bool isMetering;
|
|
final VoidCallback? onSwitchEvSourceType;
|
|
final VoidCallback onMeasure;
|
|
final VoidCallback onSettings;
|
|
|
|
const MeteringBottomControls({
|
|
required this.ev,
|
|
required this.ev100,
|
|
required this.isMetering,
|
|
required this.onSwitchEvSourceType,
|
|
required this.onMeasure,
|
|
required this.onSettings,
|
|
super.key,
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return BottomControlsBar(
|
|
left: onSwitchEvSourceType != null
|
|
? IconButton(
|
|
onPressed: onSwitchEvSourceType,
|
|
icon: Icon(
|
|
UserPreferencesProvider.evSourceTypeOf(context) != EvSourceType.camera
|
|
? Icons.camera_rear
|
|
: Icons.wb_incandescent,
|
|
),
|
|
tooltip: UserPreferencesProvider.evSourceTypeOf(context) != EvSourceType.camera
|
|
? S.of(context).tooltipUseCamera
|
|
: S.of(context).tooltipUseLightSensor,
|
|
)
|
|
: null,
|
|
center: AnimatedCircluarButton(
|
|
progress: isMetering ? null : 1.0,
|
|
isPressed: isMetering,
|
|
onPressed: onMeasure,
|
|
child: ev != null ? _EvValueText(ev: ev!, ev100: ev100!) : null,
|
|
),
|
|
right: IconButton(
|
|
onPressed: onSettings,
|
|
icon: const Icon(Icons.settings),
|
|
tooltip: S.of(context).tooltipOpenSettings,
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
class _EvValueText extends StatelessWidget {
|
|
static const String _subscript100 = '\u2081\u2080\u2080';
|
|
final double ev;
|
|
final double ev100;
|
|
|
|
const _EvValueText({
|
|
required this.ev,
|
|
required this.ev100,
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final theme = Theme.of(context);
|
|
return Text(
|
|
_text(context),
|
|
style: theme.textTheme.bodyMedium?.copyWith(color: theme.colorScheme.surface),
|
|
textAlign: TextAlign.center,
|
|
);
|
|
}
|
|
|
|
String _text(BuildContext context) {
|
|
final bool showEv100 = context.isPro && UserPreferencesProvider.showEv100Of(context);
|
|
final StringBuffer buffer = StringBuffer()
|
|
..writeAll([
|
|
(showEv100 ? ev100 : ev).toStringAsFixed(1),
|
|
'\n',
|
|
S.of(context).ev,
|
|
if (showEv100) _subscript100,
|
|
]);
|
|
return buffer.toString();
|
|
}
|
|
}
|