Line data Source code
1 : import 'dart:convert'; 2 : 3 : import 'package:flutter/widgets.dart'; 4 : import 'package:flutter_ume/flutter_ume.dart'; 5 : import 'package:flutter_ume_kit_ui/components/hit_test.dart'; 6 : import 'icon.dart' as icon; 7 : 8 : class WidgetInfoInspector extends StatefulWidget implements Pluggable { 9 2 : const WidgetInfoInspector({Key? key}) : super(key: key); 10 : 11 1 : @override 12 1 : _WidgetInfoInspectorState createState() => _WidgetInfoInspectorState(); 13 : 14 1 : @override 15 : Widget buildWidget(BuildContext? context) => this; 16 : 17 1 : @override 18 : String get name => 'WidgetInfo'; 19 : 20 0 : @override 21 : String get displayName => 'WidgetInfo'; 22 : 23 1 : @override 24 : void onTrigger() {} 25 : 26 1 : @override 27 : ImageProvider<Object> get iconImageProvider => 28 2 : MemoryImage(base64Decode(icon.iconData)); 29 : } 30 : 31 : class _WidgetInfoInspectorState extends State<WidgetInfoInspector> 32 : with WidgetsBindingObserver { 33 1 : _WidgetInfoInspectorState() 34 2 : : selection = WidgetInspectorService.instance.selection; 35 : 36 : final window = WidgetsBinding.instance!.window; 37 : 38 : Offset? _lastPointerLocation; 39 : 40 : final InspectorSelection selection; 41 : 42 1 : void _inspectAt(Offset? position) { 43 : final List<RenderObject> selected = 44 1 : HitTest.hitTest(position, edgeHitMargin: 2.0); 45 2 : setState(() { 46 2 : selection.candidates = selected; 47 : }); 48 : } 49 : 50 1 : void _handlePanDown(DragDownDetails event) { 51 2 : _lastPointerLocation = event.globalPosition; 52 2 : _inspectAt(event.globalPosition); 53 : } 54 : 55 0 : void _handlePanEnd(DragEndDetails details) { 56 : final Rect bounds = 57 0 : (Offset.zero & (window.physicalSize / window.devicePixelRatio)) 58 0 : .deflate(1.0); 59 0 : if (!bounds.contains(_lastPointerLocation!)) { 60 0 : setState(() { 61 0 : selection.clear(); 62 : }); 63 : } 64 : } 65 : 66 1 : void _handleTap() { 67 1 : if (_lastPointerLocation != null) { 68 2 : _inspectAt(_lastPointerLocation); 69 : } 70 : } 71 : 72 1 : @override 73 : void initState() { 74 1 : super.initState(); 75 2 : selection.clear(); 76 : } 77 : 78 1 : @override 79 : Widget build(BuildContext context) { 80 1 : List<Widget> children = <Widget>[]; 81 1 : GestureDetector gesture = GestureDetector( 82 1 : onTap: _handleTap, 83 1 : onPanDown: _handlePanDown, 84 1 : onPanEnd: _handlePanEnd, 85 : behavior: HitTestBehavior.opaque, 86 1 : child: IgnorePointer( 87 1 : child: Container( 88 3 : width: MediaQuery.of(context).size.width, 89 3 : height: MediaQuery.of(context).size.height)), 90 : ); 91 1 : children.add(gesture); 92 3 : children.add(InspectorOverlay(selection: selection)); 93 1 : return Stack(children: children, textDirection: TextDirection.ltr); 94 : } 95 : }