Новая приложенька

This commit is contained in:
Igor Timofeev 2017-10-14 20:14:59 +03:00
parent cb418de28c
commit c318e383e8
19 changed files with 693 additions and 716 deletions

View File

@ -141,13 +141,13 @@
path="/MineOS/System/Icons/HDD.pic",
url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/HDD.pic",
type="Icon",
version=1.0,
version=1.01,
},
{
path="/MineOS/System/Icons/Floppy.pic",
url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/Floppy.pic",
type="Icon",
version=1.0,
version=1.01,
},
{
path="/MineOS/System/Icons/Steve.pic",
@ -235,7 +235,7 @@
path="/lib/MineOSInterface.lua",
url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/MineOSInterface.lua",
type="Library",
version=1.05,
version=1.06,
},
{
path="/lib/MineOSPaths.lua",
@ -302,7 +302,7 @@
url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/GUI.lua",
type="Library",
preloadFile=true,
version=1.83,
version=1.84,
},
{
path="/lib/rayEngine.lua",
@ -890,6 +890,36 @@
createShortcut=true,
version=1.0,
},
{
path="/MineOS/Applications/Control",
url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Control/Main.lua",
type="Application",
icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Control/Icon.pic",
forceDownload=true,
version=5.00,
resources={
{
path="/Localization/Russian.lang",
url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Control/Localization/Russian.lang"
},
{
path="/Localization/English.lang",
url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Control/Localization/English.lang"
},
{
path="/Modules/1.lua",
url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Control/Modules/1.lua"
},
{
path="/Modules/2.lua",
url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Control/Modules/2.lua"
},
{
path="/Modules/3.lua",
url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Control/Modules/3.lua"
},
}
},
{
path="/MineOS/Applications/Photoshop",
url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Photoshop/Photoshop.lua",

View File

@ -1 +0,0 @@
Control - программа, позволяющая узнать всю необходимую информацию о данном компьютере, позволяет манипулировать жесткими дисками, форматировать их, изменять их имя и прочее.

View File

@ -1 +0,0 @@
Control - программа, позволяющая узнать всю необходимую информацию о данном компьютере, позволяет манипулировать жесткими дисками, форматировать их, изменять их имя и прочее.

View File

@ -1,287 +0,0 @@
--pastebin run 5whGf4Ns
local c = require("component")
local unicode = require("unicode")
local computer = require("computer")
local event = require("event")
local context = require("context")
local screen = c.screen
local gpu = c.gpu
local image = require("image")
-------------------------------------------------------------------------------------------------------------------------------
local colors = {
topBar = 0xdddddd,
main = 0xffffff,
closes = {cross = 0xCC4C4C, hide = 0xDEDE6C, full = 0x57A64E},
topText = 0x262626,
topButtons = 0xffffff,
topButtonsText = 0x262626,
}
local topButtons = {"О системе", "Диски"}
local spaceBetweenTopButtons, offsetTopButtons = 2, 2
local currentMode = 1
local osIcon = image.load("MineOS/System/OS/Icons/OS_Logo.pic")
local hddIcon = image.load("MineOS/System/OS/Icons/HDD.pic")
local floppyIcon = image.load("MineOS/System/OS/Icons/Floppy.pic")
local updateIcon = image.load("MineOS/System/OS/Icons/Update.pic")
local x, y = "auto", "auto"
local width, height = 84, 26
x, y = ecs.correctStartCoords(x, y, width, height)
local heightOfTopBar = 3
local ram = {}
ram.free, ram.total, ram.used = ecs.getInfoAboutRAM()
local drawHDDFrom = 1
local HDDs
local bootAddress = computer.getBootAddress()
local updates, oldApps
local drawUpdatesFrom = 1
local xUpdatesList, yUpdatesList
local countOfChoses
-------------------------------------------------------------------------------------------------------------------------------
--СОЗДАНИЕ ОБЪЕКТОВ
local obj = {}
local function newObj(class, name, ...)
obj[class] = obj[class] or {}
obj[class][name] = {...}
end
--Рисем цветные кружочки слева вверху
local function drawCloses()
local symbol = ""
gpu.setBackground(colors.topBar)
local yPos = y
ecs.colorText(x + 1, yPos , colors.closes.cross, symbol)
ecs.colorText(x + 3, yPos , colors.closes.hide, symbol)
ecs.colorText(x + 5, yPos , colors.closes.full, symbol)
newObj("Closes", 1, x + 1, yPos, x + 1, yPos)
newObj("Closes", 2, x + 3, yPos, x + 3, yPos)
newObj("Closes", 3, x + 5, yPos, x + 5, yPos)
end
--Рисуем верхнюю часть
local function drawTopBar()
--Рисуем сам бар
ecs.square(x, y, width, heightOfTopBar, colors.topBar)
--Рисуем кнопочки
drawCloses()
--Рисуем титл
--local text = topButtons[currentMode]
--ecs.colorText(x + math.floor(width / 2 - unicode.len(text) / 2), y, colors.topText, text)
--Рисуем кнопочки влево-вправо
local widthOfButtons = 0
for i = 1, #topButtons do
widthOfButtons = widthOfButtons + unicode.len(topButtons[i]) + spaceBetweenTopButtons + offsetTopButtons * 2
end
local xPos, yPos = x + math.floor(width / 2 - widthOfButtons / 2), y + 1
for i = 1, #topButtons do
local color1, color2 = colors.topButtons, colors.topButtonsText
if i == currentMode then color1, color2 = ecs.colors.blue, 0xffffff end
newObj("TopButtons", i, ecs.drawAdaptiveButton(xPos, yPos, offsetTopButtons, 0, topButtons[i], color1, color2))
xPos = xPos + unicode.len(topButtons[i]) + spaceBetweenTopButtons + offsetTopButtons * 2
color1, color2 = nil, nil
end
end
local function drawUpdatesList()
local selectSymbol, nonSelectSymbol = "", " "
local limit = 40
local xPos, yPos = xUpdatesList, yUpdatesList
--ОЧИЩАЕМ ЭТУ ПИЗДУ, ЗАЕБАЛО, БЛЯДЬ
ecs.square(xPos, yPos, limit + 2, 15, colors.main)
for i = drawUpdatesFrom, (drawUpdatesFrom + 4) do
if not updates[i] then break end
--Коробка для галочки
ecs.border(xPos, yPos, 5, 3, colors.main, 0x262626)
--Галочка
if updates[i].needToUpdate then
ecs.colorText(xPos + 2, yPos + 1, 0x880000, selectSymbol)
countOfChoses = countOfChoses + 1
end
--Имя проги
local text = "§f" .. (fs.name(updates[i].name) or updates[i].name) .. (function() if updates[i].needToUpdate then return "§e, версия ".. updates[i].version .." (новее)" else return "§8, версия ".. updates[i].version end end)()
ecs.smartText(xPos + 6, yPos + 1, ecs.stringLimit("end", text, limit))
text = nil
yPos = yPos + 3
end
--Скроллбар
ecs.srollBar(x + width - 3, y + heightOfTopBar + 2, 1, 15, #updates, drawUpdatesFrom, 0xdddddd, ecs.colors.blue)
end
local function drawMain()
ecs.square(x, y + heightOfTopBar, width, height - heightOfTopBar, colors.main)
local xPos, yPos
if currentMode == 1 then
xPos, yPos = x + 3, y + heightOfTopBar + 3
image.draw(xPos, yPos, osIcon)
xPos, yPos = x + 36, yPos + 3
ecs.colorTextWithBack(xPos, yPos, 0x000000, colors.main, "MineOS"); yPos = yPos + 1
ecs.colorText(xPos, yPos, ecs.colors.lightGray, "Публичная бета-версия 1.75"); yPos = yPos + 2
ecs.smartText(xPos, yPos, "§fСистемный блок §8(3 уровень, середина 2015 года)"); yPos = yPos + 1
ecs.smartText(xPos, yPos, "§fПроцессор §8(3 уровень, дохуя GHz)"); yPos = yPos + 1
ecs.smartText(xPos, yPos, "§fПамять §8(1333 МГц DDR3 "..ram.total.." KB)"); yPos = yPos + 1
ecs.smartText(xPos, yPos, "§fГрафика §8(GTX Titan AnaloRazrivatel mk.3000)"); yPos = yPos + 1
ecs.smartText(xPos, yPos, "§fСерийный номер §8"..ecs.stringLimit("end", computer.address(), 30)); yPos = yPos + 1
elseif currentMode == 2 then
obj["HDDControls"] = {}
yPos = y + heightOfTopBar + 1
HDDs = ecs.getHDDs()
for i = drawHDDFrom, (drawHDDFrom + 3) do
if not HDDs[i] then break end
xPos = x + 2
--Рисуем правильную картинку диска
if HDDs[i].isFloppy == true then image.draw(xPos, yPos, floppyIcon) else image.draw(xPos, yPos, hddIcon) end
--Рисуем тексты
xPos = xPos + 10
gpu.setBackground(colors.main)
local load = ""
if bootAddress == HDDs[i].address then load = " §eзагрузочный§8," end
ecs.smartText(xPos, yPos, ecs.stringLimit("end", "§f" .. (HDDs[i].label or "Безымянный диск") .. "§8,"..load.." " .. HDDs[i].address, 58)); yPos = yPos + 2
--Рисуем прогрессбар
local percent = math.ceil(HDDs[i].spaceUsed / HDDs[i].spaceTotal * 100)
ecs.progressBar(xPos, yPos, 50, 1, 0xdddddd, ecs.colors.blue, percent)
yPos = yPos + 1
ecs.colorTextWithBack(xPos + 10, yPos, 0xaaaaaa, colors.main, HDDs[i].spaceUsed.." из "..HDDs[i].spaceTotal.." KB использовано"); yPos = yPos + 1
ecs.separator(x, yPos, width - 1, colors.main, 0xdddddd)
--Рисуем кнопы
xPos, yPos = x + 67, yPos - 4
newObj("HDDControls", i, ecs.drawButton(xPos, yPos, 14, 3, "Управление", ecs.colors.blue, 0xffffff))
yPos = yPos + 5
end
--Скроллбар
ecs.srollBar(x + width - 1, y + heightOfTopBar, 1, height - heightOfTopBar, #HDDs, drawHDDFrom, 0xdddddd, ecs.colors.blue)
end
end
-------------------------------------------------------------------------------------------------------------------------------
--ecs.prepareToExit()
local oldPixels = ecs.rememberOldPixels(x, y, x + width - 1, y + height - 1)
drawTopBar()
drawMain()
while true do
local e = {event.pull()}
if e[1] == "touch" then
if currentMode == 2 then
for key in pairs(obj["HDDControls"]) do
if ecs.clickedAtArea(e[3], e[4], obj["HDDControls"][key][1], obj["HDDControls"][key][2], obj["HDDControls"][key][3], obj["HDDControls"][key][4]) then
ecs.drawButton(obj["HDDControls"][key][1], obj["HDDControls"][key][2], 14, 3, "Управление", 0xdddddd, ecs.colors.blue)
local action = context.menu(obj["HDDControls"][key][1], obj["HDDControls"][key][2] + 3, {"Форматировать"}, {"Изменить имя"}, {"Установить как загрузочный"}, "-", {"Сдублировать OS на этот диск"})
if action == "Форматировать" then
local data = ecs.universalWindow("auto", "auto", 38, ecs.windowColors.background, true, {"EmptyLine"}, {"CenterText", 0x880000, "Внимание!"}, {"EmptyLine"}, {"CenterText", 0x262626, "Данное действие очистит весь диск."}, {"CenterText", 0x262626, "Продолжить?"}, {"EmptyLine"}, {"Button", {0xbbbbbb, 0xffffff, "Да"}, {0x999999, 0xffffff, "Нет"}})
if data[1] ~= "Нет" then
ecs.formatHDD(HDDs[key].address)
drawMain()
end
elseif action == "Изменить имя" then
local data = ecs.universalWindow("auto", "auto", 30, ecs.windowColors.background, true, {"EmptyLine"}, {"CenterText", 0x262626, "Изменить имя диска"}, {"EmptyLine"}, {"Input", 0x262626, 0x000000, HDDs[key].label or "Имя"}, {"EmptyLine"}, {"Button", {0xbbbbbb, 0xffffff, "OK!"}})
if data[1] == "" or data[1] == " " then data[1] = "Untitled" end
ecs.setHDDLabel(HDDs[key].address, data[1])
drawMain()
elseif action == "Сдублировать OS на этот диск" then
ecs.duplicateFileSystem(bootAddress, HDDs[key].address)
drawMain()
elseif action == "Установить как загрузочный" then
computer.setBootAddress(HDDs[key].address)
bootAddress = HDDs[key].address
drawMain()
end
ecs.drawButton(obj["HDDControls"][key][1], obj["HDDControls"][key][2], 14, 3, "Управление", ecs.colors.blue, 0xffffff)
break
end
end
end
for key, val in pairs(obj["TopButtons"]) do
if ecs.clickedAtArea(e[3], e[4], obj["TopButtons"][key][1], obj["TopButtons"][key][2], obj["TopButtons"][key][3], obj["TopButtons"][key][4]) then
currentMode = key
drawTopBar()
drawMain()
break
end
end
for key, val in pairs(obj["Closes"]) do
if ecs.clickedAtArea(e[3], e[4], obj["Closes"][key][1], obj["Closes"][key][2], obj["Closes"][key][3], obj["Closes"][key][4]) then
ecs.colorTextWithBack(obj["Closes"][key][1], obj["Closes"][key][2], ecs.colors.blue, colors.topBar, "")
os.sleep(0.2)
if key == 1 then
ecs.drawOldPixels(oldPixels)
return
else
drawTopBar()
break
end
end
end
elseif e[1] == "key_down" then
for i = 2, 5 do
if e[4] == i then
currentMode = i - 1
drawTopBar()
drawMain()
break
end
end
if e[4] == 28 then
ecs.prepareToExit()
return
end
elseif e[1] == "scroll" then
if currentMode == 2 then
if e[5] == 1 then
if drawHDDFrom > 1 then drawHDDFrom = drawHDDFrom - 1; drawMain() end
else
if drawHDDFrom < #HDDs then drawHDDFrom = drawHDDFrom + 1; drawMain() end
end
elseif currentMode == 3 then
if e[5] == 1 then
if drawUpdatesFrom > 1 then drawUpdatesFrom = drawUpdatesFrom - 1; drawUpdatesList() end
else
if drawUpdatesFrom < #updates then drawUpdatesFrom = drawUpdatesFrom + 1; drawUpdatesList() end
end
end
end
end

Binary file not shown.

View File

@ -0,0 +1,16 @@
{
moduleDisk = "Disk utility",
moduleRAM = "RAM control",
moduleEvent = "Event processing",
diskLabel = "Disk label",
bootable = "Bootable",
of = "of",
free = "Free",
options = "Options",
arguments = "Arguments",
format = "Format",
execute = "Execute",
waitingEvents = "Waiting for events",
processingEnabled = "Event processing enabled",
}

View File

@ -0,0 +1,16 @@
{
moduleDisk = "Дисковая утилита",
moduleRAM = "Управление памятью",
moduleEvent = "Анализ событий",
diskLabel = "Имя диска",
bootable = "Загрузочный",
of = "из",
free = "Свободно",
options = "Опции",
arguments = "Аргументы",
format = "Форматировать",
execute = "Выполнить",
waitingEvents = "Ожидание событий",
processingEnabled = "Обработка событий",
}

View File

@ -0,0 +1,68 @@
require("advancedLua")
local component = require("component")
local computer = require("computer")
local image = require("image")
local buffer = require("doubleBuffering")
local GUI = require("GUI")
local fs = require("filesystem")
local unicode = require("unicode")
local MineOSPaths = require("MineOSPaths")
local MineOSCore = require("MineOSCore")
local MineOSInterface = require("MineOSInterface")
----------------------------------------------------------------------------------------------------------------
local resourcesPath = MineOSCore.getCurrentApplicationResourcesDirectory()
local modulesPath = resourcesPath .. "Modules/"
local localization = MineOSCore.getLocalization(resourcesPath .. "Localization/")
local mainContainer, window = MineOSInterface.addWindow(GUI.tabbedWindow(nil, nil, 80, 25))
----------------------------------------------------------------------------------------------------------------
window.contentContainer = window:addChild(GUI.container(1, 4, window.width, window.height - 3))
local function loadModules()
local fileList = fs.sortedList(modulesPath, "name", false)
for i = 1, #fileList do
local success, reason = loadfile(modulesPath .. fileList[i])
if success then
local success, reason = pcall(success, mainContainer, window, localization)
if success then
window.tabBar:addItem(reason.name).onTouch = function()
reason.onTouch()
end
else
error("Failed to call loaded module \"" .. tostring(fileList[i]) .. "\": " .. tostring(reason))
end
else
error("Failed to load module \"" .. tostring(fileList[i]) .. "\": " .. tostring(reason))
end
end
end
window.onResize = function(width, height)
window.tabBar.width = width
window.backgroundPanel.width = width
window.backgroundPanel.height = height - 3
window.contentContainer.width = width
window.contentContainer.height = window.backgroundPanel.height
window.tabBar.children[window.tabBar.selectedItem + 1].onTouch()
end
----------------------------------------------------------------------------------------------------------------
loadModules()
window.onResize(80, 25)
mainContainer:draw()
buffer.draw()

View File

@ -0,0 +1,110 @@
local args = {...}
local mainContainer, window, localization = args[1], args[2], args[3]
require("advancedLua")
local component = require("component")
local computer = require("computer")
local GUI = require("GUI")
local buffer = require("doubleBuffering")
local image = require("image")
local MineOSPaths = require("MineOSPaths")
local MineOSInterface = require("MineOSInterface")
----------------------------------------------------------------------------------------------------------------
local module = {}
module.name = localization.moduleDisk
local HDDImage = image.load(MineOSPaths.icons .. "HDD.pic")
local floppyImage = image.load(MineOSPaths.icons .. "Floppy.pic")
----------------------------------------------------------------------------------------------------------------
module.onTouch = function()
window.contentContainer:deleteChildren()
local container = window.contentContainer:addChild(GUI.container(1, 1, window.contentContainer.width, window.contentContainer.height))
local y = 2
for address in component.list("filesystem") do
local proxy = component.proxy(address)
local isBoot = computer.getBootAddress() == proxy.address
local isReadOnly = proxy.isReadOnly()
local diskContainer = container:addChild(GUI.container(1, y, container.width, 4))
local button = diskContainer:addChild(GUI.adaptiveRoundedButton(1, 3, 2, 0, 0x2D2D2D, 0xE1E1E1, 0x0, 0xE1E1E1, localization.options))
button.onTouch = function()
local container = MineOSInterface.addUniversalContainer(mainContainer, localization.options)
local inputField = container.layout:addChild(GUI.inputField(1, 1, 36, 3, 0xEEEEEE, 0x666666, 0x666666, 0xEEEEEE, 0x262626, proxy.getLabel(), localization.diskLabel))
inputField.onInputFinished = function()
if inputField.text and inputField.text:len() > 0 then
proxy.setLabel(inputField.text)
container:delete()
module.onTouch()
end
end
local button = container.layout:addChild(GUI.roundedButton(1, 1, 36, 3, 0xEEEEEE, 0x666666, 0x666666, 0xEEEEEE, localization.format))
button.onTouch = function()
local list = proxy.list("/")
for i = 1, #list do
proxy.remove(list[i])
end
container:delete()
module.onTouch()
end
button.disabled = isReadOnly
local switch = container.layout:addChild(GUI.switchAndLabel(1, 1, 36, 8, 0x66DB80, 0x1E1E1E, 0xEEEEEE, 0xBBBBBB, localization.bootable .. ":", isBoot)).switch
switch.onStateChanged = function()
if switch.state then
computer.setBootAddress(proxy.address)
container:delete()
module.onTouch()
end
end
mainContainer:draw()
buffer.draw()
end
button.localPosition.x = diskContainer.width - button.width - 1
local width = diskContainer.width - button.width - 17
local x = 13
local spaceTotal = proxy.spaceTotal()
local spaceUsed = proxy.spaceUsed()
diskContainer:addChild(GUI.image(3, 1, isReadOnly and floppyImage or HDDImage))
diskContainer:addChild(GUI.label(x, 1, width, 1, 0x2D2D2D, (proxy.getLabel() or "Unknown") .. " (" .. (isBoot and (localization.bootable .. ", ") or "") .. proxy.address .. ")"))
diskContainer:addChild(GUI.progressBar(x, 3, width, 0x66DB80, 0xD2D2D2, 0xD2D2D2, spaceUsed / spaceTotal * 100, true))
diskContainer:addChild(GUI.label(x, 4, width, 1, 0xBBBBBB, localization.free .. " " .. math.roundToDecimalPlaces((spaceTotal - spaceUsed) / 1024 / 1024, 2) .. " MB " .. localization.of .. " " .. math.roundToDecimalPlaces(spaceTotal / 1024 / 1024, 2) .. " MB")):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top)
y = y + diskContainer.height + 1
end
container.eventHandler = function(mainContainer, object, eventData)
if eventData[1] == "scroll" then
if eventData[5] < 0 or container.children[1].localPosition.y < 2 then
for i = 1, #container.children do
container.children[i].localPosition.y = container.children[i].localPosition.y + eventData[5]
end
mainContainer:draw()
buffer.draw()
end
elseif eventData[1] == "component_added" or eventData[1] == "component_removed" and eventData[3] == "filesystem" then
module.onTouch()
end
end
mainContainer:draw()
buffer.draw()
end
----------------------------------------------------------------------------------------------------------------
return module

View File

@ -0,0 +1,149 @@
local args = {...}
local mainContainer, window, localization = args[1], args[2], args[3]
require("advancedLua")
local component = require("component")
local computer = require("computer")
local GUI = require("GUI")
local buffer = require("doubleBuffering")
local image = require("image")
local MineOSPaths = require("MineOSPaths")
local MineOSInterface = require("MineOSInterface")
local unicode = require("unicode")
----------------------------------------------------------------------------------------------------------------
local module = {}
module.name = localization.moduleRAM
----------------------------------------------------------------------------------------------------------------
module.onTouch = function()
window.contentContainer:deleteChildren()
local cykaPanel = window.contentContainer:addChild(GUI.panel(1, 1, 1, 1, 0xE1E1E1))
local mainLayout = window.contentContainer:addChild(GUI.layout(1, 1, window.contentContainer.width, window.contentContainer.height, 2, 1))
mainLayout:setColumnWidth(1, GUI.sizePolicies.percentage, 0.3)
mainLayout:setColumnWidth(2, GUI.sizePolicies.percentage, 0.7)
mainLayout:setCellFitting(1, 1, true, true)
mainLayout:setCellFitting(2, 1, true, true)
local tree = mainLayout:setCellPosition(1, 1, mainLayout:addChild(GUI.tree(1, 1, 1, 1, 0xE1E1E1, 0x3C3C3C, 0x3C3C3C, 0xAAAAAA, 0x3C3C3C, 0xFFFFFF, 0xBBBBBB, 0xAAAAAA, 0xC3C3C3, 0x444444, GUI.filesystemModes.both, GUI.filesystemModes.file)))
local itemsLayout = mainLayout:setCellPosition(2, 1, mainLayout:addChild(GUI.layout(1, 1, 1, 1, 1, 2)))
itemsLayout:setRowHeight(1, GUI.sizePolicies.percentage, 0.6)
itemsLayout:setRowHeight(2, GUI.sizePolicies.percentage, 0.4)
itemsLayout:setCellFitting(1, 1, true, false, 4, 0)
itemsLayout:setCellFitting(1, 2, true, true)
local infoLabel = itemsLayout:setCellPosition(1, 1, itemsLayout:addChild(GUI.label(1, 1, 1, 1, 0x3C3C3C, "nil")):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top))
local argumentsInputField = itemsLayout:setCellPosition(1, 1, itemsLayout:addChild(GUI.inputField(1, 1, 1, 3, 0xFFFFFF, 0x666666, 0x888888, 0xFFFFFF, 0x262626, nil, localization.arguments)))
local executeButton = itemsLayout:setCellPosition(1, 1, itemsLayout:addChild(GUI.button(1, 1, 1, 3, 0x3C3C3C, 0xFFFFFF, 0x0, 0xFFFFFF, localization.execute)))
local outputTextBox = itemsLayout:setCellPosition(1, 2, itemsLayout:addChild(GUI.textBox(1, 1, 1, 1, 0xFFFFFF, 0x888888, {"nil"}, 1, 1, 0)))
local function updateList(tree, t, definitionName, offset)
local list = {}
for key in pairs(t) do
table.insert(list, key)
end
local i, expandables = 1, {}
while i <= #list do
if type(t[list[i]]) == "table" then
table.insert(expandables, list[i])
table.remove(list, i)
else
i = i + 1
end
end
table.sort(expandables, function(a, b) return unicode.lower(tostring(a)) < unicode.lower(tostring(b)) end)
table.sort(list, function(a, b) return unicode.lower(tostring(a)) < unicode.lower(tostring(b)) end)
for i = 1, #expandables do
local definition = definitionName .. expandables[i]
tree:addItem(tostring(expandables[i]), definition, offset, true)
if tree.expandedItems[definition] then
updateList(tree, t[expandables[i]], definition, offset + 2)
end
end
for i = 1, #list do
tree:addItem(tostring(list[i]) .. ": " .. type(t[list[i]]), {key = list[i], value = t[list[i]]}, offset, false)
end
end
local function out(text)
local wrappedLines = string.wrap(text, outputTextBox.width - 2)
for i = 1, #wrappedLines do
table.insert(outputTextBox.lines, wrappedLines[i])
end
end
tree.onItemExpanded = function()
tree.items = {}
updateList(tree, _G, "_G", 1)
end
tree.onItemSelected = function()
local valueType = type(tree.selectedItem.value)
local valueIsFunction = valueType == "function"
executeButton.disabled = not valueIsFunction
argumentsInputField.disabled = executeButton.disabled
infoLabel.text = tostring(tree.selectedItem.key) .. " (" .. valueType .. ")"
outputTextBox.lines = {}
if valueIsFunction then
out("nil")
else
out(tostring(tree.selectedItem.value))
end
end
executeButton.onTouch = function()
outputTextBox.lines = {}
local data = "local method = ({...})[1]; return method(" .. (argumentsInputField.text or "") .. ")"
local success, reason = load(data)
if success then
local success, reason = pcall(success, tree.selectedItem.value)
if success then
if type(reason) == "table" then
local serialized = table.toString(reason, true, 2, false, 3)
for line in serialized:gmatch("[^\n]+") do
out(line)
end
else
out(tostring(reason))
end
else
out("Failed to pcall loaded string \"" .. data .. "\": " .. reason)
end
else
out("Failed to load string \"" .. data .. "\": " .. reason)
end
mainContainer:draw()
buffer.draw()
end
executeButton.disabled = true
argumentsInputField.disabled = true
executeButton.colors.disabled.background = 0x777777
executeButton.colors.disabled.text = 0xD2D2D2
tree.onItemExpanded()
mainContainer:draw()
buffer.draw()
end
----------------------------------------------------------------------------------------------------------------
return module

View File

@ -0,0 +1,53 @@
local args = {...}
local mainContainer, window, localization = args[1], args[2], args[3]
require("advancedLua")
local component = require("component")
local computer = require("computer")
local GUI = require("GUI")
local buffer = require("doubleBuffering")
local image = require("image")
local MineOSPaths = require("MineOSPaths")
local MineOSInterface = require("MineOSInterface")
----------------------------------------------------------------------------------------------------------------
local module = {}
module.name = localization.moduleEvent
----------------------------------------------------------------------------------------------------------------
module.onTouch = function()
window.contentContainer:deleteChildren()
local container = window.contentContainer:addChild(GUI.container(1, 1, window.contentContainer.width, window.contentContainer.height))
local layout = container:addChild(GUI.layout(1, 1, container.width, window.contentContainer.height, 1, 1))
layout:setCellAlignment(1, 1, GUI.alignment.horizontal.center, GUI.alignment.vertical.top)
layout:setCellMargin(1, 1, 0, 1)
local textBox = layout:addChild(GUI.textBox(1, 1, container.width - 4, container.height - 4, nil, 0x888888, {localization.waitingEvents .. "..."}, 1, 0, 0))
local switch = layout:addChild(GUI.switchAndLabel(1, 1, 27, 6, 0x66DB80, 0x1E1E1E, 0xFFFFFF, 0x2D2D2D, localization.processingEnabled .. ": ", true)).switch
container.eventHandler = function(mainContainer, object, eventData)
if switch.state and eventData[1] then
local lines = table.concat(eventData, " ")
lines = string.wrap(lines, textBox.width)
for i = 1, #lines do
table.insert(textBox.lines, lines[i])
end
textBox:scrollDown(#lines)
mainContainer:draw()
buffer.draw()
end
end
mainContainer:draw()
buffer.draw()
end
----------------------------------------------------------------------------------------------------------------
return module

View File

@ -1,54 +0,0 @@
local fs = require("filesystem")
local advancedLua = require("advancedLua")
local buffer = require("doubleBuffering")
local GUI = require("GUI")
local MineOSCore = require("MineOSCore")
local event = require("event")
local unicode = require("unicode")
-----------------------------------------------------------------------------------------------------------------------------
local window = {}
-----------------------------------------------------------------------------------------------------------------------------
local function createWindow()
window = GUI.window("auto", "auto", math.floor(buffer.screen.width * 0.8), math.floor(buffer.screen.height * 0.7), 78, 24)
window:addPanel(1, 1, window.width, window.height, 0xEEEEEE).disabled = true
window.resourcesPath = MineOSCore.getCurrentApplicationResourcesDirectory()
window.modules = {}
local moduleNames = {}
for file in fs.list(window.resourcesPath .. "Modules/") do
local module, reason = dofile(window.resourcesPath .. "Modules/" .. file)
if module then
table.insert(window.modules, module)
table.insert(moduleNames, module.name)
else
error("Error due module execution: " .. reason)
end
end
window.tabBar = window:addTabBar(1, 1, window.width, 3, 1, 0xDDDDDD, 0x262626, 0xCCCCCC, 0x262626, table.unpack(moduleNames))
window.tabBar.onTabSwitched = function(object, eventData)
end
window:addWindowActionButtons(2, 1, false).close.onTouch = function()
window:close()
end
window.drawingArea = window:addContainer(1, 4, window.width, window.height - 3, 0xEEEEEE)
window.modules[1].execute(window)
end
-----------------------------------------------------------------------------------------------------------------------------
createWindow()
window.drawShadow = true
window:draw()
buffer.draw()
window.drawShadow = false
window:handleEvents()

Binary file not shown.

Binary file not shown.

View File

@ -1,118 +0,0 @@
local buffer = require("doubleBuffering")
local GUI = require("GUI")
local image = require("image")
local unicode = require("unicode")
local module = {
name = "Интерпретатор Lua"
}
----------------------------------------------------------------------------------------------------------------------------
function module.execute(window)
local luaConsoleCommandHistoryLimit = 20
local luaConsoleHistoryLimit = 50
local colors, printColor = {
passive = 0x777777,
error = 0xFF4940,
}
window.drawingArea:deleteChildren()
local logoPanelWidth = 20
local consolePanelWidth = window.drawingArea.width - logoPanelWidth
local luaLogoPanel = window.drawingArea:addPanel(1, 1, logoPanelWidth, window.drawingArea.height, 0xEEEEEE)
local luaLogoImage = window.drawingArea:addImage(2, 1, image.load(window.resourcesPath .. "LuaLogo.pic"))
local luaCopyrightTextBox = window.drawingArea:addTextBox(2, luaLogoImage.height + 2, luaLogoPanel.width - 2, 5, nil, 0x999999, {_G._VERSION, "(C) 1994-2016", "Lua.org, PUC-Rio", "", "GUI-based by ECS"}, 1)
luaCopyrightTextBox:setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top)
local consolePanel = window.drawingArea:addPanel(logoPanelWidth + 1, 1, consolePanelWidth, window.drawingArea.height, 0x1E1E1E)
local lines = {
{color = 0xFFDB40, text = "Система " .. _VERSION .. " инициализирована"},
{color = colors.passive, text = "● Введите выражение и нажимте Enter для его "},
{color = colors.passive, text = " исполнения в виде Lua-кода"},
{color = colors.passive, text = "● Используйте Tab для автозаполнения названий"},
{color = colors.passive, text = " переменных"},
{color = colors.passive, text = "● Введите \"=переменная\", чтобы узнать значение"},
{color = colors.passive, text = " конкретной переменной"},
" "
}
local consoleTextBox = window.drawingArea:addTextBox(logoPanelWidth + 2, 1, consolePanelWidth - 2, window.drawingArea.height - 3, nil, 0xFFFFFF, lines, 1)
local consoleCommandInputTextBox = window.drawingArea:addInputTextBox(logoPanelWidth + 1, consolePanel.height - 2, consolePanel.width, 3, 0x333333, 0x777777, 0x333333, 0x444444, "", "print(\"Hello, world!\")")
consoleCommandInputTextBox.eraseTextOnFocus = true
consoleCommandInputTextBox.highlightLuaSyntax = true
consoleCommandInputTextBox.autocompleteVariables = true
local function addLines(lines, printColor)
for i = 1, #lines do
if #consoleTextBox.lines > luaConsoleHistoryLimit then table.remove(consoleTextBox.lines, 1) end
table.insert(consoleTextBox.lines, printColor and {color = printColor, text = lines[i]} or lines[i])
end
consoleTextBox:scrollDown(#lines)
end
local function getStringValueOfVariable(variable)
local type, value = type(variable)
if type == "table" then
value = table.serialize(variable, true, nil, nil, 1)
else
value = tostring(variable)
end
return value
end
local function reimplementedPrint(...)
local args = {...}
local resultText = {}; for i = 1, #args do table.insert(resultText, getStringValueOfVariable(args[i])) end
if #resultText > 0 then
local lines = {table.concat(resultText, " ")}
lines = string.wrap(lines, consoleTextBox.width - 2)
addLines(lines)
end
end
-- Функцию стер - хуй проглотил!
-- abc = function(a, b, c) local d = b ^ 2 - 4 * a * c; if d < 0 then error("Сууука!!! D < 0") end; x1 = (-b + math.sqrt(d)) / (2 * a); x2 = (-b - math.sqrt(d)) / (2 * a); return x1, x2 end
consoleCommandInputTextBox.onInputFinished = function()
-- Подменяем стандартный print() на мой пиздатый
local oldPrint = print
print = reimplementedPrint
-- Пишем, че мы вообще исполняли
addLines({"> " .. consoleCommandInputTextBox.text}, colors.passive)
-- Ебашим поддержку =
consoleCommandInputTextBox.text = consoleCommandInputTextBox.text:gsub("^[%s+]?%=[%s+]?", "return ")
local loadSuccess, loadReason = load(consoleCommandInputTextBox.text)
if loadSuccess then
local xpcallResult = {xpcall(loadSuccess, debug.traceback)}
if xpcallResult[1] then
table.remove(xpcallResult, 1)
reimplementedPrint(table.unpack(xpcallResult))
else
addLines({xpcallResult[2]}, colors.error)
end
else
addLines({loadReason}, colors.error)
end
consoleCommandInputTextBox.text = ""
print = oldPrint
window:draw()
buffer.draw()
end
end
----------------------------------------------------------------------------------------------------------------------------
return module

Binary file not shown.

Binary file not shown.

View File

@ -76,17 +76,17 @@ GUI.colors = {
windows = {
title = {
background = 0xE1E1E1,
text = 0x3C3C3C
text = 0x2D2D2D
},
backgroundPanel = 0xFFFFFF,
backgroundPanel = 0xF0F0F0,
tabBar = {
default = {
background = 0xDDDDDD,
text = 0x3C3C3C
background = 0x2D2D2D,
text = 0xF0F0F0
},
selected = {
background = 0xCCCCCC,
text = 0x3C3C3C
background = 0xF0F0F0,
text = 0x2D2D2D
}
}
}
@ -2009,7 +2009,7 @@ local function scrollToStartTextBox(object)
end
local function scrollToEndTextBox(object)
object.currentLine = #lines
object.currentLine = #object.lines
return object
end
@ -2264,10 +2264,10 @@ local function layoutUpdate(layout)
if layout.children[i].layoutGridPosition.row >= 1 and layout.children[i].layoutGridPosition.row <= #layout.grid.rowSizes and layout.children[i].layoutGridPosition.column >= 1 and layout.children[i].layoutGridPosition.column <= #layout.grid.columnSizes then
-- Авто-фиттинг объектов
if layout.grid[layout.children[i].layoutGridPosition.row][layout.children[i].layoutGridPosition.column].fitting.horizontal then
layout.children[i].width = math.floor(layout.grid.columnSizes[layout.children[i].layoutGridPosition.column].calculatedSize)
layout.children[i].width = math.round(layout.grid.columnSizes[layout.children[i].layoutGridPosition.column].calculatedSize - layout.grid[layout.children[i].layoutGridPosition.row][layout.children[i].layoutGridPosition.column].fitting.horizontalRemove)
end
if layout.grid[layout.children[i].layoutGridPosition.row][layout.children[i].layoutGridPosition.column].fitting.vertical then
layout.children[i].height = math.floor(layout.grid.rowSizes[layout.children[i].layoutGridPosition.row].calculatedSize)
layout.children[i].height = math.round(layout.grid.rowSizes[layout.children[i].layoutGridPosition.row].calculatedSize - layout.grid[layout.children[i].layoutGridPosition.row][layout.children[i].layoutGridPosition.column].fitting.verticalRemove)
end
-- Алигнмент и расчет размеров
@ -2544,9 +2544,14 @@ local function layoutFitToChildrenSize(layout, column, row)
return layout
end
local function layoutSetCellFitting(layout, column, row, horizontalFitting, verticalFitting)
local function layoutSetCellFitting(layout, column, row, horizontal, vertical, horizontalRemove, verticalRemove )
layoutCheckCell(layout, column, row)
layout.grid[row][column].fitting = {horizontal = horizontalFitting, vertical = verticalFitting}
layout.grid[row][column].fitting = {
horizontal = horizontal,
vertical = vertical,
horizontalRemove = horizontalRemove or 0,
verticalRemove = verticalRemove or 0,
}
return layout
end
@ -2579,218 +2584,6 @@ function GUI.layout(x, y, width, height, columnCount, rowCount)
return layout
end
----------------------------------------- Color Selector object -----------------------------------------
local function updateFileList(treeView, directoriesToShowContent, xOffset, path)
local localFileList = {}
for file in fs.list(path) do
local element = {}
element.path = path .. file
element.xOffset = xOffset
element.isDirectory = fs.isDirectory(element.path)
element.extension = fs.extension(file, true) or ""
if
treeView.showMode == GUI.filesystemModes.both or
element.isDirectory and treeView.showMode == GUI.filesystemModes.directory or
not element.isDirectory and treeView.showMode == GUI.filesystemModes.file
then
table.insert(localFileList, element)
end
end
-- Sort file list alphabeitcally
table.sort(localFileList, function(a, b) return unicode.lower(a.path) < unicode.lower(b.path) end)
-- Move folders on top and recursively get their content if needed
local i, nextDirectoryIndex, nextLocalFileListIndex = 1, 1, 1
while i <= #localFileList do
if localFileList[i].isDirectory then
table.insert(localFileList, nextDirectoryIndex, localFileList[i])
table.remove(localFileList, i + 1)
if directoriesToShowContent[localFileList[nextDirectoryIndex].path] then
local nextLocalFileList = updateFileList(treeView, directoriesToShowContent, xOffset + 2, localFileList[nextDirectoryIndex].path)
nextLocalFileListIndex = nextDirectoryIndex + 1
for j = 1, #nextLocalFileList do
table.insert(localFileList, nextLocalFileListIndex, nextLocalFileList[j])
nextLocalFileListIndex = nextLocalFileListIndex + 1
end
i, nextDirectoryIndex = i + #nextLocalFileList, nextDirectoryIndex + #nextLocalFileList
end
nextDirectoryIndex = nextDirectoryIndex + 1
end
i = i + 1
end
return localFileList
end
local function treeViewUpdateFileList(treeView)
treeView.updateFileListLater = true
return treeView
end
local function treeViewDraw(treeView)
if treeView.updateFileListLater then
treeView.fileList = updateFileList(treeView, treeView.directoriesToShowContent, 1, treeView.workPath)
treeView.updateFileListLater = nil
end
local y = treeView.y
local showScrollBar = #treeView.fileList > treeView.height
local textLimit = treeView.width - (showScrollBar and 2 or 1)
if treeView.colors.default.background then
buffer.square(treeView.x, treeView.y, treeView.width, treeView.height, treeView.colors.default.background, treeView.colors.default.directory, " ")
end
for fileIndex = treeView.fromFile, #treeView.fileList do
local textColor, arrowColor, text = treeView.colors.default.file, treeView.colors.default.arrow, treeView.fileList[fileIndex].isDirectory and "" or ""
if treeView.fileList[fileIndex].path == treeView.selectedItem then
textColor, arrowColor = treeView.colors.selected.fileOrDirectory, treeView.colors.selected.arrow
buffer.square(treeView.x, y, treeView.width, 1, treeView.colors.selected.background, textColor, " ")
else
if treeView.fileList[fileIndex].isDirectory then
textColor = treeView.colors.default.directory
elseif treeView.extensionFilters and not treeView.extensionFilters[treeView.fileList[fileIndex].extension] then
textColor = treeView.colors.wrongExtension
end
end
if treeView.fileList[fileIndex].isDirectory then
buffer.text(treeView.x + treeView.fileList[fileIndex].xOffset, y, arrowColor, treeView.directoriesToShowContent[treeView.fileList[fileIndex].path] and "" or "")
end
buffer.text(treeView.x + treeView.fileList[fileIndex].xOffset + 2, y, textColor, unicode.sub(text .. fs.name(treeView.fileList[fileIndex].path), 1, textLimit - treeView.fileList[fileIndex].xOffset - 2))
y = y + 1
if y > treeView.y + treeView.height - 1 then
break
end
end
if showScrollBar then
GUI.scrollBar(
treeView.x + treeView.width - 1,
treeView.y,
1,
treeView.height,
treeView.colors.scrollBar.background,
treeView.colors.scrollBar.foreground,
1,
#treeView.fileList,
treeView.fromFile,
treeView.height - 2,
1
):draw()
end
return treeView
end
local function treeViewEventHandler(mainContainer, treeView, eventData)
if eventData[1] == "touch" then
local fileIndex = eventData[4] - treeView.y + treeView.fromFile
if treeView.fileList[fileIndex] then
if
treeView.fileList[fileIndex].isDirectory and
(
treeView.selectionMode == GUI.filesystemModes.file or
eventData[3] >= treeView.x + treeView.fileList[fileIndex].xOffset - 1 and eventData[3] <= treeView.x + treeView.fileList[fileIndex].xOffset + 1
)
then
if treeView.directoriesToShowContent[treeView.fileList[fileIndex].path] then
treeView.directoriesToShowContent[treeView.fileList[fileIndex].path] = nil
else
treeView.directoriesToShowContent[treeView.fileList[fileIndex].path] = true
end
treeView:updateFileList()
mainContainer:draw()
buffer.draw()
else
if
(
treeView.selectionMode == GUI.filesystemModes.both or
treeView.selectionMode == GUI.filesystemModes.directory and treeView.fileList[fileIndex].isDirectory or
treeView.selectionMode == GUI.filesystemModes.file and (not treeView.extensionFilters or treeView.extensionFilters[treeView.fileList[fileIndex].extension])
)
then
treeView.selectedItem = treeView.fileList[fileIndex].path
mainContainer:draw()
buffer.draw()
GUI.callMethod(treeView.onItemSelected, treeView.selectedItem, eventData)
end
end
end
elseif eventData[1] == "scroll" then
if eventData[5] == 1 then
if treeView.fromFile > 1 then
treeView.fromFile = treeView.fromFile - 1
mainContainer:draw()
buffer.draw()
end
else
if treeView.fromFile < #treeView.fileList then
treeView.fromFile = treeView.fromFile + 1
mainContainer:draw()
buffer.draw()
end
end
end
end
local function treeViewAddExtensionFilter(treeView, extensionFilter)
treeView.extensionFilters = treeView.extensionFilters or {}
treeView.extensionFilters[unicode.lower(extensionFilter)] = true
end
function GUI.treeView(x, y, width, height, backgroundColor, directoryColor, fileColor, arrowColor, backgroundSelectionColor, textSelectedColor, arrowSelectionColor, wrongExtensionColor, scrollBarBackground, scrollBarForeground, workPath, showMode, selectionMode)
local treeView = GUI.container(x, y, width, height)
treeView.eventHandler = treeViewEventHandler
treeView.colors = {
default = {
background = backgroundColor,
directory = directoryColor,
file = fileColor,
arrow = arrowColor,
},
selected = {
background = backgroundSelectionColor,
fileOrDirectory = textSelectedColor,
arrow = arrowSelectionColor,
},
scrollBar = {
background = scrollBarBackground,
foreground = scrollBarForeground
},
wrongExtension = wrongExtensionColor
}
treeView.directoriesToShowContent = {}
treeView.fileList = {}
treeView.workPath = workPath
treeView.extensionFilters = nil
treeView.selectedItem = nil
treeView.fromFile = 1
treeView.showMode = showMode or GUI.filesystemModes.both
treeView.selectionMode = selectionMode or GUI.filesystemModes.file
treeView.updateFileList = treeViewUpdateFileList
treeView.draw = treeViewDraw
treeView.addExtensionFilter = treeViewAddExtensionFilter
treeView:updateFileList()
return treeView
end
--------------------------------------------------------------------------------------------------------------------------------
local function filesystemDialogDraw(filesystemDialog)
@ -2803,8 +2596,8 @@ local function filesystemDialogDraw(filesystemDialog)
if filesystemDialog.IOMode == GUI.filesystemModes.save then
filesystemDialog.submitButton.disabled = not filesystemDialog.inputField.text
else
filesystemDialog.inputField.text = filesystemDialog.treeView.selectedItem
filesystemDialog.submitButton.disabled = not filesystemDialog.treeView.selectedItem
filesystemDialog.inputField.text = filesystemDialog.filesystemTree.selectedItem
filesystemDialog.submitButton.disabled = not filesystemDialog.filesystemTree.selectedItem
end
GUI.drawContainerContent(filesystemDialog)
@ -2818,24 +2611,24 @@ local function filesystemDialogSetMode(filesystemDialog, IOMode, filesystemMode)
filesystemDialog.filesystemMode = filesystemMode
if filesystemDialog.IOMode == GUI.filesystemModes.save then
filesystemDialog.treeView.showMode = GUI.filesystemModes.directory
filesystemDialog.treeView.selectionMode = GUI.filesystemModes.directory
filesystemDialog.filesystemTree.showMode = GUI.filesystemModes.directory
filesystemDialog.filesystemTree.selectionMode = GUI.filesystemModes.directory
filesystemDialog.inputField.eventHandler = inputFieldEventHandler
filesystemDialog.extensionComboBox.hidden = not (filesystemDialog.filesystemMode == GUI.filesystemModes.file)
else
if filesystemDialog.filesystemMode == GUI.filesystemModes.file then
filesystemDialog.treeView.showMode = GUI.filesystemModes.both
filesystemDialog.treeView.selectionMode = GUI.filesystemModes.file
filesystemDialog.filesystemTree.showMode = GUI.filesystemModes.both
filesystemDialog.filesystemTree.selectionMode = GUI.filesystemModes.file
else
filesystemDialog.treeView.showMode = GUI.filesystemModes.directory
filesystemDialog.treeView.selectionMode = GUI.filesystemModes.directory
filesystemDialog.filesystemTree.showMode = GUI.filesystemModes.directory
filesystemDialog.filesystemTree.selectionMode = GUI.filesystemModes.directory
end
filesystemDialog.inputField.eventHandler = nil
filesystemDialog.extensionComboBox.hidden = true
end
filesystemDialog.treeView:updateFileList()
filesystemDialog.filesystemTree:updateFileList()
end
local function filesystemDialogAddExtensionFilter(filesystemDialog, extension)
@ -2843,7 +2636,7 @@ local function filesystemDialogAddExtensionFilter(filesystemDialog, extension)
filesystemDialog.extensionComboBox.width = math.max(filesystemDialog.extensionComboBox.width, unicode.len(extension) + 3)
filesystemDialog.extensionComboBox.localPosition.x = filesystemDialog.cancelButton.localPosition.x - filesystemDialog.extensionComboBox.width - 2
filesystemDialog.treeView:addExtensionFilter(extension)
filesystemDialog.filesystemTree:addExtensionFilter(extension)
end
function GUI.filesystemDialog(x, y, width, height, submitButtonText, cancelButtonText, placeholderText, path)
@ -2861,11 +2654,8 @@ function GUI.filesystemDialog(x, y, width, height, submitButtonText, cancelButto
filesystemDialog.inputField = filesystemDialog:addChild(GUI.inputField(2, height - 1, 1, 1, 0xE1E1E1, 0x555555, 0x888888, 0xE1E1E1, 0x777777, nil, placeholderText))
filesystemDialog.treeView = filesystemDialog:addChild(GUI.treeView(
1, 1, width, height - 3,
0xE1E1E1, 0x3C3C3C, 0x3C3C3C, 0xAAAAAA, 0x3C3C3C, 0xE1E1E1, 0xBBBBBB, 0xAAAAAA, 0xC3C3C3, 0x444444,
path
))
filesystemDialog.filesystemTree = filesystemDialog:addChild(GUI.filesystemTree(1, 1, width, height - 3, 0xE1E1E1, 0x3C3C3C, 0x3C3C3C, 0xAAAAAA, 0x3C3C3C, 0xE1E1E1, 0xBBBBBB, 0xAAAAAA, 0xC3C3C3, 0x444444))
filesystemDialog.filesystemTree.workPath = path
filesystemDialog.draw = filesystemDialogDraw
filesystemDialog.setMode = filesystemDialogSetMode
@ -2914,7 +2704,7 @@ function GUI.addFilesystemDialogToContainer(parentContainer, ...)
filesystemDialog.submitButton.onTouch = function()
onAnyTouch()
local path = filesystemDialog.treeView.selectedItem or filesystemDialog.treeView.workPath or "/"
local path = filesystemDialog.filesystemTree.selectedItem or filesystemDialog.filesystemTree.workPath or "/"
if filesystemDialog.IOMode == GUI.filesystemModes.save then
path = path .. filesystemDialog.inputField.text
@ -3196,28 +2986,234 @@ function GUI.scrollBar(x, y, width, height, backgroundColor, foregroundColor, mi
return scrollBar
end
----------------------------------------- Tree object -----------------------------------------
local function treeDraw(tree)
local y, yEnd, showScrollBar = tree.y, tree.y + tree.height - 1, #tree.items > tree.height
local textLimit = tree.width - (showScrollBar and 1 or 0)
if tree.colors.default.background then
buffer.square(tree.x, tree.y, tree.width, tree.height, tree.colors.default.background, tree.colors.default.expandable, " ")
end
for i = tree.fromItem, #tree.items do
local textColor, arrowColor, text = tree.colors.default.notExpandable, tree.colors.default.arrow, tree.items[i].expandable and "" or ""
if tree.selectedItem == tree.items[i].definition then
textColor, arrowColor = tree.colors.selected.any, tree.colors.selected.arrow
buffer.square(tree.x, y, tree.width, 1, tree.colors.selected.background, textColor, " ")
else
if tree.items[i].expandable then
textColor = tree.colors.default.expandable
elseif tree.items[i].disabled then
textColor = tree.colors.disabled
end
end
if tree.items[i].expandable then
buffer.text(tree.x + tree.items[i].offset, y, arrowColor, tree.expandedItems[tree.items[i].definition] and "" or "")
end
buffer.text(tree.x + tree.items[i].offset + 2, y, textColor, unicode.sub(text .. fs.name(tree.items[i].name), 1, textLimit - tree.items[i].offset - 2))
y = y + 1
if y > yEnd then break end
end
if showScrollBar then
local scrollBar = tree.scrollBar
scrollBar.x = tree.x + tree.width - 1
scrollBar.y = tree.y
scrollBar.width = 1
scrollBar.height = tree.height
scrollBar.colors.background = tree.colors.scrollBar.background
scrollBar.colors.foreground = tree.colors.scrollBar.foreground
scrollBar.minimumValue = 1
scrollBar.maximumValue = #tree.items
scrollBar.value = tree.fromItem
scrollBar.shownValueCount = tree.height
scrollBar.onScrollValueIncrement = 1
scrollBar.thin = true
scrollBar:draw()
end
return tree
end
local function treeEventHandler(mainContainer, tree, eventData)
if eventData[1] == "touch" then
local i = eventData[4] - tree.y + tree.fromItem
if tree.items[i] then
if
tree.items[i].expandable and
(
tree.selectionMode == GUI.filesystemModes.file or
eventData[3] >= tree.x + tree.items[i].offset - 1 and eventData[3] <= tree.x + tree.items[i].offset + 1
)
then
if tree.expandedItems[tree.items[i].definition] then
tree.expandedItems[tree.items[i].definition] = nil
else
tree.expandedItems[tree.items[i].definition] = true
end
GUI.callMethod(tree.onItemExpanded, tree.selectedItem, eventData)
else
if
(
(
tree.selectionMode == GUI.filesystemModes.both or
tree.selectionMode == GUI.filesystemModes.directory and tree.items[i].expandable or
tree.selectionMode == GUI.filesystemModes.file
) and not tree.items[i].disabled
)
then
tree.selectedItem = tree.items[i].definition
GUI.callMethod(tree.onItemSelected, tree.selectedItem, eventData)
end
end
mainContainer:draw()
buffer.draw()
end
elseif eventData[1] == "scroll" then
if eventData[5] == 1 then
if tree.fromItem > 1 then
tree.fromItem = tree.fromItem - 1
mainContainer:draw()
buffer.draw()
end
else
if tree.fromItem < #tree.items then
tree.fromItem = tree.fromItem + 1
mainContainer:draw()
buffer.draw()
end
end
end
end
local function treeAddItem(tree, name, definition, offset, expandable, disabled)
table.insert(tree.items, {name = name, expandable = expandable, offset = offset or 0, definition = definition, disabled = disabled})
return tree
end
function GUI.tree(x, y, width, height, backgroundColor, expandableColor, notExpandableColor, arrowColor, backgroundSelectionColor, anySelectionColor, arrowSelectionColor, disabledColor, scrollBarBackground, scrollBarForeground, showMode, selectionMode)
local tree = GUI.container(x, y, width, height)
tree.eventHandler = treeEventHandler
tree.colors = {
default = {
background = backgroundColor,
expandable = expandableColor,
notExpandable = notExpandableColor,
arrow = arrowColor,
},
selected = {
background = backgroundSelectionColor,
any = anySelectionColor,
arrow = arrowSelectionColor,
},
scrollBar = {
background = scrollBarBackground,
foreground = scrollBarForeground
},
disabled = disabledColor
}
tree.items = {}
tree.fromItem = 1
tree.selectedItem = nil
tree.expandedItems = {}
tree.scrollBar = GUI.scrollBar(1, 1, 1, 1, 0x0, 0x0, 1, 1, 1, 1, 1)
tree.showMode = showMode
tree.selectionMode = selectionMode
tree.eventHandler = treeEventHandler
tree.addItem = treeAddItem
tree.draw = treeDraw
return tree
end
----------------------------------------- FilesystemTree object -----------------------------------------
local function filesystemTreeUpdateFileListRecursively(tree, path, offset)
local list = {}
for file in fs.list(path) do
table.insert(list, file)
end
local i, expandables = 1, {}
while i <= #list do
if fs.isDirectory(path .. list[i]) then
table.insert(expandables, list[i])
table.remove(list, i)
else
i = i + 1
end
end
table.sort(expandables, function(a, b) return unicode.lower(a) < unicode.lower(b) end)
table.sort(list, function(a, b) return unicode.lower(a) < unicode.lower(b) end)
if tree.showMode == GUI.filesystemModes.both or tree.showMode == GUI.filesystemModes.directory then
for i = 1, #expandables do
tree:addItem(expandables[i], path .. expandables[i], offset, true)
if tree.expandedItems[path .. expandables[i]] then
filesystemTreeUpdateFileListRecursively(tree, path .. expandables[i], offset + 2)
end
end
end
if tree.showMode == GUI.filesystemModes.both or tree.showMode == GUI.filesystemModes.file then
for i = 1, #list do
tree:addItem(list[i], path .. list[i], offset, false,tree.extensionFilters and not tree.extensionFilters[fs.extension(path .. list[i], true)] or false)
end
end
end
local function filesystemTreeUpdateFileList(tree)
tree.items = {}
filesystemTreeUpdateFileListRecursively(tree, tree.workPath, 1)
end
local function filesystemTreeAddExtensionFilter(tree, extensionFilter)
tree.extensionFilters = tree.extensionFilters or {}
tree.extensionFilters[unicode.lower(extensionFilter)] = true
end
function GUI.filesystemTree(...)
local tree = GUI.tree(...)
tree.workPath = "/"
tree.updateFileList = filesystemTreeUpdateFileList
tree.addExtensionFilter = filesystemTreeAddExtensionFilter
tree.onItemExpanded = function()
tree:updateFileList()
end
return tree
end
--------------------------------------------------------------------------------------------------------------------------------
-- buffer.flush()
-- buffer.draw(true)
-- ------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------
-- local mainContainer = GUI.fullScreenContainer()
-- mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x0))
-- local codeView = mainContainer:addChild(GUI.codeView(2, 2, 130, 30, {}, 1, 1, 1, {}, {}, true, 2))
-- local tree = mainContainer:addChild(GUI.filesystemTree(1, 1, 30, 30, 0xE1E1E1, 0x3C3C3C, 0x3C3C3C, 0xAAAAAA, 0x3C3C3C, 0xE1E1E1, 0xBBBBBB, 0xAAAAAA, 0xC3C3C3, 0x444444, GUI.filesystemModes.both, GUI.filesystemModes.file))
-- local file = io.open("/lib/color.lua", "r")
-- for line in file:lines() do
-- line = line:gsub("\t", " "):gsub("\r\n", "\n")
-- table.insert(codeView.lines, line)
-- codeView.maximumLineLength = math.max(codeView.maximumLineLength, unicode.len(line))
-- end
-- file:close()
-- tree:addExtensionFilter(".pic")
-- tree:updateFileList()
-- ------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------
-- mainContainer:draw()
-- buffer.draw(true)

View File

@ -1236,7 +1236,7 @@ local function GUICopy(parentContainer, fileList, toPath)
local container = MineOSInterface.addUniversalContainer(parentContainer, MineOSCore.localization.copying)
local textBox = container.layout:addChild(GUI.textBox(1, 1, container.width, 1, nil, 0x777777, {}, 1, 0, 0, true, true):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top))
local switchAndLabel = container.layout:addChild(GUI.switchAndLabel(1, 1, 37, 8, 0x66DB80, 0x2D2D2D, 0xEEEEEE, 0x777777, MineOSCore.localization.applyToAll .. ":", false))
local switchAndLabel = container.layout:addChild(GUI.switchAndLabel(1, 1, 37, 8, 0x66DB80, 0x1E1E1E, 0xEEEEEE, 0x777777, MineOSCore.localization.applyToAll .. ":", false))
container.panel.eventHandler = nil
local buttonsLayout = container.layout:addChild(GUI.layout(1, 1, 1, 1, 1, 1))