wip: sort gesture props when edit end.

pull/3/head
DebuggerX 4 years ago
parent 76b6c14553
commit 2484367337

@ -2,10 +2,12 @@ import 'dart:convert';
import 'package:dde_gesture_manager/builder/provider_annotation.dart'; import 'package:dde_gesture_manager/builder/provider_annotation.dart';
import 'package:dde_gesture_manager/extensions.dart'; import 'package:dde_gesture_manager/extensions.dart';
import 'package:dde_gesture_manager/extensions/compare_extension.dart';
import 'package:dde_gesture_manager/utils/helper.dart'; import 'package:dde_gesture_manager/utils/helper.dart';
import 'package:flutter/material.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';
typedef OnEditEnd(GestureProp prop);
@ProviderModel(copyable: true) @ProviderModel(copyable: true)
class Scheme { class Scheme {
@ProviderModelProp() @ProviderModelProp()
@ -26,7 +28,7 @@ class Scheme {
id = scheme['id']; id = scheme['id'];
name = scheme['name']; name = scheme['name'];
description = scheme['desc']; description = scheme['desc'];
gestures = (scheme['gestures'] as List? ?? []).map<GestureProp>((ele) => GestureProp.parse(ele)).toList(); gestures = (scheme['gestures'] as List? ?? []).map<GestureProp>((ele) => GestureProp.parse(ele)).toList()..sort();
} }
Scheme.systemDefault() { Scheme.systemDefault() {
@ -42,8 +44,8 @@ class Scheme {
} }
enum Gesture { enum Gesture {
swipe,
tap, tap,
swipe,
pinch, pinch,
} }
@ -64,7 +66,7 @@ enum GestureType {
} }
@ProviderModel(copyable: true) @ProviderModel(copyable: true)
class GestureProp { class GestureProp implements Comparable {
@ProviderModelProp() @ProviderModelProp()
String? id; String? id;
@ -87,14 +89,14 @@ class GestureProp {
String? remark; String? remark;
@ProviderModelProp() @ProviderModelProp()
bool get editMode => _editMode; bool? get editMode => _editMode;
set editMode(bool val) { set editMode(bool? val) {
_editMode = val; _editMode = val ?? false;
if (val == false) onEditEnd?.call(); if (val == false) onEditEnd?.call(this);
} }
VoidCallback? onEditEnd; OnEditEnd? onEditEnd;
bool _editMode = false; bool _editMode = false;
@ -119,4 +121,24 @@ class GestureProp {
command = props['command']; command = props['command'];
remark = props['remark']; remark = props['remark'];
} }
copyFrom(GestureProp prop) {
this.id = prop.id;
this.gesture = prop.gesture;
this.direction = prop.direction;
this.fingers = prop.fingers;
this.type = prop.type;
this.command = prop.command;
this.remark = prop.remark;
}
@override
int compareTo(other) {
assert(other is GestureProp);
if (fingers.diff(other.fingers) && other.fingers != null) return fingers! - other.fingers as int;
if (gesture.diff(other.gesture) && other.gesture != null) return gesture!.index - other.gesture!.index as int;
if (direction.diff(other.direction) && other.direction != null)
return direction!.index - other.direction!.index as int;
return 0;
}
} }

@ -74,7 +74,7 @@ class GestureEditor extends StatelessWidget {
Expanded( Expanded(
child: GestureDetector( child: GestureDetector(
onTap: () { onTap: () {
context.read<GesturePropProvider>().copyFrom(GestureProp.empty()); context.read<GesturePropProvider>().setProps(editMode: false);
}, },
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
@ -175,28 +175,53 @@ List<DDataRow> _buildDataRows(List<GestureProp>? gestures, BuildContext context)
bool selected = gesturePropProvider == gesture && !editing; bool selected = gesturePropProvider == gesture && !editing;
return DDataRow( return DDataRow(
onSelectChanged: (selected) { onSelectChanged: (selected) {
if (selected == true) var provider = context.read<GesturePropProvider>();
context.read<GesturePropProvider>().setProps( if (selected == true) {
id: gesture.id, provider.setProps(
editMode: false, editMode: false,
); );
else if (selected == false) { Future.microtask(() => provider.setProps(
var provider = context.read<GesturePropProvider>(); id: gesture.id,
provider.onEditEnd = () { ));
/// todo: resort rows && check where changed } else if (selected == false) {
provider.onEditEnd = (prop) {
var schemeProvider = context.read<SchemeProvider>();
var newGestures = List<GestureProp>.of(schemeProvider.gestures!);
var index = newGestures.indexWhere((element) => element == prop);
newGestures[index].copyFrom(prop);
context.read<SchemeProvider>().setProps(
gestures: newGestures..sort(),
);
}; };
provider.setProps( provider.copyFrom(
editMode: true, gesture..editMode = true,
); );
} }
}, },
selected: selected, selected: selected,
cells: editing ? _buildRowCellsEditing(gesture) : _buildRowCellsNormal(context, selected, gesture), cells: editing ? _buildRowCellsEditing(context, gesture) : _buildRowCellsNormal(context, selected, gesture),
); );
}).toList(); }).toList();
List<DDataCell> _buildRowCellsEditing(GestureProp gesture) => [ List<DDataCell> _buildRowCellsEditing(BuildContext context, GestureProp gesture) => [
Center(child: Text('1')), Container(
decoration: BoxDecoration(
color: Colors.lightBlue,
),
child: DropdownButton<int>(
items: [3, 4, 5]
.map(
(e) => DropdownMenuItem<int>(
child: Text('$e'),
value: e,
),
)
.toList(),
value: context.watch<GesturePropProvider>().fingers,
onChanged: (value) => context.read<GesturePropProvider>().setProps(fingers: value, editMode: true),
isExpanded: true,
),
),
Center(child: Text('2')), Center(child: Text('2')),
Center(child: Text('3')), Center(child: Text('3')),
Center(child: Text('4')), Center(child: Text('4')),

Loading…
Cancel
Save