Squash Odysseus development history

This commit is contained in:
pewdiepie-archdaemon
2026-09-11 06:04:19 +00:00
parent e5c99a5eee
commit 6ee6502010
2050 changed files with 538359 additions and 57745 deletions
+19 -7
View File
@@ -4,6 +4,7 @@
* coordination (close-others + global outside-click).
*
* #ge-undo / #ge-redo / #ge-history-btn
* #ge-compare-btn
* #ge-save-menu-btn + #ge-save-menu (Save / Save as / Download /
* Save project / Load project)
* #ge-zoom-out / #ge-zoom-in / #ge-zoom-fit / #ge-zoom-100
@@ -20,6 +21,7 @@
* undo: () => void,
* redo: () => void,
* toggleHistoryPanel: () => void,
* toggleCompare: () => void,
* fitZoom: () => void,
* applyZoom: () => void,
* exportToGallery: () => void,
@@ -35,9 +37,10 @@
* }} deps
*/
import { state } from './state.js';
import { isLayerPixelLocked, isLayerTransparencyLocked } from './layer-groups.js';
const TOPBAR_MENU_IDS = ['ge-image-menu', 'ge-filter-menu', 'ge-resize-menu', 'ge-save-menu'];
const TOPBAR_TRIGGER_IDS = ['ge-image-menu-btn', 'ge-filter-menu-btn', 'ge-resize-menu-btn', 'ge-save-menu-btn'];
const TOPBAR_MENU_IDS = ['ge-view-menu', 'ge-image-menu', 'ge-selection-menu', 'ge-filter-menu', 'ge-resize-menu', 'ge-save-menu'];
const TOPBAR_TRIGGER_IDS = ['ge-view-menu-btn', 'ge-image-menu-btn', 'ge-selection-menu-btn', 'ge-filter-menu-btn', 'ge-resize-menu-btn', 'ge-save-menu-btn'];
/**
* Close every topbar dropdown except an optional "keep open" one.
@@ -54,7 +57,7 @@ export function closeOtherTopbarMenus(keepId) {
export function wireTopbar(deps) {
const {
undo, redo, toggleHistoryPanel,
undo, redo, toggleHistoryPanel, toggleCompare,
fitZoom, applyZoom,
exportToGallery, downloadPNG, saveProject, loadProjectPrompt,
activeLayer, saveState, applyEdgeFeather, composite,
@@ -65,16 +68,22 @@ export function wireTopbar(deps) {
document.getElementById('ge-undo')?.addEventListener('click', undo);
document.getElementById('ge-redo')?.addEventListener('click', redo);
document.getElementById('ge-history-btn')?.addEventListener('click', toggleHistoryPanel);
document.getElementById('ge-compare-btn')?.addEventListener('click', toggleCompare);
// Save dropdown — "Save ▾" toggles a small menu (Save / Save-as /
// Download / Save project / Load project). Inner items keep their
// original IDs so the standalone handlers below wire to them
// unchanged.
{
const saveBtn = document.getElementById('ge-save-menu-btn');
const saveMenu = document.getElementById('ge-save-menu');
const editorRoot = document.getElementById('gallery-editor-container') || document;
const saveBtn = editorRoot.querySelector('#ge-save-menu-btn');
const saveWrap = saveBtn?.closest('.ge-save-wrap');
const saveMenu = saveWrap?.querySelector('#ge-save-menu');
if (saveBtn && saveMenu) {
const saveTopbar = saveBtn.closest('.ge-topbar');
document.querySelectorAll('body > #ge-save-menu').forEach((menu) => {
if (menu !== saveMenu) menu.remove();
});
// Reparent the menu to <body>. Without this, the menu inherits
// the gallery modal's containing block (the modal applies a
// `transform: scale(...)` for its enter animation — and any
@@ -105,7 +114,7 @@ export function wireTopbar(deps) {
saveMenu.addEventListener('click', () => { setSaveMenuOpen(false); });
window.addEventListener('resize', () => { if (!saveMenu.hidden) positionSaveMenu(); });
registerDocClickAway((e) => {
if (!saveMenu.hidden && !saveMenu.contains(e.target) && e.target !== saveBtn) {
if (!saveMenu.hidden && !saveMenu.contains(e.target) && !saveBtn.contains(e.target)) {
setSaveMenuOpen(false);
}
});
@@ -143,7 +152,10 @@ export function wireTopbar(deps) {
// Edge popup — Width input + Feather / Delete action buttons.
function applyEdgeAction(hardDelete) {
const layer = activeLayer();
if (!layer || layer.locked) { uiModule.showToast('Select an unlocked layer'); return; }
if (!layer || isLayerPixelLocked(state, layer) || isLayerTransparencyLocked(state, layer)) {
uiModule.showToast('Unlock image and transparent pixels before changing edges');
return;
}
const widthInput = document.getElementById('ge-edge-width');
const width = parseInt(widthInput?.value || '8');
if (isNaN(width) || width < 1) { uiModule.showToast('Invalid width'); return; }