advanced_settings_screen.dart 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. import 'package:flutter/cupertino.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:photos/core/configuration.dart';
  4. import 'package:photos/core/event_bus.dart';
  5. import 'package:photos/ente_theme_data.dart';
  6. import 'package:photos/events/force_reload_home_gallery_event.dart';
  7. import 'package:photos/theme/ente_theme.dart';
  8. import 'package:photos/ui/components/captioned_text_widget.dart';
  9. import 'package:photos/ui/components/icon_button_widget.dart';
  10. import 'package:photos/ui/components/menu_item_widget.dart';
  11. import 'package:photos/ui/components/title_bar_title_widget.dart';
  12. import 'package:photos/ui/components/title_bar_widget.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. final _config = Configuration.instance;
  21. @override
  22. void initState() {
  23. _albumGridSize = _config.getAlbumGridSize();
  24. _chosenGridSize = _albumGridSize;
  25. super.initState();
  26. }
  27. @override
  28. Widget build(BuildContext context) {
  29. final colorScheme = getEnteColorScheme(context);
  30. return Scaffold(
  31. body: CustomScrollView(
  32. primary: false,
  33. slivers: <Widget>[
  34. TitleBarWidget(
  35. flexibleSpaceTitle: const TitleBarTitleWidget(
  36. title: "Advanced",
  37. ),
  38. actionIcons: [
  39. IconButtonWidget(
  40. icon: Icons.close_outlined,
  41. iconButtonType: IconButtonType.secondary,
  42. onTap: () {
  43. Navigator.pop(context);
  44. Navigator.pop(context);
  45. },
  46. ),
  47. ],
  48. ),
  49. SliverList(
  50. delegate: SliverChildBuilderDelegate(
  51. (context, index) {
  52. return Padding(
  53. padding: const EdgeInsets.symmetric(horizontal: 16),
  54. child: Padding(
  55. padding: const EdgeInsets.symmetric(vertical: 20),
  56. child: Column(
  57. mainAxisSize: MainAxisSize.min,
  58. children: [
  59. Column(
  60. children: [
  61. GestureDetector(
  62. onTap: () {
  63. _showAlbumGridSizePicker();
  64. },
  65. child: MenuItemWidget(
  66. captionedTextWidget: const CaptionedTextWidget(
  67. title: "Album grid size",
  68. ),
  69. menuItemColor: colorScheme.fillFaint,
  70. trailingSwitch: Row(
  71. mainAxisAlignment: MainAxisAlignment.end,
  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 _config.setAlbumGridSize(_chosenGridSize);
  148. Bus.instance.fire(
  149. ForceReloadHomeGalleryEvent("grid size changed"),
  150. );
  151. _albumGridSize = _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: Theme.of(context).textTheme.subtitle1,
  162. ),
  163. )
  164. ],
  165. ),
  166. ),
  167. Container(
  168. height: 220.0,
  169. color: const Color(0xfff7f7f7),
  170. child: CupertinoPicker(
  171. backgroundColor:
  172. Theme.of(context).backgroundColor.withOpacity(0.95),
  173. onSelectedItemChanged: (index) {
  174. _chosenGridSize = _getAlbumGridSizeFromIndex(index);
  175. setState(() {});
  176. },
  177. scrollController: FixedExtentScrollController(
  178. initialItem: _getIndexFromAlbumGridSize(_chosenGridSize),
  179. ),
  180. magnification: 1.3,
  181. useMagnifier: true,
  182. itemExtent: 25,
  183. diameterRatio: 1,
  184. children: options,
  185. ),
  186. )
  187. ],
  188. );
  189. },
  190. );
  191. }
  192. int _getAlbumGridSizeFromIndex(int index) {
  193. return index + 2;
  194. }
  195. int _getIndexFromAlbumGridSize(int gridSize) {
  196. return gridSize - 2;
  197. }
  198. }