Skip to content

Commit 4bb91df

Browse files
Making ToggleButtonState more obvious (#1286)
1 parent 117dac0 commit 4bb91df

File tree

3 files changed

+62
-29
lines changed

3 files changed

+62
-29
lines changed

simplistic_editor/lib/basic_text_input_client.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import 'package:flutter/services.dart';
77

88
import 'replacements.dart';
99
import 'text_editing_delta_history_manager.dart';
10-
import 'toggle_button_state_manager.dart';
10+
import 'toggle_buttons_state_manager.dart';
1111

1212
/// Signature for the callback that reports when the user changes the selection
1313
/// (including the cursor location).

simplistic_editor/lib/main.dart

Lines changed: 51 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import 'package:flutter/services.dart';
44
import 'basic_text_field.dart';
55
import 'replacements.dart';
66
import 'text_editing_delta_history_manager.dart';
7-
import 'toggle_button_state_manager.dart';
7+
import 'toggle_buttons_state_manager.dart';
88

99
void main() {
1010
runApp(const MyApp());
@@ -42,7 +42,7 @@ class _MyHomePageState extends State<MyHomePage> {
4242
text: 'The quick brown fox jumps over the lazy dog.',
4343
);
4444
final FocusNode _focusNode = FocusNode();
45-
final List<bool> _isSelected = [false, false, false];
45+
final Set<ToggleButtonsState> _isSelected = {};
4646
final List<TextEditingDelta> _textEditingDeltaHistory = [];
4747

4848
void _updateTextEditingDeltaHistory(
@@ -115,43 +115,55 @@ class _MyHomePageState extends State<MyHomePage> {
115115
// at the new selection.
116116
final List<TextStyle> replacementStyles =
117117
_replacementTextEditingController.getReplacementsAtSelection(selection);
118-
final List<bool> hasChanged = [false, false, false];
118+
final Set<ToggleButtonsState> hasChanged = {};
119119

120120
if (replacementStyles.isEmpty) {
121-
_isSelected.fillRange(0, _isSelected.length, false);
121+
_isSelected.removeAll({
122+
ToggleButtonsState.bold,
123+
ToggleButtonsState.italic,
124+
ToggleButtonsState.underline
125+
});
122126
}
123127

124128
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);
128135
}
129136

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);
133141
}
134142

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);
138147
}
139148
}
140149

141150
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);
145155
}
146156

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);
150161
}
151162

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);
155167
}
156168
}
157169

@@ -170,8 +182,15 @@ class _MyHomePageState extends State<MyHomePage> {
170182
end: _replacementTextEditingController.selection.end,
171183
);
172184

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)) {
175194
_replacementTextEditingController.applyReplacement(
176195
TextEditingInlineSpanReplacement(
177196
replacementRange,
@@ -304,7 +323,14 @@ class _MyHomePageState extends State<MyHomePage> {
304323
return ToggleButtons(
305324
borderRadius:
306325
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+
],
308334
onPressed: (index) => manager
309335
.updateToggleButtonsOnButtonPressed(index),
310336
children: const [

simplistic_editor/lib/toggle_button_state_manager.dart renamed to simplistic_editor/lib/toggle_buttons_state_manager.dart

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,18 @@ typedef UpdateToggleButtonsStateOnSelectionChangedCallback = void Function(
1010
typedef UpdateToggleButtonsStateOnButtonPressedCallback = void Function(
1111
int index);
1212

13+
/// The toggle buttons that can be selected.
14+
enum ToggleButtonsState {
15+
bold,
16+
italic,
17+
underline,
18+
}
19+
1320
class ToggleButtonsStateManager extends InheritedWidget {
1421
const ToggleButtonsStateManager({
1522
super.key,
1623
required super.child,
17-
required List<bool> isToggleButtonsSelected,
24+
required Set<ToggleButtonsState> isToggleButtonsSelected,
1825
required UpdateToggleButtonsStateOnButtonPressedCallback
1926
updateToggleButtonsStateOnButtonPressed,
2027
required UpdateToggleButtonsStateOnSelectionChangedCallback
@@ -32,13 +39,13 @@ class ToggleButtonsStateManager extends InheritedWidget {
3239
return result!;
3340
}
3441

35-
final List<bool> _isToggleButtonsSelected;
42+
final Set<ToggleButtonsState> _isToggleButtonsSelected;
3643
final UpdateToggleButtonsStateOnButtonPressedCallback
3744
_updateToggleButtonsStateOnButtonPressed;
3845
final UpdateToggleButtonsStateOnSelectionChangedCallback
3946
_updateToggleButtonStateOnSelectionChanged;
4047

41-
List<bool> get toggleButtonsState => _isToggleButtonsSelected;
48+
Set<ToggleButtonsState> get toggleButtonsState => _isToggleButtonsSelected;
4249
UpdateToggleButtonsStateOnButtonPressedCallback
4350
get updateToggleButtonsOnButtonPressed =>
4451
_updateToggleButtonsStateOnButtonPressed;

0 commit comments

Comments
 (0)