Przeglądaj źródła

页码控件实现

loki.wu 2 lat temu
rodzic
commit
21a0124fcb

+ 105 - 2
assets/single_image.json

@@ -1,6 +1,6 @@
 {
   "Id": "933e1836-c7a9-4016-9612-186b2cf7f2e1",
-  "UpdateTime": "2022-06-18T20:11:57.7434837+08:00",
+  "UpdateTime": "2022-06-20T09:55:32.2211901+08:00",
   "IsCustom": true,
   "Author": null,
   "Name": "test",
@@ -84,10 +84,113 @@
       "ElementType": {
         "Name": "Paragraph"
       }
+    },
+    {
+      "LineSpace": 0.0,
+      "Elements": [
+        {
+          "Width": 478.61559055118107,
+          "BorderStyle": "Solid",
+          "Stroke": {
+            "A": 255,
+            "R": 0,
+            "G": 0,
+            "B": 0
+          },
+          "Thickness": 1.0,
+          "Id": "8ea2bb54-3277-4034-9c45-fdd91bd12a88",
+          "Index": 0,
+          "Tag": null,
+          "MeasureTag": null,
+          "HorizontalAlignment": "Stretch",
+          "VerticalAlignment": "Stretch",
+          "Margin": {
+            "Left": 0.0,
+            "Top": 0.0,
+            "Right": 0.0,
+            "Bottom": 0.0
+          },
+          "ElementType": {
+            "Name": "Line"
+          }
+        }
+      ],
+      "Id": "f228ed4a-9ac8-49db-a860-357285d7a4af",
+      "Index": 1,
+      "Tag": null,
+      "MeasureTag": null,
+      "HorizontalAlignment": "Stretch",
+      "VerticalAlignment": "Stretch",
+      "Margin": {
+        "Left": 0.0,
+        "Top": 0.0,
+        "Right": 0.0,
+        "Bottom": 0.0
+      },
+      "ElementType": {
+        "Name": "Paragraph"
+      }
     }
   ],
   "Header": [],
-  "Footer": [],
+  "Footer": [
+    {
+      "LineSpace": 0.0,
+      "Elements": [
+        {
+          "PageNumberStyle": "Number",
+          "FontName": "宋体",
+          "FontSize": 10.5,
+          "FontStyles": [],
+          "FontColor": {
+            "A": 255,
+            "R": 0,
+            "G": 0,
+            "B": 0
+          },
+          "Background": {
+            "A": 255,
+            "R": 255,
+            "G": 255,
+            "B": 255
+          },
+          "LineLength": 5,
+          "LineWidth": 0.0,
+          "TextWrap": false,
+          "Id": "f7b98f05-b238-422d-b614-7d48648bc345",
+          "Index": 0,
+          "Tag": null,
+          "MeasureTag": null,
+          "HorizontalAlignment": "Stretch",
+          "VerticalAlignment": "Center",
+          "Margin": {
+            "Left": 0.0,
+            "Top": 0.0,
+            "Right": 0.0,
+            "Bottom": 0.0
+          },
+          "ElementType": {
+            "Name": "PageNumber"
+          }
+        }
+      ],
+      "Id": "64379445-1218-4b32-9402-551e337d4632",
+      "Index": 0,
+      "Tag": null,
+      "MeasureTag": null,
+      "HorizontalAlignment": "Right",
+      "VerticalAlignment": "Stretch",
+      "Margin": {
+        "Left": 0.0,
+        "Top": 0.0,
+        "Right": 0.0,
+        "Bottom": 0.0
+      },
+      "ElementType": {
+        "Name": "Paragraph"
+      }
+    }
+  ],
   "BaseFontSize": 9.0,
   "InvertColor": false,
   "Version": "1.1_1.0.0.0"

+ 9 - 1
lib/main.dart

@@ -75,7 +75,15 @@ class _MyHomePageState extends State<MyHomePage> {
       'http://192.168.6.117:9001/Flyinsono-BJ-1300984704.VCS.AP-BeiJing/compress%E4%B9%B3%E8%85%BAVideo.VID',
       'http://192.168.6.117:9001/Flyinsono-BJ-1300984704.VCS.AP-BeiJing/compress%E9%A2%88%E5%8A%A8%E8%84%89%E6%A8%AA%E5%88%87.VID'
     ];
-
+    Future.delayed(
+      const Duration(milliseconds: 300),
+      () {
+        final listHeight =
+            context.findRenderObject()!.semanticBounds.size.height;
+        ReportInfo.instance.currentHeight = listHeight;
+        ReportInfo.instance.heightChange(listHeight);
+      },
+    );
     return Scaffold(
       body: Row(
         children: [

+ 54 - 0
lib/pages/components/page_number.dart

@@ -0,0 +1,54 @@
+import 'package:fis_lib_report/converts/margin_convert.dart';
+import 'package:fis_lib_report/converts/pt_to_px_converter.dart';
+import 'package:fis_lib_report/pages/helpler.dart';
+import 'package:fis_lib_report/report/line.dart';
+import 'package:fis_lib_report/report/page_number.dart';
+import 'package:fis_lib_report/report/rt_thickness.dart';
+import 'package:fis_lib_report/report/space.dart';
+import 'package:fis_lib_report/report_info/report_info.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+
+class RPageNumber extends StatefulWidget {
+  final PageNumber space;
+
+  RPageNumber(this.space, {Key? key}) : super(key: key);
+
+  @override
+  State<StatefulWidget> createState() {
+    return _RRPageNumberState();
+  }
+}
+
+class _RRPageNumberState extends State<RPageNumber> {
+  late PageNumber pageNumber;
+  String _text = '';
+  @override
+  initState() {
+    pageNumber = widget.space;
+    ReportInfo.instance.onHeightChange!.addListener((sender, e) {
+      final height = ReportInfo.instance.currentHeight;
+      final pageHeight = ReportInfo.instance.pageSize!.height;
+
+      final pageNum = (height / pageHeight!).ceil();
+      setState(() {
+        _text = pageNum.toString();
+      });
+    });
+    super.initState();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      margin: MarginConvert.marginConvert(pageNumber.margin),
+      child: Row(
+        mainAxisAlignment: MainAxisAlignment.end,
+        children: const [
+          ///页码功能应在生成pdf时自动添加上
+          Text(''),
+        ],
+      ),
+    );
+  }
+}

+ 7 - 0
lib/pages/paragraph_page.dart

@@ -6,6 +6,7 @@ import 'package:fis_lib_report/pages/components/input_text.dart';
 import 'package:fis_lib_report/pages/components/line.dart';
 import 'package:fis_lib_report/pages/components/multi_select.dart';
 import 'package:fis_lib_report/pages/components/multi_selected.dart';
+import 'package:fis_lib_report/pages/components/page_number.dart';
 import 'package:fis_lib_report/pages/components/single_select.dart';
 import 'package:fis_lib_report/pages/components/space.dart';
 import 'package:fis_lib_report/pages/components/static_Text.dart';
@@ -19,11 +20,13 @@ import 'package:fis_lib_report/report/interfaces/element.dart';
 import 'package:fis_lib_report/report/interfaces/position_layout.dart';
 import 'package:fis_lib_report/report/line.dart';
 import 'package:fis_lib_report/report/multiSelected.dart';
+import 'package:fis_lib_report/report/page_number.dart';
 import 'package:fis_lib_report/report/paragraph.dart';
 import 'package:fis_lib_report/report/singleSelected.dart';
 import 'package:fis_lib_report/report/space.dart';
 import 'package:fis_lib_report/report/staticText.dart';
 import 'package:fis_lib_report/report/static_image.dart';
+import 'package:fis_lib_report/report_info/report_info.dart';
 import 'package:flutter/material.dart';
 
 class ParagraphPage extends StatefulWidget {
@@ -103,6 +106,10 @@ class _ParagraphState extends State<ParagraphPage> {
             } else if (element.elementType!.name == ElementType.space!.name) {
               final space = element as Space;
               return RSpace(space);
+            } else if (element.elementType!.name ==
+                ElementType.pageNumber!.name) {
+              final pageNumber = element as PageNumber;
+              return RPageNumber(pageNumber);
             }
             return Container(
               height: 30,

+ 1 - 0
lib/report/element_type.dart

@@ -15,6 +15,7 @@ class ElementType {
   static ElementType? inputImage = ElementType('InputImage');
   static ElementType? staticImage = ElementType('StaticImage');
   static ElementType? space = ElementType('Space');
+  static ElementType? pageNumber = ElementType('PageNumber');
 
   ElementType(this.name);
 

+ 15 - 0
lib/report/page_number.dart

@@ -0,0 +1,15 @@
+import 'package:fis_lib_report/report/text_element.dart';
+
+class PageNumber extends TextElement {
+  PageNumberStyle? pageNumberStyle;
+
+  PageNumber.fromJson(Map<String, dynamic> json) : super.fromJson(json) {
+    pageNumberStyle = PageNumberStyle.values
+        .firstWhere((element) => element.name == json['PageNumberStyle']);
+  }
+}
+
+enum PageNumberStyle {
+  Number,
+  NumberAndTotalNumber,
+}

+ 4 - 0
lib/report/paragraph.dart

@@ -7,6 +7,7 @@ import 'package:fis_lib_report/report/interfaces/element.dart';
 import 'package:fis_lib_report/report/interfaces/paragraph.dart';
 import 'package:fis_lib_report/report/line.dart';
 import 'package:fis_lib_report/report/multiSelected.dart';
+import 'package:fis_lib_report/report/page_number.dart';
 import 'package:fis_lib_report/report/singleSelected.dart';
 import 'package:fis_lib_report/report/space.dart';
 import 'package:fis_lib_report/report/staticText.dart';
@@ -53,6 +54,9 @@ class Paragraph extends Element implements IParagraph {
       } else if (jsonType.name == ElementType.space!.name) {
         final space = Space.fromJson(map);
         elements!.add(space);
+      } else if (jsonType.name == ElementType.pageNumber!.name) {
+        final pageNumber = PageNumber.fromJson(map);
+        elements!.add(pageNumber);
       }
     });
   }

+ 1 - 1
lib/report/space.dart

@@ -20,7 +20,7 @@ class Space extends InlineElement implements ILine {
 
   double? spaceWidth;
 
-  double? spaceUnitCount = 0.0;
+  int? spaceUnitCount = 0;
 
   Space.fromJson(Map<String, dynamic> json) : super.fromJson(json) {
     width = json['Width'];

+ 11 - 0
lib/report_info/page_number_info.dart

@@ -0,0 +1,11 @@
+import 'package:fis_lib_report/report/page_number.dart';
+import 'package:fis_lib_report/report/staticText.dart';
+import 'package:fis_lib_report/report_info/text_element_info.dart';
+
+class PageNumberInfo extends TextElementInfo {
+  String? text;
+
+  PageNumberInfo.fromElement(PageNumber element) : super.fromElement(element) {
+    // text = element.te;
+  }
+}

+ 5 - 0
lib/report_info/paragraph_info.dart

@@ -3,6 +3,7 @@ import 'package:fis_lib_report/report/element_type.dart';
 import 'package:fis_lib_report/report/inputImage.dart';
 import 'package:fis_lib_report/report/inputText.dart';
 import 'package:fis_lib_report/report/multiSelected.dart';
+import 'package:fis_lib_report/report/page_number.dart';
 import 'package:fis_lib_report/report/paragraph.dart';
 import 'package:fis_lib_report/report/singleSelected.dart';
 import 'package:fis_lib_report/report/staticText.dart';
@@ -13,6 +14,7 @@ import 'package:fis_lib_report/report_info/element_info.dart';
 import 'package:fis_lib_report/report_info/input_image_info.dart';
 import 'package:fis_lib_report/report_info/input_text_info.dart';
 import 'package:fis_lib_report/report_info/multi_selected_info.dart';
+import 'package:fis_lib_report/report_info/page_number_info.dart';
 import 'package:fis_lib_report/report_info/single_selected_info.dart';
 import 'package:fis_lib_report/report_info/static_image_info.dart';
 import 'package:fis_lib_report/report_info/static_text_info.dart';
@@ -51,6 +53,9 @@ class ParagraphInfo extends ElementInfo implements IBlockElementInfo {
       } else if (element.elementType!.name == ElementType.staticImage!.name) {
         final inputImage = element as StaticImage;
         elementInfos!.add(StaticImageInfo.fromElement(inputImage));
+      } else if (element.elementType!.name == ElementType.pageNumber!.name) {
+        final pageNumber = element as PageNumber;
+        elementInfos!.add(PageNumberInfo.fromElement(pageNumber));
       }
     }
   }

+ 13 - 0
lib/report_info/report_info.dart

@@ -1,3 +1,4 @@
+import 'package:fis_lib_report/converts/event_type.dart';
 import 'package:fis_lib_report/report/element_tag.dart';
 import 'package:fis_lib_report/report/element_type.dart';
 import 'package:fis_lib_report/report/inputImage.dart';
@@ -7,6 +8,7 @@ import 'package:fis_lib_report/report/interfaces/block_element.dart';
 import 'package:fis_lib_report/report/interfaces/element.dart';
 import 'package:fis_lib_report/report/paragraph.dart';
 import 'package:fis_lib_report/report/report_template_document.dart';
+import 'package:fis_lib_report/report/rt_page_size.dart';
 import 'package:fis_lib_report/report/rt_table.dart';
 import 'package:fis_lib_report/report_info/block_element_info_interface.dart';
 import 'package:fis_lib_report/report_info/element_info.dart';
@@ -44,6 +46,12 @@ class ReportInfo {
 
   ReportInfo._internal();
 
+  RTPageSize? pageSize;
+
+  double currentHeight = 0;
+
+  FEventHandler<double>? onHeightChange = FEventHandler();
+
   static ReportInfo get instance {
     _reportInfo ??= ReportInfo._internal();
     return _reportInfo!;
@@ -65,11 +73,16 @@ class ReportInfo {
       for (var element in reportTemplate.footer!) {
         footers.add(_initBlockElement(element));
       }
+      pageSize = reportTemplate.pageSize;
     } catch (e) {
       print(e);
     }
   }
 
+  void heightChange(double height) {
+    onHeightChange!.emit(this, height);
+  }
+
   IBlockElementInfo? getBlockElement(IBlockElement block) {
     final id = block.id;
     for (var element in headers) {