mirror of
https://github.com/MeowLynxSea/vissh.git
synced 2025-07-09 19:44:34 +00:00
在任务栏最小化窗口时将不会导致窗口重载
This commit is contained in:
parent
33d30aacc8
commit
3ec54d41f1
@ -74,34 +74,37 @@ class _WindowManagerState extends State<WindowManager> {
|
||||
_addWindow(
|
||||
'File Explorer',
|
||||
const Offset(100, 100),
|
||||
(isActive, onSessionEnd) => const Center(
|
||||
Icons.folder_open,
|
||||
// 使用新的构建器语法
|
||||
(id) => const Center(
|
||||
child: Text('View your files...', style: TextStyle(color: Colors.white)),
|
||||
),
|
||||
Icons.folder_open,
|
||||
);
|
||||
_addWindow(
|
||||
'Terminal',
|
||||
const Offset(150, 150),
|
||||
(isActive, onSessionEnd) => TerminalPage(
|
||||
credentials: widget.credentials,
|
||||
isActive: isActive,
|
||||
onSessionEnd: onSessionEnd,
|
||||
),
|
||||
Icons.terminal,
|
||||
// 使用新的构建器语法,将 id 传入回调
|
||||
(id) => TerminalPage(
|
||||
credentials: widget.credentials,
|
||||
onSessionEnd: () => _removeWindow(id),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
void _addWindow(
|
||||
String title, Offset position, Widget Function(bool, VoidCallback) child, IconData icon) {
|
||||
void _addWindow(String title, Offset position, IconData icon,
|
||||
Widget Function(String id) childBuilder) {
|
||||
final id = 'window_${_nextWindowId++}';
|
||||
// 在这里一次性创建好 Widget
|
||||
final windowChild = childBuilder(id);
|
||||
setState(() {
|
||||
final id = 'window_${_nextWindowId++}';
|
||||
_windows.add(
|
||||
WindowData(
|
||||
id: id,
|
||||
title: title,
|
||||
position: position,
|
||||
size: const Size(700, 500),
|
||||
child: child,
|
||||
child: windowChild, // 存储创建好的 Widget 实例
|
||||
icon: icon,
|
||||
),
|
||||
);
|
||||
@ -251,7 +254,7 @@ class _WindowManagerState extends State<WindowManager> {
|
||||
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(4)),
|
||||
),
|
||||
child: const Text(
|
||||
'Back',
|
||||
'返回',
|
||||
style: TextStyle(
|
||||
color: Colors.white,
|
||||
fontSize: 16,
|
||||
@ -288,24 +291,27 @@ class _WindowManagerState extends State<WindowManager> {
|
||||
children: [
|
||||
Expanded(
|
||||
child: Stack(
|
||||
children: _windows.where((w) => !w.isMinimized).map((data) {
|
||||
children: _windows.map((data) {
|
||||
final bool isActive = data.id == activeWindowId;
|
||||
return DraggableWindow(
|
||||
key: ValueKey(data.id),
|
||||
id: data.id,
|
||||
initialPosition: data.position,
|
||||
initialSize: data.size,
|
||||
title: data.title,
|
||||
icon: data.icon,
|
||||
isActive: isActive,
|
||||
isMaximized: data.isMaximized,
|
||||
onBringToFront: _bringToFront,
|
||||
onMinimize: _minimizeWindow,
|
||||
onClose: _removeWindow,
|
||||
onMove: _updateWindowPosition,
|
||||
onResize: _updateWindowSize,
|
||||
onMaximizeChanged: _updateWindowMaximizeState,
|
||||
child: data.child,
|
||||
return Offstage(
|
||||
offstage: data.isMinimized,
|
||||
child: DraggableWindow(
|
||||
key: ValueKey(data.id),
|
||||
id: data.id,
|
||||
initialPosition: data.position,
|
||||
initialSize: data.size,
|
||||
title: data.title,
|
||||
icon: data.icon,
|
||||
isActive: isActive,
|
||||
isMaximized: data.isMaximized,
|
||||
onBringToFront: _bringToFront,
|
||||
onMinimize: _minimizeWindow,
|
||||
onClose: _removeWindow,
|
||||
onMove: _updateWindowPosition,
|
||||
onResize: _updateWindowSize,
|
||||
onMaximizeChanged: _updateWindowMaximizeState,
|
||||
child: data.child,
|
||||
),
|
||||
);
|
||||
}).toList(),
|
||||
),
|
||||
@ -325,14 +331,13 @@ class _WindowManagerState extends State<WindowManager> {
|
||||
onPressed: () => _addWindow(
|
||||
'Terminal',
|
||||
const Offset(150, 150),
|
||||
(isActive, onSessionEnd) => TerminalPage(
|
||||
credentials: widget.credentials,
|
||||
isActive: isActive,
|
||||
onSessionEnd: onSessionEnd,
|
||||
),
|
||||
Icons.terminal,
|
||||
(id) => TerminalPage(
|
||||
credentials: widget.credentials,
|
||||
onSessionEnd: () => _removeWindow(id),
|
||||
),
|
||||
),
|
||||
tooltip: 'Add New Window',
|
||||
tooltip: 'Start Terminal',
|
||||
child: const Icon(Icons.add),
|
||||
),
|
||||
const SizedBox(height: 32),
|
||||
|
@ -3,7 +3,7 @@ import 'package:flutter/material.dart';
|
||||
class WindowData {
|
||||
final String id;
|
||||
final String title;
|
||||
final Widget Function(bool isActive, VoidCallback onSessionEnd) child;
|
||||
final Widget child;
|
||||
final IconData icon;
|
||||
Offset position;
|
||||
Size size;
|
||||
|
@ -8,13 +8,11 @@ import '../models/credentials.dart';
|
||||
|
||||
class TerminalPage extends StatefulWidget {
|
||||
final SSHCredentials credentials;
|
||||
final bool isActive;
|
||||
final VoidCallback onSessionEnd;
|
||||
|
||||
const TerminalPage({
|
||||
super.key,
|
||||
required this.credentials,
|
||||
required this.isActive,
|
||||
required this.onSessionEnd,
|
||||
});
|
||||
|
||||
@ -33,22 +31,12 @@ class _TerminalPageState extends State<TerminalPage> {
|
||||
super.initState();
|
||||
_startSshShell();
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
if (mounted && widget.isActive) {
|
||||
if (mounted) {
|
||||
_focusNode.requestFocus();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
void didUpdateWidget(covariant TerminalPage oldWidget) {
|
||||
super.didUpdateWidget(oldWidget);
|
||||
if (widget.isActive && !oldWidget.isActive) {
|
||||
_focusNode.requestFocus();
|
||||
} else if (!widget.isActive && oldWidget.isActive) {
|
||||
_focusNode.unfocus();
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _startSshShell() async {
|
||||
try {
|
||||
client = SSHClient(
|
||||
|
@ -11,7 +11,7 @@ class DraggableWindow extends StatefulWidget {
|
||||
final Offset initialPosition;
|
||||
final Size initialSize;
|
||||
final String title;
|
||||
final Widget Function(bool isActive, VoidCallback onSessionEnd) child;
|
||||
final Widget child;
|
||||
final IconData icon;
|
||||
final bool isActive;
|
||||
final bool isMaximized;
|
||||
@ -229,7 +229,7 @@ class _DraggableWindowState extends State<DraggableWindow> {
|
||||
_buildTitleBar(),
|
||||
Expanded(
|
||||
child: ClipRect(
|
||||
child: widget.child(widget.isActive, () => widget.onClose(widget.id)),
|
||||
child: widget.child,
|
||||
)
|
||||
),
|
||||
],
|
||||
|
Loading…
Reference in New Issue
Block a user