opt.: more virtual keys (#596)

This commit is contained in:
lollipopkit🏳️‍⚧️
2024-09-28 14:40:22 +08:00
committed by GitHub
parent 02444fc2f0
commit 3b6fb6194b
4 changed files with 201 additions and 102 deletions

View File

@@ -5,6 +5,8 @@ import 'package:xterm/core.dart';
part 'virtual_key.g.dart'; part 'virtual_key.g.dart';
enum VirtualKeyFunc { toggleIME, backspace, clipboard, snippet, file }
@HiveType(typeId: 4) @HiveType(typeId: 4)
enum VirtKey { enum VirtKey {
@HiveField(0) @HiveField(0)
@@ -38,23 +40,80 @@ enum VirtKey {
@HiveField(14) @HiveField(14)
pgup, pgup,
@HiveField(15) @HiveField(15)
pgdn; pgdn,
@HiveField(16)
slash,
@HiveField(17)
backSlash,
@HiveField(18)
underscore,
@HiveField(19)
plus,
@HiveField(20)
equal,
@HiveField(21)
minus,
@HiveField(22)
parenLeft,
@HiveField(23)
parenRight,
@HiveField(24)
bracketLeft,
@HiveField(25)
bracketRight,
@HiveField(26)
braceLeft,
@HiveField(27)
braceRight,
@HiveField(28)
chevronLeft,
@HiveField(29)
chevronRight,
@HiveField(30)
colon,
@HiveField(31)
semicolon,
;
}
extension VirtKeyX on VirtKey {
/// Used for input to terminal
String? get inputRaw => switch (this) {
VirtKey.slash => '/',
VirtKey.backSlash => '\\',
VirtKey.underscore => '_',
VirtKey.plus => '+',
VirtKey.equal => '=',
VirtKey.minus => '-',
VirtKey.parenLeft => '(',
VirtKey.parenRight => ')',
VirtKey.bracketLeft => '[',
VirtKey.bracketRight => ']',
VirtKey.braceLeft => '{',
VirtKey.braceRight => '}',
VirtKey.chevronLeft => '<',
VirtKey.chevronRight => '>',
VirtKey.colon => ':',
VirtKey.semicolon => ';',
_ => null,
};
/// Used for displaying on UI
String get text { String get text {
switch (this) { final t = inputRaw;
case VirtKey.pgdn: if (t != null) return t;
return 'PgDn';
case VirtKey.pgup: if (this == VirtKey.pgdn) return 'PgDn';
return 'PgUp'; if (this == VirtKey.pgup) return 'PgUp';
default:
if (name.length > 1) { if (name.length > 1) {
return name.substring(0, 1).toUpperCase() + name.substring(1); return name.substring(0, 1).toUpperCase() + name.substring(1);
} }
return name; return name;
} }
}
static final defaultOrder = [ /// Default order of virtual keys
static const defaultOrder = [
VirtKey.esc, VirtKey.esc,
VirtKey.alt, VirtKey.alt,
VirtKey.home, VirtKey.home,
@@ -71,99 +130,56 @@ enum VirtKey {
VirtKey.ime, VirtKey.ime,
]; ];
TerminalKey? get key { /// Corresponding [TerminalKey]
switch (this) { TerminalKey? get key => switch (this) {
case VirtKey.esc: VirtKey.esc => TerminalKey.escape,
return TerminalKey.escape; VirtKey.alt => TerminalKey.alt,
case VirtKey.alt: VirtKey.home => TerminalKey.home,
return TerminalKey.alt; VirtKey.up => TerminalKey.arrowUp,
case VirtKey.home: VirtKey.end => TerminalKey.end,
return TerminalKey.home; VirtKey.tab => TerminalKey.tab,
case VirtKey.up: VirtKey.ctrl => TerminalKey.control,
return TerminalKey.arrowUp; VirtKey.left => TerminalKey.arrowLeft,
case VirtKey.end: VirtKey.down => TerminalKey.arrowDown,
return TerminalKey.end; VirtKey.right => TerminalKey.arrowRight,
case VirtKey.tab: VirtKey.pgup => TerminalKey.pageUp,
return TerminalKey.tab; VirtKey.pgdn => TerminalKey.pageDown,
case VirtKey.ctrl: _ => null,
return TerminalKey.control; };
case VirtKey.left:
return TerminalKey.arrowLeft;
case VirtKey.down:
return TerminalKey.arrowDown;
case VirtKey.right:
return TerminalKey.arrowRight;
case VirtKey.pgup:
return TerminalKey.pageUp;
case VirtKey.pgdn:
return TerminalKey.pageDown;
default:
return null;
}
}
IconData? get icon { /// Icons for virtual keys
switch (this) { IconData? get icon => switch (this) {
case VirtKey.up: VirtKey.up => Icons.arrow_upward,
return Icons.arrow_upward; VirtKey.left => Icons.arrow_back,
case VirtKey.left: VirtKey.down => Icons.arrow_downward,
return Icons.arrow_back; VirtKey.right => Icons.arrow_forward,
case VirtKey.down: VirtKey.sftp => Icons.file_open,
return Icons.arrow_downward; VirtKey.snippet => Icons.code,
case VirtKey.right: VirtKey.clipboard => Icons.paste,
return Icons.arrow_forward; VirtKey.ime => Icons.keyboard,
case VirtKey.sftp: _ => null,
return Icons.file_open; };
case VirtKey.snippet:
return Icons.code;
case VirtKey.clipboard:
return Icons.paste;
case VirtKey.ime:
return Icons.keyboard;
default:
return null;
}
}
// Use [VirtualKeyFunc] instead of [VirtKey] // Use [VirtualKeyFunc] instead of [VirtKey]
// This can help linter to enum all [VirtualKeyFunc] // This can help linter to enum all [VirtualKeyFunc]
// and make sure all [VirtualKeyFunc] are handled // and make sure all [VirtualKeyFunc] are handled
VirtualKeyFunc? get func { VirtualKeyFunc? get func => switch (this) {
switch (this) { VirtKey.sftp => VirtualKeyFunc.file,
case VirtKey.sftp: VirtKey.snippet => VirtualKeyFunc.snippet,
return VirtualKeyFunc.file; VirtKey.clipboard => VirtualKeyFunc.clipboard,
case VirtKey.snippet: VirtKey.ime => VirtualKeyFunc.toggleIME,
return VirtualKeyFunc.snippet; _ => null,
case VirtKey.clipboard: };
return VirtualKeyFunc.clipboard;
case VirtKey.ime:
return VirtualKeyFunc.toggleIME;
default:
return null;
}
}
bool get toggleable { bool get toggleable => switch (this) {
switch (this) { VirtKey.alt || VirtKey.ctrl => true,
case VirtKey.alt: _ => false,
case VirtKey.ctrl: };
return true;
default:
return false;
}
}
bool get canLongPress { bool get canLongPress => switch (this) {
switch (this) { VirtKey.up || VirtKey.left || VirtKey.down || VirtKey.right => true,
case VirtKey.up: _ => false,
case VirtKey.left: };
case VirtKey.down:
case VirtKey.right:
return true;
default:
return false;
}
}
String? get help => switch (this) { String? get help => switch (this) {
VirtKey.sftp => l10n.virtKeyHelpSFTP, VirtKey.sftp => l10n.virtKeyHelpSFTP,
@@ -172,5 +188,3 @@ enum VirtKey {
_ => null, _ => null,
}; };
} }
enum VirtualKeyFunc { toggleIME, backspace, clipboard, snippet, file }

View File

@@ -45,6 +45,38 @@ class VirtKeyAdapter extends TypeAdapter<VirtKey> {
return VirtKey.pgup; return VirtKey.pgup;
case 15: case 15:
return VirtKey.pgdn; return VirtKey.pgdn;
case 16:
return VirtKey.slash;
case 17:
return VirtKey.backSlash;
case 18:
return VirtKey.underscore;
case 19:
return VirtKey.plus;
case 20:
return VirtKey.equal;
case 21:
return VirtKey.minus;
case 22:
return VirtKey.parenLeft;
case 23:
return VirtKey.parenRight;
case 24:
return VirtKey.bracketLeft;
case 25:
return VirtKey.bracketRight;
case 26:
return VirtKey.braceLeft;
case 27:
return VirtKey.braceRight;
case 28:
return VirtKey.chevronLeft;
case 29:
return VirtKey.chevronRight;
case 30:
return VirtKey.colon;
case 31:
return VirtKey.semicolon;
default: default:
return VirtKey.esc; return VirtKey.esc;
} }
@@ -101,6 +133,54 @@ class VirtKeyAdapter extends TypeAdapter<VirtKey> {
case VirtKey.pgdn: case VirtKey.pgdn:
writer.writeByte(15); writer.writeByte(15);
break; break;
case VirtKey.slash:
writer.writeByte(16);
break;
case VirtKey.backSlash:
writer.writeByte(17);
break;
case VirtKey.underscore:
writer.writeByte(18);
break;
case VirtKey.plus:
writer.writeByte(19);
break;
case VirtKey.equal:
writer.writeByte(20);
break;
case VirtKey.minus:
writer.writeByte(21);
break;
case VirtKey.parenLeft:
writer.writeByte(22);
break;
case VirtKey.parenRight:
writer.writeByte(23);
break;
case VirtKey.bracketLeft:
writer.writeByte(24);
break;
case VirtKey.bracketRight:
writer.writeByte(25);
break;
case VirtKey.braceLeft:
writer.writeByte(26);
break;
case VirtKey.braceRight:
writer.writeByte(27);
break;
case VirtKey.chevronLeft:
writer.writeByte(28);
break;
case VirtKey.chevronRight:
writer.writeByte(29);
break;
case VirtKey.colon:
writer.writeByte(30);
break;
case VirtKey.semicolon:
writer.writeByte(31);
break;
} }
} }

View File

@@ -106,7 +106,7 @@ class SettingStore extends PersistentStore {
late final sshVirtKeys = listProperty( late final sshVirtKeys = listProperty(
'sshVirtKeys', 'sshVirtKeys',
VirtKey.defaultOrder.map((e) => e.index).toList(), VirtKeyX.defaultOrder.map((e) => e.index).toList(),
); );
late final netViewType = property('netViewType', NetViewType.speed); late final netViewType = property('netViewType', NetViewType.speed);

View File

@@ -213,7 +213,7 @@ class SSHPageState extends State<SSHPage>
); );
} }
final rows = _virtKeysList final rows = _virtKeysList
.map((e) => Row(children: e.map((f) => _buildVirtKeyItem(f)).toList())) .map((e) => Row(children: e.map(_buildVirtKeyItem).toList()))
.toList(); .toList();
return Column( return Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
@@ -280,6 +280,11 @@ class SSHPageState extends State<SSHPage>
HapticFeedback.mediumImpact(); HapticFeedback.mediumImpact();
_doVirtualKeyInput(item.key!); _doVirtualKeyInput(item.key!);
} }
final inputRaw = item.inputRaw;
if (inputRaw != null) {
HapticFeedback.mediumImpact();
_terminal.textInput(inputRaw);
}
} }
void _doVirtualKeyInput(TerminalKey key) { void _doVirtualKeyInput(TerminalKey key) {