123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316 |
- import 'package:fis_lib_report/converts/pt_to_px_converter.dart';
- import 'package:fis_lib_report/converts/text_size_converter.dart';
- import 'package:fis_lib_report/intents/auto_jump_intent.dart';
- import 'package:fis_lib_report/report/element_tag.dart';
- import 'package:fis_lib_report/report/input_text.dart';
- import 'package:fis_lib_report/report_info/element_tag_names.dart';
- import 'package:fis_lib_report/report_info/input_text_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:fis_ui/values/spacings.dart';
- import 'package:fis_ui/widgets/gesture/actions.dart';
- import 'package:fis_ui/widgets/gesture/shortcuts.dart';
- import 'package:fis_ui/widgets/layout/button_group.dart';
- import 'package:flutter/material.dart';
- import 'package:flutter/services.dart';
- class FInputText extends FStatefulWidget implements FInteractiveContainer {
- final InputText inputText;
- @override
- final String pageName = 'FInputText';
- const FInputText({Key? key, required this.inputText}) : super(key: key);
- @override
- FState<FStatefulWidget> createState() {
- return _FInputTextState();
- }
- }
- class _FInputTextState extends FState<FInputText> {
- _FInputTextState();
- final _controller = TextEditingController();
- final FocusNode _focusNode = FocusNode();
- final ButtonStyle _buttonStyle = const ButtonStyle(
- padding: MaterialStatePropertyAll(EdgeInsets.all(0)),
- );
- double _lineWidth = 136.0;
- double _fontSize = 22.0;
- double _allHeight = 0.0;
- bool _textWrap = false;
- Color _fontColor = const Color.fromARGB(255, 0, 0, 0);
- Color _backgroundColor = const Color.fromARGB(255, 255, 255, 255);
- TextStyle? _textStyle;
- InputTextInfo? _inputTextInfo;
- bool _isReadOnly = false;
- bool _widthLock = false;
- int? _rowCount = 1;
- InputDecoration _inputDecoration =
- const InputDecoration(border: OutlineInputBorder());
- @override
- initState() {
- _focusNode.addListener(() {
- if (!_focusNode.hasFocus) {
- _onInputChanged(_textStyle!, _controller.text);
- }
- });
- _initStyle();
- super.initState();
- }
- @override
- FWidget build(BuildContext context) {
- _checkInputTextInfo();
- return FColumn(
- mainAxisSize: MainAxisSize.min,
- children: [
- FContainer(
- width: _lineWidth,
- height: _textWrap ? null : _allHeight,
- alignment: Alignment.center,
- child: FShortcuts(
- shortcuts: {
- LogicalKeySet(LogicalKeyboardKey.tab): AutoJumpIntent(),
- },
- child: FActions(
- actions: <Type, Action<Intent>>{
- AutoJumpIntent: CallbackAction<AutoJumpIntent>(
- onInvoke: (AutoJumpIntent intent) {
- intent.handleAutoJump(_controller);
- return null;
- },
- ),
- },
- child: FTextField(
- textAlignVertical: TextAlignVertical.top,
- decoration: _isReadOnly ? null : _inputDecoration,
- readOnly: _isReadOnly,
- focusNode: _focusNode,
- minLines: _textWrap ? _rowCount : 1,
- maxLines: _textWrap ? null : _rowCount,
- controller: _controller,
- onEditingComplete: () {
- _onInputChanged(_textStyle!, _controller.text);
- },
- onChanged: (value) {
- _inputTextInfo!.writeOnly = value;
- },
- style: _textStyle,
- ),
- ),
- ),
- ),
- if (_textWrap) ...[
- const FSizedBox(height: 3),
- ],
- if (_inputTextInfo != null &&
- _inputTextInfo!.tag != null &&
- _inputTextInfo!.tag!.elementTagType ==
- ElementTagType.DiagnosticEntry) ...[
- FAlign(
- alignment: Alignment.centerRight,
- child: FContainer(
- margin: const EdgeInsets.only(right: 5),
- child: FButtonGroup(
- spacing: FSpacings.MINI_BUTTON,
- children: [
- FElevatedButton(
- businessParent: widget,
- name: "diagnosticTap",
- onPressed: () {
- FReportInfo.instance.onDiagnosticTap
- .emit(this, _inputTextInfo!.tag!.name ?? '');
- },
- child: FText(FReportInfo.instance.selectEntry),
- style: _buttonStyle),
- FElevatedButton(
- businessParent: widget,
- name: "revoke",
- onPressed: () {
- setState(() {
- _inputTextInfo!.text = '';
- });
- },
- child: FText(FReportInfo.instance.revoke),
- style: _buttonStyle,
- ),
- ],
- ),
- ),
- ),
- ],
- ],
- );
- }
- //onchange 事件
- void _onInputChanged(TextStyle _textStyle, String value) {
- if (_inputTextInfo != null) {
- _inputTextInfo!.text = value;
- }
- }
- @override
- void dispose() {
- _inputTextInfo?.onTextChange.dispose();
- _controller.dispose();
- super.dispose();
- }
- void _initDatas() {
- final inputText = widget.inputText;
- _controller.text = '';
- final inputTextInfo = FReportInfo.instance.getElementInfo(inputText);
- _inputTextInfo = inputTextInfo as InputTextInfo;
- if (_inputTextInfo!.isReadOnly!) {
- if (_inputTextInfo!.tag!.name == TagNames.RPHYSICIAN) {
- _controller.text = FReportInfo.instance.reporter ?? '';
- }
- }
- final fontColor = inputText.fontColor;
- if (fontColor != null) {
- _fontColor = Color.fromARGB(
- fontColor.a!, fontColor.r!, fontColor.g!, fontColor.b!);
- }
- final backgroundColor = inputText.background;
- if (backgroundColor != null) {
- _backgroundColor = Color.fromARGB(backgroundColor.a!, backgroundColor.r!,
- backgroundColor.g!, backgroundColor.b!);
- }
- var sufficIcon = _buildSufficIcon();
- _inputDecoration = InputDecoration(
- contentPadding: EdgeInsets.all(_textWrap ? 8 : 4),
- border: const OutlineInputBorder(),
- suffixIcon: sufficIcon,
- );
- FReportInfo.instance.onReloadFinsh.addListener((sender, e) {
- _initDatas();
- });
- setState(() {});
- }
- void _syncWidth(InputText inputText, String value) {
- final fontSize = _textStyle!.fontSize ?? 18;
- final width = fontSize * value.length + 15;
- if (inputText.tag!.name == TagNames.HOSPITALNAME) {
- if (_lineWidth < width) {
- setState(() {
- if (width < 480) {
- _lineWidth = width;
- _widthLock = true;
- }
- });
- } else if (_controller.text.isEmpty) {
- setState(() {
- //重置长度
- _lineWidth = PtToPxConverter.ptToPx(inputText.lineWidth);
- _widthLock = false;
- });
- } else if (TextSizeConvert.getTextSize(_controller.text, _textStyle!)
- .width >
- inputText.lineWidth!) {
- setState(() {
- if (width < 480) {
- _lineWidth = width;
- _widthLock = true;
- }
- });
- }
- }
- }
- void _initStyle() {
- final inputText = widget.inputText;
- _textStyle ??= TextStyle(
- fontSize: PtToPxConverter.ptToPx(inputText.fontSize),
- color: _fontColor,
- );
- _isReadOnly = inputText.isReadOnly;
- //TODO(Loki):set FontName in TextField
- final fontName = inputText.fontName;
- //TODO(Loki):常规模板暂未设置fontStyles,后续再支持
- final fontStyles = inputText.fontStyles;
- if (!_widthLock) {
- _lineWidth = PtToPxConverter.ptToPx(inputText.lineWidth);
- }
- _widthLock = false;
- _textWrap = inputText.textWrap ?? false;
- _rowCount = _textWrap ? 6 : 1;
- if (_inputTextInfo != null && _inputTextInfo!.text.isNotEmpty) {
- final text = _inputTextInfo!.text;
- _syncWidth(
- widget.inputText,
- text,
- );
- }
- _fontSize = PtToPxConverter.ptToPx(inputText.fontSize);
- _allHeight = _textWrap ? (10 + _fontSize) * (_rowCount!) : _fontSize;
- _allHeight += 10;
- if (_inputTextInfo != null && _textWrap) {
- _allHeight += 16;
- }
- var sufficIcon = _buildSufficIcon();
- _inputDecoration = InputDecoration(
- contentPadding: EdgeInsets.all(_textWrap ? 8 : 4),
- border: const OutlineInputBorder(),
- suffixIcon: sufficIcon,
- );
- }
- void _checkInputTextInfo() {
- try {
- final inputTextInfo =
- FReportInfo.instance.getElementInfo(widget.inputText);
- if (_inputTextInfo != inputTextInfo) {
- if (_inputTextInfo != null) _inputTextInfo!.onTextChange.dispose();
- _inputTextInfo = inputTextInfo as InputTextInfo;
- _addListining();
- } else if (inputTextInfo != null) {
- _inputTextInfo!.onTextChange.dispose();
- _addListining();
- }
- if (!_inputTextInfo!.isListening!) {
- _initDatas();
- _inputTextInfo!.isListening = true;
- }
- if (_inputTextInfo!.text != _controller.text) {
- _controller.text = _inputTextInfo!.text;
- }
- } catch (e) {
- print(e);
- }
- }
- void _addListining() {
- _inputTextInfo!.onTextChange.addListener((sender, e) {
- setState(() {
- _controller.text = e;
- _syncWidth(
- widget.inputText,
- e,
- );
- });
- });
- }
- FWidget? _buildSufficIcon() {
- if (_inputTextInfo == null || _inputTextInfo!.featureTag.isEmpty) {
- return null;
- }
- if (_inputTextInfo!.featureTag.contains(TagNames.SPEECHINPUT)) {
- return FIconButton(
- icon: const FIcon(Icons.mic),
- onPressed: () {
- FReportInfo.instance.onSpeechInput.emit(this, _inputTextInfo!);
- },
- businessParent: widget,
- name: TagNames.SPEECHINPUT,
- );
- }
- return null;
- }
- }
|