diff --git a/documents/PB UFT模块迁移方案.docx b/documents/PB UFT模块迁移方案.docx index b8f389f..84b5453 100644 Binary files a/documents/PB UFT模块迁移方案.docx and b/documents/PB UFT模块迁移方案.docx differ diff --git a/win_text_editor/lib/main.dart b/win_text_editor/lib/main.dart index e2bf798..4aa506d 100644 --- a/win_text_editor/lib/main.dart +++ b/win_text_editor/lib/main.dart @@ -10,7 +10,7 @@ void main() async { // 配置窗口 await windowManager.ensureInitialized(); WindowOptions windowOptions = const WindowOptions( - size: Size(1200, 1000), + size: Size(1600, 1000), center: true, title: '文件操作工具箱', ); diff --git a/win_text_editor/lib/modules/content_search/widgets/results_view.dart b/win_text_editor/lib/modules/content_search/widgets/results_view.dart index 252ce09..3b34372 100644 --- a/win_text_editor/lib/modules/content_search/widgets/results_view.dart +++ b/win_text_editor/lib/modules/content_search/widgets/results_view.dart @@ -128,13 +128,14 @@ class ResultsView extends StatelessWidget { ], selectionMode: SelectionMode.multiple, navigationMode: GridNavigationMode.cell, - allowColumnsResizing: true, gridLinesVisibility: GridLinesVisibility.both, headerGridLinesVisibility: GridLinesVisibility.both, allowSorting: false, allowFiltering: false, - columnWidthMode: ColumnWidthMode.fill, + columnWidthMode: ColumnWidthMode.none, isScrollbarAlwaysShown: true, + allowColumnsResizing: true, // 关键开关 + columnResizeMode: ColumnResizeMode.onResizeEnd, ); } diff --git a/win_text_editor/lib/modules/data_format/widgets/data_format_view.dart b/win_text_editor/lib/modules/data_format/widgets/data_format_view.dart index a1f59f0..6aec06c 100644 --- a/win_text_editor/lib/modules/data_format/widgets/data_format_view.dart +++ b/win_text_editor/lib/modules/data_format/widgets/data_format_view.dart @@ -50,18 +50,9 @@ class _DataFormatViewState extends State { return const Row( children: [ // 左侧 GridView (50%宽度) - Expanded( - flex: 1, - child: Padding( - padding: EdgeInsets.only(right: 4.0), - child: Card(child: DataGridView()), - ), - ), + Expanded(flex: 1, child: Card(child: DataGridView())), // 右侧 FormatText 面板 (50%宽度) - Expanded( - flex: 1, - child: Padding(padding: EdgeInsets.only(left: 4.0), child: FormatTextPanel()), - ), + Expanded(flex: 1, child: FormatTextPanel()), ], ); }, diff --git a/win_text_editor/lib/modules/data_format/widgets/format_text_panel.dart b/win_text_editor/lib/modules/data_format/widgets/format_text_panel.dart index 75bbd96..dba8700 100644 --- a/win_text_editor/lib/modules/data_format/widgets/format_text_panel.dart +++ b/win_text_editor/lib/modules/data_format/widgets/format_text_panel.dart @@ -15,7 +15,7 @@ class FormatTextPanel extends StatelessWidget { height: 200, child: TextEditor(tabId: 'format_template', title: 'Mustache模板'), ), - const Divider(height: 1), + const SizedBox(height: 6), // 下部结果编辑器 (扩展高度) Expanded( child: TextEditor( diff --git a/win_text_editor/lib/modules/data_format/widgets/grid_view.dart b/win_text_editor/lib/modules/data_format/widgets/grid_view.dart index 83545f5..d700b8b 100644 --- a/win_text_editor/lib/modules/data_format/widgets/grid_view.dart +++ b/win_text_editor/lib/modules/data_format/widgets/grid_view.dart @@ -103,25 +103,29 @@ class _DataGridViewState extends State { eol: '\n', ).convert(content, fieldDelimiter: _delimiter); - // 清理数据并添加序号列 - final cleanedData = csvTable - .where((row) => row.isNotEmpty && row.any((cell) => cell.toString().trim().isNotEmpty)) - .toList(); // 先转换为List - - // 添加序号列 - final dataWithIndex = cleanedData.asMap().entries.map((entry) { - final index = entry.key; - final row = entry.value; - // 如果是标题行(第一行),添加"序号"列标题 - if (index == 0) { - return ['序号', ...row.map((cell) => cell.toString().trim()).toList()]; - } - // 数据行添加序号(从1开始) - return [index, ...row.map((cell) => cell.toString().trim()).toList()]; - }).toList(); + // 清理数据并添加序号列 + final cleanedData = + csvTable + .where( + (row) => row.isNotEmpty && row.any((cell) => cell.toString().trim().isNotEmpty), + ) + .toList(); // 先转换为List + + // 添加序号列 + final dataWithIndex = + cleanedData.asMap().entries.map((entry) { + final index = entry.key; + final row = entry.value; + // 如果是标题行(第一行),添加"序号"列标题 + if (index == 0) { + return ['序号', ...row.map((cell) => cell.toString().trim()).toList()]; + } + // 数据行添加序号(从1开始) + return [index, ...row.map((cell) => cell.toString().trim()).toList()]; + }).toList(); setState(() { - _csvData = dataWithIndex; + _csvData = dataWithIndex; }); } } catch (e) { @@ -137,32 +141,32 @@ class _DataGridViewState extends State { final headers = _csvData.first; final dataRows = _csvData.sublist(1); - final columns = [ - // 添加序号列 - GridColumn( - columnName: '序号', - width: 60, // 序号列宽度较小 - label: Container( - padding: const EdgeInsets.all(8.0), - color: Colors.grey[200], - alignment: Alignment.center, - child: const Text('序号', overflow: TextOverflow.ellipsis, maxLines: 1), + final columns = [ + // 添加序号列 + GridColumn( + columnName: '序号', + width: 60, // 序号列宽度较小 + label: Container( + padding: const EdgeInsets.all(8.0), + color: Colors.grey[200], + alignment: Alignment.center, + child: const Text('序号', overflow: TextOverflow.ellipsis, maxLines: 1), + ), ), - ), - // 原有列 - ...headers.sublist(1).map((header) { - return GridColumn( - columnName: header.toString(), - width: 150, // 固定列宽 - label: Container( - padding: const EdgeInsets.all(8.0), - color: Colors.grey[200], - alignment: Alignment.center, - child: Text(header.toString(), overflow: TextOverflow.ellipsis, maxLines: 1), - ), - ); - }).toList(), - ]; + // 原有列 + ...headers.sublist(1).map((header) { + return GridColumn( + columnName: header.toString(), + minimumWidth: 150, // 固定列宽 + label: Container( + padding: const EdgeInsets.all(8.0), + color: Colors.grey[200], + alignment: Alignment.center, + child: Text(header.toString(), overflow: TextOverflow.ellipsis, maxLines: 1), + ), + ); + }).toList(), + ]; final dataSource = _CsvDataSource(headers: headers, rows: dataRows); @@ -171,7 +175,9 @@ class _DataGridViewState extends State { columns: columns, gridLinesVisibility: GridLinesVisibility.both, headerGridLinesVisibility: GridLinesVisibility.both, - columnWidthMode: ColumnWidthMode.fitByCellValue, + allowColumnsResizing: true, + columnResizeMode: ColumnResizeMode.onResizeEnd, + columnWidthMode: ColumnWidthMode.none, ); } } diff --git a/win_text_editor/lib/modules/template_parser/widgets/grid_view.dart b/win_text_editor/lib/modules/template_parser/widgets/grid_view.dart index 503ac3d..b0a9b38 100644 --- a/win_text_editor/lib/modules/template_parser/widgets/grid_view.dart +++ b/win_text_editor/lib/modules/template_parser/widgets/grid_view.dart @@ -65,15 +65,15 @@ class TemplateGridView extends StatelessWidget { selectedNodes: selectedNodes, ); - // 构建表头(不包含序号列) - String csvData = selectedNodes + // 构建表头(不包含序号列) + String csvData = selectedNodes .map((node) => node.isAttribute ? node.name.substring(1) : node.name) .join('\t'); csvData += '\n'; - // 填充数据(跳过第一列的序号) + // 填充数据(跳过第一列的序号) for (final row in dataSource.rows) { - // 从第1列开始(跳过第0列的序号) + // 从第1列开始(跳过第0列的序号) for (int i = 1; i < row.getCells().length; i++) { csvData += row.getCells()[i].value.toString(); if (i < row.getCells().length - 1) csvData += '\t'; @@ -127,6 +127,7 @@ class TemplateGridView extends StatelessWidget { label: Container( padding: const EdgeInsets.all(8.0), alignment: Alignment.center, + color: Colors.grey[200], child: Text(node.isAttribute ? node.name.substring(1) : node.name), ), @@ -140,6 +141,7 @@ class TemplateGridView extends StatelessWidget { gridLinesVisibility: GridLinesVisibility.both, headerGridLinesVisibility: GridLinesVisibility.both, columnWidthMode: ColumnWidthMode.fill, + allowColumnsResizing: true, ); } diff --git a/win_text_editor/lib/shared/components/editor_toolbar.dart b/win_text_editor/lib/shared/components/editor_toolbar.dart index 3109a21..e7ea9f4 100644 --- a/win_text_editor/lib/shared/components/editor_toolbar.dart +++ b/win_text_editor/lib/shared/components/editor_toolbar.dart @@ -46,7 +46,7 @@ class EditorToolbar extends StatelessWidget { return Container( height: 40, padding: const EdgeInsets.symmetric(horizontal: 16), - decoration: BoxDecoration(color: Colors.grey[100]), + decoration: BoxDecoration(color: Colors.grey[300]), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -61,29 +61,31 @@ class EditorToolbar extends StatelessWidget { return Row( children: [ if (showOpenFileButton) - IconButton( - icon: const Icon(Icons.folder_open, size: 20), - tooltip: '打开文件', - onPressed: isLoading ? null : onOpenFile, - ), + IconButton( + icon: const Icon(Icons.folder_open, size: 20), + tooltip: '打开文件', + onPressed: isLoading ? null : onOpenFile, + ), if (showCopyButton) - IconButton( - icon: const Icon(Icons.content_copy, size: 20), - tooltip: '复制内容', - onPressed: text.isEmpty ? null : onCopyToClipboard, - ), + IconButton( + icon: const Icon(Icons.content_copy, size: 20), + tooltip: '复制内容', + onPressed: text.isEmpty ? null : onCopyToClipboard, + ), if (showSaveButton) - IconButton( - icon: const Icon(Icons.save, size: 20), - tooltip: '保存到文件', - onPressed: text.isEmpty ? null : onSaveFile, - ), + IconButton( + icon: const Icon(Icons.save, size: 20), + tooltip: '保存到文件', + onPressed: text.isEmpty ? null : onSaveFile, + ), // 添加自定义按钮 - ...customButtons.map((button) => IconButton( - icon: Icon(button.icon, size: 20), - tooltip: button.tooltip, - onPressed: button.isEnabled ? button.onPressed : null, - )), + ...customButtons.map( + (button) => IconButton( + icon: Icon(button.icon, size: 20), + tooltip: button.tooltip, + onPressed: button.isEnabled ? button.onPressed : null, + ), + ), if (isLoading) const Padding( padding: EdgeInsets.only(left: 8),