opt chat window on its overlay, make window focusable as a desktop app
This commit is contained in:
parent
c6269b54af
commit
c306ec3ba7
@ -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))
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user