import 'package:comunic/ui/screens/call_screen.dart'; import 'package:comunic/ui/widgets/tablet_mode/calls/calls_area.dart'; import 'package:flutter/material.dart'; /// Call window widget /// /// @author Pierre HUBERT const _WindowSize = Size(500, 200); class CallWindowWidget extends StatefulWidget { final int convID; const CallWindowWidget({ Key key, this.convID, }) : assert(convID != null), super(key: key); @override _CallWindowWidgetState createState() => _CallWindowWidgetState(); } class _CallWindowWidgetState extends State { double _left, _top; @override void didChangeDependencies() { super.didChangeDependencies(); // Initialize window coordinates _top = 10; _left = MediaQuery.of(context).size.width - 10 - _WindowSize.width; } @override Widget build(BuildContext context) { return Positioned( width: _WindowSize.width, height: _WindowSize.height, left: _left, top: _top, child: Draggable( child: Card( child: CallScreen( convID: widget.convID, floatingButtons: false, ), ), feedback: Container( width: _WindowSize.width, height: _WindowSize.height, color: Colors.red, ), onDragEnd: _moveEnd, ), ); } /// Compute new window position void _moveEnd(DraggableDetails details) { // Determine the limits of containing stack RenderBox renderBox = context .findAncestorStateOfType() .context .findRenderObject(); final size = renderBox.size; final offset = renderBox.localToGlobal(Offset.zero); // Determine new window position _top = details.offset.dy - offset.dy; _left = details.offset.dx - offset.dx; // Force the window to appear completely on the screen if (_top + _WindowSize.height >= size.height) _top = size.height - _WindowSize.height; if (_left + _WindowSize.width >= size.width) _left = size.width - _WindowSize.width; if (_top < 0) _top = 0; if (_left < 0) _left = 0; setState(() {}); } }