drag to Un/Maximize update icon state

This commit is contained in:
csf 2022-10-14 10:48:33 +09:00
parent 3a23365cbb
commit cf73c04cb3
2 changed files with 94 additions and 48 deletions

View File

@ -350,7 +350,7 @@ class DesktopTab extends StatelessWidget {
} }
} }
class WindowActionPanel extends StatelessWidget { class WindowActionPanel extends StatefulWidget {
final bool mainTab; final bool mainTab;
final DesktopTabType tabType; final DesktopTabType tabType;
final Rx<DesktopTabState> state; final Rx<DesktopTabState> state;
@ -371,17 +371,79 @@ class WindowActionPanel extends StatelessWidget {
this.onClose}) this.onClose})
: super(key: key); : super(key: key);
@override
State<StatefulWidget> createState() {
return WindowActionPanelState();
}
}
class WindowActionPanelState extends State<WindowActionPanel>
with MultiWindowListener, WindowListener {
bool isMaximized = false;
@override
void initState() {
super.initState();
DesktopMultiWindow.addListener(this);
windowManager.addListener(this);
// TODO init window can't detect isMaximized
if (widget.mainTab) {
windowManager.isMaximized().then((maximized) {
debugPrint("init main maximized: $maximized");
if (isMaximized != maximized) {
WidgetsBinding.instance.addPostFrameCallback(
(_) => setState(() => isMaximized = maximized));
}
});
} else {
final wc = WindowController.fromWindowId(windowId!);
wc.isMaximized().then((maximized) {
debugPrint("init sun maximized: $maximized");
if (isMaximized != maximized) {
WidgetsBinding.instance.addPostFrameCallback(
(_) => setState(() => isMaximized = maximized));
}
});
}
}
@override
void dispose() {
DesktopMultiWindow.removeListener(this);
windowManager.removeListener(this);
super.dispose();
}
@override
void onWindowMaximize() {
// catch maximize from system
if (!isMaximized) {
setState(() => isMaximized = true);
}
super.onWindowMaximize();
}
@override
void onWindowUnmaximize() {
// catch unmaximize from system
if (isMaximized) {
setState(() => isMaximized = false);
}
super.onWindowUnmaximize();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Row( return Row(
children: [ children: [
Offstage( Offstage(
offstage: !showMinimize, offstage: !widget.showMinimize,
child: ActionIcon( child: ActionIcon(
message: 'Minimize', message: 'Minimize',
icon: IconFont.min, icon: IconFont.min,
onTap: () { onTap: () {
if (mainTab) { if (widget.mainTab) {
windowManager.minimize(); windowManager.minimize();
} else { } else {
WindowController.fromWindowId(windowId!).minimize(); WindowController.fromWindowId(windowId!).minimize();
@ -389,56 +451,40 @@ class WindowActionPanel extends StatelessWidget {
}, },
isClose: false, isClose: false,
)), )),
// TODO: drag makes window restore
Offstage( Offstage(
offstage: !showMaximize, offstage: !widget.showMaximize,
child: FutureBuilder(builder: (context, snapshot) { child: ActionIcon(
RxBool isMaximized = false.obs; message: isMaximized ? "Restore" : "Maximize",
if (mainTab) { icon: isMaximized ? IconFont.restore : IconFont.max,
windowManager.isMaximized().then((maximized) {
isMaximized.value = maximized;
});
} else {
final wc = WindowController.fromWindowId(windowId!);
wc.isMaximized().then((maximized) {
isMaximized.value = maximized;
});
}
return Obx(
() => ActionIcon(
message: isMaximized.value ? "Restore" : "Maximize",
icon: isMaximized.value ? IconFont.restore : IconFont.max,
onTap: () { onTap: () {
if (mainTab) { if (widget.mainTab) {
if (isMaximized.value) { if (isMaximized) {
windowManager.unmaximize(); windowManager.unmaximize();
} else { } else {
windowManager.maximize(); windowManager.maximize();
} }
} else { } else {
// TODO: subwindow is maximized but first query result is not maximized.
final wc = WindowController.fromWindowId(windowId!); final wc = WindowController.fromWindowId(windowId!);
if (isMaximized.value) { if (isMaximized) {
wc.unmaximize(); wc.unmaximize();
} else { } else {
wc.maximize(); wc.maximize();
} }
} }
isMaximized.value = !isMaximized.value; // setState for sub window, wc.unmaximize/maximize() will not invoke onWindowMaximize/Unmaximize
setState(() => isMaximized = !isMaximized);
}, },
isClose: false, isClose: false,
), )),
);
})),
Offstage( Offstage(
offstage: !showClose, offstage: !widget.showClose,
child: ActionIcon( child: ActionIcon(
message: 'Close', message: 'Close',
icon: IconFont.close, icon: IconFont.close,
onTap: () async { onTap: () async {
final res = await onClose?.call() ?? true; final res = await widget.onClose?.call() ?? true;
if (res) { if (res) {
if (mainTab) { if (widget.mainTab) {
windowManager.close(); windowManager.close();
} else { } else {
// only hide for multi window, not close // only hide for multi window, not close

View File

@ -243,8 +243,8 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
path: "." path: "."
ref: "0019311e8aba4e84ffd44c57ba1834cc76924f2a" ref: c09d65018f402dd0d6073149fe6705185101a270
resolved-ref: "0019311e8aba4e84ffd44c57ba1834cc76924f2a" resolved-ref: c09d65018f402dd0d6073149fe6705185101a270
url: "https://github.com/Kingtous/rustdesk_desktop_multi_window" url: "https://github.com/Kingtous/rustdesk_desktop_multi_window"
source: git source: git
version: "0.1.0" version: "0.1.0"