advanced_settings_screen.dart 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. import 'package:flutter/cupertino.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:photos/core/event_bus.dart';
  4. import 'package:photos/events/force_reload_home_gallery_event.dart';
  5. import 'package:photos/theme/ente_theme.dart';
  6. import 'package:photos/ui/components/captioned_text_widget.dart';
  7. import 'package:photos/ui/components/icon_button_widget.dart';
  8. import 'package:photos/ui/components/menu_item_widget.dart';
  9. import 'package:photos/ui/components/title_bar_title_widget.dart';
  10. import 'package:photos/ui/components/title_bar_widget.dart';
  11. import 'package:photos/utils/local_settings.dart';
  12. class AdvancedSettingsScreen extends StatefulWidget {
  13. const AdvancedSettingsScreen({super.key});
  14. @override
  15. State<AdvancedSettingsScreen> createState() => _AdvancedSettingsScreenState();
  16. }
  17. class _AdvancedSettingsScreenState extends State<AdvancedSettingsScreen> {
  18. late int _photoGridSize, _chosenGridSize;
  19. @override
  20. void initState() {
  21. _photoGridSize = LocalSettings.instance.getPhotoGridSize();
  22. _chosenGridSize = _photoGridSize;
  23. super.initState();
  24. }
  25. @override
  26. Widget build(BuildContext context) {
  27. final colorScheme = getEnteColorScheme(context);
  28. return Scaffold(
  29. body: CustomScrollView(
  30. primary: false,
  31. slivers: <Widget>[
  32. TitleBarWidget(
  33. flexibleSpaceTitle: const TitleBarTitleWidget(
  34. title: "Advanced",
  35. ),
  36. actionIcons: [
  37. IconButtonWidget(
  38. icon: Icons.close_outlined,
  39. iconButtonType: IconButtonType.secondary,
  40. onTap: () {
  41. Navigator.pop(context);
  42. Navigator.pop(context);
  43. },
  44. ),
  45. ],
  46. ),
  47. SliverList(
  48. delegate: SliverChildBuilderDelegate(
  49. (context, index) {
  50. return Padding(
  51. padding: const EdgeInsets.symmetric(horizontal: 16),
  52. child: Padding(
  53. padding: const EdgeInsets.symmetric(vertical: 20),
  54. child: Column(
  55. mainAxisSize: MainAxisSize.min,
  56. children: [
  57. Column(
  58. children: [
  59. GestureDetector(
  60. onTap: () {
  61. _showPhotoGridSizePicker();
  62. },
  63. child: MenuItemWidget(
  64. captionedTextWidget: Expanded(
  65. child: Row(
  66. mainAxisAlignment: MainAxisAlignment.start,
  67. children: [
  68. CaptionedTextWidget(
  69. title: "Photo grid size",
  70. subTitle: _photoGridSize.toString(),
  71. ),
  72. ],
  73. ),
  74. ),
  75. menuItemColor: colorScheme.fillFaint,
  76. trailingWidget: Icon(
  77. Icons.chevron_right,
  78. color: colorScheme.strokeMuted,
  79. ),
  80. borderRadius: 8,
  81. alignCaptionedTextToLeft: true,
  82. // isBottomBorderRadiusRemoved: true,
  83. isGestureDetectorDisabled: true,
  84. ),
  85. ),
  86. ],
  87. ),
  88. ],
  89. ),
  90. ),
  91. );
  92. },
  93. childCount: 1,
  94. ),
  95. ),
  96. ],
  97. ),
  98. );
  99. }
  100. Future<void> _showPhotoGridSizePicker() async {
  101. final textTheme = getEnteTextTheme(context);
  102. final List<Text> options = [];
  103. options.add(
  104. Text("2", style: textTheme.body),
  105. );
  106. options.add(
  107. Text("3", style: textTheme.body),
  108. );
  109. options.add(
  110. Text("4", style: textTheme.body),
  111. );
  112. return showCupertinoModalPopup(
  113. context: context,
  114. builder: (context) {
  115. return Column(
  116. mainAxisAlignment: MainAxisAlignment.end,
  117. children: <Widget>[
  118. Container(
  119. decoration: BoxDecoration(
  120. color: getEnteColorScheme(context).backgroundElevated2,
  121. border: const Border(
  122. bottom: BorderSide(
  123. color: Color(0xff999999),
  124. width: 0.0,
  125. ),
  126. ),
  127. ),
  128. child: Row(
  129. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  130. children: <Widget>[
  131. CupertinoButton(
  132. onPressed: () {
  133. Navigator.of(context).pop('cancel');
  134. },
  135. padding: const EdgeInsets.symmetric(
  136. horizontal: 8.0,
  137. vertical: 5.0,
  138. ),
  139. child: Text(
  140. 'Cancel',
  141. style: textTheme.body,
  142. ),
  143. ),
  144. CupertinoButton(
  145. onPressed: () async {
  146. await LocalSettings.instance
  147. .setPhotoGridSize(_chosenGridSize);
  148. Bus.instance.fire(
  149. ForceReloadHomeGalleryEvent("grid size changed"),
  150. );
  151. _photoGridSize = _chosenGridSize;
  152. setState(() {});
  153. Navigator.of(context).pop('');
  154. },
  155. padding: const EdgeInsets.symmetric(
  156. horizontal: 16.0,
  157. vertical: 2.0,
  158. ),
  159. child: Text(
  160. 'Confirm',
  161. style: textTheme.body,
  162. ),
  163. )
  164. ],
  165. ),
  166. ),
  167. Container(
  168. height: 220.0,
  169. color: const Color(0xfff7f7f7),
  170. child: CupertinoPicker(
  171. backgroundColor: getEnteColorScheme(context).backgroundElevated,
  172. onSelectedItemChanged: (index) {
  173. _chosenGridSize = _getPhotoGridSizeFromIndex(index);
  174. setState(() {});
  175. },
  176. scrollController: FixedExtentScrollController(
  177. initialItem: _getIndexFromPhotoGridSize(_chosenGridSize),
  178. ),
  179. magnification: 1.3,
  180. useMagnifier: true,
  181. itemExtent: 25,
  182. diameterRatio: 1,
  183. children: options,
  184. ),
  185. )
  186. ],
  187. );
  188. },
  189. );
  190. }
  191. int _getPhotoGridSizeFromIndex(int index) {
  192. return index + 2;
  193. }
  194. int _getIndexFromPhotoGridSize(int gridSize) {
  195. return gridSize - 2;
  196. }
  197. }