|
@@ -10,6 +10,7 @@ import 'package:fis_measure/process/workspace/measure_data_controller.dart';
|
|
|
import 'package:fis_measure/process/workspace/measure_handler.dart';
|
|
|
import 'package:fis_measure/utils/prompt_box.dart';
|
|
|
import 'package:fis_measure/view/loadding/loadding.dart';
|
|
|
+import 'package:fis_measure/view/measure/operate_type_change_button.dart';
|
|
|
import 'package:fis_measure/view/paint/ai_patint_controller.dart';
|
|
|
import 'package:fis_measure/view/player/controller.dart';
|
|
|
import 'package:fis_ui/index.dart';
|
|
@@ -31,19 +32,18 @@ class FMenuButtonGroup extends FStatefulWidget {
|
|
|
|
|
|
class _FMenuButtonGroupState extends FState<FMenuButtonGroup> {
|
|
|
// 单个按钮高度
|
|
|
- static const double buttonHeight = 42;
|
|
|
+ static const double buttonHeight = 30;
|
|
|
// 按钮外边距
|
|
|
static const double buttonMargin = 10;
|
|
|
// 单个按钮总高度 = Content(42)+Margin(10)
|
|
|
- static const double singleButtonHeight = 52;
|
|
|
+ // static const double singleButtonHeight = buttonHeight + buttonMargin;
|
|
|
// 按钮组宽度
|
|
|
static const double buttonGroupWidth = 60;
|
|
|
// 按钮组容器底部内边距 30 + 30
|
|
|
static const double groupContainerPadding = buttonGroupWidth / 2;
|
|
|
- // 按钮组容器展开的高度
|
|
|
- get countGroupHeight =>
|
|
|
- buildTitleButtonList().length * singleButtonHeight +
|
|
|
- groupContainerPadding * 2;
|
|
|
+
|
|
|
+ /// 获取当前组件最大高度
|
|
|
+ get maxGroupHeight => Get.height - 200;
|
|
|
final application = Get.find<IApplication>();
|
|
|
|
|
|
/// 数据
|
|
@@ -68,7 +68,7 @@ class _FMenuButtonGroupState extends FState<FMenuButtonGroup> {
|
|
|
@override
|
|
|
void initState() {
|
|
|
super.initState();
|
|
|
- groupHeight = countGroupHeight;
|
|
|
+ groupHeight = maxGroupHeight;
|
|
|
measure3DViewController.updatePlayerMode.addListener(_onModeChanged);
|
|
|
}
|
|
|
|
|
@@ -85,7 +85,7 @@ class _FMenuButtonGroupState extends FState<FMenuButtonGroup> {
|
|
|
setState(() {
|
|
|
ifShowModeButton = false;
|
|
|
ifShowVidModeButton = true;
|
|
|
- groupHeight = countGroupHeight;
|
|
|
+ groupHeight = maxGroupHeight;
|
|
|
isExpanded = true;
|
|
|
});
|
|
|
break;
|
|
@@ -93,7 +93,7 @@ class _FMenuButtonGroupState extends FState<FMenuButtonGroup> {
|
|
|
setState(() {
|
|
|
ifShowModeButton = true;
|
|
|
ifShowVidModeButton = false;
|
|
|
- groupHeight = countGroupHeight;
|
|
|
+ groupHeight = maxGroupHeight;
|
|
|
isExpanded = true;
|
|
|
});
|
|
|
break;
|
|
@@ -118,6 +118,7 @@ class _FMenuButtonGroupState extends FState<FMenuButtonGroup> {
|
|
|
i18nBook.measure.clear.t,
|
|
|
() => application.clearRecords(),
|
|
|
),
|
|
|
+ const OperateTypeChangeButton(),
|
|
|
_buildTitleButton(
|
|
|
measureHandler.fullScreenState
|
|
|
? FIcons.fis_full_screen_reduction
|
|
@@ -130,16 +131,6 @@ class _FMenuButtonGroupState extends FState<FMenuButtonGroup> {
|
|
|
setState(() {});
|
|
|
},
|
|
|
),
|
|
|
- _buildTitleButton(
|
|
|
- measureHandler.toolPanelState
|
|
|
- ? Icons.cancel_presentation
|
|
|
- : Icons.present_to_all,
|
|
|
- measureHandler.toolPanelState ? "关闭测量" : "打开测量",
|
|
|
- () {
|
|
|
- measureHandler.toolPanelState = !measureHandler.toolPanelState;
|
|
|
- setState(() {});
|
|
|
- },
|
|
|
- ),
|
|
|
_buildTitleButton(
|
|
|
FIcons.fis_save,
|
|
|
i18nBook.common.save.t,
|
|
@@ -221,27 +212,33 @@ class _FMenuButtonGroupState extends FState<FMenuButtonGroup> {
|
|
|
verticalDirection: VerticalDirection.up,
|
|
|
mainAxisAlignment: MainAxisAlignment.end,
|
|
|
children: [
|
|
|
- QuickFWidget(Transform.translate(
|
|
|
- offset: const Offset(0, -buttonGroupWidth / 2),
|
|
|
- child: FAnimatedContainer(
|
|
|
- duration: const Duration(milliseconds: 300),
|
|
|
- padding: const EdgeInsets.only(
|
|
|
- top: groupContainerPadding,
|
|
|
- bottom: groupContainerPadding / 2,
|
|
|
- ),
|
|
|
- decoration: BoxDecoration(
|
|
|
- borderRadius: const BorderRadius.only(
|
|
|
- bottomLeft: Radius.circular(buttonGroupWidth / 2),
|
|
|
- bottomRight: Radius.circular(buttonGroupWidth / 2),
|
|
|
+ QuickFWidget(
|
|
|
+ Transform.translate(
|
|
|
+ offset: const Offset(0, -buttonGroupWidth / 2),
|
|
|
+ child: FAnimatedContainer(
|
|
|
+ duration: const Duration(milliseconds: 300),
|
|
|
+ padding: const EdgeInsets.only(
|
|
|
+ top: groupContainerPadding,
|
|
|
+ bottom: groupContainerPadding / 2,
|
|
|
),
|
|
|
- color: Colors.grey.withOpacity(0.6),
|
|
|
- ),
|
|
|
- clipBehavior: Clip.hardEdge,
|
|
|
- width: buttonGroupWidth,
|
|
|
- height: groupHeight,
|
|
|
- child: FColumn(
|
|
|
- children: buildTitleButtonList(),
|
|
|
- )))),
|
|
|
+ decoration: BoxDecoration(
|
|
|
+ borderRadius: const BorderRadius.only(
|
|
|
+ bottomLeft: Radius.circular(buttonGroupWidth / 2),
|
|
|
+ bottomRight: Radius.circular(buttonGroupWidth / 2),
|
|
|
+ ),
|
|
|
+ color: Colors.grey.withOpacity(0.6),
|
|
|
+ ),
|
|
|
+ clipBehavior: Clip.antiAlias,
|
|
|
+ width: buttonGroupWidth,
|
|
|
+ // height: groupHeight,
|
|
|
+ constraints: BoxConstraints(
|
|
|
+ maxHeight: groupHeight,
|
|
|
+ ),
|
|
|
+ child: FListView(
|
|
|
+ shrinkWrap: true,
|
|
|
+ children: buildTitleButtonList(),
|
|
|
+ ))),
|
|
|
+ ),
|
|
|
_buildDropDownButton(),
|
|
|
const FSizedBox(height: 10),
|
|
|
],
|
|
@@ -251,27 +248,27 @@ class _FMenuButtonGroupState extends FState<FMenuButtonGroup> {
|
|
|
}
|
|
|
|
|
|
FWidget _buildTitleButton(IconData icon, String title, Function onClick) {
|
|
|
- return FContainer(
|
|
|
- height: buttonHeight,
|
|
|
- margin: const EdgeInsets.only(
|
|
|
- top: buttonMargin,
|
|
|
+ return FCustomLeftTooltip(
|
|
|
+ textStyle: const TextStyle(fontSize: 16, color: Colors.white),
|
|
|
+ height: 36,
|
|
|
+ message: title,
|
|
|
+ verticalOffset: 0,
|
|
|
+ margin: const EdgeInsets.all(0),
|
|
|
+ decoration: BoxDecoration(
|
|
|
+ color: Colors.black.withOpacity(1.0),
|
|
|
+ borderRadius: BorderRadius.circular(4),
|
|
|
),
|
|
|
- child: FInkWell(
|
|
|
- onTap: () => onClick.call(),
|
|
|
- child: Column(
|
|
|
- children: [
|
|
|
- Icon(
|
|
|
- icon,
|
|
|
- color: Colors.white,
|
|
|
- ),
|
|
|
- Text(
|
|
|
- title,
|
|
|
- style: const TextStyle(
|
|
|
- color: Colors.white,
|
|
|
- fontSize: 14,
|
|
|
- ),
|
|
|
- )
|
|
|
- ],
|
|
|
+ child: FContainer(
|
|
|
+ height: buttonHeight,
|
|
|
+ margin: const EdgeInsets.only(
|
|
|
+ top: buttonMargin,
|
|
|
+ ),
|
|
|
+ child: FInkWell(
|
|
|
+ onTap: () => onClick.call(),
|
|
|
+ child: Icon(
|
|
|
+ icon,
|
|
|
+ color: Colors.white,
|
|
|
+ ),
|
|
|
),
|
|
|
),
|
|
|
);
|
|
@@ -282,7 +279,7 @@ class _FMenuButtonGroupState extends FState<FMenuButtonGroup> {
|
|
|
onHover: (isHover) {
|
|
|
if (isHover && !isExpanded) {
|
|
|
setState(() {
|
|
|
- groupHeight = countGroupHeight;
|
|
|
+ groupHeight = maxGroupHeight;
|
|
|
isExpanded = true;
|
|
|
});
|
|
|
}
|
|
@@ -295,7 +292,7 @@ class _FMenuButtonGroupState extends FState<FMenuButtonGroup> {
|
|
|
});
|
|
|
} else {
|
|
|
setState(() {
|
|
|
- groupHeight = countGroupHeight;
|
|
|
+ groupHeight = maxGroupHeight;
|
|
|
isExpanded = true;
|
|
|
});
|
|
|
}
|
|
@@ -351,3 +348,95 @@ class _FMenuButtonGroupState extends FState<FMenuButtonGroup> {
|
|
|
);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+/// TODO:[Gavin] 定制组件,可与主项目的 FCustomRightTooltip 合并整合进 ui lib
|
|
|
+class FCustomLeftTooltip extends FStatefulWidget {
|
|
|
+ const FCustomLeftTooltip({
|
|
|
+ super.key,
|
|
|
+ this.message,
|
|
|
+ this.height,
|
|
|
+ this.padding,
|
|
|
+ this.margin,
|
|
|
+ this.verticalOffset,
|
|
|
+ this.decoration,
|
|
|
+ this.textStyle,
|
|
|
+ this.child,
|
|
|
+ }) : super();
|
|
|
+ final String? message;
|
|
|
+ final double? height;
|
|
|
+ final EdgeInsetsGeometry? padding;
|
|
|
+ final EdgeInsetsGeometry? margin;
|
|
|
+ final double? verticalOffset;
|
|
|
+ final Decoration? decoration;
|
|
|
+ final TextStyle? textStyle;
|
|
|
+ final FWidget? child;
|
|
|
+
|
|
|
+ @override
|
|
|
+ FState<FCustomLeftTooltip> createState() => FCustomRightTooltipState();
|
|
|
+}
|
|
|
+
|
|
|
+class FCustomRightTooltipState extends FState<FCustomLeftTooltip> {
|
|
|
+ OverlayEntry? _entry;
|
|
|
+
|
|
|
+ void _showTooltip() {
|
|
|
+ _createNewEntry();
|
|
|
+ }
|
|
|
+
|
|
|
+ void _createNewEntry() {
|
|
|
+ final OverlayState overlayState = Overlay.of(
|
|
|
+ context,
|
|
|
+ debugRequiredFor: widget,
|
|
|
+ );
|
|
|
+
|
|
|
+ final RenderBox box = context.findRenderObject()! as RenderBox;
|
|
|
+ final RenderBox boxConatiner =
|
|
|
+ overlayState.context.findRenderObject() as RenderBox;
|
|
|
+ final Offset target = box.localToGlobal(
|
|
|
+ box.size.center(Offset.zero),
|
|
|
+ ancestor: overlayState.context.findRenderObject(),
|
|
|
+ );
|
|
|
+ final Offset leftSide = Offset(
|
|
|
+ boxConatiner.size.width - (target.dx - box.size.width / 2),
|
|
|
+ target.dy - (widget.height ?? 26) / 2,
|
|
|
+ );
|
|
|
+ final Widget overlay = Directionality(
|
|
|
+ textDirection: Directionality.of(context),
|
|
|
+ child: Positioned(
|
|
|
+ right: leftSide.dx,
|
|
|
+ top: leftSide.dy,
|
|
|
+ child: Container(
|
|
|
+ decoration: widget.decoration ??
|
|
|
+ BoxDecoration(
|
|
|
+ color: Colors.black.withOpacity(0.7),
|
|
|
+ borderRadius: BorderRadius.circular(4),
|
|
|
+ ),
|
|
|
+ height: widget.height ?? 26,
|
|
|
+ padding: widget.padding ?? const EdgeInsets.symmetric(horizontal: 8),
|
|
|
+ margin: widget.margin ?? const EdgeInsets.only(left: 10),
|
|
|
+ child: Center(
|
|
|
+ child: Text(
|
|
|
+ widget.message ?? '',
|
|
|
+ style: widget.textStyle,
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ );
|
|
|
+ _entry = OverlayEntry(builder: (BuildContext context) => overlay);
|
|
|
+
|
|
|
+ overlayState.insert(_entry!);
|
|
|
+ }
|
|
|
+
|
|
|
+ @override
|
|
|
+ FWidget build(BuildContext context) {
|
|
|
+ return FMouseRegion(
|
|
|
+ onEnter: (event) {
|
|
|
+ _showTooltip();
|
|
|
+ },
|
|
|
+ onExit: (event) => _entry?.remove(),
|
|
|
+ child: FContainer(
|
|
|
+ child: widget.child,
|
|
|
+ ),
|
|
|
+ );
|
|
|
+ }
|
|
|
+}
|