1
1
import 'package:flutter/foundation.dart' ;
2
2
import 'package:flutter/material.dart' ;
3
+ import 'package:saber/components/theming/row_col.dart' ;
3
4
import 'package:saber/data/tools/pen.dart' ;
4
5
import 'package:saber/i18n/strings.g.dart' ;
5
6
6
7
class SizePicker extends StatefulWidget {
7
8
const SizePicker ({
8
9
super .key,
10
+ required this .axis,
9
11
required this .pen,
10
12
});
11
13
14
+ final Axis axis;
12
15
final Pen pen;
13
16
14
17
@override
@@ -28,7 +31,8 @@ class _SizePickerState extends State<SizePicker> {
28
31
@override
29
32
Widget build (BuildContext context) {
30
33
final colorScheme = Theme .of (context).colorScheme;
31
- return Row (
34
+ return RowCol (
35
+ axis: widget.axis,
32
36
mainAxisSize: MainAxisSize .min,
33
37
children: [
34
38
Column (
@@ -49,6 +53,7 @@ class _SizePickerState extends State<SizePicker> {
49
53
padding: const EdgeInsets .symmetric (vertical: 8 ),
50
54
child: _SizeSlider (
51
55
pen: widget.pen,
56
+ axis: widget.axis,
52
57
setState: setState,
53
58
),
54
59
),
@@ -62,17 +67,24 @@ class _SizeSlider extends StatelessWidget {
62
67
// ignore: unused_element
63
68
super .key,
64
69
required this .pen,
70
+ required this .axis,
65
71
required this .setState,
66
72
});
67
73
68
74
final Pen pen;
75
+ final Axis axis;
69
76
final void Function (void Function ()) setState;
70
77
71
- static const Size _size = Size (150 , 25 );
78
+ static const double _smallLength = 25 ;
79
+ static const double _largeLength = 150 ;
72
80
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 ();
76
88
final newSize = pen.sizeMin + stepsFromMin * pen.sizeStep;
77
89
if (newSize == pen.options.size) return ;
78
90
setState (() {
@@ -84,16 +96,30 @@ class _SizeSlider extends StatelessWidget {
84
96
Widget build (BuildContext context) {
85
97
final colorScheme = Theme .of (context).colorScheme;
86
98
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
+ ),
97
123
),
98
124
),
99
125
);
@@ -102,13 +128,15 @@ class _SizeSlider extends StatelessWidget {
102
128
103
129
class _SizeSliderPainter extends CustomPainter {
104
130
_SizeSliderPainter ({
131
+ required this .axis,
105
132
required this .minSize,
106
133
required this .maxSize,
107
134
required this .currentSize,
108
135
required this .trackColor,
109
136
required this .thumbColor,
110
137
});
111
138
139
+ final Axis axis;
112
140
final double minSize;
113
141
final double maxSize;
114
142
final double currentSize;
@@ -158,6 +186,7 @@ class _SizeSliderPainter extends CustomPainter {
158
186
@override
159
187
bool shouldRepaint (covariant CustomPainter oldDelegate) {
160
188
return oldDelegate is ! _SizeSliderPainter ||
189
+ oldDelegate.axis != axis ||
161
190
oldDelegate.minSize != minSize ||
162
191
oldDelegate.maxSize != maxSize ||
163
192
oldDelegate.currentSize != currentSize ||
0 commit comments