mirror of
https://github.com/lospec/pixel-editor.git
synced 2023-08-10 21:12:51 +03:00
Added back line tool
This commit is contained in:
@ -22,15 +22,18 @@ Suggestions / Planned features:
|
|||||||
- Tiled mode
|
- Tiled mode
|
||||||
- Load palette from LPE file
|
- Load palette from LPE file
|
||||||
- Symmetry options (currently being worked on)
|
- Symmetry options (currently being worked on)
|
||||||
|
- Make a palette grid instead of having a huge stack on the right when colours are too many
|
||||||
|
- Possibly add collaborate function
|
||||||
|
|
||||||
|
- Code refactoring
|
||||||
|
- Find inefficient sections (nested loops, useless / inefficient parts)
|
||||||
|
- Create classes ResizableTool and SelectionTool. Make them inherit from Tool, avoid creating brush resizing functions each time for each tool that can be resized
|
||||||
|
|
||||||
- Mobile
|
- Mobile
|
||||||
- Touch equivalent for mouse clicks
|
- Touch equivalent for mouse clicks
|
||||||
- Hide or scale ui
|
- Hide or scale ui
|
||||||
- Maybe rearrange UI on portrait
|
- Maybe rearrange UI on portrait
|
||||||
- Stack colors when too many
|
|
||||||
- Fix popups
|
- Fix popups
|
||||||
|
|
||||||
- Possibly add collaborate function
|
|
||||||
|
|
||||||
- Polish:
|
- Polish:
|
||||||
- ctrl a to select everything / selection -> all, same for deselection
|
- ctrl a to select everything / selection -> all, same for deselection
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
const ToolManager = (() => {
|
const ToolManager = (() => {
|
||||||
brush = new BrushTool("brush", {type: 'html'}, switchTool);
|
brushTool = new BrushTool("brush", {type: 'html'}, switchTool);
|
||||||
eraser = new EraserTool("eraser", {type: 'html'}, switchTool);
|
eraserTool = new EraserTool("eraser", {type: 'html'}, switchTool);
|
||||||
rectangle = new RectangleTool("rectangle", {type: 'html'}, switchTool);
|
rectangleTool = new RectangleTool("rectangle", {type: 'html'}, switchTool);
|
||||||
|
lineTool = new LineTool("line", {type: 'html'}, switchTool);
|
||||||
|
|
||||||
currTool = brush;
|
currTool = brushTool;
|
||||||
|
currTool.onSelect();
|
||||||
|
|
||||||
Events.on("mouseup", window, onMouseUp);
|
Events.on("mouseup", window, onMouseUp);
|
||||||
Events.on("mousemove", window, onMouseMove);
|
Events.on("mousemove", window, onMouseMove);
|
||||||
|
44
js/_line.js
44
js/_line.js
@ -1,44 +0,0 @@
|
|||||||
// LINE TOOL
|
|
||||||
function diagLine(lastMouseClickPos, zoom, cursorLocation) {
|
|
||||||
|
|
||||||
let x0 = Math.floor(lastMouseClickPos[0]/zoom);
|
|
||||||
let y0 = Math.floor(lastMouseClickPos[1]/zoom);
|
|
||||||
let x1 = Math.floor(cursorLocation[0]/zoom);
|
|
||||||
let y1 = Math.floor(cursorLocation[1]/zoom);
|
|
||||||
|
|
||||||
let dx = Math.abs(x1-x0);
|
|
||||||
let dy = Math.abs(y1-y0);
|
|
||||||
let sx = (x0 < x1 ? 1 : -1);
|
|
||||||
let sy = (y0 < y1 ? 1 : -1);
|
|
||||||
let err = dx-dy;
|
|
||||||
|
|
||||||
const brushSize = tool.line.brushSize;
|
|
||||||
|
|
||||||
const canvas = document.getElementById('tmp-canvas');
|
|
||||||
const context = canvas.getContext('2d');
|
|
||||||
|
|
||||||
context.clearRect(0, 0, canvas.width, canvas.height);
|
|
||||||
canvas.style.zIndex = parseInt(currentLayer.canvas.style.zIndex, 10) + 1;
|
|
||||||
|
|
||||||
//console.log(canvas.style.zIndex, currentLayer.canvas.style.zIndex);
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
if (currentTool.name !== 'line') return;
|
|
||||||
|
|
||||||
context.fillRect(x0-Math.floor(brushSize/2), y0-Math.floor(brushSize/2), brushSize, brushSize);
|
|
||||||
|
|
||||||
//if we've reached the end goal, exit the loop
|
|
||||||
if ((x0==x1) && (y0==y1)) break;
|
|
||||||
var e2 = 2*err;
|
|
||||||
|
|
||||||
if (e2 >-dy) {
|
|
||||||
err -=dy;
|
|
||||||
x0+=sx;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (e2 < dx) {
|
|
||||||
err +=dx;
|
|
||||||
y0+=sy;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -45,18 +45,4 @@ Events.on('click',"eyedropper-button", function(){
|
|||||||
//rectangular selection button
|
//rectangular selection button
|
||||||
Events.on('click', "rectselect-button", function(){
|
Events.on('click', "rectselect-button", function(){
|
||||||
tool.rectselect.switchTo();
|
tool.rectselect.switchTo();
|
||||||
}, false);
|
|
||||||
|
|
||||||
//line
|
|
||||||
Events.on('click',"line-button", function(){
|
|
||||||
tool.line.switchTo();
|
|
||||||
}, false);
|
|
||||||
|
|
||||||
Events.on('click',"line-bigger-button", function(){
|
|
||||||
tool.line.brushSize++;
|
|
||||||
}, false);
|
|
||||||
|
|
||||||
Events.on('click',"line-smaller-button", function(){
|
|
||||||
if(tool.line.brushSize > 1)
|
|
||||||
tool.line.brushSize--;
|
|
||||||
}, false);
|
}, false);
|
@ -10,6 +10,7 @@
|
|||||||
//=include Dialogue.js
|
//=include Dialogue.js
|
||||||
//=include History.js
|
//=include History.js
|
||||||
|
|
||||||
|
//=include _drawLine.js
|
||||||
//=include _tools.js
|
//=include _tools.js
|
||||||
//=include tools/*.js
|
//=include tools/*.js
|
||||||
//=include ToolManager.js
|
//=include ToolManager.js
|
||||||
@ -30,9 +31,7 @@
|
|||||||
/**functions**/
|
/**functions**/
|
||||||
//=include _changeZoom.js
|
//=include _changeZoom.js
|
||||||
//=include ColorModule.js
|
//=include ColorModule.js
|
||||||
//=include _drawLine.js
|
|
||||||
//=include _fill.js
|
//=include _fill.js
|
||||||
//=include _line.js
|
|
||||||
//=include _checkerboard.js
|
//=include _checkerboard.js
|
||||||
//=include _copyPaste.js
|
//=include _copyPaste.js
|
||||||
//=include _resizeCanvas.js
|
//=include _resizeCanvas.js
|
||||||
|
@ -0,0 +1,93 @@
|
|||||||
|
class LineTool extends Tool {
|
||||||
|
constructor(name, options, switchFunction) {
|
||||||
|
super(name, options);
|
||||||
|
|
||||||
|
Events.on('click', this.mainButton, switchFunction, this);
|
||||||
|
Events.on('click', this.biggerButton, this.increaseSize.bind(this));
|
||||||
|
Events.on('click', this.smallerButton, this.decreaseSize.bind(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
onStart(mousePos) {
|
||||||
|
super.onStart(mousePos);
|
||||||
|
|
||||||
|
// Putting the tmp layer on top of everything
|
||||||
|
TMPLayer.canvas.style.zIndex = parseInt(currentLayer.canvas.style.zIndex, 10) + 1;
|
||||||
|
|
||||||
|
this.startMousePos[0] = Math.floor(mousePos[0]) + 0.5;
|
||||||
|
this.startMousePos[1] = Math.floor(mousePos[1]) + 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
onDrag(mousePos, cursorTarget) {
|
||||||
|
super.onDrag(mousePos);
|
||||||
|
|
||||||
|
// Drawing the line at the right position
|
||||||
|
this.drawLine(mousePos);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Finishes drawing the rect, decides the end coordinates and moves the preview rectangle to the
|
||||||
|
* current layer
|
||||||
|
*
|
||||||
|
* @param {*} mousePos The position of the mouse when the user stopped dragging
|
||||||
|
*/
|
||||||
|
onEnd(mousePos) {
|
||||||
|
super.onEnd(mousePos);
|
||||||
|
|
||||||
|
const tmpContext = TMPLayer.context;
|
||||||
|
const tmpCanvas = TMPLayer.canvas;
|
||||||
|
// Setting the correct linewidth and colour
|
||||||
|
currentLayer.context.lineWidth = this.currSize;
|
||||||
|
|
||||||
|
// Drawing the line
|
||||||
|
currentLayer.context.drawImage(tmpCanvas, 0, 0);
|
||||||
|
|
||||||
|
// Update the layer preview
|
||||||
|
currentLayer.updateLayerPreview();
|
||||||
|
// Clearing the tmp canvas
|
||||||
|
tmpContext.clearRect(0, 0, TMPLayer.canvas.width, TMPLayer.canvas.height);
|
||||||
|
}
|
||||||
|
|
||||||
|
onSelect() {
|
||||||
|
super.onSelect();
|
||||||
|
}
|
||||||
|
|
||||||
|
onDeselect() {
|
||||||
|
super.onDeselect();
|
||||||
|
}
|
||||||
|
|
||||||
|
drawLine(mousePos) {
|
||||||
|
let x0 = Math.floor(this.startMousePos[0]/zoom);
|
||||||
|
let y0 = Math.floor(this.startMousePos[1]/zoom);
|
||||||
|
let x1 = Math.floor(mousePos[0]/zoom);
|
||||||
|
let y1 = Math.floor(mousePos[1]/zoom);
|
||||||
|
|
||||||
|
let dx = Math.abs(x1-x0);
|
||||||
|
let dy = Math.abs(y1-y0);
|
||||||
|
let sx = (x0 < x1 ? 1 : -1);
|
||||||
|
let sy = (y0 < y1 ? 1 : -1);
|
||||||
|
let err = dx-dy;
|
||||||
|
|
||||||
|
const canvas = document.getElementById('tmp-canvas');
|
||||||
|
const context = canvas.getContext('2d');
|
||||||
|
|
||||||
|
context.clearRect(0, 0, canvas.width, canvas.height);
|
||||||
|
canvas.style.zIndex = parseInt(currentLayer.canvas.style.zIndex, 10) + 1;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
context.fillRect(x0-Math.floor(this.currSize/2), y0-Math.floor(this.currSize/2), this.currSize, this.currSize);
|
||||||
|
|
||||||
|
//if we've reached the end goal, exit the loop
|
||||||
|
if ((x0==x1) && (y0==y1)) break;
|
||||||
|
var e2 = 2*err;
|
||||||
|
|
||||||
|
if (e2 >-dy) {
|
||||||
|
err -=dy;
|
||||||
|
x0+=sx;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e2 < dx) {
|
||||||
|
err +=dx;
|
||||||
|
y0+=sy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -7,7 +7,6 @@ class RectangleTool extends Tool {
|
|||||||
currFillMode = 'empty';
|
currFillMode = 'empty';
|
||||||
|
|
||||||
switchFunction = null;
|
switchFunction = null;
|
||||||
isDrawing = false;
|
|
||||||
|
|
||||||
constructor(name, options, switchFunction) {
|
constructor(name, options, switchFunction) {
|
||||||
super(name, options);
|
super(name, options);
|
||||||
@ -41,8 +40,6 @@ class RectangleTool extends Tool {
|
|||||||
|
|
||||||
// Putting the tmp layer on top of everything
|
// Putting the tmp layer on top of everything
|
||||||
TMPLayer.canvas.style.zIndex = parseInt(currentLayer.canvas.style.zIndex, 10) + 1;
|
TMPLayer.canvas.style.zIndex = parseInt(currentLayer.canvas.style.zIndex, 10) + 1;
|
||||||
// Updating flag
|
|
||||||
this.isDrawing = true;
|
|
||||||
|
|
||||||
this.startMousePos[0] = Math.floor(mousePos[0] / zoom) + 0.5;
|
this.startMousePos[0] = Math.floor(mousePos[0] / zoom) + 0.5;
|
||||||
this.startMousePos[1] = Math.floor(mousePos[1] / zoom) + 0.5;
|
this.startMousePos[1] = Math.floor(mousePos[1] / zoom) + 0.5;
|
||||||
@ -109,8 +106,6 @@ class RectangleTool extends Tool {
|
|||||||
currentLayer.updateLayerPreview();
|
currentLayer.updateLayerPreview();
|
||||||
// Clearing the tmp canvas
|
// Clearing the tmp canvas
|
||||||
tmpContext.clearRect(0, 0, TMPLayer.canvas.width, TMPLayer.canvas.height);
|
tmpContext.clearRect(0, 0, TMPLayer.canvas.width, TMPLayer.canvas.height);
|
||||||
// I finished drawing
|
|
||||||
this.isDrawing = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
onSelect() {
|
onSelect() {
|
@ -6,10 +6,6 @@ new Tool('fill', {
|
|||||||
imageCursor: 'fill',
|
imageCursor: 'fill',
|
||||||
});
|
});
|
||||||
|
|
||||||
new Tool('line', {
|
|
||||||
cursor: 'none',
|
|
||||||
brushPreview: true,
|
|
||||||
});
|
|
||||||
new Tool('resizeline', {
|
new Tool('resizeline', {
|
||||||
cursor: 'default',
|
cursor: 'default',
|
||||||
});
|
});
|
||||||
|
Reference in New Issue
Block a user