mirror of
https://github.com/vodemn/m3_lightmeter.git
synced 2024-11-22 07:20:39 +00:00
added films screen to navigation
This commit is contained in:
parent
ba5bbb78d7
commit
0243598553
6 changed files with 63 additions and 208 deletions
|
@ -5,11 +5,16 @@ import 'package:lightmeter/data/models/supported_locale.dart';
|
||||||
import 'package:lightmeter/generated/l10n.dart';
|
import 'package:lightmeter/generated/l10n.dart';
|
||||||
import 'package:lightmeter/platform_config.dart';
|
import 'package:lightmeter/platform_config.dart';
|
||||||
import 'package:lightmeter/providers/user_preferences_provider.dart';
|
import 'package:lightmeter/providers/user_preferences_provider.dart';
|
||||||
|
import 'package:lightmeter/screens/film_edit/flow_film_edit.dart';
|
||||||
|
import 'package:lightmeter/screens/film_edit/screen_film_edit.dart';
|
||||||
|
import 'package:lightmeter/screens/films/screen_films.dart';
|
||||||
import 'package:lightmeter/screens/lightmeter_pro/screen_lightmeter_pro.dart';
|
import 'package:lightmeter/screens/lightmeter_pro/screen_lightmeter_pro.dart';
|
||||||
import 'package:lightmeter/screens/metering/flow_metering.dart';
|
import 'package:lightmeter/screens/metering/flow_metering.dart';
|
||||||
import 'package:lightmeter/screens/settings/flow_settings.dart';
|
import 'package:lightmeter/screens/settings/flow_settings.dart';
|
||||||
import 'package:lightmeter/screens/shared/release_notes_dialog/flow_dialog_release_notes.dart';
|
import 'package:lightmeter/screens/shared/release_notes_dialog/flow_dialog_release_notes.dart';
|
||||||
import 'package:lightmeter/screens/timer/flow_timer.dart';
|
import 'package:lightmeter/screens/timer/flow_timer.dart';
|
||||||
|
import 'package:m3_lightmeter_iap/m3_lightmeter_iap.dart';
|
||||||
|
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
||||||
|
|
||||||
class Application extends StatelessWidget {
|
class Application extends StatelessWidget {
|
||||||
const Application({super.key});
|
const Application({super.key});
|
||||||
|
@ -45,6 +50,8 @@ class Application extends StatelessWidget {
|
||||||
routes: {
|
routes: {
|
||||||
"metering": (_) => const ReleaseNotesFlow(child: MeteringFlow()),
|
"metering": (_) => const ReleaseNotesFlow(child: MeteringFlow()),
|
||||||
"settings": (_) => const SettingsFlow(),
|
"settings": (_) => const SettingsFlow(),
|
||||||
|
"films": (_) => const FilmsScreen(),
|
||||||
|
"filmEdit": (context) => FilmEditFlow(args: ModalRoute.of(context)!.settings.arguments! as FilmEditArgs),
|
||||||
"lightmeterPro": (_) => LightmeterProScreen(),
|
"lightmeterPro": (_) => LightmeterProScreen(),
|
||||||
"timer": (context) => TimerFlow(args: ModalRoute.of(context)!.settings.arguments! as TimerFlowArgs),
|
"timer": (context) => TimerFlow(args: ModalRoute.of(context)!.settings.arguments! as TimerFlowArgs),
|
||||||
},
|
},
|
||||||
|
|
|
@ -67,8 +67,6 @@
|
||||||
"equipmentProfile": "Equipment profile",
|
"equipmentProfile": "Equipment profile",
|
||||||
"equipmentProfiles": "Equipment profiles",
|
"equipmentProfiles": "Equipment profiles",
|
||||||
"tapToAdd": "Tap to add",
|
"tapToAdd": "Tap to add",
|
||||||
"filmsInUse": "Films in use",
|
|
||||||
"filmsInUseDescription": "Select films which you use.",
|
|
||||||
"general": "General",
|
"general": "General",
|
||||||
"keepScreenOn": "Keep screen on",
|
"keepScreenOn": "Keep screen on",
|
||||||
"haptics": "Haptics",
|
"haptics": "Haptics",
|
||||||
|
@ -151,6 +149,10 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"close": "Close",
|
"close": "Close",
|
||||||
|
"films": "Films",
|
||||||
|
"filmsInUse": "Films in use",
|
||||||
|
"filmsInUseDescription": "Select films which you use.",
|
||||||
|
"filmsCustom": "Custom films",
|
||||||
"addFilmTitle": "Add film",
|
"addFilmTitle": "Add film",
|
||||||
"editFilmTitle": "Edit film",
|
"editFilmTitle": "Edit film",
|
||||||
"filmFormula": "Formula",
|
"filmFormula": "Formula",
|
||||||
|
|
|
@ -4,15 +4,21 @@ import 'package:lightmeter/screens/film_edit/bloc_film_edit.dart';
|
||||||
import 'package:lightmeter/screens/film_edit/screen_film_edit.dart';
|
import 'package:lightmeter/screens/film_edit/screen_film_edit.dart';
|
||||||
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
||||||
|
|
||||||
class FilmEditFlow extends StatelessWidget {
|
class FilmEditArgs {
|
||||||
final FilmExponential? film;
|
final FilmExponential film;
|
||||||
|
|
||||||
const FilmEditFlow({this.film, super.key});
|
const FilmEditArgs({required this.film});
|
||||||
|
}
|
||||||
|
|
||||||
|
class FilmEditFlow extends StatelessWidget {
|
||||||
|
final FilmEditArgs args;
|
||||||
|
|
||||||
|
const FilmEditFlow({required this.args, super.key});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return BlocProvider(
|
return BlocProvider(
|
||||||
create: (_) => FilmEditBloc(film),
|
create: (_) => FilmEditBloc(args.film),
|
||||||
child: const FilmEditScreen(),
|
child: const FilmEditScreen(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:lightmeter/generated/l10n.dart';
|
import 'package:lightmeter/generated/l10n.dart';
|
||||||
import 'package:lightmeter/providers/films_provider.dart';
|
import 'package:lightmeter/providers/films_provider.dart';
|
||||||
import 'package:lightmeter/res/dimens.dart';
|
import 'package:lightmeter/res/dimens.dart';
|
||||||
import 'package:lightmeter/screens/settings/components/shared/expandable_section_list/widget_expandable_section_list.dart';
|
import 'package:lightmeter/screens/film_edit/flow_film_edit.dart';
|
||||||
import 'package:lightmeter/screens/shared/sliver_screen/screen_sliver.dart';
|
import 'package:lightmeter/screens/shared/sliver_screen/screen_sliver.dart';
|
||||||
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
||||||
|
|
||||||
|
@ -16,6 +16,12 @@ class FilmsScreen extends StatefulWidget {
|
||||||
class _FilmsScreenState extends State<FilmsScreen> with SingleTickerProviderStateMixin {
|
class _FilmsScreenState extends State<FilmsScreen> with SingleTickerProviderStateMixin {
|
||||||
late final tabController = TabController(length: 2, vsync: this);
|
late final tabController = TabController(length: 2, vsync: this);
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
tabController.dispose();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return SliverScreen(
|
return SliverScreen(
|
||||||
|
@ -28,16 +34,22 @@ class _FilmsScreenState extends State<FilmsScreen> with SingleTickerProviderStat
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
appBarActions: [
|
appBarActions: [
|
||||||
IconButton(
|
AnimatedBuilder(
|
||||||
onPressed: _addFilm,
|
animation: tabController,
|
||||||
icon: const Icon(Icons.add_outlined),
|
builder: (context, _) => AnimatedSwitcher(
|
||||||
tooltip: S.of(context).tooltipAdd,
|
duration: Dimens.switchDuration,
|
||||||
|
child: tabController.index == 0
|
||||||
|
? const SizedBox.shrink()
|
||||||
|
: IconButton(
|
||||||
|
onPressed: _addFilm,
|
||||||
|
icon: const Icon(Icons.add_outlined),
|
||||||
|
tooltip: S.of(context).tooltipAdd,
|
||||||
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
slivers: [
|
slivers: [
|
||||||
SliverFillRemaining(
|
SliverFillRemaining(
|
||||||
// The inner (body) scroll view must use this scroll controller so that
|
|
||||||
// the independent scroll positions can be kept in sync.
|
|
||||||
child: TabBarView(
|
child: TabBarView(
|
||||||
controller: tabController,
|
controller: tabController,
|
||||||
children: [
|
children: [
|
||||||
|
@ -45,9 +57,10 @@ class _FilmsScreenState extends State<FilmsScreen> with SingleTickerProviderStat
|
||||||
films: Films.of(context).skip(1).toList(),
|
films: Films.of(context).skip(1).toList(),
|
||||||
onFilmSelected: (film, value) {},
|
onFilmSelected: (film, value) {},
|
||||||
),
|
),
|
||||||
_FilmsListBuilder(
|
_FilmsListBuilder<FilmExponential>(
|
||||||
films: Films.of(context).skip(1).toList(),
|
films: Films.of(context).skip(1).whereType<FilmExponential>().toList(),
|
||||||
onFilmSelected: (film, value) {},
|
onFilmSelected: (film, value) {},
|
||||||
|
onFilmEdit: _editFilm,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
@ -56,13 +69,25 @@ class _FilmsScreenState extends State<FilmsScreen> with SingleTickerProviderStat
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _addFilm([EquipmentProfile? copyFrom]) {}
|
void _addFilm() {
|
||||||
|
Navigator.of(context).pushNamed(
|
||||||
|
'filmEdit',
|
||||||
|
arguments: const FilmEditArgs(film: FilmExponential(name: '', iso: 100, exponent: 1.3)),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _editFilm(FilmExponential film) {
|
||||||
|
Navigator.of(context).pushNamed(
|
||||||
|
'filmEdit',
|
||||||
|
arguments: FilmEditArgs(film: film),
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class _FilmsListBuilder extends StatelessWidget {
|
class _FilmsListBuilder<T extends Film> extends StatelessWidget {
|
||||||
final List<Film> films;
|
final List<T> films;
|
||||||
final void Function(Film film, bool value) onFilmSelected;
|
final void Function(T film, bool value) onFilmSelected;
|
||||||
final void Function()? onFilmEdit;
|
final void Function(T film)? onFilmEdit;
|
||||||
|
|
||||||
const _FilmsListBuilder({
|
const _FilmsListBuilder({
|
||||||
required this.films,
|
required this.films,
|
||||||
|
@ -98,7 +123,7 @@ class _FilmsListBuilder extends StatelessWidget {
|
||||||
},
|
},
|
||||||
secondary: onFilmEdit != null
|
secondary: onFilmEdit != null
|
||||||
? IconButton(
|
? IconButton(
|
||||||
onPressed: onFilmEdit,
|
onPressed: () => onFilmEdit!(films[index]),
|
||||||
icon: const Icon(Icons.edit),
|
icon: const Icon(Icons.edit),
|
||||||
)
|
)
|
||||||
: null,
|
: null,
|
||||||
|
|
|
@ -1,166 +0,0 @@
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter/services.dart';
|
|
||||||
import 'package:lightmeter/res/dimens.dart';
|
|
||||||
|
|
||||||
class FormulaInput extends StatefulWidget {
|
|
||||||
const FormulaInput({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<FormulaInput> createState() => _FormulaInputState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _FormulaInputState extends State<FormulaInput> {
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Scaffold(
|
|
||||||
body: SafeArea(
|
|
||||||
child: Column(
|
|
||||||
children: [
|
|
||||||
TextFormField(
|
|
||||||
inputFormatters: [
|
|
||||||
FilteringTextInputFormatter.allow(RegExp('x')),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
const Spacer(),
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
_Button(
|
|
||||||
title: '()',
|
|
||||||
onTap: () {},
|
|
||||||
),
|
|
||||||
_buttonsDivider,
|
|
||||||
_Button(
|
|
||||||
title: 'ln',
|
|
||||||
onTap: () {},
|
|
||||||
),
|
|
||||||
_buttonsDivider,
|
|
||||||
_Button(
|
|
||||||
title: 'lg',
|
|
||||||
onTap: () {},
|
|
||||||
),
|
|
||||||
_buttonsDivider,
|
|
||||||
_Button(
|
|
||||||
title: '^',
|
|
||||||
onTap: () {},
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
_Button(
|
|
||||||
title: '7',
|
|
||||||
onTap: () {},
|
|
||||||
),
|
|
||||||
_buttonsDivider,
|
|
||||||
_Button(
|
|
||||||
title: '8',
|
|
||||||
onTap: () {},
|
|
||||||
),
|
|
||||||
_buttonsDivider,
|
|
||||||
_Button(
|
|
||||||
title: '9',
|
|
||||||
onTap: () {},
|
|
||||||
),
|
|
||||||
_buttonsDivider,
|
|
||||||
_Button(
|
|
||||||
title: '^',
|
|
||||||
onTap: () {},
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
_Button(
|
|
||||||
title: '4',
|
|
||||||
onTap: () {},
|
|
||||||
),
|
|
||||||
_buttonsDivider,
|
|
||||||
_Button(
|
|
||||||
title: '5',
|
|
||||||
onTap: () {},
|
|
||||||
),
|
|
||||||
_buttonsDivider,
|
|
||||||
_Button(
|
|
||||||
title: '6',
|
|
||||||
onTap: () {},
|
|
||||||
),
|
|
||||||
_buttonsDivider,
|
|
||||||
_Button(
|
|
||||||
title: '^',
|
|
||||||
onTap: () {},
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
_Button(
|
|
||||||
title: '1',
|
|
||||||
onTap: () {},
|
|
||||||
),
|
|
||||||
_buttonsDivider,
|
|
||||||
_Button(
|
|
||||||
title: '2',
|
|
||||||
onTap: () {},
|
|
||||||
),
|
|
||||||
_buttonsDivider,
|
|
||||||
_Button(
|
|
||||||
title: '3',
|
|
||||||
onTap: () {},
|
|
||||||
),
|
|
||||||
_buttonsDivider,
|
|
||||||
_Button(
|
|
||||||
title: '^',
|
|
||||||
onTap: () {},
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
_Button(
|
|
||||||
title: '0',
|
|
||||||
onTap: () {},
|
|
||||||
),
|
|
||||||
_Button(
|
|
||||||
title: '.',
|
|
||||||
onTap: () {},
|
|
||||||
),
|
|
||||||
_Button(
|
|
||||||
title: '<',
|
|
||||||
onTap: () {},
|
|
||||||
),
|
|
||||||
_Button(
|
|
||||||
title: '^',
|
|
||||||
onTap: () {},
|
|
||||||
),
|
|
||||||
],
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class _Button extends StatelessWidget {
|
|
||||||
final String title;
|
|
||||||
final VoidCallback onTap;
|
|
||||||
|
|
||||||
const _Button({super.key, required this.title, required this.onTap});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Expanded(
|
|
||||||
child: Container(
|
|
||||||
alignment: Alignment.center,
|
|
||||||
height: Dimens.grid48,
|
|
||||||
decoration: ShapeDecoration(
|
|
||||||
color: Theme.of(context).colorScheme.secondaryContainer,
|
|
||||||
shape: const StadiumBorder(),
|
|
||||||
),
|
|
||||||
child: Text(title),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const _buttonsDivider = SizedBox(width: Dimens.grid8, height: Dimens.grid8);
|
|
|
@ -1,9 +1,6 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:lightmeter/generated/l10n.dart';
|
import 'package:lightmeter/generated/l10n.dart';
|
||||||
import 'package:lightmeter/providers/films_provider.dart';
|
|
||||||
import 'package:lightmeter/screens/settings/components/shared/dialog_filter/widget_dialog_filter.dart';
|
|
||||||
import 'package:lightmeter/screens/settings/components/shared/iap_list_tile/widget_list_tile_iap.dart';
|
import 'package:lightmeter/screens/settings/components/shared/iap_list_tile/widget_list_tile_iap.dart';
|
||||||
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
|
||||||
|
|
||||||
class FilmsListTile extends StatelessWidget {
|
class FilmsListTile extends StatelessWidget {
|
||||||
const FilmsListTile({super.key});
|
const FilmsListTile({super.key});
|
||||||
|
@ -12,24 +9,8 @@ class FilmsListTile extends StatelessWidget {
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return IAPListTile(
|
return IAPListTile(
|
||||||
leading: const Icon(Icons.camera_roll_outlined),
|
leading: const Icon(Icons.camera_roll_outlined),
|
||||||
title: Text(S.of(context).filmsInUse),
|
title: Text(S.of(context).films),
|
||||||
onTap: () {
|
onTap: () => Navigator.of(context).pushNamed('films'),
|
||||||
showDialog<List<Film>>(
|
|
||||||
context: context,
|
|
||||||
builder: (_) => DialogFilter<Film>(
|
|
||||||
icon: const Icon(Icons.camera_roll_outlined),
|
|
||||||
title: S.of(context).filmsInUse,
|
|
||||||
description: S.of(context).filmsInUseDescription,
|
|
||||||
values: Films.of(context).sublist(1),
|
|
||||||
selectedValues: Films.inUseOf(context),
|
|
||||||
titleAdapter: (_, value) => value.name,
|
|
||||||
),
|
|
||||||
).then((values) {
|
|
||||||
if (values != null) {
|
|
||||||
FilmsProvider.of(context).saveFilms(values);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue