mirror of
https://github.com/IgorTimofeev/MineOS.git
synced 2025-12-20 11:09:21 +01:00
250 lines
8.3 KiB
Lua
Executable File
250 lines
8.3 KiB
Lua
Executable File
|
|
----------------------------------------- Libraries -----------------------------------------
|
|
|
|
_G.GUI, package.loaded.GUI = nil, nil
|
|
|
|
local libraries = {
|
|
computer = "computer",
|
|
doubleBuffering = "doubleBuffering",
|
|
GUI = "GUI",
|
|
unicode = "unicode",
|
|
}
|
|
|
|
for library in pairs(libraries) do if not _G[library] then _G[library] = require(libraries[library]) end end; libraries = nil
|
|
|
|
----------------------------------------- Main variables -----------------------------------------
|
|
|
|
local windows = {}
|
|
|
|
windows.alignment = GUI.alignment
|
|
|
|
windows.colors = {
|
|
background = 0xEEEEEE,
|
|
title = {
|
|
background = 0xDDDDDD,
|
|
text = 0x262626,
|
|
},
|
|
tabBar = {
|
|
background = 0xDDDDDD,
|
|
text = 0x262626,
|
|
selectedTab = {
|
|
background = 0xCCCCCC,
|
|
text = 0x262626,
|
|
}
|
|
},
|
|
}
|
|
|
|
----------------------------------------- Universal window event handlers -----------------------------------------
|
|
|
|
local function executeObjectMethod(method, ...)
|
|
if method then method(...) end
|
|
end
|
|
|
|
local function buttonHandler(window, object, objectIndex, eventData)
|
|
object.pressed = true
|
|
window:draw()
|
|
os.sleep(0.2)
|
|
object.pressed = false
|
|
window:draw()
|
|
executeObjectMethod(object.onTouch, eventData)
|
|
end
|
|
|
|
local function tabBarTabHandler(window, object, objectIndex, eventData)
|
|
object.parent.parent.selectedTab = objectIndex
|
|
window:draw()
|
|
executeObjectMethod(object.parent.parent.onTabSwitched, eventData)
|
|
end
|
|
|
|
local function inputTextBoxHandler(window, object, objectIndex, eventData)
|
|
object:input()
|
|
window:draw()
|
|
executeObjectMethod(object.onInputFinished, eventData)
|
|
end
|
|
|
|
local function textBoxScrollHandler(window, object, objectIndex, eventData)
|
|
if eventData[5] == 1 then
|
|
object:scrollUp()
|
|
window:draw()
|
|
else
|
|
object:scrollDown()
|
|
window:draw()
|
|
end
|
|
end
|
|
|
|
local function horizontalSliderHandler(window, object, objectIndex, eventData)
|
|
local clickPosition = eventData[3] - object.x + 1
|
|
object.value = object.minimumValue + (clickPosition * (object.maximumValue - object.minimumValue) / object.width)
|
|
window:draw()
|
|
executeObjectMethod(object.onValueChanged, eventData)
|
|
end
|
|
|
|
local function switchHandler(window, object, objectIndex, eventData)
|
|
object.state = not object.state
|
|
window:draw()
|
|
executeObjectMethod(object.onStateChanged, eventData)
|
|
end
|
|
|
|
local function comboBoxHandler(window, object, objectIndex, eventData)
|
|
object:selectItem()
|
|
executeObjectMethod(object.onItemSelected, eventData)
|
|
end
|
|
|
|
function windows.handleEventData(window, eventData)
|
|
if eventData[1] == "touch" then
|
|
local object, objectIndex = window:getClickedObject(eventData[3], eventData[4])
|
|
if object then
|
|
if object.type == GUI.objectTypes.button then
|
|
buttonHandler(window, object, objectIndex, eventData)
|
|
elseif object.type == GUI.objectTypes.tabBarTab then
|
|
tabBarTabHandler(window, object, objectIndex, eventData)
|
|
elseif object.type == GUI.objectTypes.inputTextBox then
|
|
inputTextBoxHandler(window, object, objectIndex, eventData)
|
|
elseif object.type == GUI.objectTypes.horizontalSlider then
|
|
horizontalSliderHandler(window, object, objectIndex, eventData)
|
|
elseif object.type == GUI.objectTypes.switch then
|
|
switchHandler(window, object, objectIndex, eventData)
|
|
elseif object.type == GUI.objectTypes.comboBox then
|
|
comboBoxHandler(window, object, objectIndex, eventData)
|
|
elseif object.onTouch then
|
|
executeObjectMethod(object.onTouch, eventData)
|
|
end
|
|
else
|
|
executeObjectMethod(window.onTouch, eventData)
|
|
end
|
|
elseif eventData[1] == "scroll" then
|
|
local object, objectIndex = window:getClickedObject(eventData[3], eventData[4])
|
|
if object then
|
|
if object.type == GUI.objectTypes.textBox then
|
|
textBoxScrollHandler(window, object, objectIndex, eventData)
|
|
elseif object.onScroll then
|
|
executeObjectMethod(object.onScroll, eventData)
|
|
end
|
|
else
|
|
executeObjectMethod(window.onScroll, eventData)
|
|
end
|
|
elseif eventData[1] == "drag" then
|
|
local object, objectIndex = window:getClickedObject(eventData[3], eventData[4])
|
|
if object then
|
|
if object.type == GUI.objectTypes.horizontalSlider then
|
|
horizontalSliderHandler(window, object, objectIndex, eventData)
|
|
elseif object.onDrag then
|
|
executeObjectMethod(object.onDrag, eventData)
|
|
end
|
|
else
|
|
executeObjectMethod(window.onDrag, eventData)
|
|
end
|
|
elseif eventData[1] == "drop" then
|
|
local object, objectIndex = window:getClickedObject(eventData[3], eventData[4])
|
|
if object then
|
|
if object.onDrag then
|
|
executeObjectMethod(object.onDrop, eventData)
|
|
end
|
|
else
|
|
executeObjectMethod(window.onDrop, eventData)
|
|
end
|
|
elseif eventData[1] == "key_down" then
|
|
executeObjectMethod(window.onKeyDown, eventData)
|
|
elseif eventData[1] == "key_up" then
|
|
executeObjectMethod(window.onKeyUp, eventData)
|
|
end
|
|
|
|
executeObjectMethod(window.onAnyEvent, eventData)
|
|
end
|
|
|
|
function windows.handleEvents(window, pullTime)
|
|
while true do
|
|
window:handleEventData({event.pull(pullTime)})
|
|
if window.dataToReturn then return table.unpack(window.dataToReturn) end
|
|
end
|
|
end
|
|
|
|
----------------------------------------- Window actions -----------------------------------------
|
|
|
|
function windows.returnData(window, ...)
|
|
window.dataToReturn = {...}
|
|
computer.pushSignal("windowAction")
|
|
end
|
|
|
|
function windows.close(window)
|
|
windows.returnData(window, nil)
|
|
end
|
|
|
|
----------------------------------------- Window creation -----------------------------------------
|
|
|
|
function windows.correctWindowCoordinates(x, y, width, height, minimumWidth, minimumHeight)
|
|
width = minimumWidth and math.max(width, minimumWidth) or width
|
|
height = minimumHeight and math.max(height, minimumHeight) or height
|
|
x = (x == "auto" and math.floor(buffer.screen.width / 2 - width / 2)) or x
|
|
y = (y == "auto" and math.floor(buffer.screen.height / 2 - height / 2)) or y
|
|
|
|
return x, y, width, height
|
|
end
|
|
|
|
local function drawWindow(window, bufferForcedRedraw)
|
|
if window.onDrawStarted then window.onDrawStarted() end
|
|
window:update()
|
|
if window.drawShadow then GUI.windowShadow(window.x, window.y, window.width, window.height, 50) end
|
|
if window.onDrawFinished then window.onDrawFinished() end
|
|
buffer.draw(bufferForcedRedraw)
|
|
end
|
|
|
|
local function newWindow(x, y, width, height, minimumWidth, minimumHeight)
|
|
x, y, width, height = windows.correctWindowCoordinates(x, y, width, height, minimumWidth, minimumHeight)
|
|
|
|
local window = GUI.container(x, y, width, height)
|
|
window.minimumWidth = minimumWidth
|
|
window.minimumHeight = minimumHeight
|
|
window.drawShadow = true
|
|
window.update = window.draw
|
|
window.draw = drawWindow
|
|
window.handleEventData = windows.handleEventData
|
|
window.handleEvents = windows.handleEvents
|
|
window.close = windows.close
|
|
window.returnData = windows.returnData
|
|
|
|
return window
|
|
end
|
|
|
|
----------------------------------------- Window patterns -----------------------------------------
|
|
|
|
function windows.empty(x, y, width, height, minimumWidth, minimumHeight, title)
|
|
local window = newWindow(x, y, width, height, minimumWidth, minimumHeight)
|
|
window.drawShadow = false
|
|
return window
|
|
end
|
|
|
|
function windows.fullScreen()
|
|
local window = newWindow(1, 1, buffer.screen.width, buffer.screen.height)
|
|
window.drawShadow = false
|
|
return window
|
|
end
|
|
|
|
function windows.tabbed(x, y, width, height, minimumWidth, minimumHeight, ...)
|
|
local tabs = {...}
|
|
local window = newWindow(x, y, width, height, minimumWidth, minimumHeight)
|
|
window:addPanel(1, 1, window.width, window.height, 0xEEEEEE).disabled = true
|
|
window:addTabBar(1, 1, window.width, 3, 1, 0xDDDDDD, 0x262626, 0xCCCCCC, 0x262626, ...)
|
|
window:addWindowActionButtons(2, 1, false)
|
|
|
|
return window
|
|
end
|
|
|
|
----------------------------------------- Playground -----------------------------------------
|
|
|
|
-- buffer.clear(0x262626)
|
|
-- buffer.draw(true)
|
|
|
|
-- local myWindow = windows.empty(10, 5, 60, 20, 60, 20)
|
|
-- myWindow:addPanel(1, 1, myWindow.width, myWindow.height, 0xEEEEEE)
|
|
-- myWindow:addLabel(2, 5, 20, 1, 0x000000, tostring(10)):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top)
|
|
-- myWindow:addHorizontalSlider(2, 4, 20, 0x880000, 0x000000, 0xFF4444, 0, 100, 10).onValueChanged = function(object)
|
|
-- myWindow.counter.text = tostring(object.value)
|
|
-- end
|
|
|
|
-- myWindow:draw()
|
|
-- myWindow:handleEvents()
|
|
|
|
----------------------------------------- End of shit -----------------------------------------
|
|
|
|
return windows
|