mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-17 07:14:28 +01:00
opt.: more virtual keys (#596)
This commit is contained in:
@@ -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 }
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user