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