fix can't update isMaximized IconButton via double click title logo

This commit is contained in:
csf 2022-10-17 19:37:00 +09:00
parent 516ff4221b
commit 76581d46f2

View File

@ -191,6 +191,8 @@ class DesktopTab extends StatelessWidget {
final DesktopTabController controller; final DesktopTabController controller;
Rx<DesktopTabState> get state => controller.state; Rx<DesktopTabState> get state => controller.state;
final isMaximized = false.obs;
late final DesktopTabType tabType; late final DesktopTabType tabType;
late final bool isMainWindow; late final bool isMainWindow;
@ -297,8 +299,10 @@ class DesktopTab extends StatelessWidget {
width: 78, width: 78,
)), )),
GestureDetector( GestureDetector(
onDoubleTap: () => onDoubleTap: showMaximize
showMaximize ? toggleMaximize(isMainWindow) : null, ? () => toggleMaximize(isMainWindow)
.then((value) => isMaximized.value = value)
: null,
onPanStart: (_) => startDragging(isMainWindow), onPanStart: (_) => startDragging(isMainWindow),
child: Row(children: [ child: Row(children: [
Offstage( Offstage(
@ -331,6 +335,7 @@ class DesktopTab extends StatelessWidget {
tabType: tabType, tabType: tabType,
state: state, state: state,
tail: tail, tail: tail,
isMaximized: isMaximized,
showMinimize: showMinimize, showMinimize: showMinimize,
showMaximize: showMaximize, showMaximize: showMaximize,
showClose: showClose, showClose: showClose,
@ -345,6 +350,7 @@ class WindowActionPanel extends StatefulWidget {
final bool isMainWindow; final bool isMainWindow;
final DesktopTabType tabType; final DesktopTabType tabType;
final Rx<DesktopTabState> state; final Rx<DesktopTabState> state;
final RxBool isMaximized;
final bool showMinimize; final bool showMinimize;
final bool showMaximize; final bool showMaximize;
@ -357,6 +363,7 @@ class WindowActionPanel extends StatefulWidget {
required this.isMainWindow, required this.isMainWindow,
required this.tabType, required this.tabType,
required this.state, required this.state,
required this.isMaximized,
this.tail, this.tail,
this.showMinimize = true, this.showMinimize = true,
this.showMaximize = true, this.showMaximize = true,
@ -372,30 +379,31 @@ class WindowActionPanel extends StatefulWidget {
class WindowActionPanelState extends State<WindowActionPanel> class WindowActionPanelState extends State<WindowActionPanel>
with MultiWindowListener, WindowListener { with MultiWindowListener, WindowListener {
bool isMaximized = false;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
DesktopMultiWindow.addListener(this); DesktopMultiWindow.addListener(this);
windowManager.addListener(this); windowManager.addListener(this);
if (widget.isMainWindow) { Future.delayed(Duration(milliseconds: 500), () {
windowManager.isMaximized().then((maximized) { if (widget.isMainWindow) {
if (isMaximized != maximized) { windowManager.isMaximized().then((maximized) {
WidgetsBinding.instance.addPostFrameCallback( if (widget.isMaximized.value != maximized) {
(_) => setState(() => isMaximized = maximized)); WidgetsBinding.instance.addPostFrameCallback(
} (_) => setState(() => widget.isMaximized.value = maximized));
}); }
} else { });
final wc = WindowController.fromWindowId(windowId!); } else {
wc.isMaximized().then((maximized) { final wc = WindowController.fromWindowId(windowId!);
if (isMaximized != maximized) { wc.isMaximized().then((maximized) {
WidgetsBinding.instance.addPostFrameCallback( debugPrint("isMaximized $maximized");
(_) => setState(() => isMaximized = maximized)); if (widget.isMaximized.value != maximized) {
} WidgetsBinding.instance.addPostFrameCallback(
}); (_) => setState(() => widget.isMaximized.value = maximized));
} }
});
}
});
} }
@override @override
@ -408,8 +416,8 @@ class WindowActionPanelState extends State<WindowActionPanel>
@override @override
void onWindowMaximize() { void onWindowMaximize() {
// catch maximize from system // catch maximize from system
if (!isMaximized) { if (!widget.isMaximized.value) {
setState(() => isMaximized = true); widget.isMaximized.value = true;
} }
super.onWindowMaximize(); super.onWindowMaximize();
} }
@ -417,8 +425,8 @@ class WindowActionPanelState extends State<WindowActionPanel>
@override @override
void onWindowUnmaximize() { void onWindowUnmaximize() {
// catch unmaximize from system // catch unmaximize from system
if (isMaximized) { if (widget.isMaximized.value) {
setState(() => isMaximized = false); widget.isMaximized.value = false;
} }
super.onWindowUnmaximize(); super.onWindowUnmaximize();
} }
@ -450,12 +458,14 @@ class WindowActionPanelState extends State<WindowActionPanel>
)), )),
Offstage( Offstage(
offstage: !widget.showMaximize, offstage: !widget.showMaximize,
child: ActionIcon( child: Obx(() => ActionIcon(
message: isMaximized ? "Restore" : "Maximize", message: widget.isMaximized.value ? "Restore" : "Maximize",
icon: isMaximized ? IconFont.restore : IconFont.max, icon: widget.isMaximized.value
onTap: _toggleMaximize, ? IconFont.restore
isClose: false, : IconFont.max,
)), onTap: _toggleMaximize,
isClose: false,
))),
Offstage( Offstage(
offstage: !widget.showClose, offstage: !widget.showClose,
child: ActionIcon( child: ActionIcon(
@ -482,9 +492,9 @@ class WindowActionPanelState extends State<WindowActionPanel>
void _toggleMaximize() { void _toggleMaximize() {
toggleMaximize(widget.isMainWindow).then((maximize) { toggleMaximize(widget.isMainWindow).then((maximize) {
if (isMaximized != maximize) { if (widget.isMaximized.value != maximize) {
// setState for sub window, wc.unmaximize/maximize() will not invoke onWindowMaximize/Unmaximize // update state for sub window, wc.unmaximize/maximize() will not invoke onWindowMaximize/Unmaximize
setState(() => isMaximized = !isMaximized); widget.isMaximized.value = maximize;
} }
}); });
} }