Таблички чуть получше сделал

This commit is contained in:
IgorTimofeev 2023-10-24 16:04:46 +03:00
parent a59f7acc06
commit b84d8f084e
6 changed files with 664 additions and 467 deletions

View File

@ -80,7 +80,7 @@ itemsLayout:setMargin(1, 1, 0, 0)
local searchInput = window:addChild(GUI.input(1, 2, 16, 1, 0x4B4B4B, 0xC3C3C3, 0x878787, 0x4B4B4B, 0xE1E1E1, nil, localization.search, true))
local iconField
local iconField
local statusContainer = window:addChild(GUI.container(FTPButton.localX + FTPButton.width + 2, 2, 1, 1))
local statusPanel = statusContainer:addChild(GUI.panel(1, 1, 1, 1, 0x4B4B4B))
@ -97,8 +97,42 @@ local function saveConfig()
filesystem.writeTable(configPath, config)
end
local function getVerticalScroll()
return config.gridMode and iconField.yOffset or iconField:getVerticalScroll()
end
local function setVerticalScroll(value)
if config.gridMode then
local iconsCount = #iconField.children
local rows = math.ceil((iconsCount - 1) / iconField.iconCount.horizontal)
local minimumOffset = (rows - 1) * (userSettings.iconHeight + userSettings.iconVerticalSpace) - userSettings.iconVerticalSpace
value = math.max(-minimumOffset + 1, math.min(iconField.initialYOffset, value))
local delta = iconField.yOffset - value
iconField.yOffset = value
local iconsCount, child = #iconField.children
if iconsCount < 2 then
return
end
for i = 1, iconsCount do
child = iconField.children[i]
if child ~= iconField.backgroundObject then
child.localY = child.localY - delta
end
end
else
iconField:setVerticalScroll(value)
end
end
local function updateFileListAndDraw()
iconField:updateFileList()
setVerticalScroll(config.gridMode and iconField.initialYOffset or 0)
workspace:draw()
end
@ -124,9 +158,11 @@ local function prevOrNextpath(next)
updateFileListAndDraw()
end
local function addpath(path)
local function addPath(path)
pathHistoryCurrent = pathHistoryCurrent + 1
table.insert(pathHistory, pathHistoryCurrent, path)
for i = pathHistoryCurrent + 1, #pathHistory do
pathHistory[i] = nil
end
@ -187,7 +223,7 @@ local function addSidebarSeparator()
end
local function onFavouriteTouch(path)
addpath(path)
addPath(path)
updateFileListAndDraw()
end
@ -196,7 +232,7 @@ local openFTP, updateSidebar
openFTP = function(...)
local mountPath = FTPMountPath .. network.getFTPProxyName(...) .. "/"
addpath(mountPath)
addPath(mountPath)
workspace:draw()
local proxy, reason = network.connectToFTP(...)
@ -243,7 +279,7 @@ updateSidebar = function()
end
addSidebarItem(" " .. network.getModemProxyName(proxy), path).onTouch = function()
addpath(path)
addPath(path)
updateFileListAndDraw()
end
end
@ -436,59 +472,47 @@ local function updateIconField()
) or
system.listIconField(
1, 4, 1, 1, path,
0xF0F0F0,
0xFFFFFF,
0x000000
0x000000,
nil,
0x3C3C3C,
0xE1E1E1,
0x3C3C3C,
0xCC2440,
0xFFFFFF
)
)
iconField.launchers.directory = function(icon)
addpath(icon.path)
addPath(icon.path)
updateFileListAndDraw()
end
iconField.launchers.showPackageContent = function(icon)
addpath(icon.path)
addPath(icon.path)
updateFileListAndDraw()
end
iconField.launchers.showContainingFolder = function(icon)
addpath(filesystem.path(system.readShortcut(icon.path)))
addPath(filesystem.path(system.readShortcut(icon.path)))
updateFileListAndDraw()
end
iconField.eventHandler = function(workspace, self, e1, e2, e3, e4, e5)
if e1 == "scroll" then
if config.gridMode then
local iconsCount = #iconField.children
setVerticalScroll(getVerticalScroll() + (config.gridMode and e5 * 2 or e5))
if iconsCount < 2 then
return
end
local rows = math.ceil((iconsCount - 1) / iconField.iconCount.horizontal)
local minimumOffset = (rows - 1) * (userSettings.iconHeight + userSettings.iconVerticalSpace) - userSettings.iconVerticalSpace
iconField.yOffset = math.max(-minimumOffset + 1, math.min(iconField.yOffsetInitial, iconField.yOffset + e5 * 2))
-- Moving icons upper or lower
local delta, child = iconField.yOffset - iconField.children[2].localY
for i = 1, iconsCount do
child = iconField.children[i]
if child ~= iconField.backgroundObject then
child.localY = child.localY + delta
end
end
workspace:draw()
else
GUI.tableEventHandler(workspace, self, e1, e2, e3, e4, e5)
end
workspace:draw()
elseif e1 == "system" or e1 == "Finder" then
if e2 == "updateFileList" then
updateFileListAndDraw()
elseif e2 == "updateFavourites" then
if e3 then
table.insert(config.favourites, e3)
@ -511,7 +535,7 @@ local function updateIconField()
local function addNode(text, path)
statusContainer:addChild(GUI.adaptiveButton(x, 1, 0, 0, nil, 0xC3C3C3, nil, 0xFFFFFF, text)).onTouch = function()
addpath(path)
addPath(path)
updateFileListAndDraw()
end
@ -550,7 +574,7 @@ gotoButton.onTouch = function()
input.text = ("/" .. input.text .. "/"):gsub("/+", "/")
if filesystem.exists(input.text) and filesystem.isDirectory(input.text) then
addpath(input.text)
addPath(input.text)
iconField:updateFileList()
end
@ -617,9 +641,9 @@ modeList.selectedItem = config.gridMode == nil and 2 or (config.gridMode and 1 o
updateIconField()
if (options.o or options.open) and args[1] and filesystem.isDirectory(args[1]) then
addpath(args[1])
addPath(args[1])
else
addpath("/")
addPath("/")
end
updateSidebar()

View File

@ -192,8 +192,8 @@ selector.draw = function()
screen.drawText(selector.x + selector.width - 1, selector.y, 0x0, "")
screen.drawText(selector.x, selector.y + selector.height - 1, 0x0, "")
screen.drawText(selector.x, selector.y, 0x66FF80, "")
screen.drawText(selector.x + selector.width - 1, selector.y + selector.height - 1, 0x66FF80, "")
screen.drawText(selector.x, selector.y, 0x66FF80, "")
screen.drawText(selector.x + selector.width - 1, selector.y + selector.height - 1, 0x66FF80, "")
end
------------------------------------------------------

View File

@ -7,6 +7,8 @@ local image = require("Image")
local paths = require("Paths")
local system = require("System")
local text = require("Text")
local internet = require("Internet")
local event = require("Event")
--------------------------------------------------------------------------------
@ -37,7 +39,7 @@ local tape
local tapeWritingProgress
local function updateCurrentTapeSpeed()
tape.proxy.setSpeed(speedMin + tape.speed * (speedMax - speedMin))
component.invoke(tape.address, "setSpeed", speedMin + tape.speed * (speedMax - speedMin))
end
local function updateCurrentTape()
@ -65,324 +67,16 @@ local function updateTapes()
for address in component.list("tape_drive") do
table.insert(tapes, {
proxy = component.proxy(address),
address = address,
size = component.invoke(address, "getSize"),
speed = 0.5,
cues = {}
cues = {},
})
end
updateCurrentTape()
end
-------------------------------- Window ------------------------------------------------
local backgroundImage = loadImage("Background")
local workspace, window, menu = system.addWindow(GUI.window(1, 1, 78, 49))
window.drawShadow = false
-------------------------------- Jog ------------------------------------------------
local jogImages = {}
for i = 1, 12 do
jogImages[i] = loadImage("Jog" .. i)
end
local function getIsPlaying()
return tape.proxy.getState() == "PLAYING"
end
-------------------------------- Background ------------------------------------------------
local windowBackground = window:addChild(GUI.object(1, 1, window.width, window.height))
local currentJogIndex = 1
local displayWidth, displayHeight = 33, 9
local function displayDrawProgressBar(x, y, width, progress)
local progressActiveWidth = math.floor(progress * width)
screen.drawText(x, y, 0xE1E1E1, string.rep("", progressActiveWidth))
screen.drawText(x + progressActiveWidth, y, 0x4B4B4B, string.rep("", width - progressActiveWidth))
end
windowBackground.draw = function(windowBackground)
-- Background
screen.drawImage(windowBackground.x, windowBackground.y, backgroundImage)
-- Speed slider indicator
screen.drawText(windowBackground.x + 68, windowBackground.y + 39, powerButton.pressed and 0xFFDB40 or 0x332400, "")
-- Ignoring if power is off
if not powerButton.pressed then
return
end
-- Jog
screen.drawImage(windowBackground.x + 33, windowBackground.y + 29, jogImages[currentJogIndex])
-- Display
local displayX, displayY = windowBackground.x + 22, windowBackground.y + 3
local displayUpperText
if tapeWritingProgress then
displayUpperText = "Writing in progress"
local progressWidth = displayWidth - 4
displayDrawProgressBar(
math.floor(displayX + displayWidth / 2 - progressWidth / 2),
math.floor(displayY + displayHeight / 2),
progressWidth,
tapeWritingProgress
)
else
-- UpperText
displayUpperText = tape.proxy.getLabel()
if not displayUpperText or #displayUpperText == 0 then
displayUpperText = "Untitled tape"
end
-- BPM
local bpmText = tostring(math.floor(bpmMin + speedSlider.value * (bpmMax - bpmMin))) .. " bpm"
local bpmWidth = #bpmText + 4
local bpmX = displayX + displayWidth - 2 - bpmWidth
local bpmY = displayY + displayHeight - 5
screen.drawFrame(bpmX, bpmY, bpmWidth, 3, 0xE1E1E1)
screen.drawText(bpmX + 2, bpmY + 1, 0xE1E1E1, bpmText)
-- Lower track
local progressWidth = displayWidth - 4
local tapeSize = tape.proxy.getSize()
displayDrawProgressBar(
math.floor(displayX + displayWidth / 2 - progressWidth / 2),
displayY + displayHeight - 2,
progressWidth,
tapeSize == 0 and 0 or tape.proxy.getPosition() / tapeSize
)
end
-- UpperText
displayUpperText = text.limit(displayUpperText, displayWidth - 2)
screen.drawText(math.floor(displayX + displayWidth / 2 - #displayUpperText / 2), displayY + 1, 0xE1E1E1, displayUpperText)
end
-------------------------------- Power button ------------------------------------------------
powerButton = window:addChild(GUI.object(75, 2, 4, 2))
powerButton.pressed = false
powerButton.draw = function()
screen.drawText(powerButton.x, powerButton.y, 0x1E1E1E, powerButton.pressed and "⣠⣤⣄" or "⣸⣿⣇")
end
powerButton.eventHandler = function(workspace, powerButton, e1)
if e1 == "touch" then
powerButton.pressed = not powerButton.pressed
workspace:draw()
computer.beep(20, 0.01)
end
end
-------------------------------- ImageButton ------------------------------------------------
local imageButtonBlink = false
local imageButtonBlinkUptime = 0
local imageButtonBlinkInterval = 0.5
local function imageButtonDraw(button)
screen.drawImage(button.x, button.y, (powerButton.pressed and (not button.blinking or imageButtonBlink)) and button.imageOn or button.imageOff)
end
local function newImageButton(x, y, width, height, name)
local button = GUI.object(x, y, width, height)
button.imageOn = loadImage(name .. "On")
button.imageOff = loadImage(name .. "Off")
button.draw = imageButtonDraw
return button
end
-------------------------------- Speed slider ------------------------------------------------
local speedSliderImage = loadImage("SpeedSlider")
speedSlider = window:addChild(GUI.object(71, 33, 5, 14))
speedSlider.draw = function(speedSlider)
-- screen.drawRectangle(speedSlider.x, speedSlider.y, speedSlider.width, speedSlider.height, 0xFF0000, 0x0, " ")
local x = speedSlider.x
local y = speedSlider.y + math.floor((1 - speedSlider.value) * (speedSlider.height - image.getHeight(speedSliderImage) / 2))
screen.drawImage(x, y, speedSliderImage)
end
speedSlider.eventHandler = function(workspace, speedSlider, e1, e2, e3, e4)
if e1 == "touch" or e1 == "drag" then
speedSlider.value = 1 - ((e4 - speedSlider.y) / speedSlider.height)
tape.speed = speedSlider.value
updateCurrentTapeSpeed()
workspace:draw()
end
end
-------------------------------- UpperButtons ------------------------------------------------
local function upperButtonDraw(button)
local bg, fg = button.animationCurrentBackground, powerButton.pressed and button.animationCurrentText or 0x0
-- Background
screen.drawRectangle(button.x + 1, button.y + 1, button.width - 2, button.height - 2, bg, fg, " ")
-- Upper
screen.drawText(button.x, button.y, fg, "" .. string.rep("", button.width - 2) .. "")
-- Left
screen.drawText(button.x, button.y + 1, fg, "")
-- Middle
screen.drawText(math.floor(button.x + button.width / 2 - #button.text / 2), button.y + 1, fg, button.text)
-- Right
screen.drawText(button.x + button.width - 1, button.y + 1, fg, "")
-- Lower
screen.drawText(button.x, button.y + button.height - 1, fg, "" .. string.rep("", button.width - 2) .. "")
end
local function upperButtonEventHandler(workspace, button, e1, e2, e3, e4, e5)
if e1 == "touch" and powerButton.pressed then
button:press()
end
end
local function newUpperButton(x, y, width, text)
local button = GUI.button(x, y, width, 3, 0x2D2D2D, 0xFFB600, 0x2D2D2D, 0x996D00, text)
button.pressed = false
button.draw = upperButtonDraw
button.eventHandler = upperButtonEventHandler
return button
end
-------------------------------- Write upper button ------------------------------------------------
local writeUpperButton = window:addChild(newUpperButton(23, 1, 9, "Write"))
writeUpperButton.onTouch = function()
local filesystemDialog = GUI.addFilesystemDialog(workspace, true, 50, math.floor(window.height * 0.8), "Confirm", "Cancel", "File name", "/")
filesystemDialog:setMode(GUI.IO_MODE_OPEN, GUI.IO_MODE_FILE)
filesystemDialog:addExtensionFilter(".dfpwm")
filesystemDialog:expandPath(paths.user.desktop)
filesystemDialog:show()
filesystemDialog.onSubmit = function(path)
local tapeSize = tape.proxy.getSize()
local tapeSpaceFree = tapeSize - tape.proxy.getPosition()
local fileSize = filesystem.size(path)
if fileSize > tapeSpaceFree then
GUI.alert("Not enough space on tape")
return
end
local file = filesystem.open(path, "rb")
tape.proxy.stop()
local bytesWritten, chunk = 0
while true do
chunk = file:read(8192)
if not chunk then
break
end
if not tape.proxy.isReady() then
GUI.alert("Tape was removed during writing")
break
end
tape.proxy.write(chunk)
bytesWritten = bytesWritten + #chunk
tapeWritingProgress = bytesWritten / fileSize
workspace:draw()
end
file:close()
tape.proxy.seek(-tape.proxy.getSize())
tapeWritingProgress = nil
end
end
-------------------------------- Label upper button ------------------------------------------------
local labelUpperButton = window:addChild(newUpperButton(33, 1, 9, "Label"))
labelUpperButton.onTouch = function()
local container = GUI.addBackgroundContainer(workspace, true, true, title)
local input = container.layout:addChild(GUI.input(1, 1, 36, 3, 0xE1E1E1, 0x696969, 0x969696, 0xE1E1E1, 0x2D2D2D, tape.proxy.getLabel() or "", "New label", false))
input.onInputFinished = function()
tape.proxy.setLabel(input.text)
workspace:draw()
end
container.panel.onTouch = function()
container:remove()
workspace:draw()
end
workspace:draw()
return container
end
-------------------------------- Needle search ------------------------------------------------
local needleSearch = window:addChild(GUI.object(25, 15, 29, 2))
needleSearch.draw = function()
-- screen.drawRectangle(needleSearch.x, needleSearch.y, needleSearch.width, needleSearch.height, 0xFF0000, 0x0, " ")
if powerButton.pressed then
screen.drawText(needleSearch.x, needleSearch.y, 0xE1E1E1, "▲ ╷ ╷ ╷ ╷ ╷ ╷ ╷ ╷ ╷ ╷ ╷ ╷ ╷ ▲")
end
end
needleSearch.eventHandler = function(workspace, needleSearch, e1, e2, e3, e4)
if e1 == "touch" and powerButton.pressed and tape then
local position = tape.proxy.getPosition()
local newPosition = math.floor((e3 - needleSearch.x) / needleSearch.width * tape.proxy.getSize())
tape.proxy.seek(newPosition - position)
end
end
-------------------------------- Round mini button ------------------------------------------------
local function roundMiniButtonDraw(button)
@ -439,6 +133,18 @@ local function roundTinyButtonDraw(button)
-- Lower
screen.drawText(button.x, button.y + 1, bg, "⠈⠛⠛⠁")
-- -- Left
-- screen.drawText(button.x, button.y, bg, "⣾")
-- -- Middle
-- screen.set(button.x + 1, button.y, bg, fg, "⠄")
-- -- Right
-- screen.drawText(button.x + 2, button.y, bg, "⡆")
-- -- Lower
-- screen.drawText(button.x, button.y + 1, bg, "⠈⠉")
end
local function newRoundTinyButton(x, y, ...)
@ -450,6 +156,391 @@ local function newRoundTinyButton(x, y, ...)
return button
end
-------------------------------- UpperButtons ------------------------------------------------
local function upperButtonDraw(button)
local bg, fg = button.animationCurrentBackground, powerButton.pressed and button.animationCurrentText or 0x0
-- Background
screen.drawRectangle(button.x + 1, button.y + 1, button.width - 2, button.height - 2, bg, fg, " ")
-- Upper
screen.drawText(button.x, button.y, fg, "" .. string.rep("", button.width - 2) .. "")
-- Left
screen.drawText(button.x, button.y + 1, fg, "")
-- Middle
screen.drawText(math.floor(button.x + button.width / 2 - unicode.len(button.text) / 2), button.y + 1, fg, button.text)
-- Right
screen.drawText(button.x + button.width - 1, button.y + 1, fg, "")
-- Lower
screen.drawText(button.x, button.y + button.height - 1, fg, "" .. string.rep("", button.width - 2) .. "")
end
local function upperButtonEventHandler(workspace, button, e1, e2, e3, e4, e5)
if e1 == "touch" and powerButton.pressed then
button:press()
end
end
local function newUpperButton(x, y, width, ...)
local button = GUI.button(x, y, width, 3, ...)
button.pressed = false
button.draw = upperButtonDraw
button.eventHandler = upperButtonEventHandler
return button
end
-------------------------------- Round mini button ------------------------------------------------
local function hotCueButtonDraw(button)
local bg, fg = button.animationCurrentBackground, powerButton.pressed and button.animationCurrentText or 0x2D2D2D
-- Upper
screen.drawText(button.x, button.y, bg, "" .. string.rep("", button.width - 2) .. "")
-- Left
screen.drawText(button.x, button.y + 1, bg, "")
-- Middle
screen.set(button.x + 1, button.y + 1, 0x2D2D2D, 0x5A5A5A, "")
screen.set(button.x + 2, button.y + 1, bg, 0x787878, "")
screen.set(button.x + 3, button.y + 1, bg, fg, button.text)
screen.set(button.x + 4, button.y + 1, bg, 0x787878, "")
screen.set(button.x + 5, button.y + 1, 0x2D2D2D, 0x5A5A5A, "")
-- Right
screen.drawText(button.x + button.width - 1, button.y + 1, bg, "")
-- Lower
screen.drawText(button.x, button.y + button.height - 1, bg, "" .. string.rep("", button.width - 2) .. "")
end
local function hotCueButtonEventHandler(workspace, button, e1, e2, e3, e4, e5)
if e1 == "touch" then
button:press()
end
end
local function newHotCueButton(x, y, defaultForeground, pressedForeground, text)
local button = GUI.button(x, y, 7, 3, 0x1E1E1E, defaultForeground, 0x0, pressedForeground, text)
button.draw = hotCueButtonDraw
button.eventHandler = hotCueButtonEventHandler
return button
end
-------------------------------- Window ------------------------------------------------
local backgroundImage = loadImage("Background")
local workspace, window, menu = system.addWindow(GUI.window(1, 1, 78, 49))
window.drawShadow = false
-------------------------------- Jog ------------------------------------------------
local jogImages = {}
for i = 1, 12 do
jogImages[i] = loadImage("Jog" .. i)
end
local function getIsPlaying()
return component.invoke(tape.address, "getState") == "PLAYING"
end
-------------------------------- Background ------------------------------------------------
local windowBackground = window:addChild(GUI.object(1, 1, window.width, window.height))
local currentJogIndex = 1
local displayWidth, displayHeight = 33, 9
local function displayDrawProgressBar(x, y, width, progress)
local progressActiveWidth = math.floor(progress * width)
screen.drawText(x, y, 0xE1E1E1, string.rep("", progressActiveWidth))
screen.drawText(x + progressActiveWidth, y, 0x4B4B4B, string.rep("", width - progressActiveWidth))
end
windowBackground.draw = function(windowBackground)
-- Background
screen.drawImage(windowBackground.x, windowBackground.y, backgroundImage)
-- Ignoring if power is off
if not powerButton.pressed then
return
end
-- Power indicator
screen.drawText(windowBackground.x + 73, windowBackground.y + 3, 0xFF0000, "")
-- Speed slider indicator
screen.drawText(windowBackground.x + 68, windowBackground.y + 39, 0xFFDB40, "")
-- Jog
screen.drawImage(windowBackground.x + 33, windowBackground.y + 29, jogImages[currentJogIndex])
-- Display
local displayX, displayY = windowBackground.x + 22, windowBackground.y + 3
local displayUpperText
if tapeWritingProgress then
displayUpperText = "Writing in progress"
local progressWidth = displayWidth - 4
displayDrawProgressBar(
math.floor(displayX + displayWidth / 2 - progressWidth / 2),
math.floor(displayY + displayHeight / 2),
progressWidth,
tapeWritingProgress
)
else
-- UpperText
displayUpperText = component.invoke(tape.address, "getLabel")
if not displayUpperText or #displayUpperText == 0 then
displayUpperText = "Untitled tape"
end
-- BPM
local bpmText = tostring(math.floor(bpmMin + speedSlider.value * (bpmMax - bpmMin))) .. " bpm"
local bpmWidth = #bpmText + 4
local bpmX = displayX + displayWidth - 2 - bpmWidth
local bpmY = displayY + displayHeight - 5
screen.drawFrame(bpmX, bpmY, bpmWidth, 3, 0xE1E1E1)
screen.drawText(bpmX + 2, bpmY + 1, 0xE1E1E1, bpmText)
-- Lower track
local progressWidth = displayWidth - 4
displayDrawProgressBar(
math.floor(displayX + displayWidth / 2 - progressWidth / 2),
displayY + displayHeight - 2,
progressWidth,
tape.size == 0 and 0 or component.invoke(tape.address, "getPosition") / tape.size
)
end
-- UpperText
displayUpperText = text.limit(displayUpperText, displayWidth - 2)
screen.drawText(math.floor(displayX + displayWidth / 2 - #displayUpperText / 2), displayY + 1, 0xE1E1E1, displayUpperText)
end
-------------------------------- Power button ------------------------------------------------
powerButton = window:addChild(GUI.object(75, 2, 4, 2))
powerButton.pressed = false
powerButton.draw = function()
screen.drawText(powerButton.x, powerButton.y, 0x1E1E1E, powerButton.pressed and "⣠⣤⣄" or "⣸⣿⣇")
end
powerButton.eventHandler = function(workspace, powerButton, e1)
if e1 == "touch" then
powerButton.pressed = not powerButton.pressed
-- Stopping playback
if powerButton.pressed then
currentJogIndex = 1
else
for i = 1, #tapes do
component.invoke(tapes[i].address, "stop")
end
end
workspace:draw()
computer.beep(20, 0.01)
end
end
-------------------------------- ImageButton ------------------------------------------------
local imageButtonBlink = false
local imageButtonBlinkUptime = 0
local imageButtonBlinkInterval = 0.5
local function imageButtonDraw(button)
screen.drawImage(button.x, button.y, (powerButton.pressed and (not button.blinking or imageButtonBlink)) and button.imageOn or button.imageOff)
end
local function newImageButton(x, y, width, height, name)
local button = GUI.object(x, y, width, height)
button.imageOn = loadImage(name .. "On")
button.imageOff = loadImage(name .. "Off")
button.draw = imageButtonDraw
return button
end
-------------------------------- Speed slider ------------------------------------------------
local speedSliderImage = loadImage("SpeedSlider")
speedSlider = window:addChild(GUI.object(71, 33, 5, 14))
speedSlider.draw = function(speedSlider)
-- screen.drawRectangle(speedSlider.x, speedSlider.y, speedSlider.width, speedSlider.height, 0xFF0000, 0x0, " ")
local x = speedSlider.x
local y = speedSlider.y + math.floor((1 - speedSlider.value) * (speedSlider.height - image.getHeight(speedSliderImage) / 2))
screen.drawImage(x, y, speedSliderImage)
end
speedSlider.eventHandler = function(workspace, speedSlider, e1, e2, e3, e4)
if e1 == "touch" or e1 == "drag" then
speedSlider.value = 1 - ((e4 - speedSlider.y) / speedSlider.height)
tape.speed = speedSlider.value
updateCurrentTapeSpeed()
workspace:draw()
end
end
-------------------------------- File/url/label upper buttons ------------------------------------------------
local _ = window:addChild(newUpperButton(14, 1, 7, 0x1E1E1E, 0xF0F0F0, 0x0F0F0F, 0xA5A5A5, "Help"))
local urlUpperButton = window:addChild(newUpperButton(14, 4, 7, 0x1E1E1E, 0x3349FF, 0x0F0F0F, 0x002480, "Url"))
local fileUpperButton = window:addChild(newUpperButton(14, 7, 7, 0x1E1E1E, 0xFFDB40, 0x0F0F0F, 0x996D00, "File"))
local _ = window:addChild(newRoundTinyButton(14, 12, 0x0F0F0F, 0xFF0000, 0x0F0F0F, 0xFF0000, "⢠⡄"))
local _ = window:addChild(newRoundTinyButton(18, 12, 0x0F0F0F, 0x2D2D2D, 0x0F0F0F, 0x2D2D2D, "⢠⡄"))
local labelUpperButton = window:addChild(newUpperButton(23, 1, 9, 0x1E1E1E, 0xFFDB40, 0x0F0F0F, 0x996D00, "Label"))
local _ = window:addChild(newUpperButton(33, 1, 9, 0x1E1E1E, 0xFFDB40, 0x0F0F0F, 0x996D00, " "))
local _ = window:addChild(newUpperButton(43, 1, 9, 0x1E1E1E, 0xFFDB40, 0x0F0F0F, 0x996D00, " "))
fileUpperButton.onTouch = function()
local filesystemDialog = GUI.addFilesystemDialog(workspace, true, 50, math.floor(window.height * 0.8), "Confirm", "Cancel", "File name", "/")
filesystemDialog:setMode(GUI.IO_MODE_OPEN, GUI.IO_MODE_FILE)
filesystemDialog:addExtensionFilter(".dfpwm")
filesystemDialog:expandPath(paths.user.desktop)
filesystemDialog:show()
filesystemDialog.onSubmit = function(path)
local tapeSpaceFree = tape.size - component.invoke(tape.address, "getPosition")
local fileSize = filesystem.size(path)
if fileSize > tapeSpaceFree then
GUI.alert("Not enough space on tape")
return
end
local file = filesystem.open(path, "rb")
component.invoke(tape.address, "stop")
local bytesWritten, chunk = 0
while true do
chunk = file:read(8192)
if not chunk then
break
end
if not component.invoke(tape.address, "isReady") then
GUI.alert("Tape was removed during writing")
break
end
component.invoke(tape.address, "write", chunk)
bytesWritten = bytesWritten + #chunk
tapeWritingProgress = bytesWritten / fileSize
workspace:draw()
end
file:close()
component.invoke(tape.address, "seek", -tape.size)
tapeWritingProgress = nil
end
end
urlUpperButton.onTouch = function()
local container = GUI.addBackgroundContainer(workspace, true, true, title)
local input = container.layout:addChild(GUI.input(1, 1, 36, 3, 0xE1E1E1, 0x696969, 0x969696, 0xE1E1E1, 0x2D2D2D, "", "Url", false))
input.onInputFinished = function()
workspace:draw()
end
container.panel.onTouch = function()
container:remove()
workspace:draw()
end
workspace:draw()
return container
end
labelUpperButton.onTouch = function()
local container = GUI.addBackgroundContainer(workspace, true, true, title)
local input = container.layout:addChild(GUI.input(1, 1, 36, 3, 0xE1E1E1, 0x696969, 0x969696, 0xE1E1E1, 0x2D2D2D, component.invoke(tape.address, "getLabel") or "", "New label", false))
input.onInputFinished = function()
component.invoke(tape.address, "setLabel", input.text)
workspace:draw()
end
container.panel.onTouch = function()
container:remove()
workspace:draw()
end
workspace:draw()
return container
end
-------------------------------- Needle search ------------------------------------------------
local needleSearch = window:addChild(GUI.object(25, 15, 29, 2))
needleSearch.draw = function()
-- screen.drawRectangle(needleSearch.x, needleSearch.y, needleSearch.width, needleSearch.height, 0xFF0000, 0x0, " ")
screen.drawText(needleSearch.x, needleSearch.y, powerButton.pressed and 0xE1E1E1 or 0x0, "▲ ╷ ╷ ╷ ╷ ╷ ╷ ╷ ╷ ╷ ╷ ╷ ╷ ╷ ▲")
end
needleSearch.eventHandler = function(workspace, needleSearch, e1, e2, e3, e4)
if e1 == "touch" and powerButton.pressed and tape then
local position = component.invoke(tape.address, "getPosition")
local newPosition = math.floor((e3 - needleSearch.x) / needleSearch.width * tape.size)
component.invoke(tape.address, "seek", newPosition - position)
end
end
-------------------------------- Pref/next tape button ------------------------------------------------
@ -477,6 +568,106 @@ nextSearchButton.onTouch = function()
end
-------------------------------- Hot cue buttons ------------------------------------------------
local hotCueButtonA = window:addChild(newHotCueButton(3, 13, 0x66FF40, 0x336D00, "A"))
local hotCueButtonB = window:addChild(newHotCueButton(3, 16, 0xFFB600, 0x664900, "B"))
local hotCueButtonB = window:addChild(newHotCueButton(3, 19, 0xFF2440, 0x660000, "C"))
local hotCueSaveLoad = window:addChild(newHotCueButton(3, 23, 0x0F0F0F, 0x000000, "⠰⠆"))
hotCueSaveLoad.draw = function(button)
local bg, fg = button.animationCurrentBackground, button.animationCurrentText
-- Upper
screen.drawText(button.x, button.y, bg, "" .. string.rep("", button.width - 2) .. "")
-- Left
screen.drawText(button.x, button.y + 1, bg, "")
-- Middle
screen.set(button.x + 1, button.y + 1, 0x2D2D2D, fg, " ")
screen.set(button.x + 2, button.y + 1, 0x2D2D2D, fg, " ")
screen.set(button.x + 3, button.y + 1, 0x2D2D2D, fg, "")
screen.set(button.x + 4, button.y + 1, 0x2D2D2D, fg, " ")
screen.set(button.x + 5, button.y + 1, 0x2D2D2D, fg, " ")
-- Right
screen.drawText(button.x + button.width - 1, button.y + 1, bg, "")
-- Lower
screen.drawText(button.x, button.y + button.height - 1, bg, "" .. string.rep("", button.width - 2) .. "")
end
hotCueButtonA.onTouch = function()
end
-------------------------------- Loop buttons ------------------------------------------------
local function loopButtonDraw(button)
local border, color1, color2, color3, color4
if powerButton.pressed then
if button.pressed then
border, color1, color2, color3, color4 = 0x332400, 0x996D00, 0x996D00, 0x996D00, 0x996D00
else
border, color1, color2, color3, color4 = 0x332400, 0xFFDB80, 0xFFDB40, 0xFFB680, 0xFFB640
end
else
border, color1, color2, color3, color4 = 0x0F0F0F, 0x332400, 0x332400, 0x332400, 0x332400
end
-- 1
screen.drawText(button.x, button.y, border, "")
screen.set(button.x + 1, button.y, color1, border, "")
screen.set(button.x + 2, button.y, color2, border, "")
screen.set(button.x + 3, button.y, color3, border, "")
screen.drawText(button.x + 4, button.y, border, "")
-- 2
screen.drawText(button.x, button.y + 1, border, "")
screen.set(button.x + 1, button.y + 1, color4, border, "")
screen.set(button.x + 2, button.y + 1, color4, border, "")
screen.set(button.x + 3, button.y + 1, color3, border, "")
screen.drawText(button.x + 4, button.y + 1, border, "")
end
local function loopButtonEventHandler(workspace, button, e1, e2, e3, e4, e5)
if e1 == "touch" then
button.pressed = true
workspace:draw()
event.sleep(0.2)
button.pressed = false
workspace:draw()
if button.onTouch then
button.onTouch()
end
end
end
local function newLoopButton(x, y)
local button = GUI.object(x, y, 5, 2)
button.pressed = false
button.draw = loopButtonDraw
button.eventHandler = loopButtonEventHandler
return button
end
local loopButtonIn = window:addChild(newLoopButton(13, 18))
local loopButtonOut = window:addChild(newLoopButton(19, 18))
local reloopButton = window:addChild(newRoundTinyButton(26, 18, 0x2D2D2D, 0xFFB640, 0x1E1E1E, 0x996D00, "⢠⡄"))
loopButtonIn.onTouch = function()
end
-------------------------------- Cue button ------------------------------------------------
@ -498,11 +689,7 @@ playButton.eventHandler = function(workspace, playButton, e1)
if e1 == "touch" and powerButton.pressed then
playButton.blinking = not playButton.blinking
if playButton.blinking then
tape.proxy.stop()
else
tape.proxy.play()
end
component.invoke(tape.address, playButton.blinking and "stop" or "play")
workspace:draw()
end
@ -517,7 +704,7 @@ local beatSyncMasterButton = window:addChild(newRoundMiniButton(74, 24, 0xB4B4B4
local tempoButton = window:addChild(newRoundTinyButton(72, 28, 0x0F0F0F, 0x2D2D2D, 0x0, 0xFF2440, " "))
local masterTempoButton = window:addChild(newRoundTinyButton(72, 31, 0x0F0F0F, 0x2D2D2D, 0x0F0F0F, 0xFF2440, "⢠⡄"))
local masterTempoButton = window:addChild(newRoundTinyButton(72, 31, 0x0F0F0F, 0x2D2D2D, 0x0F0F0F, 0xFF0000, "⢠⡄"))
masterTempoButton.switchMode = true
masterTempoButton:press()
@ -542,6 +729,12 @@ window.eventHandler = function(workspace, window, e1, ...)
local uptime = computer.uptime()
-- Cheching if play button state was changed
if isPlaying == playButton.blinking then
playButton.blinking = not playButton.blinking
shouldDraw = true
end
if isPlaying then
if uptime > jogIncrementUptime then
-- Rotating jog
@ -565,14 +758,6 @@ window.eventHandler = function(workspace, window, e1, ...)
shouldDraw = true
end
if not e1 then
-- Cheching if play button state was changed
if isPlaying == playButton.blinking then
playButton.blinking = not playButton.blinking
shouldDraw = true
end
end
if shouldDraw then
workspace:draw()
end

View File

@ -611,11 +611,13 @@ local function buttonPlayAnimation(button, onFinish)
if button.colors.default.background and button.colors.pressed.background then
button.animationCurrentBackground = color.transition(button.colors.pressed.background, button.colors.default.background, animation.position)
end
button.animationCurrentText = color.transition(button.colors.pressed.text, button.colors.default.text, animation.position)
else
if button.colors.default.background and button.colors.pressed.background then
button.animationCurrentBackground = color.transition(button.colors.default.background, button.colors.pressed.background, animation.position)
end
button.animationCurrentText = color.transition(button.colors.default.text, button.colors.pressed.text, animation.position)
end
end,
@ -4728,8 +4730,8 @@ end
---------------------------------------------------------------------------------------------------
local function tableHeaderDraw(self)
screen.drawRectangle(self.x, self.y, self.width, self.height, self.parent.colors.headerBackground, self.parent.colors.headerText, " ")
screen.drawText(self.x + 1, self.y, self.parent.colors.headerText, self.text)
screen.drawRectangle(self.x, self.y, self.width, self.height, self.parent.colors.headerBackground, self.parent.colors.headerForeground, " ")
screen.drawText(self.x + 1, self.y, self.parent.colors.headerForeground, self.text)
end
local function tableAddColumn(self, headerText, sizePolicy, size)
@ -4810,28 +4812,34 @@ end
function GUI.tableCellDraw(self)
local background, foreground
if self.selected then
background, foreground = self.colors.selectionBackground, self.colors.selectionText
background, foreground =
self.colors.selectionBackground or self.parent.colors.itemSelectionBackground,
self.colors.selectionForeground or self.parent.colors.itemSelectionForeground
elseif self.alternative then
background, foreground = self.colors.alternativeBackground, self.colors.alternativeText
background, foreground =
self.colors.alternativeBackground or self.parent.colors.itemAlternativeBackground,
self.colors.alternativeForeground or self.parent.colors.itemAlternativeForeground
else
background, foreground = self.colors.defaultBackground, self.colors.defaultText
background, foreground =
self.colors.defaultBackground or self.parent.colors.itemDefaultBackground,
self.colors.defaultForeground or self.parent.colors.itemDefaultForeground
end
if background then
screen.drawRectangle(self.x, self.y, self.width, self.height,
background,
foreground,
" ")
screen.drawRectangle(self.x, self.y, self.width, self.height, background, foreground or 0x0, " ")
end
return foreground
return foreground or 0x0
end
function GUI.tableCell(colors)
function GUI.tableCell()
local cell = GUI.object(1, 1, 1, 1)
cell.colors = colors
cell.colors = {}
cell.draw = GUI.tableCellDraw
cell.eventHandler = GUI.tableCellEventHandler
@ -4839,11 +4847,11 @@ function GUI.tableCell(colors)
end
local function tableTextCellDraw(self)
screen.drawText(self.x + 1, self.y, GUI.tableCellDraw(self), self.text)
screen.drawText(self.x + 1, self.y, GUI.tableCellDraw(self) or 0x0, self.text)
end
function GUI.tableTextCell(colors, text)
local cell = GUI.tableCell(colors)
function GUI.tableTextCell(text)
local cell = GUI.tableCell()
cell.text = text
cell.draw = tableTextCellDraw
@ -4893,7 +4901,9 @@ function GUI.tableEventHandler(workspace, self, e1, e2, e3, e4, e5, ...)
end
if not itemTouched then
self.onBackgroundTouch(workspace, self, e1, e2, e3, e4, e5, ...)
if self.onBackgroundTouch then
self.onBackgroundTouch(workspace, self, e1, e2, e3, e4, e5, ...)
end
end
elseif e1 == "scroll" then
@ -4902,13 +4912,43 @@ function GUI.tableEventHandler(workspace, self, e1, e2, e3, e4, e5, ...)
end
end
function GUI.table(x, y, width, height, itemHeight, backgroundColor, headerBackgroundColor, headerTextColor)
function GUI.table(
x,
y,
width,
height,
itemHeight,
background,
headerBackground,
headerForeground,
itemDefaultBackground,
itemDefaultForeground,
itemAlternativeBackground,
itemAlternativeForeground,
itemSelectionBackground,
itemSelectionForeground
)
local table = GUI.layout(x, y, width, height, 0, 2)
table.colors = {
background = backgroundColor,
headerBackground = headerBackgroundColor,
headerText = headerTextColor
background = background,
headerBackground = headerBackground,
headerForeground = headerForeground,
itemDefaultBackground = itemDefaultBackground,
itemDefaultForeground = itemDefaultForeground,
itemAlternativeBackground = itemAlternativeBackground,
itemAlternativeForeground = itemAlternativeForeground,
itemSelectionBackground = itemSelectionBackground,
itemSelectionForeground = itemSelectionForeground
}
table.itemHeight = itemHeight
@ -4928,51 +4968,6 @@ function GUI.table(x, y, width, height, itemHeight, backgroundColor, headerBackg
return table
end
---------------------------------------------------------------------------------------------------
-- local workspace = GUI.workspace()
-- workspace:addChild(GUI.panel(1, 1, workspace.width, workspace.height, 0x2D2D2D))
-- local t = workspace:addChild(GUI.table(3, 2, 80, 30, 1,
-- 0xF0F0F0,
-- 0xFFFFFF,
-- 0x000000
-- ))
-- t:addColumn("Name", GUI.SIZE_POLICY_RELATIVE, 0.6)
-- t:addColumn("Date", GUI.SIZE_POLICY_RELATIVE, 0.4)
-- t:addColumn("Size", GUI.SIZE_POLICY_ABSOLUTE, 16)
-- t:addColumn("Type", GUI.SIZE_POLICY_ABSOLUTE, 10)
-- local colors1 = {
-- defaultBackground = nil,
-- defaultText = 0x3C3C3C,
-- alternativeBackground = 0xE1E1E1,
-- alternativeText = 0x3C3C3C,
-- selectionBackground = 0xCC2440,
-- selectionText = 0xFFFFFF,
-- }
-- local colors2 = {}
-- for key, value in pairs(colors1) do
-- colors2[key] = value
-- end
-- colors2.defaultText, colors2.alternativeText = 0xA5A5A5, 0xA5A5A5
-- for i = 1, 10 do
-- t:addRow(
-- GUI.tableTextCell(colors1, "Ehehehe " .. i),
-- GUI.tableTextCell(colors2, "12.02.2018"),
-- GUI.tableTextCell(colors2, "114.23 KB"),
-- GUI.tableTextCell(colors2, ".lua")
-- )
-- end
-- workspace:draw()
-- workspace:start()
---------------------------------------------------------------------------------------------------
return GUI

View File

@ -1289,22 +1289,31 @@ local function listIconFieldUpdateFileList(iconField)
-- Removing old rows
iconField:clear()
local function cell1Draw(self)
local function firstCell(self)
local foreground = GUI.tableCellDraw(self)
screen.drawText(self.x, self.y, self.pizda, "")
screen.drawText(self.x + 3, self.y, foreground, self.name)
end
local function newCell1(path)
local icon = GUI.tableCell(iconField.cell1Colors)
anyIconAddInfo(icon, path)
anyIconFieldAddIcon(iconField, icon)
local function newFirstCell(path)
local cell = GUI.tableCell()
icon.draw = cell1Draw
anyIconAddInfo(cell, path)
anyIconFieldAddIcon(iconField, cell)
return icon
cell.draw = firstCell
return cell
end
local function newOtherCell(text)
local cell = GUI.tableTextCell(text)
cell.colors.defaultForeground = 0xA5A5A5
cell.colors.alternativeForeground = 0xA5A5A5
return cell
end
local file
@ -1314,22 +1323,23 @@ local function listIconFieldUpdateFileList(iconField)
if file then
file = iconField.path .. file
local icon = newCell1(file)
local firstCell = newFirstCell(file)
-- Adding a single-pixel representation of icon
for i = 3, #icon.image, 4 do
if icon.image[i + 2] == 0 then
icon.pizda = icon.image[i]
-- Adding a single-pixel representation of firstCell
for i = 3, #firstCell.image, 4 do
if firstCell.image[i + 2] == 0 then
firstCell.pizda = firstCell.image[i]
break
end
end
icon.pizda = icon.pizda or 0x0
firstCell.pizda = firstCell.pizda or 0x0
iconField:addRow(
icon,
GUI.tableTextCell(iconField.cell2Colors, os.date(userSettings.timeFormat, math.floor(filesystem.lastModified(file) / 1000 + userSettings.timeTimezone))),
GUI.tableTextCell(iconField.cell2Colors, icon.isDirectory and "-" or number.roundToDecimalPlaces(filesystem.size(file) / 1024, 2) .. " KB"),
GUI.tableTextCell(iconField.cell2Colors, icon.isDirectory and localization.folder or(icon.extension and icon.extension:sub(2, 2):upper() .. icon.extension:sub(3, -1) or "-"))
firstCell,
newOtherCell(os.date(userSettings.timeFormat, math.floor(filesystem.lastModified(file) / 1000 + userSettings.timeTimezone))),
newOtherCell(firstCell.isDirectory and "-" or number.roundToDecimalPlaces(filesystem.size(file) / 1024, 2) .. " KB"),
newOtherCell(firstCell.isDirectory and localization.folder or(firstCell.extension and firstCell.extension:sub(2, 2):upper() .. firstCell.extension:sub(3, -1) or "-"))
)
else
break
@ -1803,23 +1813,6 @@ end
function system.listIconField(x, y, width, height, path, ...)
local iconField = GUI.table(x, y, width, height, 1, ...)
-- First cell colors
iconField.cell1Colors = {
defaultBackground = nil,
defaultText = 0x3C3C3C,
alternativeBackground = 0xE1E1E1,
alternativeText = 0x3C3C3C,
selectionBackground = 0xCC2440,
selectionText = 0xFFFFFF,
}
-- Other cells colors
iconField.cell2Colors = {}
for key, value in pairs(iconField.cell1Colors) do
iconField.cell2Colors[key] = value
end
iconField.cell2Colors.defaultText, iconField.cell2Colors.alternativeText = 0xA5A5A5, 0xA5A5A5
iconField:addColumn(localization.name, GUI.SIZE_POLICY_RELATIVE, 0.6)
iconField:addColumn(localization.date, GUI.SIZE_POLICY_RELATIVE, 0.4)
iconField:addColumn(localization.size, GUI.SIZE_POLICY_ABSOLUTE, 16)