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 DesktopTabType tabType;
final Rx<DesktopTabState> state;
@ -371,17 +371,79 @@ class WindowActionPanel extends StatelessWidget {
this.onClose})
: 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
Widget build(BuildContext context) {
return Row(
children: [
Offstage(
offstage: !showMinimize,
offstage: !widget.showMinimize,
child: ActionIcon(
message: 'Minimize',
icon: IconFont.min,
onTap: () {
if (mainTab) {
if (widget.mainTab) {
windowManager.minimize();
} else {
WindowController.fromWindowId(windowId!).minimize();
@ -389,56 +451,40 @@ class WindowActionPanel extends StatelessWidget {
},
isClose: false,
)),
// TODO: drag makes window restore
Offstage(
offstage: !showMaximize,
child: FutureBuilder(builder: (context, snapshot) {
RxBool isMaximized = false.obs;
if (mainTab) {
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: () {
if (mainTab) {
if (isMaximized.value) {
windowManager.unmaximize();
} else {
windowManager.maximize();
}
} else {
// TODO: subwindow is maximized but first query result is not maximized.
final wc = WindowController.fromWindowId(windowId!);
if (isMaximized.value) {
wc.unmaximize();
} else {
wc.maximize();
}
}
isMaximized.value = !isMaximized.value;
},
isClose: false,
),
);
})),
offstage: !widget.showMaximize,
child: ActionIcon(
message: isMaximized ? "Restore" : "Maximize",
icon: isMaximized ? IconFont.restore : IconFont.max,
onTap: () {
if (widget.mainTab) {
if (isMaximized) {
windowManager.unmaximize();
} else {
windowManager.maximize();
}
} else {
final wc = WindowController.fromWindowId(windowId!);
if (isMaximized) {
wc.unmaximize();
} else {
wc.maximize();
}
}
// setState for sub window, wc.unmaximize/maximize() will not invoke onWindowMaximize/Unmaximize
setState(() => isMaximized = !isMaximized);
},
isClose: false,
)),
Offstage(
offstage: !showClose,
offstage: !widget.showClose,
child: ActionIcon(
message: 'Close',
icon: IconFont.close,
onTap: () async {
final res = await onClose?.call() ?? true;
final res = await widget.onClose?.call() ?? true;
if (res) {
if (mainTab) {
if (widget.mainTab) {
windowManager.close();
} else {
// only hide for multi window, not close

View File

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