mirror of
https://github.com/lospec/pixel-editor.git
synced 2023-08-10 21:12:51 +03:00
Fixed #52
The pixel grid is now disabled when the zoom level is too low; in addition, the thickness of the grid now changes depending on the zoom level.
This commit is contained in:
@ -1,8 +1,8 @@
|
|||||||
const EditorState = (() => {
|
const EditorState = (() => {
|
||||||
let pixelEditorMode = "Basic";
|
let pixelEditorMode = "Basic";
|
||||||
|
|
||||||
Events.on('click', 'switch-editor-mode-splash', function (e) {toggleMode();});
|
Events.on('click', 'switch-editor-mode-splash', chooseMode);
|
||||||
Events.on('click', 'switch-mode-button', function (e) {toggleMode();});
|
Events.on('click', 'switch-mode-button', toggleMode);
|
||||||
|
|
||||||
function getCurrentMode() {
|
function getCurrentMode() {
|
||||||
return pixelEditorMode;
|
return pixelEditorMode;
|
||||||
@ -10,18 +10,13 @@ const EditorState = (() => {
|
|||||||
|
|
||||||
function switchMode(newMode) {
|
function switchMode(newMode) {
|
||||||
//switch to advanced mode
|
//switch to advanced mode
|
||||||
if (newMode == 'Advanced' && pixelEditorMode == 'Basic') {
|
if (newMode == 'Advanced') {
|
||||||
// Switch to advanced ez pez lemon squez
|
|
||||||
document.getElementById('switch-mode-button').innerHTML = 'Switch to basic mode';
|
|
||||||
// Show the layer menus
|
// Show the layer menus
|
||||||
LayerList.getLayerListEntries().style.display = "inline-block";
|
LayerList.getLayerListEntries().style.display = "inline-block";
|
||||||
document.getElementById('layer-button').style.display = 'inline-block';
|
document.getElementById('layer-button').style.display = 'inline-block';
|
||||||
// Hide the palette menu
|
// Hide the palette menu
|
||||||
document.getElementById('colors-menu').style.right = '200px'
|
document.getElementById('colors-menu').style.right = '200px'
|
||||||
|
|
||||||
//change splash text
|
|
||||||
document.querySelector('#sp-quickstart-container .mode-switcher').classList.add('advanced-mode');
|
|
||||||
|
|
||||||
pixelEditorMode = 'Advanced';
|
pixelEditorMode = 'Advanced';
|
||||||
|
|
||||||
//turn pixel grid off
|
//turn pixel grid off
|
||||||
@ -30,7 +25,7 @@ const EditorState = (() => {
|
|||||||
//switch to basic mode
|
//switch to basic mode
|
||||||
else {
|
else {
|
||||||
//if there is a current layer (a document is active)
|
//if there is a current layer (a document is active)
|
||||||
if (currentLayer) {
|
if (Startup.documentCreated()) {
|
||||||
if (!confirm('Switching to basic mode will flatten all the visible layers. Are you sure you want to continue?')) {
|
if (!confirm('Switching to basic mode will flatten all the visible layers. Are you sure you want to continue?')) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -41,9 +36,6 @@ const EditorState = (() => {
|
|||||||
LayerList.flatten(true);
|
LayerList.flatten(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
//change menu text
|
|
||||||
document.getElementById('switch-mode-button').innerHTML = 'Switch to advanced mode';
|
|
||||||
|
|
||||||
// Hide the layer menus
|
// Hide the layer menus
|
||||||
LayerList.getLayerListEntries().style.display = 'none';
|
LayerList.getLayerListEntries().style.display = 'none';
|
||||||
document.getElementById('layer-button').style.display = 'none';
|
document.getElementById('layer-button').style.display = 'none';
|
||||||
@ -51,14 +43,27 @@ const EditorState = (() => {
|
|||||||
document.getElementById('colors-menu').style.display = 'flex';
|
document.getElementById('colors-menu').style.display = 'flex';
|
||||||
// Move the palette menu
|
// Move the palette menu
|
||||||
document.getElementById('colors-menu').style.right = '0px';
|
document.getElementById('colors-menu').style.right = '0px';
|
||||||
|
|
||||||
//change splash text
|
|
||||||
document.querySelector('#sp-quickstart-container .mode-switcher').classList.remove('advanced-mode');
|
|
||||||
|
|
||||||
pixelEditorMode = 'Basic';
|
pixelEditorMode = 'Basic';
|
||||||
togglePixelGrid('off');
|
togglePixelGrid('on');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function chooseMode() {
|
||||||
|
console.log("Here");
|
||||||
|
let prevMode = pixelEditorMode.toLowerCase();
|
||||||
|
|
||||||
|
if (pixelEditorMode === "Basic") {
|
||||||
|
pixelEditorMode = "Advanced";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pixelEditorMode = "Basic";
|
||||||
|
}
|
||||||
|
|
||||||
|
//change splash text
|
||||||
|
document.querySelector('#sp-quickstart-container .mode-switcher').classList.remove(prevMode + '-mode');
|
||||||
|
document.querySelector('#sp-quickstart-container .mode-switcher').classList.add(pixelEditorMode.toLowerCase() + '-mode');
|
||||||
|
}
|
||||||
|
|
||||||
function toggleMode() {
|
function toggleMode() {
|
||||||
if (pixelEditorMode == 'Advanced')
|
if (pixelEditorMode == 'Advanced')
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
const Startup = (() => {
|
const Startup = (() => {
|
||||||
|
|
||||||
let firstPixel = true;
|
let firstPixel = true;
|
||||||
|
let editorMode = "Basic";
|
||||||
let splashPostfix = '';
|
let splashPostfix = '';
|
||||||
|
|
||||||
Events.on('click', 'create-button', create, false);
|
Events.on('click', 'create-button', create, false);
|
||||||
@ -8,23 +9,16 @@ const Startup = (() => {
|
|||||||
|
|
||||||
function create(isSplash) {
|
function create(isSplash) {
|
||||||
// If I'm creating from the splash menu, I append '-splash' so I get the corresponding values
|
// If I'm creating from the splash menu, I append '-splash' so I get the corresponding values
|
||||||
if (isSplash) {
|
if (isSplash)
|
||||||
splashPostfix = '-splash';
|
splashPostfix = '-splash';
|
||||||
}
|
else
|
||||||
else {
|
|
||||||
splashPostfix = '';
|
splashPostfix = '';
|
||||||
}
|
|
||||||
|
|
||||||
var width = Util.getValue('size-width' + splashPostfix);
|
var width = Util.getValue('size-width' + splashPostfix);
|
||||||
var height = Util.getValue('size-height' + splashPostfix);
|
var height = Util.getValue('size-height' + splashPostfix);
|
||||||
var selectedPalette = Util.getText('palette-button' + splashPostfix);
|
var selectedPalette = Util.getText('palette-button' + splashPostfix);
|
||||||
|
|
||||||
newPixel(width, height);
|
newPixel(width, height);
|
||||||
|
|
||||||
// If I'm not creating from the splash page, then this is not the first project I've created
|
|
||||||
if (!isSplash)
|
|
||||||
document.getElementById('new-pixel-warning').style.display = 'block';
|
|
||||||
|
|
||||||
resetInput();
|
resetInput();
|
||||||
|
|
||||||
//track google event
|
//track google event
|
||||||
@ -38,7 +32,7 @@ const Startup = (() => {
|
|||||||
* @param {*} height Start height of the canvas
|
* @param {*} height Start height of the canvas
|
||||||
* @param {*} fileContent If fileContent != null, then the newPixel is being called from the open menu
|
* @param {*} fileContent If fileContent != null, then the newPixel is being called from the open menu
|
||||||
*/
|
*/
|
||||||
function newPixel (width, height, fileContent = null) {
|
function newPixel (width, height, fileContent = null) {
|
||||||
// The palette is empty, at the beginning
|
// The palette is empty, at the beginning
|
||||||
ColorModule.resetPalette();
|
ColorModule.resetPalette();
|
||||||
|
|
||||||
@ -57,9 +51,6 @@ const Startup = (() => {
|
|||||||
// The user is now able to export the Pixel
|
// The user is now able to export the Pixel
|
||||||
document.getElementById('export-button').classList.remove('disabled');
|
document.getElementById('export-button').classList.remove('disabled');
|
||||||
|
|
||||||
// This is not the first Pixel anymore
|
|
||||||
firstPixel = false;
|
|
||||||
|
|
||||||
// Now, if I opened an LPE file
|
// Now, if I opened an LPE file
|
||||||
if (fileContent != null) {
|
if (fileContent != null) {
|
||||||
loadFromLPE(fileContent);
|
loadFromLPE(fileContent);
|
||||||
@ -68,6 +59,11 @@ const Startup = (() => {
|
|||||||
// Selecting the new one
|
// Selecting the new one
|
||||||
layers[1].selectLayer();
|
layers[1].selectLayer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
console.log("Starting with mode " + EditorState.getCurrentMode());
|
||||||
|
EditorState.switchMode(EditorState.getCurrentMode());
|
||||||
|
// This is not the first Pixel anymore
|
||||||
|
firstPixel = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
function initLayers(width, height) {
|
function initLayers(width, height) {
|
||||||
@ -246,10 +242,15 @@ const Startup = (() => {
|
|||||||
return !firstPixel;
|
return !firstPixel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function splashEditorMode(mode) {
|
||||||
|
editorMode = mode;
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
create,
|
create,
|
||||||
newPixel,
|
newPixel,
|
||||||
newFromTemplate,
|
newFromTemplate,
|
||||||
documentCreated
|
documentCreated,
|
||||||
|
splashEditorMode
|
||||||
}
|
}
|
||||||
})();
|
})();
|
@ -4,13 +4,16 @@
|
|||||||
*/
|
*/
|
||||||
function changeZoom (direction, cursorLocation) {
|
function changeZoom (direction, cursorLocation) {
|
||||||
// Computing current width and height
|
// Computing current width and height
|
||||||
var oldWidth = canvasSize[0] * zoom;
|
let oldWidth = canvasSize[0] * zoom;
|
||||||
var oldHeight = canvasSize[1] * zoom;
|
let oldHeight = canvasSize[1] * zoom;
|
||||||
var newWidth, newHeight;
|
let newWidth, newHeight;
|
||||||
|
let prevZoom = zoom;
|
||||||
|
let zoomed = false;
|
||||||
|
|
||||||
//change zoom level
|
//change zoom level
|
||||||
//if you want to zoom out, and the zoom isnt already at the smallest level
|
//if you want to zoom out, and the zoom isnt already at the smallest level
|
||||||
if (direction == 'out' && zoom > 1) {
|
if (direction == 'out' && zoom > 1) {
|
||||||
|
zoomed = true;
|
||||||
zoom -= Math.ceil(zoom / 10);
|
zoom -= Math.ceil(zoom / 10);
|
||||||
newWidth = canvasSize[0] * zoom;
|
newWidth = canvasSize[0] * zoom;
|
||||||
newHeight = canvasSize[1] * zoom;
|
newHeight = canvasSize[1] * zoom;
|
||||||
@ -21,7 +24,8 @@ function changeZoom (direction, cursorLocation) {
|
|||||||
layers[0].canvas.offsetTop + (oldHeight - newHeight) * cursorLocation[1]/oldWidth);
|
layers[0].canvas.offsetTop + (oldHeight - newHeight) * cursorLocation[1]/oldWidth);
|
||||||
}
|
}
|
||||||
//if you want to zoom in
|
//if you want to zoom in
|
||||||
else if (direction == 'in' && zoom + Math.ceil(zoom/10) < window.innerHeight/4){
|
else if (direction == 'in' && zoom + Math.ceil(zoom/10) < window.innerHeight/4) {
|
||||||
|
zoomed = true;
|
||||||
zoom += Math.ceil(zoom/10);
|
zoom += Math.ceil(zoom/10);
|
||||||
newWidth = canvasSize[0] * zoom;
|
newWidth = canvasSize[0] * zoom;
|
||||||
newHeight = canvasSize[1] * zoom;
|
newHeight = canvasSize[1] * zoom;
|
||||||
@ -34,7 +38,23 @@ function changeZoom (direction, cursorLocation) {
|
|||||||
|
|
||||||
//resize canvas
|
//resize canvas
|
||||||
layers[0].resize();
|
layers[0].resize();
|
||||||
|
|
||||||
// adjust brush size
|
// adjust brush size
|
||||||
currentTool.updateCursor();
|
currentTool.updateCursor();
|
||||||
|
|
||||||
|
// Adjust pixel grid thickness
|
||||||
|
if (zoomed) {
|
||||||
|
if (zoom <= 7)
|
||||||
|
disablePixelGrid();
|
||||||
|
else if (zoom >= 20 && direction == 'in') {
|
||||||
|
enablePixelGrid();
|
||||||
|
repaintPixelGrid(zoom - prevZoom);
|
||||||
|
}
|
||||||
|
else if ((prevZoom >= 20 && direction == 'out')) {
|
||||||
|
enablePixelGrid();
|
||||||
|
repaintPixelGrid(zoom - prevZoom);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
enablePixelGrid();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -501,7 +501,6 @@ function updateMiniSlider(hex) {
|
|||||||
function updateMiniPickerSpectrum() {
|
function updateMiniPickerSpectrum() {
|
||||||
let ctx = miniPickerCanvas.getContext('2d');
|
let ctx = miniPickerCanvas.getContext('2d');
|
||||||
let hsv = new Color("hex", colourValue.value).hsv;
|
let hsv = new Color("hex", colourValue.value).hsv;
|
||||||
console.log("Spectrum hex: " + new Color("hex", colourValue.value).hex);
|
|
||||||
let white = new Color("hsv", hsv.h, 0, parseInt(miniPickerSlider.value)).rgb;
|
let white = new Color("hsv", hsv.h, 0, parseInt(miniPickerSlider.value)).rgb;
|
||||||
|
|
||||||
ctx.clearRect(0, 0, miniPickerCanvas.width, miniPickerCanvas.height);
|
ctx.clearRect(0, 0, miniPickerCanvas.width, miniPickerCanvas.height);
|
||||||
|
@ -4,15 +4,37 @@
|
|||||||
let pixelGridColor = "#000000";
|
let pixelGridColor = "#000000";
|
||||||
// Distance between one line and another in HTML pixels
|
// Distance between one line and another in HTML pixels
|
||||||
let lineDistance = 12;
|
let lineDistance = 12;
|
||||||
// The grid is visible by default
|
// The grid is not visible by default
|
||||||
let pixelGridVisible = false;
|
let pixelGridVisible = false;
|
||||||
|
// The grid is enabled, but is disabled in order to save performance with big sprites
|
||||||
|
let pixelGridEnabled = true;
|
||||||
|
// Used to edit lineDistance depending on the zoom level
|
||||||
|
let zoomFactor = 1;
|
||||||
|
|
||||||
|
function disablePixelGrid() {
|
||||||
|
pixelGridEnabled = false;
|
||||||
|
pixelGrid.canvas.style.display = "none";
|
||||||
|
}
|
||||||
|
|
||||||
|
function enablePixelGrid() {
|
||||||
|
pixelGridEnabled = true;
|
||||||
|
pixelGrid.canvas.style.display = "inline-block";
|
||||||
|
}
|
||||||
|
|
||||||
|
function repaintPixelGrid(factor) {
|
||||||
|
lineDistance += factor;
|
||||||
|
console.log("Line distance: " + lineDistance + " zoom: " + zoom);
|
||||||
|
fillPixelGrid();
|
||||||
|
}
|
||||||
|
|
||||||
/** Shows or hides the pixel grid depening on its current visibility
|
/** Shows or hides the pixel grid depening on its current visibility
|
||||||
* (triggered by the show pixel grid button in the top menu)
|
* (triggered by the show pixel grid button in the top menu)
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
function togglePixelGrid(newState) {
|
function togglePixelGrid(newState) {
|
||||||
|
// Ignore the event if the grid is disabled
|
||||||
|
if (!pixelGridEnabled) return;
|
||||||
|
|
||||||
// Getting the button because I have to change its text
|
// Getting the button because I have to change its text
|
||||||
let button = document.getElementById("toggle-pixelgrid-button");
|
let button = document.getElementById("toggle-pixelgrid-button");
|
||||||
|
|
||||||
@ -42,26 +64,26 @@ function fillPixelGrid() {
|
|||||||
|
|
||||||
// The pixelGridCanvas is lineDistance times bigger so that the lines don't take 1 canvas pixel
|
// The pixelGridCanvas is lineDistance times bigger so that the lines don't take 1 canvas pixel
|
||||||
// (which would cover the whole canvas with the pixelGridColour), but they take 1/lineDistance canvas pixels
|
// (which would cover the whole canvas with the pixelGridColour), but they take 1/lineDistance canvas pixels
|
||||||
pixelGrid.canvas.width = originalSize[0] * lineDistance;
|
pixelGrid.canvas.width = originalSize[0] * Math.round(lineDistance);
|
||||||
pixelGrid.canvas.height = originalSize[1] * lineDistance;
|
pixelGrid.canvas.height = originalSize[1] * Math.round(lineDistance);
|
||||||
|
|
||||||
// OPTIMIZABLE, could probably be a bit more elegant
|
// OPTIMIZABLE, could probably be a bit more elegant
|
||||||
// Draw horizontal lines
|
// Draw horizontal lines
|
||||||
for (let i=0; i<pixelGrid.canvas.width / lineDistance; i++) {
|
for (let i=0; i<pixelGrid.canvas.width / Math.round(lineDistance); i++) {
|
||||||
context.strokeStyle = settings.pixelGridColour;
|
context.strokeStyle = settings.pixelGridColour;
|
||||||
|
|
||||||
context.beginPath();
|
context.beginPath();
|
||||||
context.moveTo(i * lineDistance + 0.5, 0);
|
context.moveTo(i * Math.round(lineDistance) + 0.5, 0);
|
||||||
context.lineTo(i * lineDistance + 0.5, originalSize[1] * lineDistance);
|
context.lineTo(i * Math.round(lineDistance) + 0.5, originalSize[1] * Math.round(lineDistance));
|
||||||
context.stroke();
|
context.stroke();
|
||||||
context.closePath();
|
context.closePath();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw vertical lines
|
// Draw vertical lines
|
||||||
for (let i=0; i<pixelGrid.canvas.height / lineDistance; i++) {
|
for (let i=0; i<pixelGrid.canvas.height / Math.round(lineDistance); i++) {
|
||||||
context.beginPath();
|
context.beginPath();
|
||||||
context.moveTo(0, i * lineDistance + 0.5);
|
context.moveTo(0, i * Math.round(lineDistance) + 0.5);
|
||||||
context.lineTo(originalSize[0] * lineDistance, i * lineDistance + 0.5);
|
context.lineTo(originalSize[0] * Math.round(lineDistance), i * Math.round(lineDistance) + 0.5);
|
||||||
context.stroke();
|
context.stroke();
|
||||||
context.closePath();
|
context.closePath();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user