advanced_settings_screen.dart 6.8 KB

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