advanced_settings_screen.dart 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. import 'package:flutter/cupertino.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:photos/core/event_bus.dart';
  4. import 'package:photos/ente_theme_data.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 _albumGridSize, _chosenGridSize;
  20. @override
  21. void initState() {
  22. _albumGridSize = LocalSettings.instance.getAlbumGridSize();
  23. _chosenGridSize = _albumGridSize;
  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. _showAlbumGridSizePicker();
  63. },
  64. child: MenuItemWidget(
  65. captionedTextWidget: const CaptionedTextWidget(
  66. title: "Album grid size",
  67. ),
  68. menuItemColor: colorScheme.fillFaint,
  69. trailingWidget: Row(
  70. mainAxisAlignment: MainAxisAlignment.center,
  71. crossAxisAlignment: CrossAxisAlignment.center,
  72. children: [
  73. Text(
  74. _albumGridSize.toString(),
  75. ),
  76. Icon(
  77. Icons.chevron_right,
  78. color: colorScheme.strokeMuted,
  79. ),
  80. ],
  81. ),
  82. borderRadius: 8,
  83. alignCaptionedTextToLeft: true,
  84. // isBottomBorderRadiusRemoved: true,
  85. isGestureDetectorDisabled: true,
  86. ),
  87. ),
  88. ],
  89. ),
  90. ],
  91. ),
  92. ),
  93. );
  94. },
  95. childCount: 1,
  96. ),
  97. ),
  98. ],
  99. ),
  100. );
  101. }
  102. Future<void> _showAlbumGridSizePicker() async {
  103. final List<Text> options = [];
  104. options.add(
  105. Text("2", style: Theme.of(context).textTheme.subtitle1),
  106. );
  107. options.add(
  108. Text("3", style: Theme.of(context).textTheme.subtitle1),
  109. );
  110. options.add(
  111. Text("4", style: Theme.of(context).textTheme.subtitle1),
  112. );
  113. return showCupertinoModalPopup(
  114. context: context,
  115. builder: (context) {
  116. return Column(
  117. mainAxisAlignment: MainAxisAlignment.end,
  118. children: <Widget>[
  119. Container(
  120. decoration: BoxDecoration(
  121. color: Theme.of(context).colorScheme.cupertinoPickerTopColor,
  122. border: const Border(
  123. bottom: BorderSide(
  124. color: Color(0xff999999),
  125. width: 0.0,
  126. ),
  127. ),
  128. ),
  129. child: Row(
  130. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  131. children: <Widget>[
  132. CupertinoButton(
  133. onPressed: () {
  134. Navigator.of(context).pop('cancel');
  135. },
  136. padding: const EdgeInsets.symmetric(
  137. horizontal: 8.0,
  138. vertical: 5.0,
  139. ),
  140. child: Text(
  141. 'Cancel',
  142. style: Theme.of(context).textTheme.subtitle1,
  143. ),
  144. ),
  145. CupertinoButton(
  146. onPressed: () async {
  147. await LocalSettings.instance
  148. .setAlbumGridSize(_chosenGridSize);
  149. Bus.instance.fire(
  150. ForceReloadHomeGalleryEvent("grid size changed"),
  151. );
  152. _albumGridSize = _chosenGridSize;
  153. setState(() {});
  154. Navigator.of(context).pop('');
  155. },
  156. padding: const EdgeInsets.symmetric(
  157. horizontal: 16.0,
  158. vertical: 2.0,
  159. ),
  160. child: Text(
  161. 'Confirm',
  162. style: Theme.of(context).textTheme.subtitle1,
  163. ),
  164. )
  165. ],
  166. ),
  167. ),
  168. Container(
  169. height: 220.0,
  170. color: const Color(0xfff7f7f7),
  171. child: CupertinoPicker(
  172. backgroundColor:
  173. Theme.of(context).backgroundColor.withOpacity(0.95),
  174. onSelectedItemChanged: (index) {
  175. _chosenGridSize = _getAlbumGridSizeFromIndex(index);
  176. setState(() {});
  177. },
  178. scrollController: FixedExtentScrollController(
  179. initialItem: _getIndexFromAlbumGridSize(_chosenGridSize),
  180. ),
  181. magnification: 1.3,
  182. useMagnifier: true,
  183. itemExtent: 25,
  184. diameterRatio: 1,
  185. children: options,
  186. ),
  187. )
  188. ],
  189. );
  190. },
  191. );
  192. }
  193. int _getAlbumGridSizeFromIndex(int index) {
  194. return index + 2;
  195. }
  196. int _getIndexFromAlbumGridSize(int gridSize) {
  197. return gridSize - 2;
  198. }
  199. }