Desktop: Fix window maximize and minimize (#3200)

Fix window maximize and minimize state
This commit is contained in:
Timon
2025-09-20 23:48:47 +00:00
committed by GitHub
parent f4a0f272dd
commit 46d5928724
9 changed files with 44 additions and 40 deletions
+11 -2
View File
@@ -166,10 +166,15 @@ impl App {
graphics_state.set_overlays_scene(scene); graphics_state.set_overlays_scene(scene);
} }
} }
DesktopFrontendMessage::UpdateWindowState { maximized, minimized } => { DesktopFrontendMessage::MinimizeWindow => {
if let Some(window) = &self.window { if let Some(window) = &self.window {
window.set_minimized(true);
}
}
DesktopFrontendMessage::MaximizeWindow => {
if let Some(window) = &self.window {
let maximized = !window.is_maximized();
window.set_maximized(maximized); window.set_maximized(maximized);
window.set_minimized(minimized);
} }
} }
DesktopFrontendMessage::DragWindow => { DesktopFrontendMessage::DragWindow => {
@@ -352,6 +357,10 @@ impl ApplicationHandler for App {
WindowEvent::SurfaceResized(size) => { WindowEvent::SurfaceResized(size) => {
let _ = self.cef_window_size_sender.send(size.into()); let _ = self.cef_window_size_sender.send(size.into());
self.cef_context.notify_of_resize(); self.cef_context.notify_of_resize();
if let Some(window) = &self.window {
let maximized = window.is_maximized();
self.app_event_scheduler.schedule(AppEvent::DesktopWrapperMessage(DesktopWrapperMessage::UpdateMaximized { maximized }));
}
} }
WindowEvent::RedrawRequested => { WindowEvent::RedrawRequested => {
let Some(ref mut graphics_state) = self.graphics_state else { return }; let Some(ref mut graphics_state) = self.graphics_state else { return };
@@ -1,7 +1,7 @@
use graphene_std::Color; use graphene_std::Color;
use graphene_std::raster::Image; use graphene_std::raster::Image;
use graphite_editor::messages::app_window::app_window_message_handler::AppWindowPlatform; use graphite_editor::messages::app_window::app_window_message_handler::AppWindowPlatform;
use graphite_editor::messages::prelude::{AppWindowMessage, DocumentMessage, PortfolioMessage, PreferencesMessage}; use graphite_editor::messages::prelude::{AppWindowMessage, DocumentMessage, FrontendMessage, PortfolioMessage, PreferencesMessage};
use crate::messages::Platform; use crate::messages::Platform;
@@ -118,6 +118,10 @@ pub(super) fn handle_desktop_wrapper_message(dispatcher: &mut DesktopWrapperMess
let message = AppWindowMessage::AppWindowUpdatePlatform { platform }; let message = AppWindowMessage::AppWindowUpdatePlatform { platform };
dispatcher.queue_editor_message(message.into()); dispatcher.queue_editor_message(message.into());
} }
DesktopWrapperMessage::UpdateMaximized { maximized } => {
let message = FrontendMessage::UpdateMaximized { maximized };
dispatcher.queue_editor_message(message.into());
}
DesktopWrapperMessage::LoadDocument { DesktopWrapperMessage::LoadDocument {
id, id,
document, document,
@@ -64,18 +64,18 @@ pub(super) fn intercept_frontend_message(dispatcher: &mut DesktopWrapperMessageD
FrontendMessage::TriggerVisitLink { url } => { FrontendMessage::TriggerVisitLink { url } => {
dispatcher.respond(DesktopFrontendMessage::OpenUrl(url)); dispatcher.respond(DesktopFrontendMessage::OpenUrl(url));
} }
FrontendMessage::UpdateWindowState { maximized, minimized } => {
dispatcher.respond(DesktopFrontendMessage::UpdateWindowState { maximized, minimized });
// Forward this to update the UI
return Some(message);
}
FrontendMessage::DragWindow => { FrontendMessage::DragWindow => {
dispatcher.respond(DesktopFrontendMessage::DragWindow); dispatcher.respond(DesktopFrontendMessage::DragWindow);
} }
FrontendMessage::CloseWindow => { FrontendMessage::CloseWindow => {
dispatcher.respond(DesktopFrontendMessage::CloseWindow); dispatcher.respond(DesktopFrontendMessage::CloseWindow);
} }
FrontendMessage::TriggerMinimizeWindow => {
dispatcher.respond(DesktopFrontendMessage::MinimizeWindow);
}
FrontendMessage::TriggerMaximizeWindow => {
dispatcher.respond(DesktopFrontendMessage::MaximizeWindow);
}
FrontendMessage::TriggerPersistenceWriteDocument { document_id, document, details } => { FrontendMessage::TriggerPersistenceWriteDocument { document_id, document, details } => {
dispatcher.respond(DesktopFrontendMessage::PersistenceWriteDocument { dispatcher.respond(DesktopFrontendMessage::PersistenceWriteDocument {
id: document_id, id: document_id,
+5 -4
View File
@@ -32,10 +32,8 @@ pub enum DesktopFrontendMessage {
height: f32, height: f32,
}, },
UpdateOverlays(vello::Scene), UpdateOverlays(vello::Scene),
UpdateWindowState { MinimizeWindow,
maximized: bool, MaximizeWindow,
minimized: bool,
},
DragWindow, DragWindow,
CloseWindow, CloseWindow,
PersistenceWriteDocument { PersistenceWriteDocument {
@@ -92,6 +90,9 @@ pub enum DesktopWrapperMessage {
}, },
PollNodeGraphEvaluation, PollNodeGraphEvaluation,
UpdatePlatform(Platform), UpdatePlatform(Platform),
UpdateMaximized {
maximized: bool,
},
LoadDocument { LoadDocument {
id: DocumentId, id: DocumentId,
document: Document, document: Document,
@@ -5,8 +5,6 @@ use graphite_proc_macros::{ExtractField, message_handler_data};
#[derive(Debug, Clone, Default, ExtractField)] #[derive(Debug, Clone, Default, ExtractField)]
pub struct AppWindowMessageHandler { pub struct AppWindowMessageHandler {
platform: AppWindowPlatform, platform: AppWindowPlatform,
maximized: bool,
minimized: bool,
} }
#[message_handler_data] #[message_handler_data]
@@ -14,18 +12,10 @@ impl MessageHandler<AppWindowMessage, ()> for AppWindowMessageHandler {
fn process_message(&mut self, message: AppWindowMessage, responses: &mut std::collections::VecDeque<Message>, _: ()) { fn process_message(&mut self, message: AppWindowMessage, responses: &mut std::collections::VecDeque<Message>, _: ()) {
match message { match message {
AppWindowMessage::AppWindowMaximize => { AppWindowMessage::AppWindowMaximize => {
self.maximized = !self.maximized; responses.add(FrontendMessage::TriggerMaximizeWindow);
responses.add(FrontendMessage::UpdateWindowState {
maximized: self.maximized,
minimized: self.minimized,
});
} }
AppWindowMessage::AppWindowMinimize => { AppWindowMessage::AppWindowMinimize => {
self.minimized = !self.minimized; responses.add(FrontendMessage::TriggerMinimizeWindow);
responses.add(FrontendMessage::UpdateWindowState {
maximized: self.maximized,
minimized: self.minimized,
});
} }
AppWindowMessage::AppWindowUpdatePlatform { platform } => { AppWindowMessage::AppWindowUpdatePlatform { platform } => {
self.platform = platform; self.platform = platform;
@@ -120,6 +120,8 @@ pub enum FrontendMessage {
TriggerVisitLink { TriggerVisitLink {
url: String, url: String,
}, },
TriggerMinimizeWindow,
TriggerMaximizeWindow,
// Update prefix: give the frontend a new value or state for it to use // Update prefix: give the frontend a new value or state for it to use
UpdateActiveDocument { UpdateActiveDocument {
@@ -339,9 +341,8 @@ pub enum FrontendMessage {
UpdatePlatform { UpdatePlatform {
platform: AppWindowPlatform, platform: AppWindowPlatform,
}, },
UpdateWindowState { UpdateMaximized {
maximized: bool, maximized: bool,
minimized: bool,
}, },
DragWindow, DragWindow,
CloseWindow, CloseWindow,
+2 -3
View File
@@ -302,9 +302,8 @@ export class UpdatePlatform extends JsMessage {
readonly platform!: AppWindowPlatform; readonly platform!: AppWindowPlatform;
} }
export class UpdateWindowState extends JsMessage { export class UpdateMaximized extends JsMessage {
readonly maximized!: boolean; readonly maximized!: boolean;
readonly minimized!: boolean;
} }
export class CloseWindow extends JsMessage {} export class CloseWindow extends JsMessage {}
@@ -1694,7 +1693,7 @@ export const messageMakers: Record<string, MessageMaker> = {
UpdateLayersPanelControlBarLeftLayout, UpdateLayersPanelControlBarLeftLayout,
UpdateLayersPanelControlBarRightLayout, UpdateLayersPanelControlBarRightLayout,
UpdateLayerWidths, UpdateLayerWidths,
UpdateWindowState, UpdateMaximized,
UpdateMenuBarLayout, UpdateMenuBarLayout,
UpdateMouseCursor, UpdateMouseCursor,
UpdateNodeGraphControlBarLayout, UpdateNodeGraphControlBarLayout,
+3 -3
View File
@@ -1,7 +1,7 @@
import { writable } from "svelte/store"; import { writable } from "svelte/store";
import { type Editor } from "@graphite/editor"; import { type Editor } from "@graphite/editor";
import { type AppWindowPlatform, UpdatePlatform, UpdateViewportHolePunch, UpdateWindowState } from "@graphite/messages"; import { type AppWindowPlatform, UpdatePlatform, UpdateViewportHolePunch, UpdateMaximized as UpdateMaximized } from "@graphite/messages";
export function createAppWindowState(editor: Editor) { export function createAppWindowState(editor: Editor) {
const { subscribe, update } = writable({ const { subscribe, update } = writable({
@@ -17,9 +17,9 @@ export function createAppWindowState(editor: Editor) {
return state; return state;
}); });
}); });
editor.subscriptions.subscribeJsMessage(UpdateWindowState, (updateWindowState) => { editor.subscriptions.subscribeJsMessage(UpdateMaximized, (updateMaximized) => {
update((state) => { update((state) => {
state.maximized = updateWindowState.maximized; state.maximized = updateMaximized.maximized;
return state; return state;
}); });
}); });
+7 -7
View File
@@ -307,13 +307,6 @@ impl EditorHandle {
} }
} }
/// Minimizes the application window to the taskbar or dock
#[wasm_bindgen(js_name = appWindowMinimize)]
pub fn app_window_minimize(&self) {
let message = AppWindowMessage::AppWindowMinimize;
self.dispatch(message);
}
#[wasm_bindgen(js_name = addPrimaryImport)] #[wasm_bindgen(js_name = addPrimaryImport)]
pub fn add_primary_import(&self) { pub fn add_primary_import(&self) {
self.dispatch(DocumentMessage::AddTransaction); self.dispatch(DocumentMessage::AddTransaction);
@@ -338,6 +331,13 @@ impl EditorHandle {
self.dispatch(NodeGraphMessage::AddSecondaryExport); self.dispatch(NodeGraphMessage::AddSecondaryExport);
} }
/// Minimizes the application window to the taskbar or dock
#[wasm_bindgen(js_name = appWindowMinimize)]
pub fn app_window_minimize(&self) {
let message = AppWindowMessage::AppWindowMinimize;
self.dispatch(message);
}
/// Toggles minimizing or restoring down the application window /// Toggles minimizing or restoring down the application window
#[wasm_bindgen(js_name = appWindowMaximize)] #[wasm_bindgen(js_name = appWindowMaximize)]
pub fn app_window_maximize(&self) { pub fn app_window_maximize(&self) {