123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- import 'package:fis_lib_report/converts/date_to_string_converter.dart';
- import 'package:fis_lib_report/converts/pt_to_px_converter.dart';
- import 'package:fis_lib_report/converts/alignment_convert.dart';
- import 'package:fis_lib_report/report/date_time_element.dart';
- import 'package:fis_lib_report/report_info/date_time_info.dart';
- import 'package:fis_lib_report/report_info/report_info.dart';
- import 'package:fis_ui/index.dart';
- import 'package:fis_ui/interface/interactive_container.dart';
- import 'package:flutter/material.dart';
- class FDateTime extends StatefulWidget implements FInteractiveContainer {
- final DateTimeElement dateTimeElement;
- const FDateTime(this.dateTimeElement, {Key? key}) : super(key: key);
- @override
- final String pageName = 'FDateTime';
- @override
- State<StatefulWidget> createState() {
- return _FDateTimeState();
- }
- }
- class _FDateTimeState extends State<FDateTime> {
- DateTime selectedDate = DateTime.now();
- _FDateTimeState();
- String _dateTimeStr = '';
- double _fontSize = 14.0;
- double _width = 0;
- TextStyle _style = const TextStyle();
- Color _fontColor = Colors.black;
- Color _backgroundColor = const Color.fromARGB(255, 255, 255, 255);
- EdgeInsets _margin = const EdgeInsets.all(0);
- DateTimeInfo? _dateTimeInfo;
- @override
- initState() {
- super.initState();
- }
- @override
- FWidget build(BuildContext context) {
- final dateTimeElement = widget.dateTimeElement;
- _initDatas();
- return FContainer(
- margin: _margin,
- constraints: const BoxConstraints(minHeight: 24),
- padding: const EdgeInsets.symmetric(horizontal: 4),
- height: _fontSize + 10,
- decoration: BoxDecoration(
- borderRadius: BorderRadius.circular(4),
- border: Border.all(
- width: 1,
- color:
- dateTimeElement.isReadOnly ? Colors.transparent : Colors.grey,
- ),
- ),
- width: _width,
- alignment: AlignmentConvert.verticalLayoutConvert(
- dateTimeElement.verticalAlignment!),
- child: FRow(
- mainAxisAlignment: AlignmentConvert.horizontalToMainConvert(
- dateTimeElement.horizontalAlignment),
- children: [
- FContainer(
- alignment: AlignmentConvert.verticalLayoutConvert(
- dateTimeElement.verticalAlignment!),
- child: FText(
- _dateTimeStr,
- style: _style,
- textAlign: AlignmentConvert.horizontalAlignmentConvert(
- dateTimeElement.horizontalAlignment),
- ),
- ),
- if (!dateTimeElement.isReadOnly) ...[
- const FExpanded(child: FSizedBox()),
- FGestureDetector(
- name: "selectDate",
- businessParent: widget,
- onTap: () => _selectDate(context),
- child: const FIcon(
- Icons.date_range_outlined,
- size: 17,
- ),
- ),
- ],
- ],
- ));
- }
- _selectDate(BuildContext context) async {
- final DateTime? picked = await showDatePicker(
- context: context,
- initialDate: selectedDate,
- firstDate: DateTime(2000),
- lastDate: DateTime(2025),
- );
- if (picked != null && picked != selectedDate) {
- final format = widget.dateTimeElement.dateTimeFormat;
- setState(() {
- selectedDate = picked;
-
- _dateTimeInfo!.text = selectedDate.toString();
- });
- }
- }
- void _initDatas() {
- final dateTimeElement = widget.dateTimeElement;
- final format = dateTimeElement.dateTimeFormat;
- final dateTimeInfo =
- FReportInfo.instance.getElementInfo(dateTimeElement) as DateTimeInfo?;
- if (dateTimeInfo != null && dateTimeInfo != _dateTimeInfo) {
- if (_dateTimeInfo != null) {
- _dateTimeInfo!.onTextChange.dispose();
- }
- _dateTimeInfo = dateTimeInfo;
- _dateTimeInfo!.onTextChange.addListener((sender, e) {
- if (mounted) {
- setState(() {
- final date = DateTime.parse(_dateTimeInfo!.text.trim());
- _dateTimeConvert(format!, date.millisecondsSinceEpoch);
- });
- }
- });
- }
- if (_dateTimeInfo!.text.isNotEmpty) {
- final date = DateTime.parse(_dateTimeInfo!.text.trim());
- final dateStr = DateToStringConverter.dateTimeConvert(
- format!, date.millisecondsSinceEpoch);
- if (dateStr != _dateTimeStr) {
- _dateTimeStr = dateStr.trim();
- }
- }
-
- final fontStyles = dateTimeElement.fontStyles;
- final fontColor = dateTimeElement.fontColor;
- if (fontColor != null) {
- _fontColor = Color.fromARGB(
- fontColor.a!, fontColor.r!, fontColor.g!, fontColor.b!);
- }
- final backgroundColor = dateTimeElement.background;
- if (backgroundColor != null) {
- _backgroundColor = Color.fromARGB(backgroundColor.a!, backgroundColor.r!,
- backgroundColor.g!, backgroundColor.b!);
- if (_backgroundColor == Colors.white) {
- _backgroundColor = Colors.transparent;
- }
- }
- final margin = dateTimeElement.margin;
- if (margin != null) {
- _margin = EdgeInsets.only(
- top: margin.top ?? 0,
- bottom: margin.bottom ?? 0,
- left: margin.left ?? 0,
- right: margin.right ?? 0);
- }
- _fontSize = PtToPxConverter.ptToPx(dateTimeElement.fontSize ?? 14);
- _style = TextStyle(
- fontSize: _fontSize,
- color: _fontColor,
- backgroundColor: _backgroundColor,
- );
- _width = (_fontSize * 2 / 3) * _dateTimeStr.length;
- if (!dateTimeElement.isReadOnly) {
- var contentWidth = PtToPxConverter.ptToPx(dateTimeElement.lineWidth);
- _width = contentWidth;
- }
- }
- void _dateTimeConvert(String format, int timestamp) {
- _dateTimeStr =
- DateToStringConverter.dateTimeConvert(format, timestamp).trim();
- }
- }
|