@@ -4,7 +4,7 @@ import 'package:flutter/services.dart';
4
4
import 'basic_text_field.dart' ;
5
5
import 'replacements.dart' ;
6
6
import 'text_editing_delta_history_manager.dart' ;
7
- import 'toggle_button_state_manager .dart' ;
7
+ import 'toggle_buttons_state_manager .dart' ;
8
8
9
9
void main () {
10
10
runApp (const MyApp ());
@@ -42,7 +42,7 @@ class _MyHomePageState extends State<MyHomePage> {
42
42
text: 'The quick brown fox jumps over the lazy dog.' ,
43
43
);
44
44
final FocusNode _focusNode = FocusNode ();
45
- final List < bool > _isSelected = [ false , false , false ] ;
45
+ final Set < ToggleButtonsState > _isSelected = {} ;
46
46
final List <TextEditingDelta > _textEditingDeltaHistory = [];
47
47
48
48
void _updateTextEditingDeltaHistory (
@@ -115,43 +115,55 @@ class _MyHomePageState extends State<MyHomePage> {
115
115
// at the new selection.
116
116
final List <TextStyle > replacementStyles =
117
117
_replacementTextEditingController.getReplacementsAtSelection (selection);
118
- final List < bool > hasChanged = [ false , false , false ] ;
118
+ final Set < ToggleButtonsState > hasChanged = {} ;
119
119
120
120
if (replacementStyles.isEmpty) {
121
- _isSelected.fillRange (0 , _isSelected.length, false );
121
+ _isSelected.removeAll ({
122
+ ToggleButtonsState .bold,
123
+ ToggleButtonsState .italic,
124
+ ToggleButtonsState .underline
125
+ });
122
126
}
123
127
124
128
for (final TextStyle style in replacementStyles) {
125
- if (style.fontWeight != null && ! hasChanged[0 ]) {
126
- _isSelected[0 ] = true ;
127
- hasChanged[0 ] = true ;
129
+ // See [_updateToggleButtonsStateOnButtonPressed] for how
130
+ // Bold, Italic and Underline are encoded into [style]
131
+ if (style.fontWeight != null &&
132
+ ! hasChanged.contains (ToggleButtonsState .bold)) {
133
+ _isSelected.add (ToggleButtonsState .bold);
134
+ hasChanged.add (ToggleButtonsState .bold);
128
135
}
129
136
130
- if (style.fontStyle != null && ! hasChanged[1 ]) {
131
- _isSelected[1 ] = true ;
132
- hasChanged[1 ] = true ;
137
+ if (style.fontStyle != null &&
138
+ ! hasChanged.contains (ToggleButtonsState .italic)) {
139
+ _isSelected.add (ToggleButtonsState .italic);
140
+ hasChanged.add (ToggleButtonsState .italic);
133
141
}
134
142
135
- if (style.decoration != null && ! hasChanged[2 ]) {
136
- _isSelected[2 ] = true ;
137
- hasChanged[2 ] = true ;
143
+ if (style.decoration != null &&
144
+ ! hasChanged.contains (ToggleButtonsState .underline)) {
145
+ _isSelected.add (ToggleButtonsState .underline);
146
+ hasChanged.add (ToggleButtonsState .underline);
138
147
}
139
148
}
140
149
141
150
for (final TextStyle style in replacementStyles) {
142
- if (style.fontWeight == null && ! hasChanged[0 ]) {
143
- _isSelected[0 ] = false ;
144
- hasChanged[0 ] = true ;
151
+ if (style.fontWeight == null &&
152
+ ! hasChanged.contains (ToggleButtonsState .bold)) {
153
+ _isSelected.remove (ToggleButtonsState .bold);
154
+ hasChanged.add (ToggleButtonsState .bold);
145
155
}
146
156
147
- if (style.fontStyle == null && ! hasChanged[1 ]) {
148
- _isSelected[1 ] = false ;
149
- hasChanged[1 ] = true ;
157
+ if (style.fontStyle == null &&
158
+ ! hasChanged.contains (ToggleButtonsState .italic)) {
159
+ _isSelected.remove (ToggleButtonsState .italic);
160
+ hasChanged.add (ToggleButtonsState .italic);
150
161
}
151
162
152
- if (style.decoration == null && ! hasChanged[2 ]) {
153
- _isSelected[2 ] = false ;
154
- hasChanged[2 ] = true ;
163
+ if (style.decoration == null &&
164
+ ! hasChanged.contains (ToggleButtonsState .underline)) {
165
+ _isSelected.remove (ToggleButtonsState .underline);
166
+ hasChanged.add (ToggleButtonsState .underline);
155
167
}
156
168
}
157
169
@@ -170,8 +182,15 @@ class _MyHomePageState extends State<MyHomePage> {
170
182
end: _replacementTextEditingController.selection.end,
171
183
);
172
184
173
- _isSelected[index] = ! _isSelected[index];
174
- if (_isSelected[index]) {
185
+ final targetToggleButtonState = ToggleButtonsState .values[index];
186
+
187
+ if (_isSelected.contains (targetToggleButtonState)) {
188
+ _isSelected.remove (targetToggleButtonState);
189
+ } else {
190
+ _isSelected.add (targetToggleButtonState);
191
+ }
192
+
193
+ if (_isSelected.contains (targetToggleButtonState)) {
175
194
_replacementTextEditingController.applyReplacement (
176
195
TextEditingInlineSpanReplacement (
177
196
replacementRange,
@@ -304,7 +323,14 @@ class _MyHomePageState extends State<MyHomePage> {
304
323
return ToggleButtons (
305
324
borderRadius:
306
325
const BorderRadius .all (Radius .circular (4.0 )),
307
- isSelected: manager.toggleButtonsState,
326
+ isSelected: [
327
+ manager.toggleButtonsState
328
+ .contains (ToggleButtonsState .bold),
329
+ manager.toggleButtonsState
330
+ .contains (ToggleButtonsState .italic),
331
+ manager.toggleButtonsState
332
+ .contains (ToggleButtonsState .underline),
333
+ ],
308
334
onPressed: (index) => manager
309
335
.updateToggleButtonsOnButtonPressed (index),
310
336
children: const [
0 commit comments