drag to Un/Maximize update icon state
This commit is contained in:
parent
3a23365cbb
commit
cf73c04cb3
@ -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
|
||||||
|
@ -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"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user