11import 'package:flutter/foundation.dart' ;
22import 'package:flutter/material.dart' ;
3+ import 'package:saber/components/theming/row_col.dart' ;
34import 'package:saber/data/tools/pen.dart' ;
45import 'package:saber/i18n/strings.g.dart' ;
56
67class SizePicker extends StatefulWidget {
78 const SizePicker ({
89 super .key,
10+ required this .axis,
911 required this .pen,
1012 });
1113
14+ final Axis axis;
1215 final Pen pen;
1316
1417 @override
@@ -28,7 +31,8 @@ class _SizePickerState extends State<SizePicker> {
2831 @override
2932 Widget build (BuildContext context) {
3033 final colorScheme = Theme .of (context).colorScheme;
31- return Row (
34+ return RowCol (
35+ axis: widget.axis,
3236 mainAxisSize: MainAxisSize .min,
3337 children: [
3438 Column (
@@ -49,6 +53,7 @@ class _SizePickerState extends State<SizePicker> {
4953 padding: const EdgeInsets .symmetric (vertical: 8 ),
5054 child: _SizeSlider (
5155 pen: widget.pen,
56+ axis: widget.axis,
5257 setState: setState,
5358 ),
5459 ),
@@ -62,17 +67,24 @@ class _SizeSlider extends StatelessWidget {
6267 // ignore: unused_element
6368 super .key,
6469 required this .pen,
70+ required this .axis,
6571 required this .setState,
6672 });
6773
6874 final Pen pen;
75+ final Axis axis;
6976 final void Function (void Function ()) setState;
7077
71- static const Size _size = Size (150 , 25 );
78+ static const double _smallLength = 25 ;
79+ static const double _largeLength = 150 ;
7280
73- void onDrag (double localDx) {
74- final relX = clampDouble (localDx / _size.width, 0 , 1 );
75- final stepsFromMin = (relX * pen.sizeStepsBetweenMinAndMax).round ();
81+ /// [percent] is a value between 0 and 1
82+ /// where 0 is the start of the slider and 1 is the end.
83+ ///
84+ /// Values outside of this range are allowed but will be clamped.
85+ void onDrag (double percent) {
86+ percent = clampDouble (percent, 0 , 1 );
87+ final stepsFromMin = (percent * pen.sizeStepsBetweenMinAndMax).round ();
7688 final newSize = pen.sizeMin + stepsFromMin * pen.sizeStep;
7789 if (newSize == pen.options.size) return ;
7890 setState (() {
@@ -84,16 +96,30 @@ class _SizeSlider extends StatelessWidget {
8496 Widget build (BuildContext context) {
8597 final colorScheme = Theme .of (context).colorScheme;
8698 return GestureDetector (
87- onHorizontalDragStart: (details) => onDrag (details.localPosition.dx),
88- onHorizontalDragUpdate: (details) => onDrag (details.localPosition.dx),
89- child: CustomPaint (
90- size: _size,
91- painter: _SizeSliderPainter (
92- minSize: pen.sizeMin,
93- maxSize: pen.sizeMax,
94- currentSize: pen.options.size,
95- trackColor: colorScheme.onBackground.withOpacity (0.2 ),
96- thumbColor: colorScheme.primary,
99+ onHorizontalDragStart: axis == Axis .horizontal
100+ ? (details) => onDrag (details.localPosition.dx / _largeLength)
101+ : null ,
102+ onHorizontalDragUpdate: axis == Axis .horizontal
103+ ? (details) => onDrag (details.localPosition.dx / _largeLength)
104+ : null ,
105+ onVerticalDragStart: axis == Axis .vertical
106+ ? (details) => onDrag (details.localPosition.dy / _largeLength)
107+ : null ,
108+ onVerticalDragUpdate: axis == Axis .vertical
109+ ? (details) => onDrag (details.localPosition.dy / _largeLength)
110+ : null ,
111+ child: RotatedBox (
112+ quarterTurns: axis == Axis .horizontal ? 0 : 1 ,
113+ child: CustomPaint (
114+ size: const Size (_largeLength, _smallLength),
115+ painter: _SizeSliderPainter (
116+ axis: axis,
117+ minSize: pen.sizeMin,
118+ maxSize: pen.sizeMax,
119+ currentSize: pen.options.size,
120+ trackColor: colorScheme.onBackground.withOpacity (0.2 ),
121+ thumbColor: colorScheme.primary,
122+ ),
97123 ),
98124 ),
99125 );
@@ -102,13 +128,15 @@ class _SizeSlider extends StatelessWidget {
102128
103129class _SizeSliderPainter extends CustomPainter {
104130 _SizeSliderPainter ({
131+ required this .axis,
105132 required this .minSize,
106133 required this .maxSize,
107134 required this .currentSize,
108135 required this .trackColor,
109136 required this .thumbColor,
110137 });
111138
139+ final Axis axis;
112140 final double minSize;
113141 final double maxSize;
114142 final double currentSize;
@@ -158,6 +186,7 @@ class _SizeSliderPainter extends CustomPainter {
158186 @override
159187 bool shouldRepaint (covariant CustomPainter oldDelegate) {
160188 return oldDelegate is ! _SizeSliderPainter ||
189+ oldDelegate.axis != axis ||
161190 oldDelegate.minSize != minSize ||
162191 oldDelegate.maxSize != maxSize ||
163192 oldDelegate.currentSize != currentSize ||
0 commit comments