Skip to content

Commit 3dcb0b0

Browse files
committed
feat: add converters for LogicalKeyboardKey and SingleActivator serialization
1 parent b2c3968 commit 3dcb0b0

File tree

4 files changed

+125
-101
lines changed

4 files changed

+125
-101
lines changed

packages/dogs_flutter/lib/converters/various.dart

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import 'dart:ui';
22

33
import 'package:dogs_core/dogs_core.dart';
4+
import 'package:flutter/material.dart';
5+
import 'package:flutter/services.dart';
46

57
@linkSerializer
68
class FlutterColorConverter extends SimpleDogConverter<Color> {
@@ -52,3 +54,80 @@ class FlutterColorConverter extends SimpleDogConverter<Color> {
5254
return "#${color.toARGB32().toRadixString(16).toUpperCase().padLeft(8, "0")}";
5355
}
5456
}
57+
58+
@linkSerializer
59+
class FlutterLogicalKeyConverter extends SimpleDogConverter<LogicalKeyboardKey> {
60+
FlutterLogicalKeyConverter() : super(serialName: "FLLogicalKey");
61+
62+
@override
63+
LogicalKeyboardKey deserialize(value, DogEngine engine) {
64+
if (value is Map) {
65+
var keyId = value["id"];
66+
var keyLabel = value["label"];
67+
var resolved = LogicalKeyboardKey.findKeyByKeyId(keyId);
68+
if (resolved != null && resolved.keyLabel == keyLabel) {
69+
return resolved;
70+
}
71+
}
72+
throw DogSerializerException(
73+
message: "Invalid logical key value",
74+
converter: this,
75+
);
76+
}
77+
78+
@override
79+
serialize(LogicalKeyboardKey value, DogEngine engine) {
80+
return {
81+
"id": value.keyId,
82+
"label": value.keyLabel,
83+
};
84+
}
85+
}
86+
87+
@linkSerializer
88+
class FlutterSingleActivatorConverter
89+
extends SimpleDogConverter<SingleActivator> {
90+
FlutterSingleActivatorConverter() : super(serialName: "FLSingleActivator");
91+
92+
@override
93+
SingleActivator deserialize(value, DogEngine engine) {
94+
if (value is Map) {
95+
var key = value["k"];
96+
var control = value["c"] ?? false;
97+
var shift = value["s"] ?? false;
98+
var alt = value["a"] ?? false;
99+
var meta = value["m"] ?? false;
100+
var repeats = value["r"] ?? false;
101+
var numLock = value["n"] ?? 0;
102+
103+
if (key is Map) {
104+
return SingleActivator(
105+
dogs.fromNative<LogicalKeyboardKey>(key),
106+
control: control == true,
107+
shift: shift == true,
108+
alt: alt == true,
109+
meta: meta == true,
110+
numLock: LockState.values[numLock as int],
111+
includeRepeats: repeats == true,
112+
);
113+
}
114+
}
115+
throw DogSerializerException(
116+
message: "Invalid single activator value",
117+
converter: this,
118+
);
119+
}
120+
121+
@override
122+
serialize(SingleActivator value, DogEngine engine) {
123+
return {
124+
"k": engine.toNative<LogicalKeyboardKey>(value.trigger),
125+
"c": value.control,
126+
"s": value.shift,
127+
"a": value.alt,
128+
"m": value.meta,
129+
"r": value.includeRepeats,
130+
"n": value.numLock.index
131+
};
132+
}
133+
}

packages/dogs_flutter/lib/databinding/style.conv.g.dart

Lines changed: 19 additions & 97 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/dogs_flutter/lib/dogs.g.dart

Lines changed: 5 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/dogs_flutter/test/dogs_flutter_test.dart

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import 'package:dogs_flutter/dogs_flutter.dart';
2+
import 'package:flutter/material.dart';
23
import 'package:flutter/painting.dart';
4+
import 'package:flutter/services.dart';
35
import 'package:flutter_test/flutter_test.dart';
46

57
void main() {
@@ -66,5 +68,25 @@ void main() {
6668
final decoded = dogs.fromJson<Color>(encoded);
6769
expect(decoded, color);
6870
});
71+
72+
test("Serialize Logical Key", () {
73+
final key = LogicalKeyboardKey.keyA;
74+
final encoded = dogs.toJson<LogicalKeyboardKey>(key);
75+
final decoded = dogs.fromJson<LogicalKeyboardKey>(encoded);
76+
expect(decoded, key);
77+
});
78+
79+
test("Serialize Single Activator", () {
80+
var activator = SingleActivator(LogicalKeyboardKey.keyA, control: true, shift: true);
81+
final encoded = dogs.toJson<SingleActivator>(activator);
82+
final decoded = dogs.fromJson<SingleActivator>(encoded);
83+
expect(decoded.trigger, activator.trigger);
84+
expect(decoded.control, activator.control);
85+
expect(decoded.shift, activator.shift);
86+
expect(decoded.alt, activator.alt);
87+
expect(decoded.meta, activator.meta);
88+
expect(decoded.includeRepeats, activator.includeRepeats);
89+
expect(decoded.numLock, activator.numLock);
90+
});
6991
});
7092
}

0 commit comments

Comments
 (0)