wip: sort gesture props when edit end.
This commit is contained in:
@@ -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')),
|
||||||
|
|||||||
Reference in New Issue
Block a user