mirror of
https://github.com/IgorTimofeev/MineOS.git
synced 2025-12-20 11:09:21 +01:00
212 lines
6.9 KiB
Lua
212 lines
6.9 KiB
Lua
|
|
local GUI = require("GUI")
|
|
local screen = require("Screen")
|
|
local image = require("Image")
|
|
|
|
------------------------------------------------------
|
|
|
|
local workspace, window, menu = select(1, ...), select(2, ...), select(3, ...)
|
|
local tool = {}
|
|
local locale = select(4, ...)
|
|
|
|
tool.shortcut = "Slc"
|
|
tool.keyCode = 50
|
|
tool.about = locale.tool1
|
|
|
|
local selector, touchX, touchY, dragX, dragY = GUI.object(1, 1, 1, 1)
|
|
|
|
local fillButton = window.newButton1(locale.fill)
|
|
local outlineButton = window.newButton1(locale.outline)
|
|
local rasterizeLineButton = window.newButton1(locale.rasterizeLine)
|
|
local rasterizeEllipseButton = window.newButton1(locale.rasterizeEllipse)
|
|
local rasterizePolygonButton = window.newButton1(locale.rasterizePolygon)
|
|
local clearButton = window.newButton2(locale.clear)
|
|
local cropButton = window.newButton2(locale.crop)
|
|
|
|
local function repositionSelector()
|
|
if dragX - touchX >= 0 then
|
|
selector.localX, selector.width = touchX - window.currentToolOverlay.x + 1, dragX - touchX + 1
|
|
else
|
|
selector.localX, selector.width = dragX - window.currentToolOverlay.x + 1, touchX - dragX + 1
|
|
end
|
|
|
|
if dragY - touchY >= 0 then
|
|
selector.localY, selector.height = touchY - window.currentToolOverlay.y + 1, dragY - touchY + 1
|
|
else
|
|
selector.localY, selector.height = dragY - window.currentToolOverlay.y + 1, touchY - dragY + 1
|
|
end
|
|
|
|
workspace:draw()
|
|
end
|
|
|
|
local function fitSelector()
|
|
touchX, touchY, dragX, dragY = window.image.x, window.image.y, window.image.x + window.image.width - 1, window.image.y + window.image.height - 1
|
|
repositionSelector()
|
|
end
|
|
|
|
tool.onSelection = function()
|
|
window.currentToolLayout:addChild(fillButton).onTouch = function()
|
|
for j = selector.y, selector.y + selector.height - 1 do
|
|
for i = selector.x, selector.x + selector.width - 1 do
|
|
image.set(window.image.data, i - window.image.x + 1, j - window.image.y + 1, window.primaryColorSelector.color, 0x0, 0, " ")
|
|
end
|
|
end
|
|
|
|
workspace:draw()
|
|
end
|
|
|
|
window.currentToolLayout:addChild(outlineButton).onTouch = function()
|
|
local x1, y1 = selector.x - window.image.x + 1, selector.y - window.image.y + 1
|
|
local x2, y2 = x1 + selector.width - 1, y1 + selector.height - 1
|
|
|
|
for x = x1, x2 do
|
|
image.set(window.image.data, x, y1, window.primaryColorSelector.color, 0x0, 0, " ")
|
|
image.set(window.image.data, x, y2, window.primaryColorSelector.color, 0x0, 0, " ")
|
|
end
|
|
|
|
for y = y1 + 1, y2 - 1 do
|
|
image.set(window.image.data, x1, y, window.primaryColorSelector.color, 0x0, 0, " ")
|
|
image.set(window.image.data, x2, y, window.primaryColorSelector.color, 0x0, 0, " ")
|
|
end
|
|
|
|
workspace:draw()
|
|
end
|
|
|
|
window.currentToolLayout:addChild(rasterizeLineButton).onTouch = function()
|
|
screen.rasterizeLine(
|
|
touchX - window.image.x + 1,
|
|
touchY - window.image.y + 1,
|
|
dragX - window.image.x + 1,
|
|
dragY - window.image.y + 1,
|
|
function(x, y)
|
|
image.set(window.image.data, x, y, window.primaryColorSelector.color, 0x0, 0, " ")
|
|
end
|
|
)
|
|
|
|
workspace:draw()
|
|
end
|
|
|
|
window.currentToolLayout:addChild(rasterizeEllipseButton).onTouch = function()
|
|
local minX, minY, maxX, maxY = math.min(touchX, dragX), math.min(touchY, dragY), math.max(touchX, dragX), math.max(touchY, dragY)
|
|
local centerX, centerY = math.ceil(minX + (maxX - minX) / 2), math.ceil(minY + (maxY - minY) / 2)
|
|
|
|
screen.rasterizeEllipse(
|
|
centerX - window.image.x + 1,
|
|
centerY - window.image.y + 1,
|
|
maxX - centerX,
|
|
maxY - centerY,
|
|
function(x, y)
|
|
image.set(window.image.data, x, y, window.primaryColorSelector.color, 0x0, 0, " ")
|
|
end
|
|
)
|
|
|
|
workspace:draw()
|
|
end
|
|
|
|
window.currentToolLayout:addChild(rasterizePolygonButton).onTouch = function()
|
|
local container = GUI.addBackgroundContainer(workspace, true, true, locale.polygonEdges)
|
|
container.panel.eventHandler = nil
|
|
|
|
local edgesSelector = container.layout:addChild(GUI.comboBox(1, 1, 30, 3, 0xEEEEEE, 0x2D2D2D, 0xCCCCCC, 0x888888))
|
|
for i = 3, 10 do
|
|
edgesSelector:addItem(i)
|
|
end
|
|
|
|
container.layout:addChild(GUI.button(1, 1, 30, 3, 0xFFFFFF, 0x555555, 0x880000, 0xFFFFFF, locale.ok)).onTouch = function()
|
|
screen.rasterizePolygon(
|
|
touchX - window.image.x + 1,
|
|
touchY - window.image.y + 1,
|
|
dragX - window.image.x + 1,
|
|
dragY - window.image.y + 1,
|
|
edgesSelector.selectedItem + 2,
|
|
function(x, y)
|
|
if x <= window.image.data[1] and y <= window.image.data[2] and x > 0 and y > 0 then
|
|
image.set(window.image.data, x, y, window.primaryColorSelector.color, 0x0, 0, " ")
|
|
end
|
|
end
|
|
)
|
|
|
|
container:remove()
|
|
end
|
|
|
|
container.layout:addChild(GUI.button(1, 1, 30, 3, 0xFFFFFF, 0x555555, 0x880000, 0xFFFFFF, locale.cancel)).onTouch = function()
|
|
container:remove()
|
|
end
|
|
|
|
workspace:draw()
|
|
end
|
|
|
|
window.currentToolLayout:addChild(clearButton).onTouch = function()
|
|
for j = selector.y, selector.y + selector.height - 1 do
|
|
for i = selector.x, selector.x + selector.width - 1 do
|
|
image.set(window.image.data, i - window.image.x + 1, j - window.image.y + 1, 0x0, 0x0, 1, " ")
|
|
end
|
|
end
|
|
|
|
workspace:draw()
|
|
end
|
|
|
|
window.currentToolLayout:addChild(cropButton).onTouch = function()
|
|
window.image.data = image.crop(window.image.data, selector.x - window.image.x + 1, selector.y - window.image.y + 1, selector.width, selector.height)
|
|
window.image.reposition()
|
|
fitSelector()
|
|
end
|
|
|
|
window.currentToolOverlay:addChild(selector)
|
|
fitSelector()
|
|
end
|
|
|
|
tool.eventHandler = function(workspace, object, e1, e2, e3, e4)
|
|
if e1 == "touch" then
|
|
e3, e4 = math.ceil(e3), math.ceil(e4)
|
|
touchX, touchY, dragX, dragY = e3, e4, e3, e4
|
|
repositionSelector()
|
|
|
|
elseif e1 == "drag" then
|
|
e3, e4 = math.ceil(e3), math.ceil(e4)
|
|
dragX, dragY = e3, e4
|
|
repositionSelector()
|
|
end
|
|
end
|
|
|
|
selector.eventHandler = tool.eventHandler
|
|
|
|
selector.draw = function()
|
|
-- Border
|
|
local temp = true
|
|
|
|
for x = selector.x + 1, selector.x + selector.width - 2 do
|
|
screen.drawText(x, selector.y, temp and 0xFFFFFF or 0x0, "━")
|
|
screen.drawText(x, selector.y + selector.height - 1, temp and 0xFFFFFF or 0x0, "━")
|
|
temp = not temp
|
|
end
|
|
|
|
temp = true
|
|
|
|
for y = selector.y + 1, selector.y + selector.height - 2 do
|
|
screen.drawText(selector.x, y, temp and 0xFFFFFF or 0x0, "┃")
|
|
screen.drawText(selector.x + selector.width - 1, y, temp and 0xFFFFFF or 0x0, "┃")
|
|
temp = not temp
|
|
end
|
|
|
|
screen.drawText(selector.x, selector.y, 0x0, "┏")
|
|
screen.drawText(selector.x + selector.width - 1, selector.y + selector.height - 1, 0x0, "┛")
|
|
|
|
screen.drawText(selector.x + selector.width - 1, selector.y, 0x0, "┓")
|
|
screen.drawText(selector.x, selector.y + selector.height - 1, 0x0, "┗")
|
|
|
|
-- Corners
|
|
screen.drawText(touchX, touchY, 0x66FF80, "●")
|
|
screen.drawText(dragX, dragY, 0x66FF80, "●")
|
|
|
|
-- Size
|
|
temp = selector.width .. " px"
|
|
screen.drawText(math.floor(selector.x + selector.width / 2 - #temp / 2), selector.y + selector.height, 0xFFFFFF, temp)
|
|
|
|
screen.drawText(selector.x + selector.width + 1, math.floor(selector.y + selector.height / 2), 0xFFFFFF, selector.height .. " px")
|
|
end
|
|
|
|
------------------------------------------------------
|
|
|
|
return tool
|