|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'package:provider/provider.dart';
|
|
|
|
import 'package:win_text_editor/app/menus/app_menu.dart';
|
|
|
|
import 'package:win_text_editor/app/providers/tab_provider.dart';
|
|
|
|
import 'package:win_text_editor/app/providers/file_provider.dart';
|
|
|
|
import 'package:win_text_editor/app/widgets/editor_pane.dart';
|
|
|
|
import 'package:win_text_editor/app/widgets/file_explorer.dart';
|
|
|
|
import 'package:win_text_editor/app/widgets/console_panel.dart'; // 新增导入
|
|
|
|
|
|
|
|
class AppScaffold extends StatelessWidget {
|
|
|
|
const AppScaffold({super.key});
|
|
|
|
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
return MultiProvider(
|
|
|
|
providers: [
|
|
|
|
ChangeNotifierProvider(create: (_) => FileProvider()),
|
|
|
|
ChangeNotifierProvider(create: (_) => TabProvider()),
|
|
|
|
],
|
|
|
|
child: const Scaffold(
|
|
|
|
body: Column(
|
|
|
|
children: [
|
|
|
|
// 菜单栏
|
|
|
|
AppMenu(),
|
|
|
|
// 主内容区域
|
|
|
|
Expanded(child: _ResizablePanel()),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class _ResizablePanel extends StatefulWidget {
|
|
|
|
const _ResizablePanel();
|
|
|
|
|
|
|
|
@override
|
|
|
|
State<_ResizablePanel> createState() => _ResizablePanelState();
|
|
|
|
}
|
|
|
|
|
|
|
|
class _ResizablePanelState extends State<_ResizablePanel> {
|
|
|
|
double _leftWidth = 0.2; // 初始宽度20%
|
|
|
|
final double _minWidth = 100; // 最小宽度
|
|
|
|
final double _maxWidth = 400; // 最大宽度
|
|
|
|
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
final screenWidth = MediaQuery.of(context).size.width;
|
|
|
|
|
|
|
|
return LayoutBuilder(
|
|
|
|
builder: (context, constraints) {
|
|
|
|
// 计算实际宽度
|
|
|
|
final leftPanelWidth = (_leftWidth * screenWidth).clamp(_minWidth, _maxWidth);
|
|
|
|
|
|
|
|
return Column(
|
|
|
|
children: [
|
|
|
|
Expanded(
|
|
|
|
child: Row(
|
|
|
|
children: [
|
|
|
|
// 左侧文件资源管理器 - 添加Material小部件包裹
|
|
|
|
Material(
|
|
|
|
elevation: 1, // 轻微阴影分隔
|
|
|
|
child: SizedBox(
|
|
|
|
width: leftPanelWidth,
|
|
|
|
child: const ClipRect(
|
|
|
|
// 确保内容被裁剪
|
|
|
|
child: FileExplorer(),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
// 拖拽手柄
|
|
|
|
GestureDetector(
|
|
|
|
behavior: HitTestBehavior.translucent,
|
|
|
|
onPanUpdate: (details) {
|
|
|
|
setState(() {
|
|
|
|
_leftWidth = ((leftPanelWidth + details.delta.dx) / screenWidth).clamp(
|
|
|
|
_minWidth / screenWidth,
|
|
|
|
_maxWidth / screenWidth,
|
|
|
|
);
|
|
|
|
});
|
|
|
|
},
|
|
|
|
child: MouseRegion(
|
|
|
|
cursor: SystemMouseCursors.resizeLeftRight,
|
|
|
|
child: Container(width: 4, color: Colors.grey[300]),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
// 右侧编辑器区域 - 添加Material背景
|
|
|
|
const Expanded(
|
|
|
|
child: Material(
|
|
|
|
color: Colors.white,
|
|
|
|
child: Column(children: [Expanded(child: EditorPane())]),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
// 控制台面板
|
|
|
|
const ConsolePanel(),
|
|
|
|
],
|
|
|
|
);
|
|
|
|
},
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|