Objavljen izvor
Preuzmi ZIP izvora
CH-J SM Mobile
Pregledaj direktorije i datoteke za određeni programski izdanje.
CH-J / SM Mobile
134 datoteke
sm-mobile-20261016T050549Z-3678f2a05fa9
Dodano: · Izgrađeno:
1
import 'package:flutter/material.dart';2
import 'package:flutter/services.dart';3
import 'package:xterm/xterm.dart';4
import '../core/app_controller.dart';5
import '../l10n/strings.dart';6
import 'common.dart';8
class TerminalPage extends StatefulWidget {9
final AppController controller;10
const TerminalPage(this.controller, {super.key});11
@override12
State<TerminalPage> createState() => _TerminalPageState();13
}15
class _TerminalPageState extends State<TerminalPage> {16
final selection = TerminalController();17
final focus = FocusNode();18
bool ctrl = false, alt = false;19
@override20
void dispose() {21
selection.dispose();22
focus.dispose();23
super.dispose();24
}26
@override27
Widget build(BuildContext context) {28
final c = widget.controller;29
if (!c.ssh.connected) {30
return const PageMessage('selectServer', icon: Icons.terminal);31
}32
final terminal = c.ssh.terminal;33
return Column(34
children: [35
Expanded(36
child: Focus(37
onKeyEvent: (_, _) {38
c.activity();39
return KeyEventResult.ignored;40
},41
child: TerminalView(42
terminal,43
controller: selection,44
focusNode: focus,45
textStyle: TerminalStyle(46
fontSize: 14 * MediaQuery.textScalerOf(context).scale(1),47
),48
onKeyEvent: (_, key) {49
c.activity();50
return KeyEventResult.ignored;51
},52
),53
),54
),55
SingleChildScrollView(56
scrollDirection: Axis.horizontal,57
child: Row(58
children: [59
for (final entry in {60
'ESC': TerminalKey.escape,61
'TAB': TerminalKey.tab,62
'↑': TerminalKey.arrowUp,63
'↓': TerminalKey.arrowDown,64
'←': TerminalKey.arrowLeft,65
'→': TerminalKey.arrowRight,66
}.entries)67
TextButton(68
onPressed: () {69
c.activity();70
terminal.keyInput(entry.value);71
},72
child: Text(entry.key),73
),74
FilterChip(75
label: const Text('CTRL'),76
selected: c.ssh.ctrlNext,77
onSelected: (v) => setState(() => c.ssh.ctrlNext = v),78
),79
const SizedBox(width: 6),80
FilterChip(81
label: const Text('ALT'),82
selected: c.ssh.altNext,83
onSelected: (v) => setState(() => c.ssh.altNext = v),84
),85
IconButton(86
tooltip: context.tr('keyboard'),87
icon: const Icon(Icons.keyboard),88
onPressed: () => focus.requestFocus(),89
),90
IconButton(91
tooltip: context.tr('copy'),92
icon: const Icon(Icons.copy),93
onPressed: () {94
if (selection.selection != null) {95
Clipboard.setData(96
ClipboardData(97
text: terminal.buffer.getText(selection.selection),98
),99
);100
}101
},102
),103
IconButton(104
tooltip: context.tr('paste'),105
icon: const Icon(Icons.paste),106
onPressed: () async {107
final data = await Clipboard.getData(Clipboard.kTextPlain);108
if (c.ssh.connected &&109
c.vault.unlocked &&110
data?.text != null) {111
terminal.paste(data!.text!);112
}113
},114
),115
],116
),117
),118
],119
);120
}121
}SHA-256
e5fe68d4dc7308e64d1571a74eadcd118f949e7a031b4241e7783a673e0c1e99CH-J Proprietary Software License 1.14 · Izvor je osiguran pod CH-J Proprietary Software License 1.14. Njena dostupnost ne mijenja uvjete licenciranja niti daje dodatna prava.
Arhiv SHA-256
c486a807e4828998b9c57ab0f2e760f7980b31965fe118e89d3e1a5a2b65be65