Skip to content

Commit 0383e90

Browse files
committed
fix: crash when change fingers or gesture type of a gesture prop.
1 parent 0fe0ed1 commit 0383e90

2 files changed

Lines changed: 38 additions & 22 deletions

File tree

app/lib/models/scheme.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,9 +159,9 @@ class Scheme {
159159
this.name = LocaleKeys.str_new_scheme.tr();
160160
}
161161

162-
SchemeTree buildSchemeTree() {
162+
SchemeTree buildSchemeTree({String? availableGestureId}) {
163163
var schemeTree = SchemeTree();
164-
this.gestures!.forEach((gesture) {
164+
this.gestures!.where((e) => e.id != availableGestureId).forEach((gesture) {
165165
var schemeTreeNode = schemeTree.nodes.firstWhere((ele) => ele.fingers == gesture.fingers);
166166
var schemeGestureNode = schemeTreeNode.nodes.firstWhere((element) => element.type == gesture.gesture);
167167
schemeGestureNode.nodes.firstWhere((element) => element.direction == gesture.direction).available = false;

app/lib/pages/gesture_editor.dart

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -446,20 +446,13 @@ void saveGesturesToLocal(BuildContext context, SchemeProvider schemeProvider, Li
446446

447447
List<DDataCell> _buildRowCellsEditing(BuildContext context) {
448448
var gesture = context.read<GesturePropProvider>();
449-
var schemeTree = context.read<SchemeProvider>().buildSchemeTree();
449+
var schemeTree = context.read<SchemeProvider>().buildSchemeTree(availableGestureId: gesture.id);
450450
var availableFingers = schemeTree.nodes.where((node) => !node.fullFiled).map((e) => e.fingers);
451-
if (!availableFingers.contains(gesture.fingers)) {
452-
availableFingers = [...availableFingers, gesture.fingers!]..sort();
453-
}
454-
455451
var availableGestures = schemeTree.nodes
456452
.firstWhere((node) => node.fingers == gesture.fingers)
457453
.nodes
458454
.where((node) => !node.fullFiled)
459455
.map((e) => e.type);
460-
if (!availableGestures.any((type) => type == gesture.gesture)) {
461-
availableGestures = [...availableGestures, gesture.gesture!]..sort((a, b) => a.index - b.index);
462-
}
463456

464457
var availableDirection = schemeTree.nodes
465458
.firstWhere((node) => node.fingers == gesture.fingers)
@@ -469,10 +462,6 @@ List<DDataCell> _buildRowCellsEditing(BuildContext context) {
469462
.where((node) => !node.fullFiled)
470463
.map((e) => e.direction);
471464

472-
if (!availableDirection.any((direction) => direction == gesture.direction)) {
473-
availableDirection = [...availableDirection, gesture.direction!]..sort((a, b) => a.index - b.index);
474-
}
475-
476465
return [
477466
DButton.dropdown(
478467
enabled: true,
@@ -487,10 +476,28 @@ List<DDataCell> _buildRowCellsEditing(BuildContext context) {
487476
)
488477
.toList(),
489478
value: gesture.fingers,
490-
onChanged: (value) => context.read<GesturePropProvider>().setProps(
491-
fingers: value,
492-
editMode: true,
493-
),
479+
onChanged: (value) {
480+
var gesturePropProvider = context.read<GesturePropProvider>();
481+
Gesture? newGestureType;
482+
GestureDirection? newDirection;
483+
if (!schemeTree.nodes
484+
.firstWhere((e) => e.fingers == value)
485+
.nodes
486+
.firstWhere((e) => e.type == gesturePropProvider.gesture)
487+
.nodes
488+
.firstWhere((e) => e.direction == gesturePropProvider.direction)
489+
.available) {
490+
var availableNode = schemeTree.nodes.firstWhere((e) => e.fingers == value).availableNode;
491+
newGestureType = availableNode.type;
492+
newDirection = availableNode.availableNode.direction;
493+
}
494+
gesturePropProvider.setProps(
495+
fingers: value,
496+
gesture: newGestureType ?? gesturePropProvider.gesture,
497+
direction: newDirection ?? gesturePropProvider.direction,
498+
editMode: true,
499+
);
500+
},
494501
isExpanded: true,
495502
),
496503
),
@@ -511,10 +518,19 @@ List<DDataCell> _buildRowCellsEditing(BuildContext context) {
511518
)
512519
.toList(),
513520
value: gesture.gesture,
514-
onChanged: (value) => context.read<GesturePropProvider>().setProps(
515-
gesture: value,
516-
editMode: true,
517-
),
521+
onChanged: (value) {
522+
var gesturePropProvider = context.read<GesturePropProvider>();
523+
gesturePropProvider.setProps(
524+
gesture: value,
525+
direction: schemeTree.nodes
526+
.firstWhere((node) => node.fingers == gesture.fingers)
527+
.nodes
528+
.firstWhere((node) => node.type == value)
529+
.availableNode
530+
.direction,
531+
editMode: true,
532+
);
533+
},
518534
isExpanded: true,
519535
),
520536
),

0 commit comments

Comments
 (0)