Desktop: Fix window maximize and minimize (#3200)

Fix window maximize and minimize state
This commit is contained in:
Timon 2025-09-20 16:48:47 -07:00 committed by GitHub
parent f4a0f272dd
commit 46d5928724
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 44 additions and 40 deletions

View File

@ -166,10 +166,15 @@ impl App {
graphics_state.set_overlays_scene(scene);
}
}
DesktopFrontendMessage::UpdateWindowState { maximized, minimized } => {
DesktopFrontendMessage::MinimizeWindow => {
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_minimized(minimized);
}
}
DesktopFrontendMessage::DragWindow => {
@ -352,6 +357,10 @@ impl ApplicationHandler for App {
WindowEvent::SurfaceResized(size) => {
let _ = self.cef_window_size_sender.send(size.into());
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 => {
let Some(ref mut graphics_state) = self.graphics_state else { return };

View File

@ -1,7 +1,7 @@
use graphene_std::Color;
use graphene_std::raster::Image;
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;
@ -118,6 +118,10 @@ pub(super) fn handle_desktop_wrapper_message(dispatcher: &mut DesktopWrapperMess
let message = AppWindowMessage::AppWindowUpdatePlatform { platform };
dispatcher.queue_editor_message(message.into());
}
DesktopWrapperMessage::UpdateMaximized { maximized } => {
let message = FrontendMessage::UpdateMaximized { maximized };
dispatcher.queue_editor_message(message.into());
}
DesktopWrapperMessage::LoadDocument {
id,
document,

View File

@ -64,18 +64,18 @@ pub(super) fn intercept_frontend_message(dispatcher: &mut DesktopWrapperMessageD
FrontendMessage::TriggerVisitLink { 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 => {
dispatcher.respond(DesktopFrontendMessage::DragWindow);
}
FrontendMessage::CloseWindow => {
dispatcher.respond(DesktopFrontendMessage::CloseWindow);
}
FrontendMessage::TriggerMinimizeWindow => {
dispatcher.respond(DesktopFrontendMessage::MinimizeWindow);
}
FrontendMessage::TriggerMaximizeWindow => {
dispatcher.respond(DesktopFrontendMessage::MaximizeWindow);
}
FrontendMessage::TriggerPersistenceWriteDocument { document_id, document, details } => {
dispatcher.respond(DesktopFrontendMessage::PersistenceWriteDocument {
id: document_id,

View File

@ -32,10 +32,8 @@ pub enum DesktopFrontendMessage {
height: f32,
},
UpdateOverlays(vello::Scene),
UpdateWindowState {
maximized: bool,
minimized: bool,
},
MinimizeWindow,
MaximizeWindow,
DragWindow,
CloseWindow,
PersistenceWriteDocument {
@ -92,6 +90,9 @@ pub enum DesktopWrapperMessage {
},
PollNodeGraphEvaluation,
UpdatePlatform(Platform),
UpdateMaximized {
maximized: bool,
},
LoadDocument {
id: DocumentId,
document: Document,

View File

@ -5,8 +5,6 @@ use graphite_proc_macros::{ExtractField, message_handler_data};
#[derive(Debug, Clone, Default, ExtractField)]
pub struct AppWindowMessageHandler {
platform: AppWindowPlatform,
maximized: bool,
minimized: bool,
}
#[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>, _: ()) {
match message {
AppWindowMessage::AppWindowMaximize => {
self.maximized = !self.maximized;
responses.add(FrontendMessage::UpdateWindowState {
maximized: self.maximized,
minimized: self.minimized,
});
responses.add(FrontendMessage::TriggerMaximizeWindow);
}
AppWindowMessage::AppWindowMinimize => {
self.minimized = !self.minimized;
responses.add(FrontendMessage::UpdateWindowState {
maximized: self.maximized,
minimized: self.minimized,
});
responses.add(FrontendMessage::TriggerMinimizeWindow);
}
AppWindowMessage::AppWindowUpdatePlatform { platform } => {
self.platform = platform;

View File

@ -120,6 +120,8 @@ pub enum FrontendMessage {
TriggerVisitLink {
url: String,
},
TriggerMinimizeWindow,
TriggerMaximizeWindow,
// Update prefix: give the frontend a new value or state for it to use
UpdateActiveDocument {
@ -339,9 +341,8 @@ pub enum FrontendMessage {
UpdatePlatform {
platform: AppWindowPlatform,
},
UpdateWindowState {
UpdateMaximized {
maximized: bool,
minimized: bool,
},
DragWindow,
CloseWindow,

View File

@ -302,9 +302,8 @@ export class UpdatePlatform extends JsMessage {
readonly platform!: AppWindowPlatform;
}
export class UpdateWindowState extends JsMessage {
export class UpdateMaximized extends JsMessage {
readonly maximized!: boolean;
readonly minimized!: boolean;
}
export class CloseWindow extends JsMessage {}
@ -1694,7 +1693,7 @@ export const messageMakers: Record<string, MessageMaker> = {
UpdateLayersPanelControlBarLeftLayout,
UpdateLayersPanelControlBarRightLayout,
UpdateLayerWidths,
UpdateWindowState,
UpdateMaximized,
UpdateMenuBarLayout,
UpdateMouseCursor,
UpdateNodeGraphControlBarLayout,

View File

@ -1,7 +1,7 @@
import { writable } from "svelte/store";
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) {
const { subscribe, update } = writable({
@ -17,9 +17,9 @@ export function createAppWindowState(editor: Editor) {
return state;
});
});
editor.subscriptions.subscribeJsMessage(UpdateWindowState, (updateWindowState) => {
editor.subscriptions.subscribeJsMessage(UpdateMaximized, (updateMaximized) => {
update((state) => {
state.maximized = updateWindowState.maximized;
state.maximized = updateMaximized.maximized;
return state;
});
});

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)]
pub fn add_primary_import(&self) {
self.dispatch(DocumentMessage::AddTransaction);
@ -338,6 +331,13 @@ impl EditorHandle {
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
#[wasm_bindgen(js_name = appWindowMaximize)]
pub fn app_window_maximize(&self) {