mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-09-21 03:18:12 +08:00
* Migrate Specta to Tsify to auto-generate messages.ts, working except colors and widgets * Adopt the generated FillColor/Color/GradientStops * Fix widget typing * Separate WidgetGroup enum variants into wrapper structs * Small rename * Simplify widgets further * Clean up message type references * Switch type imports to the auto-generated file * Remove lowercase serde rename * Fix FillChoice deserialization * Fix small regression from #3837 * Improve type safety * Make WidgetSpan type-safe * More cleanup and type safety * More type safety * More type safety * Get the rest to type-check without errors; improve widget builder macro to have optional icons; improve Svelte 5 configs * Cargo fmt * Fix imports * Update outdated readme info * Fix lint command rename references * Fix typos * One more typos fix * Remove unnecessary dep: prefix from the edited Cargo.toml files * Remove excess parts from Cargo.toml * Fix compiling on desktop * Revert "Remove excess parts from Cargo.toml" This reverts commit 6b711117b3a5d5d8a3ee20f36a43bc74930b7c82. * Update dev docs with simpler, more accurate instructions
64 lines
1.6 KiB
TypeScript
64 lines
1.6 KiB
TypeScript
import { writable } from "svelte/store";
|
|
|
|
import type { Editor } from "@graphite/editor";
|
|
|
|
export function createFullscreenState(editor: Editor) {
|
|
// Experimental Keyboard API: https://developer.mozilla.org/en-US/docs/Web/API/Navigator/keyboard
|
|
const keyboardLockApiSupported: Readonly<boolean> = navigator.keyboard !== undefined && "lock" in navigator.keyboard;
|
|
|
|
const { subscribe, update } = writable({
|
|
windowFullscreen: false,
|
|
keyboardLocked: false,
|
|
keyboardLockApiSupported,
|
|
});
|
|
|
|
function fullscreenModeChanged() {
|
|
update((state) => {
|
|
state.windowFullscreen = Boolean(document.fullscreenElement);
|
|
if (!state.windowFullscreen) state.keyboardLocked = false;
|
|
return state;
|
|
});
|
|
}
|
|
|
|
async function enterFullscreen() {
|
|
await document.documentElement.requestFullscreen();
|
|
|
|
if (keyboardLockApiSupported && navigator.keyboard) {
|
|
await navigator.keyboard.lock(["ControlLeft", "ControlRight"]);
|
|
|
|
update((state) => {
|
|
state.keyboardLocked = true;
|
|
return state;
|
|
});
|
|
}
|
|
}
|
|
|
|
async function exitFullscreen() {
|
|
await document.exitFullscreen();
|
|
}
|
|
|
|
async function toggleFullscreen() {
|
|
return new Promise((resolve, reject) => {
|
|
update((state) => {
|
|
if (state.windowFullscreen) exitFullscreen().then(resolve).catch(reject);
|
|
else enterFullscreen().then(resolve).catch(reject);
|
|
|
|
return state;
|
|
});
|
|
});
|
|
}
|
|
|
|
editor.subscriptions.subscribeFrontendMessage("WindowFullscreen", () => {
|
|
toggleFullscreen();
|
|
});
|
|
|
|
return {
|
|
subscribe,
|
|
fullscreenModeChanged,
|
|
enterFullscreen,
|
|
exitFullscreen,
|
|
toggleFullscreen,
|
|
};
|
|
}
|
|
export type FullscreenState = ReturnType<typeof createFullscreenState>;
|