Making ToggleButtonState more obvious (#1286)

pull/1289/head
Brett Morgan 2 years ago committed by GitHub
parent 117dac0c49
commit 4bb91df627
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -7,7 +7,7 @@ import 'package:flutter/services.dart';
import 'replacements.dart';
import 'text_editing_delta_history_manager.dart';
import 'toggle_button_state_manager.dart';
import 'toggle_buttons_state_manager.dart';
/// Signature for the callback that reports when the user changes the selection
/// (including the cursor location).

@ -4,7 +4,7 @@ import 'package:flutter/services.dart';
import 'basic_text_field.dart';
import 'replacements.dart';
import 'text_editing_delta_history_manager.dart';
import 'toggle_button_state_manager.dart';
import 'toggle_buttons_state_manager.dart';
void main() {
runApp(const MyApp());
@ -42,7 +42,7 @@ class _MyHomePageState extends State<MyHomePage> {
text: 'The quick brown fox jumps over the lazy dog.',
);
final FocusNode _focusNode = FocusNode();
final List<bool> _isSelected = [false, false, false];
final Set<ToggleButtonsState> _isSelected = {};
final List<TextEditingDelta> _textEditingDeltaHistory = [];
void _updateTextEditingDeltaHistory(
@ -115,43 +115,55 @@ class _MyHomePageState extends State<MyHomePage> {
// at the new selection.
final List<TextStyle> replacementStyles =
_replacementTextEditingController.getReplacementsAtSelection(selection);
final List<bool> hasChanged = [false, false, false];
final Set<ToggleButtonsState> hasChanged = {};
if (replacementStyles.isEmpty) {
_isSelected.fillRange(0, _isSelected.length, false);
_isSelected.removeAll({
ToggleButtonsState.bold,
ToggleButtonsState.italic,
ToggleButtonsState.underline
});
}
for (final TextStyle style in replacementStyles) {
if (style.fontWeight != null && !hasChanged[0]) {
_isSelected[0] = true;
hasChanged[0] = true;
// See [_updateToggleButtonsStateOnButtonPressed] for how
// Bold, Italic and Underline are encoded into [style]
if (style.fontWeight != null &&
!hasChanged.contains(ToggleButtonsState.bold)) {
_isSelected.add(ToggleButtonsState.bold);
hasChanged.add(ToggleButtonsState.bold);
}
if (style.fontStyle != null && !hasChanged[1]) {
_isSelected[1] = true;
hasChanged[1] = true;
if (style.fontStyle != null &&
!hasChanged.contains(ToggleButtonsState.italic)) {
_isSelected.add(ToggleButtonsState.italic);
hasChanged.add(ToggleButtonsState.italic);
}
if (style.decoration != null && !hasChanged[2]) {
_isSelected[2] = true;
hasChanged[2] = true;
if (style.decoration != null &&
!hasChanged.contains(ToggleButtonsState.underline)) {
_isSelected.add(ToggleButtonsState.underline);
hasChanged.add(ToggleButtonsState.underline);
}
}
for (final TextStyle style in replacementStyles) {
if (style.fontWeight == null && !hasChanged[0]) {
_isSelected[0] = false;
hasChanged[0] = true;
if (style.fontWeight == null &&
!hasChanged.contains(ToggleButtonsState.bold)) {
_isSelected.remove(ToggleButtonsState.bold);
hasChanged.add(ToggleButtonsState.bold);
}
if (style.fontStyle == null && !hasChanged[1]) {
_isSelected[1] = false;
hasChanged[1] = true;
if (style.fontStyle == null &&
!hasChanged.contains(ToggleButtonsState.italic)) {
_isSelected.remove(ToggleButtonsState.italic);
hasChanged.add(ToggleButtonsState.italic);
}
if (style.decoration == null && !hasChanged[2]) {
_isSelected[2] = false;
hasChanged[2] = true;
if (style.decoration == null &&
!hasChanged.contains(ToggleButtonsState.underline)) {
_isSelected.remove(ToggleButtonsState.underline);
hasChanged.add(ToggleButtonsState.underline);
}
}
@ -170,8 +182,15 @@ class _MyHomePageState extends State<MyHomePage> {
end: _replacementTextEditingController.selection.end,
);
_isSelected[index] = !_isSelected[index];
if (_isSelected[index]) {
final targetToggleButtonState = ToggleButtonsState.values[index];
if (_isSelected.contains(targetToggleButtonState)) {
_isSelected.remove(targetToggleButtonState);
} else {
_isSelected.add(targetToggleButtonState);
}
if (_isSelected.contains(targetToggleButtonState)) {
_replacementTextEditingController.applyReplacement(
TextEditingInlineSpanReplacement(
replacementRange,
@ -304,7 +323,14 @@ class _MyHomePageState extends State<MyHomePage> {
return ToggleButtons(
borderRadius:
const BorderRadius.all(Radius.circular(4.0)),
isSelected: manager.toggleButtonsState,
isSelected: [
manager.toggleButtonsState
.contains(ToggleButtonsState.bold),
manager.toggleButtonsState
.contains(ToggleButtonsState.italic),
manager.toggleButtonsState
.contains(ToggleButtonsState.underline),
],
onPressed: (index) => manager
.updateToggleButtonsOnButtonPressed(index),
children: const [

@ -10,11 +10,18 @@ typedef UpdateToggleButtonsStateOnSelectionChangedCallback = void Function(
typedef UpdateToggleButtonsStateOnButtonPressedCallback = void Function(
int index);
/// The toggle buttons that can be selected.
enum ToggleButtonsState {
bold,
italic,
underline,
}
class ToggleButtonsStateManager extends InheritedWidget {
const ToggleButtonsStateManager({
super.key,
required super.child,
required List<bool> isToggleButtonsSelected,
required Set<ToggleButtonsState> isToggleButtonsSelected,
required UpdateToggleButtonsStateOnButtonPressedCallback
updateToggleButtonsStateOnButtonPressed,
required UpdateToggleButtonsStateOnSelectionChangedCallback
@ -32,13 +39,13 @@ class ToggleButtonsStateManager extends InheritedWidget {
return result!;
}
final List<bool> _isToggleButtonsSelected;
final Set<ToggleButtonsState> _isToggleButtonsSelected;
final UpdateToggleButtonsStateOnButtonPressedCallback
_updateToggleButtonsStateOnButtonPressed;
final UpdateToggleButtonsStateOnSelectionChangedCallback
_updateToggleButtonStateOnSelectionChanged;
List<bool> get toggleButtonsState => _isToggleButtonsSelected;
Set<ToggleButtonsState> get toggleButtonsState => _isToggleButtonsSelected;
UpdateToggleButtonsStateOnButtonPressedCallback
get updateToggleButtonsOnButtonPressed =>
_updateToggleButtonsStateOnButtonPressed;
Loading…
Cancel
Save