Added store, pixel perfect option init
This commit is contained in:
parent
0ddb9f4918
commit
932e519a35
@ -381,10 +381,3 @@
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style>
|
|
||||||
canvas {
|
|
||||||
image-rendering: pixelated;
|
|
||||||
image-rendering: crisp-edges;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
@ -1 +1,6 @@
|
|||||||
@import 'tailwindcss';
|
@import 'tailwindcss';
|
||||||
|
|
||||||
|
canvas {
|
||||||
|
image-rendering: pixelated;
|
||||||
|
image-rendering: crisp-edges;
|
||||||
|
}
|
||||||
|
@ -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>
|
||||||
|
@ -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) {
|
||||||
|
21
src/stores/useSettingsStore.ts
Normal file
21
src/stores/useSettingsStore.ts
Normal 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,
|
||||||
|
};
|
||||||
|
});
|
Loading…
x
Reference in New Issue
Block a user