You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
3.4 KiB
96 lines
3.4 KiB
import 'package:flutter/material.dart'; |
|
import 'package:provider/provider.dart'; |
|
import 'package:flutter/services.dart'; // 复制功能需要 |
|
import 'package:win_text_editor/app/providers/editor_provider.dart'; |
|
|
|
class TextTab extends StatelessWidget { |
|
final String tabId; |
|
|
|
const TextTab({super.key, required this.tabId}); |
|
|
|
@override |
|
Widget build(BuildContext context) { |
|
final provider = Provider.of<EditorProvider>(context); |
|
final tab = provider.tabs.firstWhere((t) => t.id == tabId); |
|
|
|
return Column( |
|
children: [ |
|
// 新增工具条 |
|
Container( |
|
height: 40, |
|
padding: const EdgeInsets.symmetric(horizontal: 16), |
|
decoration: BoxDecoration( |
|
color: Colors.grey[100], |
|
border: Border(bottom: BorderSide(color: Colors.grey[300]!)), |
|
), |
|
child: Row( |
|
mainAxisAlignment: MainAxisAlignment.spaceBetween, |
|
children: [ |
|
const Text('源文本', style: TextStyle(fontWeight: FontWeight.bold)), |
|
Row( |
|
children: [ |
|
IconButton( |
|
icon: const Icon(Icons.folder_open, size: 20), |
|
tooltip: '打开文件', |
|
onPressed: () => _openFile(context, tabId), |
|
), |
|
IconButton( |
|
icon: const Icon(Icons.content_copy, size: 20), |
|
tooltip: '复制内容', |
|
onPressed: () => _copyToClipboard(context, tab.content), |
|
), |
|
IconButton( |
|
icon: const Icon(Icons.save, size: 20), |
|
tooltip: '保存文件', |
|
onPressed: () => _saveFile(context, tab.content), |
|
), |
|
], |
|
), |
|
], |
|
), |
|
), |
|
// 文本编辑区 |
|
Expanded( |
|
child: TextField( |
|
maxLines: null, |
|
controller: TextEditingController(text: tab.content), |
|
onChanged: (text) => provider.updateContent(tabId, text), |
|
decoration: const InputDecoration( |
|
border: InputBorder.none, |
|
hintText: '开始输入内容...', |
|
contentPadding: EdgeInsets.all(16), |
|
), |
|
), |
|
), |
|
], |
|
); |
|
} |
|
|
|
// 打开文件模拟功能 |
|
Future<void> _openFile(BuildContext context, String tabId) async { |
|
final provider = Provider.of<EditorProvider>(context, listen: false); |
|
// 这里是模拟代码,实际应该使用文件选择器 |
|
const mockContent = "从文件加载的示例文本..."; |
|
provider.updateContent(tabId, mockContent); |
|
|
|
ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text('已加载文件内容'))); |
|
} |
|
|
|
// 复制到剪贴板 |
|
Future<void> _copyToClipboard(BuildContext context, String content) async { |
|
await Clipboard.setData(ClipboardData(text: content)); |
|
if (context.mounted) { |
|
ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text('已复制到剪贴板'))); |
|
} |
|
} |
|
|
|
// 保存文件模拟功能 |
|
Future<void> _saveFile(BuildContext context, String content) async { |
|
// 这里是模拟代码,实际应该使用文件保存对话框 |
|
if (context.mounted) { |
|
ScaffoldMessenger.of( |
|
context, |
|
).showSnackBar(SnackBar(content: Text('已保存 ${content.length} 个字符'))); |
|
} |
|
} |
|
}
|
|
|