8 changed files with 278 additions and 221 deletions
@ -1,53 +1,9 @@ |
|||||||
// grid_view_controller.dart |
// grid_view_controller.dart |
||||||
import 'package:win_text_editor/shared/base/safe_notifier.dart'; |
import 'package:win_text_editor/shared/base/safe_notifier.dart'; |
||||||
import 'package:win_text_editor/modules/template_parser/models/template_node.dart'; |
|
||||||
|
|
||||||
class GridViewController extends SafeNotifier { |
class GridViewController extends SafeNotifier { |
||||||
List<TemplateItem> _templateItems = []; |
void reset() { |
||||||
List<TemplateItem> _filteredItems = []; |
// 重置状态的方法 |
||||||
bool _isFilterApplied = false; |
|
||||||
|
|
||||||
List<TemplateItem> get displayedItems => _isFilterApplied ? _filteredItems : _templateItems; |
|
||||||
bool get isFilterApplied => _isFilterApplied; |
|
||||||
List<TemplateItem> get templateItems => _templateItems; |
|
||||||
|
|
||||||
// 新增方法:更新节点引用 |
|
||||||
List<TemplateNode>? _currentTreeNodes; |
|
||||||
void updateTreeNodesRef(List<TemplateNode> nodes) { |
|
||||||
_currentTreeNodes = nodes; |
|
||||||
safeNotify(); |
|
||||||
} |
|
||||||
|
|
||||||
List<TemplateNode> getSelectedNodes() { |
|
||||||
if (_currentTreeNodes == null) return []; |
|
||||||
|
|
||||||
List<TemplateNode> selectedNodes = []; |
|
||||||
void traverse(TemplateNode node) { |
|
||||||
if (node.isChecked) selectedNodes.add(node); |
|
||||||
for (var child in node.children) { |
|
||||||
traverse(child); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
for (var node in _currentTreeNodes!) { |
|
||||||
traverse(node); |
|
||||||
} |
|
||||||
return selectedNodes; |
|
||||||
} |
|
||||||
|
|
||||||
void updateTemplateItems(List<TemplateItem> items) { |
|
||||||
_templateItems = items; |
|
||||||
safeNotify(); |
|
||||||
} |
|
||||||
|
|
||||||
void applyFilter(List<TemplateItem> filteredItems) { |
|
||||||
_filteredItems = filteredItems; |
|
||||||
_isFilterApplied = true; |
|
||||||
safeNotify(); |
|
||||||
} |
|
||||||
|
|
||||||
void clearFilter() { |
|
||||||
_isFilterApplied = false; |
|
||||||
safeNotify(); |
safeNotify(); |
||||||
} |
} |
||||||
} |
} |
||||||
|
@ -0,0 +1,48 @@ |
|||||||
|
import 'package:flutter/material.dart'; |
||||||
|
import 'package:win_text_editor/shared/components/editor_toolbar.dart'; |
||||||
|
import 'package:win_text_editor/shared/components/text_editor.dart'; |
||||||
|
|
||||||
|
class FormatTextPanel extends StatelessWidget { |
||||||
|
const FormatTextPanel({super.key}); |
||||||
|
|
||||||
|
@override |
||||||
|
Widget build(BuildContext context) { |
||||||
|
return Card( |
||||||
|
child: Column( |
||||||
|
children: [ |
||||||
|
// 上部模板编辑器 (固定高度200px) |
||||||
|
const SizedBox( |
||||||
|
height: 200, |
||||||
|
child: TextEditor(tabId: 'format_template', title: 'Mustache模板'), |
||||||
|
), |
||||||
|
const Divider(height: 1), |
||||||
|
// 下部结果编辑器 (扩展高度) |
||||||
|
Expanded( |
||||||
|
child: TextEditor( |
||||||
|
tabId: 'format_result', |
||||||
|
title: '转换结果', |
||||||
|
toolbarBuilder: |
||||||
|
(context, state) => EditorToolbar( |
||||||
|
title: '转换结果', |
||||||
|
text: state.currentText, |
||||||
|
isLoading: state.isLoading, |
||||||
|
showOpenFileButton: false, // 隐藏打开文件按钮 |
||||||
|
customButtons: [ |
||||||
|
ToolbarButtonConfig( |
||||||
|
icon: Icons.code, |
||||||
|
tooltip: '格式化', |
||||||
|
onPressed: () => _applyFormat(state.currentText), |
||||||
|
), |
||||||
|
], |
||||||
|
onCopyToClipboard: state.copyToClipboard, |
||||||
|
onSaveFile: state.saveFile, |
||||||
|
), |
||||||
|
), |
||||||
|
), |
||||||
|
], |
||||||
|
), |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
void _applyFormat(String currentText) {} |
||||||
|
} |
Loading…
Reference in new issue