Browse Source

开始搞格式转换

master
hejl 2 months ago
parent
commit
effdc96a56
  1. BIN
      documents/PB UFT模块迁移方案.docx
  2. 2
      win_text_editor/lib/main.dart
  3. 5
      win_text_editor/lib/modules/content_search/widgets/results_view.dart
  4. 13
      win_text_editor/lib/modules/data_format/widgets/data_format_view.dart
  5. 2
      win_text_editor/lib/modules/data_format/widgets/format_text_panel.dart
  6. 92
      win_text_editor/lib/modules/data_format/widgets/grid_view.dart
  7. 10
      win_text_editor/lib/modules/template_parser/widgets/grid_view.dart
  8. 44
      win_text_editor/lib/shared/components/editor_toolbar.dart

BIN
documents/PB UFT模块迁移方案.docx

Binary file not shown.

2
win_text_editor/lib/main.dart

@ -10,7 +10,7 @@ void main() async {
// //
await windowManager.ensureInitialized(); await windowManager.ensureInitialized();
WindowOptions windowOptions = const WindowOptions( WindowOptions windowOptions = const WindowOptions(
size: Size(1200, 1000), size: Size(1600, 1000),
center: true, center: true,
title: '文件操作工具箱', title: '文件操作工具箱',
); );

5
win_text_editor/lib/modules/content_search/widgets/results_view.dart

@ -128,13 +128,14 @@ class ResultsView extends StatelessWidget {
], ],
selectionMode: SelectionMode.multiple, selectionMode: SelectionMode.multiple,
navigationMode: GridNavigationMode.cell, navigationMode: GridNavigationMode.cell,
allowColumnsResizing: true,
gridLinesVisibility: GridLinesVisibility.both, gridLinesVisibility: GridLinesVisibility.both,
headerGridLinesVisibility: GridLinesVisibility.both, headerGridLinesVisibility: GridLinesVisibility.both,
allowSorting: false, allowSorting: false,
allowFiltering: false, allowFiltering: false,
columnWidthMode: ColumnWidthMode.fill, columnWidthMode: ColumnWidthMode.none,
isScrollbarAlwaysShown: true, isScrollbarAlwaysShown: true,
allowColumnsResizing: true, //
columnResizeMode: ColumnResizeMode.onResizeEnd,
); );
} }

13
win_text_editor/lib/modules/data_format/widgets/data_format_view.dart

@ -50,18 +50,9 @@ class _DataFormatViewState extends State<DataFormatView> {
return const Row( return const Row(
children: [ children: [
// GridView (50%) // GridView (50%)
Expanded( Expanded(flex: 1, child: Card(child: DataGridView())),
flex: 1,
child: Padding(
padding: EdgeInsets.only(right: 4.0),
child: Card(child: DataGridView()),
),
),
// FormatText (50%) // FormatText (50%)
Expanded( Expanded(flex: 1, child: FormatTextPanel()),
flex: 1,
child: Padding(padding: EdgeInsets.only(left: 4.0), child: FormatTextPanel()),
),
], ],
); );
}, },

2
win_text_editor/lib/modules/data_format/widgets/format_text_panel.dart

@ -15,7 +15,7 @@ class FormatTextPanel extends StatelessWidget {
height: 200, height: 200,
child: TextEditor(tabId: 'format_template', title: 'Mustache模板'), child: TextEditor(tabId: 'format_template', title: 'Mustache模板'),
), ),
const Divider(height: 1), const SizedBox(height: 6),
// () // ()
Expanded( Expanded(
child: TextEditor( child: TextEditor(

92
win_text_editor/lib/modules/data_format/widgets/grid_view.dart

@ -103,25 +103,29 @@ class _DataGridViewState extends State<DataGridView> {
eol: '\n', eol: '\n',
).convert(content, fieldDelimiter: _delimiter); ).convert(content, fieldDelimiter: _delimiter);
// //
final cleanedData = csvTable final cleanedData =
.where((row) => row.isNotEmpty && row.any((cell) => cell.toString().trim().isNotEmpty)) csvTable
.toList(); // List .where(
(row) => row.isNotEmpty && row.any((cell) => cell.toString().trim().isNotEmpty),
// )
final dataWithIndex = cleanedData.asMap().entries.map((entry) { .toList(); // List
final index = entry.key;
final row = entry.value; //
// ()"序号" final dataWithIndex =
if (index == 0) { cleanedData.asMap().entries.map((entry) {
return ['序号', ...row.map((cell) => cell.toString().trim()).toList()]; final index = entry.key;
} final row = entry.value;
// (1) // ()"序号"
return [index, ...row.map((cell) => cell.toString().trim()).toList()]; if (index == 0) {
}).toList(); return ['序号', ...row.map((cell) => cell.toString().trim()).toList()];
}
// (1)
return [index, ...row.map((cell) => cell.toString().trim()).toList()];
}).toList();
setState(() { setState(() {
_csvData = dataWithIndex; _csvData = dataWithIndex;
}); });
} }
} catch (e) { } catch (e) {
@ -137,32 +141,32 @@ class _DataGridViewState extends State<DataGridView> {
final headers = _csvData.first; final headers = _csvData.first;
final dataRows = _csvData.sublist(1); final dataRows = _csvData.sublist(1);
final columns = [ final columns = [
// //
GridColumn( GridColumn(
columnName: '序号', columnName: '序号',
width: 60, // width: 60, //
label: Container( label: Container(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
color: Colors.grey[200], color: Colors.grey[200],
alignment: Alignment.center, alignment: Alignment.center,
child: const Text('序号', overflow: TextOverflow.ellipsis, maxLines: 1), child: const Text('序号', overflow: TextOverflow.ellipsis, maxLines: 1),
),
), ),
), //
// ...headers.sublist(1).map<GridColumn>((header) {
...headers.sublist(1).map<GridColumn>((header) { return GridColumn(
return GridColumn( columnName: header.toString(),
columnName: header.toString(), minimumWidth: 150, //
width: 150, // label: Container(
label: Container( padding: const EdgeInsets.all(8.0),
padding: const EdgeInsets.all(8.0), color: Colors.grey[200],
color: Colors.grey[200], alignment: Alignment.center,
alignment: Alignment.center, child: Text(header.toString(), overflow: TextOverflow.ellipsis, maxLines: 1),
child: Text(header.toString(), overflow: TextOverflow.ellipsis, maxLines: 1), ),
), );
); }).toList(),
}).toList(), ];
];
final dataSource = _CsvDataSource(headers: headers, rows: dataRows); final dataSource = _CsvDataSource(headers: headers, rows: dataRows);
@ -171,7 +175,9 @@ class _DataGridViewState extends State<DataGridView> {
columns: columns, columns: columns,
gridLinesVisibility: GridLinesVisibility.both, gridLinesVisibility: GridLinesVisibility.both,
headerGridLinesVisibility: GridLinesVisibility.both, headerGridLinesVisibility: GridLinesVisibility.both,
columnWidthMode: ColumnWidthMode.fitByCellValue, allowColumnsResizing: true,
columnResizeMode: ColumnResizeMode.onResizeEnd,
columnWidthMode: ColumnWidthMode.none,
); );
} }
} }

10
win_text_editor/lib/modules/template_parser/widgets/grid_view.dart

@ -65,15 +65,15 @@ class TemplateGridView extends StatelessWidget {
selectedNodes: selectedNodes, selectedNodes: selectedNodes,
); );
// //
String csvData = selectedNodes String csvData = selectedNodes
.map((node) => node.isAttribute ? node.name.substring(1) : node.name) .map((node) => node.isAttribute ? node.name.substring(1) : node.name)
.join('\t'); .join('\t');
csvData += '\n'; csvData += '\n';
// //
for (final row in dataSource.rows) { for (final row in dataSource.rows) {
// 10 // 10
for (int i = 1; i < row.getCells().length; i++) { for (int i = 1; i < row.getCells().length; i++) {
csvData += row.getCells()[i].value.toString(); csvData += row.getCells()[i].value.toString();
if (i < row.getCells().length - 1) csvData += '\t'; if (i < row.getCells().length - 1) csvData += '\t';
@ -127,6 +127,7 @@ class TemplateGridView extends StatelessWidget {
label: Container( label: Container(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
alignment: Alignment.center, alignment: Alignment.center,
color: Colors.grey[200], color: Colors.grey[200],
child: Text(node.isAttribute ? node.name.substring(1) : node.name), child: Text(node.isAttribute ? node.name.substring(1) : node.name),
), ),
@ -140,6 +141,7 @@ class TemplateGridView extends StatelessWidget {
gridLinesVisibility: GridLinesVisibility.both, gridLinesVisibility: GridLinesVisibility.both,
headerGridLinesVisibility: GridLinesVisibility.both, headerGridLinesVisibility: GridLinesVisibility.both,
columnWidthMode: ColumnWidthMode.fill, columnWidthMode: ColumnWidthMode.fill,
allowColumnsResizing: true,
); );
} }

44
win_text_editor/lib/shared/components/editor_toolbar.dart

@ -46,7 +46,7 @@ class EditorToolbar extends StatelessWidget {
return Container( return Container(
height: 40, height: 40,
padding: const EdgeInsets.symmetric(horizontal: 16), padding: const EdgeInsets.symmetric(horizontal: 16),
decoration: BoxDecoration(color: Colors.grey[100]), decoration: BoxDecoration(color: Colors.grey[300]),
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
@ -61,29 +61,31 @@ class EditorToolbar extends StatelessWidget {
return Row( return Row(
children: [ children: [
if (showOpenFileButton) if (showOpenFileButton)
IconButton( IconButton(
icon: const Icon(Icons.folder_open, size: 20), icon: const Icon(Icons.folder_open, size: 20),
tooltip: '打开文件', tooltip: '打开文件',
onPressed: isLoading ? null : onOpenFile, onPressed: isLoading ? null : onOpenFile,
), ),
if (showCopyButton) if (showCopyButton)
IconButton( IconButton(
icon: const Icon(Icons.content_copy, size: 20), icon: const Icon(Icons.content_copy, size: 20),
tooltip: '复制内容', tooltip: '复制内容',
onPressed: text.isEmpty ? null : onCopyToClipboard, onPressed: text.isEmpty ? null : onCopyToClipboard,
), ),
if (showSaveButton) if (showSaveButton)
IconButton( IconButton(
icon: const Icon(Icons.save, size: 20), icon: const Icon(Icons.save, size: 20),
tooltip: '保存到文件', tooltip: '保存到文件',
onPressed: text.isEmpty ? null : onSaveFile, onPressed: text.isEmpty ? null : onSaveFile,
), ),
// //
...customButtons.map((button) => IconButton( ...customButtons.map(
icon: Icon(button.icon, size: 20), (button) => IconButton(
tooltip: button.tooltip, icon: Icon(button.icon, size: 20),
onPressed: button.isEnabled ? button.onPressed : null, tooltip: button.tooltip,
)), onPressed: button.isEnabled ? button.onPressed : null,
),
),
if (isLoading) if (isLoading)
const Padding( const Padding(
padding: EdgeInsets.only(left: 8), padding: EdgeInsets.only(left: 8),

Loading…
Cancel
Save