diff --git a/frontend/src/App.svelte b/frontend/src/App.svelte index dd784bb..db39c76 100644 --- a/frontend/src/App.svelte +++ b/frontend/src/App.svelte @@ -9,7 +9,7 @@ import { LoadedFile, PixelsPlaceUndoable, SelectionClearUndoable, SelectionSetUndoable } from './types/file' import "carbon-components-svelte/css/all.css" - import { Tabs, Tab, TabContent, Theme, Button, Modal, Truncate, ButtonSet, NumberInput, Dropdown } from "carbon-components-svelte" + import { Tabs, Tab, TabContent, Theme, Button, Modal, Truncate, ButtonSet, NumberInput, Dropdown, Checkbox, TextInput } from "carbon-components-svelte" import { ComposedModal } from "carbon-components-svelte" import { OverflowMenu, OverflowMenuItem } from "carbon-components-svelte" @@ -25,6 +25,9 @@ import type { PixelPosition } from './types/shapes.js'; import ColorSelector from './components/ColorSelector.svelte'; import ColorIndex from './components/ColorIndex.svelte'; + import CheckerboardSettingsModal from './components/CheckerboardSettingsModal.svelte'; + import GridSettingsModal from './components/GridSettingsModal.svelte'; + import ThemeSettingsModal from './components/ThemeSettingsModal.svelte'; let theme: 'white'|'g10'|'g80'|'g90'|'g100' = 'g90' @@ -82,6 +85,21 @@ let importCanvas: Canvas = null let showPreview: boolean = false + let showGridSettings: boolean = false + let showCheckerboardSettings: boolean = false + let showThemeSettings: boolean = false + + let showGrid: boolean = true + let showCheckerboard: boolean = true + + let gridMajorSize: number = 16 + let gridMinorSize: number = 8 + let gridMajorColor: string = '#0000ff' + let gridMinorColor: string = '#006666' + + let checkerboardSize: number = 8 + let checkerboardColor1: string = '#888888' + let checkerboardColor2: string = '#444444' let toolSelection = new SelectionTool() let toolMagicWand = new MagicWandTool() @@ -199,6 +217,18 @@ Redo   + +
View
+ + e.stopPropagation()} bind:checked={showGrid} labelText="Grid" /> + + showGridSettings = true} /> + + e.stopPropagation()} bind:checked={showCheckerboard} labelText="Checkerboard" /> + + showCheckerboardSettings = true} /> + showThemeSettings = true} /> +
Windows
showPreview = true}/> @@ -277,7 +307,7 @@ selectFile(file, index)} /> - + {/each} @@ -288,11 +318,21 @@ label="Stack Preview" noPadding bind:open={showPreview} - > + > {/if} + {#if showGridSettings} + + {/if} + {#if showCheckerboardSettings} + + {/if} + {#if showThemeSettings} + + {/if} + + import { Column, Grid, Modal, NumberInput, Row, TextInput } from "carbon-components-svelte"; + + export let size: number = 8 + export let color1: string = "#888888" + export let color2: string = "#444444" + + let pendingSize: number = size + let pendingColor1: string = color1 + let pendingColor2: string = color2 + + $: { + pendingSize = size + pendingColor1 = color1 + pendingColor2 = color2 + } + + let changed: boolean = false + $: { + changed = size !== pendingSize || color1 !== pendingColor1 || color2 !== pendingColor2 + } + + export let open: boolean = false + + + open = false} + on:click:button--secondary={() => open = false} + on:submit={() => { + size = pendingSize + color1 = pendingColor1 + color2 = pendingColor2 + open = false + }} + primaryButtonDisabled={!changed} +> + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/src/components/GridSettingsModal.svelte b/frontend/src/components/GridSettingsModal.svelte new file mode 100644 index 0000000..f7fd199 --- /dev/null +++ b/frontend/src/components/GridSettingsModal.svelte @@ -0,0 +1,62 @@ + + + open = false} + on:click:button--secondary={() => open = false} + on:submit={() => { + majorSize = pendingMajorSize + minorSize = pendingMinorSize + majorColor = pendingMajorColor + minorColor = pendingMinorColor + open = false + }} + primaryButtonDisabled={!changed} +> + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/src/components/ThemeSettingsModal.svelte b/frontend/src/components/ThemeSettingsModal.svelte new file mode 100644 index 0000000..f6302d7 --- /dev/null +++ b/frontend/src/components/ThemeSettingsModal.svelte @@ -0,0 +1,55 @@ + + + open = false} + on:click:button--secondary={() => open = false} + on:submit={() => { + theme = pendingId + open = false + }} + primaryButtonDisabled={!changed} +> + +
+
+ + \ No newline at end of file diff --git a/frontend/src/sections/Editor2D.svelte b/frontend/src/sections/Editor2D.svelte index f671dbf..f0d4839 100644 --- a/frontend/src/sections/Editor2D.svelte +++ b/frontend/src/sections/Editor2D.svelte @@ -14,7 +14,14 @@ export let layer: data.Layer export let refresh: {} + export let showCheckerboard: boolean = true export let checkerboardSize: number = 8 + export let checkerboardColor1: string = '#888888' + export let checkerboardColor2: string = '#444444' + + $: ((...args) => { + canvasDirty = true + })(showCheckerboard, checkerboardSize, checkerboardColor1, checkerboardColor2) let offsetX: number let offsetY: number @@ -174,16 +181,16 @@ ctx.save() ctx.imageSmoothingEnabled = false ctx.scale(zoom, zoom) - { + if (showCheckerboard) { ctx.beginPath() - ctx.fillStyle = '#888888' + ctx.fillStyle = checkerboardColor1 ctx.rect(offsetX, offsetY, file.canvas.width, file.canvas.height) ctx.fill() let rows = file.canvas.height / checkerboardSize let cols = file.canvas.width / checkerboardSize ctx.beginPath() - ctx.fillStyle = '#444444' + ctx.fillStyle = checkerboardColor2 for (let r = 0; r < rows; r++) { for (let c = 0; c < cols; c++) { if (r % 2 === 0 && c % 2 === 1 || r % 2 === 1 && c % 2 === 0) {