Added store, pixel perfect option init

This commit is contained in:
Dennis Postma 2025-04-06 01:29:49 +02:00
parent 0ddb9f4918
commit 932e519a35
5 changed files with 46 additions and 19 deletions

View File

@ -381,10 +381,3 @@
}); });
}; };
</script> </script>
<style>
canvas {
image-rendering: pixelated;
image-rendering: crisp-edges;
}
</style>

View File

@ -1 +1,6 @@
@import 'tailwindcss'; @import 'tailwindcss';
canvas {
image-rendering: pixelated;
image-rendering: crisp-edges;
}

View File

@ -2,7 +2,7 @@
<div class="space-y-4"> <div class="space-y-4">
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<div class="flex items-center"> <div class="flex items-center">
<input id="pixel-perfect" type="checkbox" v-model="pixelPerfect" class="mr-2" @change="drawCanvas" /> <input id="pixel-perfect" type="checkbox" v-model="settingsStore.pixelPerfect" class="mr-2" @change="drawCanvas" />
<label for="pixel-perfect">Pixel perfect rendering (for pixel art)</label> <label for="pixel-perfect">Pixel perfect rendering (for pixel art)</label>
</div> </div>
</div> </div>
@ -15,6 +15,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, onMounted, watch, computed } from 'vue'; import { ref, onMounted, watch, computed } from 'vue';
import { useSettingsStore } from '@/stores/useSettingsStore';
interface Sprite { interface Sprite {
id: string; id: string;
@ -34,8 +35,8 @@
(e: 'updateSprite', id: string, x: number, y: number): void; (e: 'updateSprite', id: string, x: number, y: number): void;
}>(); }>();
// Pixel art optimization // Get settings from store
const pixelPerfect = ref(true); const settingsStore = useSettingsStore();
const canvasRef = ref<HTMLCanvasElement | null>(null); const canvasRef = ref<HTMLCanvasElement | null>(null);
const ctx = ref<CanvasRenderingContext2D | null>(null); const ctx = ref<CanvasRenderingContext2D | null>(null);
@ -194,8 +195,8 @@
// Clear canvas // Clear canvas
ctx.value.clearRect(0, 0, canvasRef.value.width, canvasRef.value.height); ctx.value.clearRect(0, 0, canvasRef.value.width, canvasRef.value.height);
// Disable image smoothing // Disable image smoothing based on pixel perfect setting
ctx.value.imageSmoothingEnabled = false; ctx.value.imageSmoothingEnabled = !settingsStore.pixelPerfect;
// Draw grid // Draw grid
ctx.value.strokeStyle = '#e5e7eb'; ctx.value.strokeStyle = '#e5e7eb';
@ -227,4 +228,5 @@
watch(() => props.sprites, drawCanvas, { deep: true }); watch(() => props.sprites, drawCanvas, { deep: true });
watch(() => props.columns, drawCanvas); watch(() => props.columns, drawCanvas);
watch(() => settingsStore.pixelPerfect, drawCanvas);
</script> </script>

View File

@ -45,6 +45,11 @@
<input type="checkbox" v-model="showAllSprites" class="w-4 h-4 text-blue-500 focus:ring-blue-400 rounded border-gray-300" /> <input type="checkbox" v-model="showAllSprites" class="w-4 h-4 text-blue-500 focus:ring-blue-400 rounded border-gray-300" />
<span class="text-sm whitespace-nowrap">Hide sprites</span> <span class="text-sm whitespace-nowrap">Hide sprites</span>
</label> </label>
<label class="flex items-center gap-2 cursor-pointer">
<input type="checkbox" v-model="settingsStore.pixelPerfect" class="w-4 h-4 text-blue-500 focus:ring-blue-400 rounded border-gray-300" @change="drawPreviewCanvas" />
<span class="text-sm whitespace-nowrap">Pixel perfect</span>
</label>
</div> </div>
</div> </div>
</div> </div>
@ -115,6 +120,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, onMounted, watch, onUnmounted, computed } from 'vue'; import { ref, onMounted, watch, onUnmounted, computed } from 'vue';
import { useSettingsStore } from '@/stores/useSettingsStore';
interface Sprite { interface Sprite {
id: string; id: string;
@ -154,12 +160,11 @@
const dragStartY = ref(0); const dragStartY = ref(0);
const spritePosBeforeDrag = ref({ x: 0, y: 0 }); const spritePosBeforeDrag = ref({ x: 0, y: 0 });
// Computed properties
const totalFrames = computed(() => props.sprites.length);
// Add this after other refs // Add this after other refs
const hiddenFrames = ref<number[]>([]); const hiddenFrames = ref<number[]>([]);
const pixelPerfect = ref(true);
// Get settings from store
const settingsStore = useSettingsStore();
// Add these computed properties // Add these computed properties
const visibleFrames = computed(() => props.sprites.filter((_, index) => !hiddenFrames.value.includes(index))); const visibleFrames = computed(() => props.sprites.filter((_, index) => !hiddenFrames.value.includes(index)));
@ -190,8 +195,8 @@
const { maxWidth, maxHeight } = calculateMaxDimensions(); const { maxWidth, maxHeight } = calculateMaxDimensions();
// Apply pixel art optimization consistently // Apply pixel art optimization consistently from store
ctx.value.imageSmoothingEnabled = !pixelPerfect.value; ctx.value.imageSmoothingEnabled = !settingsStore.pixelPerfect;
// Set canvas size to just fit one sprite cell // Set canvas size to just fit one sprite cell
previewCanvasRef.value.width = maxWidth; previewCanvasRef.value.width = maxWidth;
@ -217,7 +222,7 @@
} }
// Keep pixel art optimization consistent throughout all drawing operations // Keep pixel art optimization consistent throughout all drawing operations
ctx.value.imageSmoothingEnabled = !pixelPerfect.value; ctx.value.imageSmoothingEnabled = !settingsStore.pixelPerfect;
// Draw all sprites with transparency if enabled // Draw all sprites with transparency if enabled
if (showAllSprites.value && props.sprites.length > 1) { if (showAllSprites.value && props.sprites.length > 1) {
@ -399,6 +404,7 @@
watch(isDraggable, drawPreviewCanvas); watch(isDraggable, drawPreviewCanvas);
watch(showAllSprites, drawPreviewCanvas); watch(showAllSprites, drawPreviewCanvas);
watch(hiddenFrames, drawPreviewCanvas); watch(hiddenFrames, drawPreviewCanvas);
watch(() => settingsStore.pixelPerfect, drawPreviewCanvas);
// Initial draw // Initial draw
if (props.sprites.length > 0) { if (props.sprites.length > 0) {

View File

@ -0,0 +1,21 @@
import { defineStore } from 'pinia';
import { ref } from 'vue';
const pixelPerfect = ref(true);
export const useSettingsStore = defineStore('settings', () => {
// Actions
function togglePixelPerfect() {
pixelPerfect.value = !pixelPerfect.value;
}
function setPixelPerfect(value: boolean) {
pixelPerfect.value = value;
}
return {
pixelPerfect,
togglePixelPerfect,
setPixelPerfect,
};
});