Merge pull request #1740 from Heap-Hop/master

update file transfer and chat page
This commit is contained in:
RustDesk
2022-10-18 08:53:08 +08:00
committed by GitHub
7 changed files with 335 additions and 259 deletions

View File

@@ -191,6 +191,8 @@ class DesktopTab extends StatelessWidget {
final DesktopTabController controller;
Rx<DesktopTabState> get state => controller.state;
final isMaximized = false.obs;
late final DesktopTabType tabType;
late final bool isMainWindow;
@@ -299,8 +301,10 @@ class DesktopTab extends StatelessWidget {
width: 78,
)),
GestureDetector(
onDoubleTap: () =>
showMaximize ? toggleMaximize(isMainWindow) : null,
onDoubleTap: showMaximize
? () => toggleMaximize(isMainWindow)
.then((value) => isMaximized.value = value)
: null,
onPanStart: (_) => startDragging(isMainWindow),
child: Row(children: [
Offstage(
@@ -333,6 +337,7 @@ class DesktopTab extends StatelessWidget {
tabType: tabType,
state: state,
tail: tail,
isMaximized: isMaximized,
showMinimize: showMinimize,
showMaximize: showMaximize,
showClose: showClose,
@@ -347,6 +352,7 @@ class WindowActionPanel extends StatefulWidget {
final bool isMainWindow;
final DesktopTabType tabType;
final Rx<DesktopTabState> state;
final RxBool isMaximized;
final bool showMinimize;
final bool showMaximize;
@@ -359,6 +365,7 @@ class WindowActionPanel extends StatefulWidget {
required this.isMainWindow,
required this.tabType,
required this.state,
required this.isMaximized,
this.tail,
this.showMinimize = true,
this.showMaximize = true,
@@ -374,30 +381,31 @@ class WindowActionPanel extends StatefulWidget {
class WindowActionPanelState extends State<WindowActionPanel>
with MultiWindowListener, WindowListener {
bool isMaximized = false;
@override
void initState() {
super.initState();
DesktopMultiWindow.addListener(this);
windowManager.addListener(this);
if (widget.isMainWindow) {
windowManager.isMaximized().then((maximized) {
if (isMaximized != maximized) {
WidgetsBinding.instance.addPostFrameCallback(
(_) => setState(() => isMaximized = maximized));
}
});
} else {
final wc = WindowController.fromWindowId(windowId!);
wc.isMaximized().then((maximized) {
if (isMaximized != maximized) {
WidgetsBinding.instance.addPostFrameCallback(
(_) => setState(() => isMaximized = maximized));
}
});
}
Future.delayed(Duration(milliseconds: 500), () {
if (widget.isMainWindow) {
windowManager.isMaximized().then((maximized) {
if (widget.isMaximized.value != maximized) {
WidgetsBinding.instance.addPostFrameCallback(
(_) => setState(() => widget.isMaximized.value = maximized));
}
});
} else {
final wc = WindowController.fromWindowId(windowId!);
wc.isMaximized().then((maximized) {
debugPrint("isMaximized $maximized");
if (widget.isMaximized.value != maximized) {
WidgetsBinding.instance.addPostFrameCallback(
(_) => setState(() => widget.isMaximized.value = maximized));
}
});
}
});
}
@override
@@ -410,8 +418,8 @@ class WindowActionPanelState extends State<WindowActionPanel>
@override
void onWindowMaximize() {
// catch maximize from system
if (!isMaximized) {
setState(() => isMaximized = true);
if (!widget.isMaximized.value) {
widget.isMaximized.value = true;
}
super.onWindowMaximize();
}
@@ -419,8 +427,8 @@ class WindowActionPanelState extends State<WindowActionPanel>
@override
void onWindowUnmaximize() {
// catch unmaximize from system
if (isMaximized) {
setState(() => isMaximized = false);
if (widget.isMaximized.value) {
widget.isMaximized.value = false;
}
super.onWindowUnmaximize();
}
@@ -452,12 +460,14 @@ class WindowActionPanelState extends State<WindowActionPanel>
)),
Offstage(
offstage: !widget.showMaximize,
child: ActionIcon(
message: isMaximized ? "Restore" : "Maximize",
icon: isMaximized ? IconFont.restore : IconFont.max,
onTap: _toggleMaximize,
isClose: false,
)),
child: Obx(() => ActionIcon(
message: widget.isMaximized.value ? "Restore" : "Maximize",
icon: widget.isMaximized.value
? IconFont.restore
: IconFont.max,
onTap: _toggleMaximize,
isClose: false,
))),
Offstage(
offstage: !widget.showClose,
child: ActionIcon(
@@ -484,9 +494,9 @@ class WindowActionPanelState extends State<WindowActionPanel>
void _toggleMaximize() {
toggleMaximize(widget.isMainWindow).then((maximize) {
if (isMaximized != maximize) {
// setState for sub window, wc.unmaximize/maximize() will not invoke onWindowMaximize/Unmaximize
setState(() => isMaximized = !isMaximized);
if (widget.isMaximized.value != maximize) {
// update state for sub window, wc.unmaximize/maximize() will not invoke onWindowMaximize/Unmaximize
widget.isMaximized.value = maximize;
}
});
}
@@ -801,13 +811,15 @@ class ActionIcon extends StatelessWidget {
final IconData icon;
final Function() onTap;
final bool isClose;
const ActionIcon({
Key? key,
required this.message,
required this.icon,
required this.onTap,
required this.isClose,
}) : super(key: key);
final double? size;
const ActionIcon(
{Key? key,
required this.message,
required this.icon,
required this.onTap,
required this.isClose,
this.size})
: super(key: key);
@override
Widget build(BuildContext context) {
@@ -822,8 +834,8 @@ class ActionIcon extends StatelessWidget {
onHover: (value) => hover.value = value,
onTap: onTap,
child: SizedBox(
height: _kTabBarHeight - 1,
width: _kTabBarHeight - 1,
height: size ?? (_kTabBarHeight - 1),
width: size ?? (_kTabBarHeight - 1),
child: Icon(
icon,
color: hover.value && isClose