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) {