function fillTool(editor) { "use strict"; var currentColor; function colorChange(evt) { currentColor = evt.detail; } function simpleFill(startBlock, targetColor, currentColorBias) { var queue, lastRowIndex, block; queue = [startBlock]; lastRowIndex = editor.height * 2 - 1; editor.setBlocks(currentColorBias, currentColor, function (setBlock) { while (queue.length) { block = queue.pop(); if (block.isBlocky && ((block.isUpperHalf && (block.upperBlockColor === targetColor)) || (block.isLowerHalf && (block.lowerBlockColor === targetColor)))) { setBlock(block, currentColor); if (block.blockX > 0) { queue.push(editor.getBlock(block.blockX - 1, block.blockY)); } if (block.blockX < 79) { queue.push(editor.getBlock(block.blockX + 1, block.blockY)); } if (block.blockX > 0) { queue.push(editor.getBlock(block.blockX, block.blockY - 1)); } if (block.blockX < lastRowIndex) { queue.push(editor.getBlock(block.blockX, block.blockY + 1)); } } } }); } function canvasDown(evt) { var targetColor; if (evt.detail.isBlocky) { targetColor = evt.detail.isUpperHalf ? evt.detail.upperBlockColor : evt.detail.lowerBlockColor; if (targetColor !== currentColor) { editor.takeUndoSnapshot(); simpleFill(evt.detail, targetColor, !evt.detail.altKey); } } } function init() { editor.canvas.addEventListener("canvasDown", canvasDown, false); editor.canvas.addEventListener("colorChange", colorChange, false); currentColor = editor.palette.getCurrentColor(); return true; } function remove() { editor.canvas.removeEventListener("canvasDown", canvasDown); editor.canvas.removeEventListener("colorChange", colorChange); } function toString() { return "Fill"; } return { "init": init, "remove": remove, "toString": toString, "uid": "fill" }; } AnsiEditController.addTool(fillTool, "tools-right", 110);