CH-J SM Mobileуправление на сървъри над SSH
Меню
Публикуван източник

CH-J SM Mobile

Преглед на директории и файлове за конкретна версия на приложението.

Изтегляне на източник ZIP
CH-J / SM Mobile 134 Файлове
sm-mobile-20261016T050549Z-3678f2a05fa9 Добавено: · Построена:
Файлове
terminal_page.dart Добавено: Дата, която не е регистрирана 3,7 KB · 121 линии
Изтегляне на файл
1import 'package:flutter/material.dart';
2import 'package:flutter/services.dart';
3import 'package:xterm/xterm.dart';
4import '../core/app_controller.dart';
5import '../l10n/strings.dart';
6import 'common.dart';
8class TerminalPage extends StatefulWidget {
9 final AppController controller;
10 const TerminalPage(this.controller, {super.key});
11 @override
12 State<TerminalPage> createState() => _TerminalPageState();
15class _TerminalPageState extends State<TerminalPage> {
16 final selection = TerminalController();
17 final focus = FocusNode();
18 bool ctrl = false, alt = false;
19 @override
20 void dispose() {
21 selection.dispose();
22 focus.dispose();
23 super.dispose();
24 }
26 @override
27 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 }
SHA-256e5fe68d4dc7308e64d1571a74eadcd118f949e7a031b4241e7783a673e0c1e99

CH-J Proprietary Software License 1.14 · Източникът е предоставен под CH-J Proprietary Software License 1.14. Неговата наличност не променя лицензионните условия или не предоставя допълнителни права.

Архив SHA-256c486a807e4828998b9c57ab0f2e760f7980b31965fe118e89d3e1a5a2b65be65