opt chat window on its overlay, make window focusable as a desktop app

This commit is contained in:
csf 2023-02-06 09:54:21 +09:00
parent c6269b54af
commit c306ec3ba7
2 changed files with 61 additions and 34 deletions

View File

@ -1,6 +1,7 @@
import 'package:auto_size_text/auto_size_text.dart'; import 'package:auto_size_text/auto_size_text.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_hbb/common.dart'; import 'package:flutter_hbb/common.dart';
import 'package:get/get_state_manager/src/rx_flutter/rx_obx_widget.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../../consts.dart'; import '../../consts.dart';
@ -91,28 +92,31 @@ class DraggableChatWindow extends StatelessWidget {
bottom: BorderSide( bottom: BorderSide(
color: Theme.of(context).hintColor.withOpacity(0.4)))), color: Theme.of(context).hintColor.withOpacity(0.4)))),
height: 38, height: 38,
child: Row( child: Obx(() => Opacity(
mainAxisAlignment: MainAxisAlignment.spaceBetween, opacity: chatModel.isWindowFocus.value ? 1.0 : 0.4,
children: [ child: Row(
Padding( mainAxisAlignment: MainAxisAlignment.spaceBetween,
padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 8), children: [
child: Row(children: [ Padding(
Icon(Icons.chat_bubble_outline, padding:
size: 20, color: Theme.of(context).colorScheme.primary), const EdgeInsets.symmetric(horizontal: 15, vertical: 8),
SizedBox(width: 6), child: Row(children: [
Text(translate("Chat")) Icon(Icons.chat_bubble_outline,
])), size: 20, color: Theme.of(context).colorScheme.primary),
Padding( SizedBox(width: 6),
padding: EdgeInsets.all(2), Text(translate("Chat"))
child: ActionIcon( ])),
message: 'Close', Padding(
icon: IconFont.close, padding: EdgeInsets.all(2),
onTap: chatModel.hideChatWindowOverlay, child: ActionIcon(
isClose: true, message: 'Close',
boxSize: 32, icon: IconFont.close,
)) onTap: chatModel.hideChatWindowOverlay,
], isClose: true,
), boxSize: 32,
))
],
))),
); );
} }
} }
@ -304,15 +308,17 @@ class _DraggableState extends State<Draggable> {
if (widget.checkKeyboard) { if (widget.checkKeyboard) {
checkKeyboard(); checkKeyboard();
} }
if (widget.checkKeyboard) { if (widget.checkScreenSize) {
checkScreenSize(); checkScreenSize();
} }
return Positioned( return Stack(children: [
top: _position.dy, Positioned(
left: _position.dx, top: _position.dy,
width: widget.width, left: _position.dx,
height: widget.height, width: widget.width,
child: widget.builder(context, onPanUpdate)); height: widget.height,
child: widget.builder(context, onPanUpdate))
]);
} }
} }

View File

@ -4,6 +4,8 @@ import 'package:dash_chat_2/dash_chat_2.dart';
import 'package:draggable_float_widget/draggable_float_widget.dart'; import 'package:draggable_float_widget/draggable_float_widget.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_hbb/models/platform_model.dart'; import 'package:flutter_hbb/models/platform_model.dart';
import 'package:get/get_rx/src/rx_types/rx_types.dart';
import 'package:get/get_state_manager/src/rx_flutter/rx_obx_widget.dart';
import 'package:window_manager/window_manager.dart'; import 'package:window_manager/window_manager.dart';
import '../consts.dart'; import '../consts.dart';
@ -37,6 +39,8 @@ class ChatModel with ChangeNotifier {
OverlayEntry? chatWindowOverlayEntry; OverlayEntry? chatWindowOverlayEntry;
bool isConnManager = false; bool isConnManager = false;
RxBool isWindowFocus = true.obs;
final ChatUser me = ChatUser( final ChatUser me = ChatUser(
id: "", id: "",
firstName: "Me", firstName: "Me",
@ -133,11 +137,28 @@ class ChatModel with ChangeNotifier {
final overlayState = _getOverlayState(); final overlayState = _getOverlayState();
if (overlayState == null) return; if (overlayState == null) return;
final overlay = OverlayEntry(builder: (context) { final overlay = OverlayEntry(builder: (context) {
return DraggableChatWindow( bool innerClicked = false;
position: const Offset(20, 80), return Listener(
width: 250, onPointerDown: (_) {
height: 350, if (!innerClicked) {
chatModel: this); isWindowFocus.value = false;
}
innerClicked = false;
},
child: Obx(() => Container(
color: isWindowFocus.value ? Colors.red.withOpacity(0.3) : null,
child: Listener(
onPointerDown: (_) {
innerClicked = true;
if (!isWindowFocus.value) {
isWindowFocus.value = true;
}
},
child: DraggableChatWindow(
position: const Offset(20, 80),
width: 250,
height: 350,
chatModel: this)))));
}); });
overlayState.insert(overlay); overlayState.insert(overlay);
chatWindowOverlayEntry = overlay; chatWindowOverlayEntry = overlay;