single_select.dart 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. import 'package:fis_lib_report/converts/pt_to_px_converter.dart';
  2. import 'package:fis_lib_report/report/singleSelected.dart';
  3. import 'package:fis_lib_report/report_info/report_info.dart';
  4. import 'package:fis_lib_report/report_info/single_selected_info.dart';
  5. import 'package:flutter/material.dart';
  6. import 'package:dropdown_button2/dropdown_button2.dart';
  7. class RSingleSelected extends StatefulWidget {
  8. SingleSelected singleSelected;
  9. RSingleSelected(this.singleSelected);
  10. @override
  11. State<StatefulWidget> createState() {
  12. return _RSingleSelectState();
  13. }
  14. }
  15. class _RSingleSelectState extends State<RSingleSelected> {
  16. late SingleSelected singleSelected;
  17. _RSingleSelectState();
  18. String _value = '';
  19. List<String>? _items = [];
  20. SingleSelectedInfo? _singleSelectedInfo;
  21. @override
  22. initState() {
  23. super.initState();
  24. }
  25. @override
  26. Widget build(BuildContext context) {
  27. singleSelected = widget.singleSelected;
  28. final selectInfo = ReportInfo.instance.getElementInfo(singleSelected);
  29. if (selectInfo != null && _singleSelectedInfo != selectInfo) {
  30. _singleSelectedInfo = selectInfo as SingleSelectedInfo;
  31. _singleSelectedInfo!.onSelectedChange.addListener((sender, e) {
  32. if (_singleSelectedInfo!.items!.contains(e)) {
  33. setState(() {
  34. _value = _singleSelectedInfo!.selectedItem;
  35. });
  36. }
  37. });
  38. }
  39. if (singleSelected.items!.isNotEmpty) {
  40. _items = singleSelected.items;
  41. }
  42. if (_items!.isEmpty) {
  43. return const SizedBox();
  44. }
  45. var buttonDecoration = BoxDecoration(
  46. border: Border.all(color: Colors.grey, width: 0.8),
  47. borderRadius: BorderRadius.circular(0),
  48. color: Colors.white,
  49. );
  50. if (_singleSelectedInfo!.selectedItem.isNotEmpty &&
  51. _singleSelectedInfo!.selectedItem != _value) {
  52. _value = _singleSelectedInfo!.selectedItem;
  53. }
  54. return SizedBox(
  55. height: 24,
  56. child: DropdownButtonHideUnderline(
  57. child: DropdownButton2<String>(
  58. dropdownMaxHeight: 280,
  59. buttonWidth: PtToPxConverter.ptToPx(singleSelected.lineWidth),
  60. itemHeight: 28,
  61. itemPadding: const EdgeInsets.symmetric(horizontal: 4, vertical: 2),
  62. isExpanded: false,
  63. dropdownOverButton: false,
  64. scrollbarAlwaysShow: true,
  65. scrollbarThickness: 4,
  66. scrollbarRadius: const Radius.circular(2),
  67. buttonPadding: const EdgeInsets.symmetric(horizontal: 4, vertical: 2),
  68. dropdownDecoration: BoxDecoration(
  69. borderRadius: BorderRadius.circular(4),
  70. ),
  71. buttonDecoration: buttonDecoration,
  72. offset: const Offset(0, -4),
  73. selectedItemHighlightColor: Theme.of(context).secondaryHeaderColor,
  74. selectedItemBuilder: (_) => _items!
  75. .map((e) => _OptionRow(
  76. singleSelected,
  77. e,
  78. height: 22,
  79. ))
  80. .toList(),
  81. value: _value.isEmpty ? null : _value,
  82. items: buildItems(),
  83. onChanged: (v) {
  84. setState(() {
  85. if (_singleSelectedInfo != null) {
  86. _singleSelectedInfo!.selectedItem = v!;
  87. }
  88. _value = v!;
  89. });
  90. },
  91. ),
  92. ),
  93. );
  94. }
  95. List<DropdownMenuItem<String>> buildItems() {
  96. return _items!.map((String e) {
  97. final active = e == _value;
  98. return DropdownMenuItem<String>(
  99. child: _OptionRow(singleSelected, e, isActive: active),
  100. value: e,
  101. );
  102. }).toList();
  103. }
  104. }
  105. class _OptionRow extends StatelessWidget {
  106. _OptionRow(
  107. this.singleSelected,
  108. this.label, {
  109. Key? key,
  110. this.isActive = false,
  111. this.height,
  112. }) : super(key: key);
  113. SingleSelected singleSelected;
  114. final String label;
  115. final bool isActive;
  116. final double? height;
  117. @override
  118. Widget build(BuildContext context) {
  119. final color = singleSelected.fontColor!;
  120. final background = singleSelected.background!;
  121. final text = Text(
  122. label,
  123. style: TextStyle(
  124. backgroundColor: Color.fromARGB(
  125. background.a!, background.r!, background.g!, background.b!),
  126. fontSize: PtToPxConverter.ptToPx(singleSelected.fontSize),
  127. color: Color.fromARGB(color.a!, color.r!, color.g!, color.b!),
  128. ),
  129. );
  130. if (height != null) {
  131. return Container(
  132. alignment: Alignment.centerLeft,
  133. height: height,
  134. child: text,
  135. );
  136. } else {
  137. return text;
  138. }
  139. }
  140. }