mirror of
https://github.com/IgorTimofeev/MineOS.git
synced 2026-09-14 11:06:16 +05:00
Параметры обоев, улучшенное текстовое поле
This commit is contained in:
parent
c2dc372b77
commit
030605c2f0
@ -5,7 +5,7 @@
|
||||
about="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/MineOS/About/",
|
||||
type="Script",
|
||||
forceDownload=true,
|
||||
version=3.64,
|
||||
version=3.65,
|
||||
},
|
||||
{
|
||||
path="/MineOS/Pictures/MoonTouch.pic",
|
||||
@ -72,14 +72,14 @@
|
||||
url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/MineOS/Localization/Russian.lang",
|
||||
type="Script",
|
||||
forceDownload=true,
|
||||
version=1.26,
|
||||
version=1.27,
|
||||
},
|
||||
{
|
||||
path="/MineOS/System/OS/Localization/English.lang",
|
||||
url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/MineOS/Localization/English.lang",
|
||||
type="Script",
|
||||
forceDownload=true,
|
||||
version=1.26,
|
||||
version=1.27,
|
||||
},
|
||||
|
||||
----------------------------------------------------- Системные иконки --------------------------------------------------------------------------
|
||||
@ -204,7 +204,7 @@
|
||||
path="/lib/MineOSCore.lua",
|
||||
url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/MineOSCore.lua",
|
||||
type="Library",
|
||||
version=1.68,
|
||||
version=1.69,
|
||||
},
|
||||
{
|
||||
path="/lib/advancedLua.lua",
|
||||
@ -264,7 +264,7 @@
|
||||
url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/GUI.lua",
|
||||
type="Library",
|
||||
preloadFile=true,
|
||||
version=1.60,
|
||||
version=1.61,
|
||||
},
|
||||
{
|
||||
path="/lib/rayEngine.lua",
|
||||
@ -324,7 +324,7 @@
|
||||
path="/lib/palette.lua",
|
||||
url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/palette.lua",
|
||||
type="Library",
|
||||
version=1.14,
|
||||
version=1.15,
|
||||
},
|
||||
{
|
||||
path="/lib/doubleBuffering.lua",
|
||||
@ -449,7 +449,7 @@
|
||||
icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/MineCodeIDE/Icon.pic",
|
||||
createShortcut="dock",
|
||||
forceDownload=true,
|
||||
version=1.73,
|
||||
version=1.74,
|
||||
resources={
|
||||
{
|
||||
path="/Localization/Russian.lang",
|
||||
@ -477,7 +477,7 @@
|
||||
type="Application",
|
||||
icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/GeoScan2/Icon.pic",
|
||||
createShortcut="desktop",
|
||||
version=1.07,
|
||||
version=1.08,
|
||||
resources={
|
||||
{
|
||||
path="/Earth.pic",
|
||||
@ -492,7 +492,7 @@
|
||||
type="Application",
|
||||
icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/VK/Icon.pic",
|
||||
createShortcut="desktop",
|
||||
version=1.30,
|
||||
version=1.31,
|
||||
resources={
|
||||
{
|
||||
path="/VKLogo.pic",
|
||||
@ -570,7 +570,7 @@
|
||||
type="Application",
|
||||
icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/RayWalk/Icon.pic",
|
||||
createShortcut="desktop",
|
||||
version=1.64,
|
||||
version=1.65,
|
||||
resources={
|
||||
{
|
||||
path="/Localization/Russian.lang",
|
||||
@ -693,7 +693,7 @@
|
||||
type="Application",
|
||||
icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/PrintImage/Icon.pic",
|
||||
createShortcut="desktop",
|
||||
version=1.11,
|
||||
version=1.12,
|
||||
},
|
||||
{
|
||||
path="/MineOS/Applications/Palette",
|
||||
@ -709,7 +709,7 @@
|
||||
type="Application",
|
||||
icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Stargate/Icon.pic",
|
||||
createShortcut="desktop",
|
||||
version=1.07,
|
||||
version=1.08,
|
||||
resources={
|
||||
{
|
||||
path="/Ch1.pic",
|
||||
@ -853,7 +853,7 @@
|
||||
icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/AppMarket/Icon.pic",
|
||||
createShortcut="dock",
|
||||
forceDownload=true,
|
||||
version=1.60,
|
||||
version=1.61,
|
||||
resources={
|
||||
{
|
||||
path="/Update.pic",
|
||||
|
||||
@ -141,7 +141,7 @@ local function displayApps(fromPage, typeFilter, nameFilter, updateCheck)
|
||||
return
|
||||
end
|
||||
else
|
||||
window.contentContainer.searchInputTextBox = window.contentContainer:addChild(GUI.inputTextBox(math.floor(window.contentContainer.width / 2 - 10), y, 20, 1, 0xEEEEEE, 0xAAAAAA, 0xEEEEEE, 0x3C3C3C, nil, localization.search, true))
|
||||
window.contentContainer.searchInputTextBox = window.contentContainer:addChild(GUI.inputField(math.floor(window.contentContainer.width / 2 - 10), y, 20, 1, 0xEEEEEE, 0x444444, 0xAAAAAA, 0xEEEEEE, 0x2D2D2D, nil, localization.search, true))
|
||||
window.contentContainer.searchInputTextBox.onInputFinished = function()
|
||||
if window.contentContainer.searchInputTextBox.text then
|
||||
displayApps(1, typeFilter, window.contentContainer.searchInputTextBox.text)
|
||||
|
||||
@ -132,9 +132,9 @@ objectY = objectY + 4
|
||||
mainContainer:addChild(GUI.label(buttonX, objectY, buttonWidth, 1, 0xFFFFFF, "Rendering properties")):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top)
|
||||
objectY = objectY + 2
|
||||
|
||||
mainContainer.minimumHardnessTextBox = mainContainer:addChild(GUI.inputTextBox(buttonX, objectY, 12, 3, 0x262626, 0xBBBBBB, 0x262626, 0xFFFFFF, tostring(2.7), nil, true))
|
||||
mainContainer.minimumHardnessTextBox = mainContainer:addChild(GUI.inputField(buttonX, objectY, 12, 3, 0x262626, 0xBBBBBB, 0xBBBBBB, 0x262626, 0xFFFFFF, tostring(2.7), nil, true))
|
||||
mainContainer.minimumHardnessTextBox.validator = function(text) if tonumber(text) then return true end end
|
||||
mainContainer.maximumHardnessTextBox = mainContainer:addChild(GUI.inputTextBox(buttonX + 14, objectY, 12, 3, 0x262626, 0xBBBBBB, 0x262626, 0xFFFFFF, tostring(10), nil, true))
|
||||
mainContainer.maximumHardnessTextBox = mainContainer:addChild(GUI.inputField(buttonX + 14, objectY, 12, 3, 0x262626, 0xBBBBBB, 0xBBBBBB, 0x262626, 0xFFFFFF, tostring(10), nil, true))
|
||||
mainContainer.maximumHardnessTextBox.validator = function(text) if tonumber(text) then return true end end
|
||||
objectY = objectY + 3
|
||||
mainContainer:addChild(GUI.label(buttonX, objectY, buttonWidth, 1, 0xBBBBBB, "Hardness min Hardness max")):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top)
|
||||
|
||||
@ -283,7 +283,7 @@ local function calculateSizes()
|
||||
|
||||
mainContainer.bottomToolBar.localPosition.y = mainContainer.height - 2
|
||||
mainContainer.bottomToolBar.findButton.localPosition.x = mainContainer.bottomToolBar.width - mainContainer.bottomToolBar.findButton.width + 1
|
||||
mainContainer.bottomToolBar.inputTextBox.width = mainContainer.bottomToolBar.width - mainContainer.bottomToolBar.inputTextBox.localPosition.x - mainContainer.bottomToolBar.findButton.width + 1
|
||||
mainContainer.bottomToolBar.inputField.width = mainContainer.bottomToolBar.width - mainContainer.bottomToolBar.inputField.localPosition.x - mainContainer.bottomToolBar.findButton.width + 1
|
||||
|
||||
mainContainer.topToolBar.width, mainContainer.topToolBar.backgroundPanel.width = mainContainer.width, mainContainer.width
|
||||
mainContainer.titleTextBox.width = math.floor(mainContainer.topToolBar.width * 0.32)
|
||||
@ -626,22 +626,22 @@ local function changeResolutionWindow()
|
||||
local textBoxWidth, x, y = math.floor(textBoxesWidth / 2), math.floor(mainContainer.width / 2 - textBoxesWidth / 2), math.floor(mainContainer.height / 2) - 3
|
||||
|
||||
mainContainer.settingsContainer:addChild(GUI.label(1, y, mainContainer.width, 1, 0xFFFFFF, localization.changeResolution)):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top); y = y + 3
|
||||
local inputTextBoxWidth = mainContainer.settingsContainer:addChild(GUI.inputTextBox(x, y, textBoxWidth, 3, 0xCCCCCC, 0x777777, 0xCCCCCC, 0x2D2D2D, tostring(config.screenResolution.width))); x = x + textBoxWidth + 2
|
||||
local inputTextBoxHeight = mainContainer.settingsContainer:addChild(GUI.inputTextBox(x, y, textBoxWidth, 3, 0xCCCCCC, 0x777777, 0xCCCCCC, 0x2D2D2D, tostring(config.screenResolution.height)))
|
||||
local inputFieldWidth = mainContainer.settingsContainer:addChild(GUI.inputField(x, y, textBoxWidth, 3, 0xCCCCCC, 0x777777, 0x777777, 0xCCCCCC, 0x2D2D2D, tostring(config.screenResolution.width))); x = x + textBoxWidth + 2
|
||||
local inputFieldHeight = mainContainer.settingsContainer:addChild(GUI.inputField(x, y, textBoxWidth, 3, 0xCCCCCC, 0x777777, 0x777777, 0xCCCCCC, 0x2D2D2D, tostring(config.screenResolution.height)))
|
||||
|
||||
local maxResolutionWidth, maxResolutionHeight = component.gpu.maxResolution()
|
||||
inputTextBoxWidth.validator = function(text)
|
||||
inputFieldWidth.validator = function(text)
|
||||
local number = tonumber(text)
|
||||
if number and number >= 1 and number <= maxResolutionWidth then return true end
|
||||
end
|
||||
inputTextBoxHeight.validator = function(text)
|
||||
inputFieldHeight.validator = function(text)
|
||||
local number = tonumber(text)
|
||||
if number and number >= 1 and number <= maxResolutionHeight then return true end
|
||||
end
|
||||
|
||||
mainContainer.settingsContainer.backgroundPanel.eventHandler = function(mainContainer, object, eventData)
|
||||
if eventData[1] == "touch" then
|
||||
config.screenResolution.width, config.screenResolution.height = tonumber(inputTextBoxWidth.text), tonumber(inputTextBoxHeight.text)
|
||||
config.screenResolution.width, config.screenResolution.height = tonumber(inputFieldWidth.text), tonumber(inputFieldHeight.text)
|
||||
saveConfig()
|
||||
hideSettingsContainer()
|
||||
changeResolution(config.screenResolution.width, config.screenResolution.height)
|
||||
@ -655,10 +655,10 @@ local function createInputTextBoxForSettingsWindow(title, placeholder, onInputFi
|
||||
local x, y = math.floor(mainContainer.width / 2 - textBoxWidth / 2), math.floor(mainContainer.height / 2) - 3
|
||||
|
||||
mainContainer.settingsContainer:addChild(GUI.label(1, y, mainContainer.width, 1, 0xFFFFFF, title)):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top); y = y + 3
|
||||
mainContainer.settingsContainer.inputTextBox = mainContainer.settingsContainer:addChild(GUI.inputTextBox(x, y, textBoxWidth, 3, 0xCCCCCC, 0x777777, 0xCCCCCC, 0x2D2D2D, "", placeholder))
|
||||
mainContainer.settingsContainer.inputField = mainContainer.settingsContainer:addChild(GUI.inputField(x, y, textBoxWidth, 3, 0xCCCCCC, 0x777777, 0x777777, 0xCCCCCC, 0x2D2D2D, "", placeholder))
|
||||
|
||||
mainContainer.settingsContainer.inputTextBox.validator = validatorMethod
|
||||
mainContainer.settingsContainer.inputTextBox.onInputFinished = function(...)
|
||||
mainContainer.settingsContainer.inputField.validator = validatorMethod
|
||||
mainContainer.settingsContainer.inputField.onInputFinished = function(...)
|
||||
onInputFinishedMethod(...)
|
||||
hideSettingsContainer()
|
||||
end
|
||||
@ -704,10 +704,10 @@ end
|
||||
local function gotoLineWindow()
|
||||
createInputTextBoxForSettingsWindow(localization.gotoLine, localization.lineNumber,
|
||||
function()
|
||||
gotoLine(tonumber(mainContainer.settingsContainer.inputTextBox.text))
|
||||
gotoLine(tonumber(mainContainer.settingsContainer.inputField.text))
|
||||
end,
|
||||
function()
|
||||
if mainContainer.settingsContainer.inputTextBox.text:match("%d+") then return true end
|
||||
if mainContainer.settingsContainer.inputField.text:match("%d+") then return true end
|
||||
end
|
||||
)
|
||||
end
|
||||
@ -715,10 +715,10 @@ end
|
||||
local function openFileWindow()
|
||||
createInputTextBoxForSettingsWindow(localization.openFile, localization.pathToFile,
|
||||
function()
|
||||
loadFile(mainContainer.settingsContainer.inputTextBox.text)
|
||||
loadFile(mainContainer.settingsContainer.inputField.text)
|
||||
end,
|
||||
function()
|
||||
if fs.exists(mainContainer.settingsContainer.inputTextBox.text) then return true end
|
||||
if fs.exists(mainContainer.settingsContainer.inputField.text) then return true end
|
||||
end
|
||||
)
|
||||
end
|
||||
@ -726,8 +726,8 @@ end
|
||||
local function saveFileAsWindow()
|
||||
createInputTextBoxForSettingsWindow(localization.saveAs, localization.pathToFile,
|
||||
function()
|
||||
saveFile(mainContainer.settingsContainer.inputTextBox.text)
|
||||
mainContainer.leftTreeView.currentFile = mainContainer.settingsContainer.inputTextBox.text
|
||||
saveFile(mainContainer.settingsContainer.inputField.text)
|
||||
mainContainer.leftTreeView.currentFile = mainContainer.settingsContainer.inputField.text
|
||||
if unicode.sub(mainContainer.leftTreeView.currentFile, 1, 1) ~= "/" then
|
||||
mainContainer.leftTreeView.currentFile = "/" .. mainContainer.leftTreeView.currentFile
|
||||
end
|
||||
@ -763,7 +763,7 @@ end
|
||||
local function downloadFileFromWeb()
|
||||
createInputTextBoxForSettingsWindow(localization.getFromWeb, localization.url,
|
||||
function()
|
||||
local result, reason = web.request(mainContainer.settingsContainer.inputTextBox.text)
|
||||
local result, reason = web.request(mainContainer.settingsContainer.inputField.text)
|
||||
if result then
|
||||
newFile()
|
||||
mainContainer.codeView.lines, mainContainer.codeView.maximumLineLength = splitStringIntoLines(result)
|
||||
@ -1226,11 +1226,11 @@ local function updateRAMProgressBar()
|
||||
end
|
||||
|
||||
local function find()
|
||||
if not mainContainer.bottomToolBar.hidden and mainContainer.bottomToolBar.inputTextBox.text ~= "" then
|
||||
if not mainContainer.bottomToolBar.hidden and mainContainer.bottomToolBar.inputField.text ~= "" then
|
||||
findStartFrom = findStartFrom + 1
|
||||
|
||||
for line = findStartFrom, #mainContainer.codeView.lines do
|
||||
local whereToFind, whatToFind = mainContainer.codeView.lines[line], mainContainer.bottomToolBar.inputTextBox.text
|
||||
local whereToFind, whatToFind = mainContainer.codeView.lines[line], mainContainer.bottomToolBar.inputField.text
|
||||
if not mainContainer.bottomToolBar.caseSensitiveButton.pressed then
|
||||
whereToFind, whatToFind = unicode.lower(whereToFind), unicode.lower(whatToFind)
|
||||
end
|
||||
@ -1268,7 +1268,7 @@ local function toggleBottomToolBar()
|
||||
|
||||
if not mainContainer.bottomToolBar.hidden then
|
||||
mainContainer:draw()
|
||||
mainContainer.bottomToolBar.inputTextBox:input()
|
||||
mainContainer.bottomToolBar.inputField:startInput()
|
||||
findFromFirstDisplayedLine()
|
||||
end
|
||||
end
|
||||
@ -1450,12 +1450,12 @@ local function createMainContainer()
|
||||
local elementWidth = math.floor(mainContainer.width * 0.3)
|
||||
local x, y = math.floor(mainContainer.width / 2 - elementWidth / 2), math.floor(mainContainer.height / 2) - 7
|
||||
mainContainer.settingsContainer:addChild(GUI.label(1, y, mainContainer.settingsContainer.width, 1, 0xFFFFFF, localization.cursorProperties)):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top); y = y + 3
|
||||
local inputTextBox = mainContainer.settingsContainer:addChild(GUI.inputTextBox(x, y, elementWidth, 3, 0xCCCCCC, 0x777777, 0xCCCCCC, 0x2D2D2D, config.cursorSymbol, localization.cursorSymbol)); y = y + 5
|
||||
inputTextBox.validator = function(text)
|
||||
local inputField = mainContainer.settingsContainer:addChild(GUI.inputField(x, y, elementWidth, 3, 0xCCCCCC, 0x777777, 0x777777, 0xCCCCCC, 0x2D2D2D, config.cursorSymbol, localization.cursorSymbol)); y = y + 5
|
||||
inputField.validator = function(text)
|
||||
if unicode.len(text) == 1 then return true end
|
||||
end
|
||||
inputTextBox.onInputFinished = function()
|
||||
config.cursorSymbol = inputTextBox.text; saveConfig()
|
||||
inputField.onInputFinished = function()
|
||||
config.cursorSymbol = inputField.text; saveConfig()
|
||||
end
|
||||
local colorSelector = mainContainer.settingsContainer:addChild(GUI.colorSelector(x, y, elementWidth, 3, config.cursorColor, localization.cursorColor)); y = y + 5
|
||||
colorSelector.onTouch = function()
|
||||
@ -1578,8 +1578,8 @@ local function createMainContainer()
|
||||
mainContainer.bottomToolBar.onTouch = function()
|
||||
find()
|
||||
end
|
||||
mainContainer.bottomToolBar.inputTextBox = mainContainer.bottomToolBar:addChild(GUI.inputTextBox(7, 1, 10, 3, 0xCCCCCC, 0x999999, 0xCCCCCC, 0x2D2D2D, "", localization.findSomeShit))
|
||||
mainContainer.bottomToolBar.inputTextBox.onInputFinished = function()
|
||||
mainContainer.bottomToolBar.inputField = mainContainer.bottomToolBar:addChild(GUI.inputField(7, 1, 10, 3, 0xCCCCCC, 0x999999, 0x999999, 0xCCCCCC, 0x2D2D2D, "", localization.findSomeShit))
|
||||
mainContainer.bottomToolBar.inputField.onInputFinished = function()
|
||||
findFromFirstDisplayedLine()
|
||||
end
|
||||
mainContainer.bottomToolBar.findButton = mainContainer.bottomToolBar:addChild(GUI.adaptiveButton(1, 1, 3, 1, 0x3C3C3C, 0xEEEEEE, 0xBBBBBB, 0x2D2D2D, localization.find))
|
||||
|
||||
@ -196,7 +196,7 @@ local function createWindow()
|
||||
|
||||
y = y + 2
|
||||
mainContainer.shadeContainer:addChild(GUI.label(3, y, mainContainer.shadeContainer.width, 1, 0xCCCCCC, "Image path:"))
|
||||
mainContainer.shadeContainer:addChild(GUI.inputTextBox(mainContainer.shadeContainer.width - textBoxesWidth - 1, y, textBoxesWidth, 1, 0xEEEEEE, 0x555555, 0xEEEEEE, 0x262626, startImagePath, nil, true)).validator = function(text)
|
||||
mainContainer.shadeContainer:addChild(GUI.inputField(mainContainer.shadeContainer.width - textBoxesWidth - 1, y, textBoxesWidth, 1, 0xEEEEEE, 0x555555, 0x555555, 0xEEEEEE, 0x262626, startImagePath, nil, true)).validator = function(text)
|
||||
if text and fs.exists(text) then
|
||||
if unicode.sub(text, -4, -1) == ".pic" then
|
||||
mainImage = image.load(text)
|
||||
@ -212,7 +212,7 @@ local function createWindow()
|
||||
|
||||
y = y + 2
|
||||
mainContainer.shadeContainer:addChild(GUI.label(3, y, mainContainer.shadeContainer.width, 1, 0xCCCCCC, "Material:"))
|
||||
local mainMaterialTextBox = mainContainer.shadeContainer:addChild(GUI.inputTextBox(mainContainer.shadeContainer.width - textBoxesWidth - 1, y, textBoxesWidth, 1, 0xEEEEEE, 0x555555, 0xEEEEEE, 0x262626, config.mainMaterial, nil, false))
|
||||
local mainMaterialTextBox = mainContainer.shadeContainer:addChild(GUI.inputField(mainContainer.shadeContainer.width - textBoxesWidth - 1, y, textBoxesWidth, 1, 0xEEEEEE, 0x555555, 0x555555, 0xEEEEEE, 0x262626, config.mainMaterial, nil, false))
|
||||
mainMaterialTextBox.onInputFinished = function()
|
||||
config.mainMaterial = mainMaterialTextBox.text
|
||||
save()
|
||||
@ -220,7 +220,7 @@ local function createWindow()
|
||||
|
||||
y = y + 2
|
||||
mainContainer.shadeContainer:addChild(GUI.label(3, y, mainContainer.shadeContainer.width, 1, 0xCCCCCC, "Print name:"))
|
||||
local printNameTextBox = mainContainer.shadeContainer:addChild(GUI.inputTextBox(mainContainer.shadeContainer.width - textBoxesWidth - 1, y, textBoxesWidth, 1, 0xEEEEEE, 0x555555, 0xEEEEEE, 0x262626, config.printName, nil, false))
|
||||
local printNameTextBox = mainContainer.shadeContainer:addChild(GUI.inputField(mainContainer.shadeContainer.width - textBoxesWidth - 1, y, textBoxesWidth, 1, 0xEEEEEE, 0x555555, 0x555555, 0xEEEEEE, 0x262626, config.printName, nil, false))
|
||||
printNameTextBox.onInputFinished = function()
|
||||
config.printName = printNameTextBox.text
|
||||
save()
|
||||
@ -254,7 +254,7 @@ local function createWindow()
|
||||
end
|
||||
y = y + 2
|
||||
mainContainer.shadeContainer:addChild(GUI.label(3, y, mainContainer.shadeContainer.width, 1, 0xCCCCCC, "Material:"))
|
||||
local frameMaterialTextBox = mainContainer.shadeContainer:addChild(GUI.inputTextBox(mainContainer.shadeContainer.width - textBoxesWidth - 1, y, textBoxesWidth, 1, 0xEEEEEE, 0x555555, 0xEEEEEE, 0x262626, config.frame.material, nil, false))
|
||||
local frameMaterialTextBox = mainContainer.shadeContainer:addChild(GUI.inputField(mainContainer.shadeContainer.width - textBoxesWidth - 1, y, textBoxesWidth, 1, 0xEEEEEE, 0x555555, 0x555555, 0xEEEEEE, 0x262626, config.frame.material, nil, false))
|
||||
frameMaterialTextBox.onInputFinished = function()
|
||||
config.frame.material = frameMaterialTextBox.text
|
||||
save()
|
||||
|
||||
@ -37,13 +37,17 @@ local function settings()
|
||||
|
||||
window:addChild(GUI.label(1, y, window.width, 1, 0xFFFFFF, localization.rayEngineProperties)):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top); y = y + 3
|
||||
|
||||
local resolutionTextBoxWidth = window:addChild(GUI.inputTextBox(x, y, textBoxWidth, 3, 0x262626, 0xBBBBBB, 0x262626, 0xFFFFFF, tostring(buffer.width), nil, true))
|
||||
local resolutionTextBoxWidth = window:addChild(GUI.inputField(x, y, textBoxWidth, 3, 0x262626, 0xBBBBBB, 0xBBBBBB, 0x262626, 0xFFFFFF, tostring(buffer.width), nil, true))
|
||||
window:addChild(GUI.label(x + textBoxWidth + 2, y + 1, 1, 1, 0xFFFFFF, "X"))
|
||||
local resolutionTextBoxHeight = window:addChild(GUI.inputTextBox(x + textBoxWidth + 5, y, textBoxWidth, 3, 0x262626, 0xBBBBBB, 0x262626, 0xFFFFFF, tostring(buffer.height), nil, true)); y = y + 4
|
||||
local resolutionTextBoxHeight = window:addChild(GUI.inputField(x + textBoxWidth + 5, y, textBoxWidth, 3, 0x262626, 0xBBBBBB, 0xBBBBBB, 0x262626, 0xFFFFFF, tostring(buffer.height), nil, true)); y = y + 4
|
||||
window:addChild(GUI.label(1, y, window.width, 1, 0xDDDDDD, localization.screenResolution)):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top); y = y + 3
|
||||
resolutionTextBoxWidth.validator = function(text) local num = tonumber(text); if num and num >= 40 and num <= 160 then return true end end
|
||||
resolutionTextBoxHeight.validator = function(text) local num = tonumber(text); if num and num >= 12 and num <= 50 then return true end end
|
||||
local function onAnyResolutionTextBoxInputFinished() window:stopEventHandling(); rayEngine.changeResolution(tonumber(resolutionTextBoxWidth.text), tonumber(resolutionTextBoxHeight.text)); settings() end
|
||||
local function onAnyResolutionTextBoxInputFinished()
|
||||
window:stopEventHandling()
|
||||
rayEngine.changeResolution(tonumber(resolutionTextBoxWidth.text), tonumber(resolutionTextBoxHeight.text))
|
||||
settings()
|
||||
end
|
||||
resolutionTextBoxWidth.onInputFinished = onAnyResolutionTextBoxInputFinished
|
||||
resolutionTextBoxHeight.onInputFinished = onAnyResolutionTextBoxInputFinished
|
||||
|
||||
|
||||
@ -158,11 +158,11 @@ mainContainer.connectionButton = mainContainer:addChild(GUI.framedButton(x, y, w
|
||||
mainContainer.connectionButton.onTouch = function()
|
||||
if stargate.stargateState() == "Idle" then
|
||||
local container = MineOSCore.addUniversalContainer(mainContainer, "Connect")
|
||||
local inputTextBox = container.layout:addChild(GUI.inputTextBox(1, 1, 36, 3, 0xEEEEEE, 0x666666, 0xEEEEEE, 0x262626, contacts.last, "Type address here"))
|
||||
inputTextBox.onInputFinished = function()
|
||||
if inputTextBox.text then
|
||||
dial(inputTextBox.text)
|
||||
contacts.last = inputTextBox.text
|
||||
local inputField = container.layout:addChild(GUI.inputField(1, 1, 36, 3, 0xEEEEEE, 0x666666, 0x666666, 0xEEEEEE, 0x262626, contacts.last, "Type address here"))
|
||||
inputField.onInputFinished = function()
|
||||
if inputField.text then
|
||||
dial(inputField.text)
|
||||
contacts.last = inputField.text
|
||||
saveContacts()
|
||||
container:delete()
|
||||
|
||||
@ -172,7 +172,7 @@ mainContainer.connectionButton.onTouch = function()
|
||||
end
|
||||
|
||||
container.panel.eventHandler = function()
|
||||
inputTextBox.onInputFinished()
|
||||
inputField.onInputFinished()
|
||||
end
|
||||
|
||||
mainContainer:draw()
|
||||
@ -194,11 +194,11 @@ end
|
||||
mainContainer.messageContactButton = mainContainer:addChild(GUI.framedButton(x, y, width, 3, 0xEEEEEE, 0xEEEEEE, 0xBBBBBB, 0xBBBBBB, "Message")); y = y + 4
|
||||
mainContainer.messageContactButton.onTouch = function()
|
||||
local container = MineOSCore.addUniversalContainer(mainContainer, "Message")
|
||||
local inputTextBox = container.layout:addChild(GUI.inputTextBox(1, 1, 36, 3, 0xEEEEEE, 0x666666, 0xEEEEEE, 0x262626, nil, "Type message text here"))
|
||||
inputTextBox.onInputFinished = function()
|
||||
if inputTextBox.text then
|
||||
local inputField = container.layout:addChild(GUI.inputField(1, 1, 36, 3, 0xEEEEEE, 0x666666, 0x666666, 0xEEEEEE, 0x262626, nil, "Type message text here"))
|
||||
inputField.onInputFinished = function()
|
||||
if inputField.text then
|
||||
container:delete()
|
||||
stargate.sendMessage(inputTextBox.text)
|
||||
stargate.sendMessage(inputField.text)
|
||||
|
||||
mainContainer:draw()
|
||||
buffer.draw()
|
||||
@ -206,7 +206,7 @@ mainContainer.messageContactButton.onTouch = function()
|
||||
end
|
||||
|
||||
container.panel.eventHandler = function()
|
||||
inputTextBox.onInputFinished()
|
||||
inputField.onInputFinished()
|
||||
end
|
||||
|
||||
mainContainer:draw()
|
||||
@ -226,21 +226,21 @@ end
|
||||
mainContainer.addContactButton = mainContainer:addChild(GUI.framedButton(x, y, width, 3, 0xEEEEEE, 0xEEEEEE, 0xBBBBBB, 0xBBBBBB, "Add contact")); y = y + 3
|
||||
mainContainer.addContactButton.onTouch = function()
|
||||
local container = MineOSCore.addUniversalContainer(mainContainer, "Add contact")
|
||||
local inputTextBox1 = container.layout:addChild(GUI.inputTextBox(1, 1, 36, 3, 0xEEEEEE, 0x666666, 0xEEEEEE, 0x262626, nil, "Name"))
|
||||
local inputTextBox2 = container.layout:addChild(GUI.inputTextBox(1, 1, 36, 3, 0xEEEEEE, 0x666666, 0xEEEEEE, 0x262626, contacts.last, "Address"))
|
||||
local inputField1 = container.layout:addChild(GUI.inputField(1, 1, 36, 3, 0xEEEEEE, 0x666666, 0x666666, 0xEEEEEE, 0x262626, nil, "Name"))
|
||||
local inputField2 = container.layout:addChild(GUI.inputField(1, 1, 36, 3, 0xEEEEEE, 0x666666, 0x666666, 0xEEEEEE, 0x262626, contacts.last, "Address"))
|
||||
|
||||
container.panel.eventHandler = function(mainContainer, object, eventData)
|
||||
if eventData[1] == "touch" then
|
||||
if inputTextBox1.text and inputTextBox2.text then
|
||||
if inputField1.text and inputField2.text then
|
||||
local exists = false
|
||||
for i = 1, #contacts do
|
||||
if contacts[i].address == inputTextBox2.text then
|
||||
if contacts[i].address == inputField2.text then
|
||||
exists = true
|
||||
break
|
||||
end
|
||||
end
|
||||
if not exists then
|
||||
table.insert(contacts, {name = inputTextBox1.text, address = inputTextBox2.text})
|
||||
table.insert(contacts, {name = inputField1.text, address = inputField2.text})
|
||||
updateContacts()
|
||||
saveContacts()
|
||||
end
|
||||
|
||||
@ -319,8 +319,8 @@ local function loginGUI(startUsername, startPassword)
|
||||
obj.button = GUI.button(x, y, textFieldWidth, textFieldHeight, buttonColor, 0xEEEEEE, 0xEEEEEE, buttonColor, "Войти")
|
||||
|
||||
local VKLogoImage = image.load(VKLogoImagePath)
|
||||
local loginTextBox = GUI.inputTextBox(x, obj.username[2], textFieldWidth, 3, 0xEEEEEE, 0x777777, 0xEEEEEE, 0x262626, username, "E-Mail", false)
|
||||
local passwordTextBox = GUI.inputTextBox(x, obj.password[2], textFieldWidth, 3, 0xEEEEEE, 0x777777, 0xEEEEEE, 0x262626, password, "Password", false, "*")
|
||||
local loginTextBox = GUI.inputField(x, obj.username[2], textFieldWidth, 3, 0xEEEEEE, 0x777777, 0x777777, 0xEEEEEE, 0x262626, username, "E-Mail", false)
|
||||
local passwordTextBox = GUI.inputField(x, obj.password[2], textFieldWidth, 3, 0xEEEEEE, 0x777777, 0x777777, 0xEEEEEE, 0x262626, password, "Password", false, "*")
|
||||
|
||||
local function draw()
|
||||
buffer.clear(colors.loginGUIBackground)
|
||||
@ -446,7 +446,7 @@ end
|
||||
local function drawMessageInputBar(currentText)
|
||||
local x, y = mainZoneX, buffer.height - 5
|
||||
buffer.square(x, y, mainZoneWidth, 5, colors.messageInputBarColor)
|
||||
obj.messageInputBar = GUI.inputTextBox(x + 2, y + 1, mainZoneWidth - 4, 3, 0xFFFFFF, 0x444444, 0xFFFFFF, 0x262626, "", "Введите сообщение", true)
|
||||
obj.messageInputBar = GUI.inputField(x + 2, y + 1, mainZoneWidth - 4, 3, 0xFFFFFF, 0x444444, 0x444444, 0x444444, 0xFFFFFF, 0x262626, "", "Введите сообщение", true)
|
||||
obj.messageInputBar:draw()
|
||||
end
|
||||
|
||||
|
||||
@ -403,7 +403,7 @@ mainContainer:startEventHandling()
|
||||
|
||||

|
||||
|
||||
GUI.**inputTextBox**( x, y, width, height, backgroundColor, textColor, backgroundFocusedColor, textFocusedColor, text, [placeholderText, eraseTextOnFocus, textMask, highlightLuaSyntax, autocompleteVariables] ): *table* inputTextBox
|
||||
GUI.**inputField**( x, y, width, height, backgroundColor, textColor, placeholderTextColor, backgroundFocusedColor, textFocusedColor, text, [placeholderText, eraseTextOnFocus, textMask ): *table* inputField
|
||||
------------------------------------------------------------------------
|
||||
| Тип | Аргумент | Описание |
|
||||
| ------ | ------ | ------ |
|
||||
@ -411,23 +411,23 @@ GUI.**inputTextBox**( x, y, width, height, backgroundColor, textColor, backgroun
|
||||
| *int* | y | Координата объекта по оси y |
|
||||
| *int* | width | Ширина объекта |
|
||||
| *int* | height | Высота объекта |
|
||||
| *int* | backgroundColor | Цвет поля ввода |
|
||||
| *int* | textColor | Цвет текста поля ввода |
|
||||
| *int* | backgroundFocusedColor | Цвет поля ввода в состоянии *focused* |
|
||||
| *int* | textFocusedColor |Цвет текста поля ввода в состоянии *focused* |
|
||||
| *int* | backgroundColor | Цвет фона |
|
||||
| *int* | textColor | Цвет текста |
|
||||
| *int* | placeholderTextColor | Цвет текста *placeholder* при условии, что он указан ниже |
|
||||
| *int* | backgroundFocusedColor | Цвет фона в состоянии *focused* |
|
||||
| *int* | textFocusedColor |Цвет текста в состоянии *focused* |
|
||||
| *string* | text | Введенный на момент создания поля текст |
|
||||
| [*string* | placeholderText] | Текст, появляющийся при условии, что *text* == nil |
|
||||
| [*string* | placeholderText] | Текст, появляющийся при условии, что введенный текст отсутствует |
|
||||
| [*boolean* | eraseTextOnFocus] | Необходимо ли удалять текст при активации ввода |
|
||||
| [*string* | textMask] | Символ-маска для вводимого текста. Полезно для создания поля ввода пароля |
|
||||
| [*boolean* | highlightLuaSyntax] | Режим подсветки синтаксиса Lua для вводимой строки. Цвет текста при этом игнорируется |
|
||||
| [*boolean* | autocompleteVariables] | Режим автодополнения текстовых данных на основе поиска таковых переменных в оперативной памяти |
|
||||
| [*char* | textMask] | Символ-маска для вводимого текста. Удобно для создания поля ввода пароля |
|
||||
|
||||
Создать объект типа "поле ввода текста", предназначенный для ввода и анализа текстовых данных с клавиатуры. Объект универсален и подходит как для создания простых форм для ввода логина/пароля, так и для сложных структур наподобие интерпретаторов команд. К примеру, окно *палитры* выше целиком и полностью основано на использовании этого объекта.
|
||||
Создать объект, предназначенный для ввода и анализа текстовых данных с клавиатуры. Объект универсален и подходит как для создания простых форм для ввода логина/пароля, так и для сложных структур наподобие интерпретаторов команд. К примеру, окно *палитры* со скриншота в начале документации полностью основано на использовании этого объекта.
|
||||
|
||||
| Тип свойства | Свойство |Описание |
|
||||
| ------ | ------ | ------ |
|
||||
| *function* | :**startInput**()| Начать ввод в текстовое поле. Метод полезен, если хочется сразу сделать |
|
||||
| *callback-function* | .**validator**( *string* text )| Метод, вызывающийся после окончания ввода текста в поле. Если возвращает *true*, то текст в текстовом поле меняется на введенный, в противном случае введенные данные игнорируются. К примеру, в данном методе удобно проверять, является ли введенная текстовая информация числом через *tonumber()* |
|
||||
| *callback-function* | .**onInputFinished**( *string* text, *table* eventData )| Метод, вызываемый после ввода данных в обработчике событий |
|
||||
| *callback-function* | .**onInputFinished**( *string* text, *table* eventData )| Метод, вызываемый после ввода данных в обработчике событий. Удобная штука, если хочется выполнить какие-либо действия сразу после ввода текста. Если у объекта имеется *validator*, и текст не прошел проверку через него, то *onInputFinished* вызван не будет. |
|
||||
|
||||
Пример реализации поля ввода:
|
||||
|
||||
@ -438,11 +438,16 @@ local GUI = require("GUI")
|
||||
local mainContainer = GUI.fullScreenContainer()
|
||||
mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D))
|
||||
|
||||
local inputTextBox = mainContainer:addChild(GUI.inputTextBox(2, 2, 32, 3, 0xEEEEEE, 0x555555, 0xEEEEEE, 0x2D2D2D, nil, "Type number here", true, nil, nil, nil))
|
||||
inputTextBox.validator = function(text)
|
||||
if tonumber(text) then return true end
|
||||
local inputField = mainContainer:addChild(GUI.inputField(2, 2, 30, 3, 0xEEEEEE, 0x555555, 0x999999, 0xFFFFFF, 0x2D2D2D, "Hello world", "Placeholder text"))
|
||||
|
||||
inputField.validator = function(text)
|
||||
if tonumber(text) then
|
||||
GUI.error("It's a number!")
|
||||
end
|
||||
return true
|
||||
end
|
||||
inputTextBox.onInputFinished = function()
|
||||
|
||||
inputField.onInputFinished = function()
|
||||
-- Do something when input finished
|
||||
end
|
||||
|
||||
@ -453,9 +458,11 @@ mainContainer:startEventHandling()
|
||||
|
||||
Результат:
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||

|
||||
|
||||
GUI.**slider**( x, y, width, primaryColor, secondaryColor, pipeColor, valueColor, minimumValue, maximumValue, value, [showCornerValues, currentValuePrefix, currentValuePostfix] ): *table* slider
|
||||
------------------------------------------------------------------------
|
||||
@ -1227,7 +1234,7 @@ layout:setCellPosition(3, 1, layout:addChild(GUI.adaptiveButton(1, 1, 3, 0, 0x33
|
||||
mainContainer:draw()
|
||||
buffer.draw()
|
||||
end
|
||||
-- В ячейке 3ч1 задаем горизонтальную ориентацию объектов, расстояние между ними в 2 пикселя, а также выравнивание по правому верхнему краю
|
||||
-- В ячейке 3x1 задаем горизонтальную ориентацию объектов, расстояние между ними в 2 пикселя, а также выравнивание по правому верхнему краю
|
||||
layout:setCellDirection(3, 1, GUI.directions.horizontal)
|
||||
layout:setCellSpacing(3, 1, 2)
|
||||
layout:setCellAlignment(3, 1, GUI.alignment.horizontal.right, GUI.alignment.vertical.bottom)
|
||||
|
||||
@ -87,7 +87,12 @@
|
||||
mineOSCreatorUsedMasterPassword = "The creator of this operating system has used Master-Password",
|
||||
loginToSystem = "Login",
|
||||
|
||||
appearance = "Appearance",
|
||||
wallpaperProperties = "Wallpaper properties",
|
||||
colorScheme = "Color scheme",
|
||||
wallpaperPath = "Path to wallpaper",
|
||||
wallpaperModeStretch = "Stretch",
|
||||
wallpaperModeCenter = "Center",
|
||||
backgroundColor = "Background color",
|
||||
interfaceColor = "Interface color",
|
||||
screenResolution = "Screen resolution",
|
||||
|
||||
@ -87,7 +87,12 @@
|
||||
mineOSCreatorUsedMasterPassword = "Создатель операционной системы использовал мастер-ключ",
|
||||
loginToSystem = "Вход в систему",
|
||||
|
||||
appearance = "Внешний вид",
|
||||
wallpaperProperties = "Параметры обоев",
|
||||
colorScheme = "Цветовая схема",
|
||||
wallpaperPath = "Путь к обоям",
|
||||
wallpaperModeStretch = "Растянуть",
|
||||
wallpaperModeCenter = "По центру",
|
||||
backgroundColor = "Цвет фона",
|
||||
interfaceColor = "Цвет интерфейса",
|
||||
screenResolution = "Разрешение экрана",
|
||||
|
||||
132
MineOS/OS.lua
132
MineOS/OS.lua
@ -108,34 +108,36 @@ end
|
||||
|
||||
local function checkPassword()
|
||||
local container = MineOSCore.addUniversalContainer(MineOSCore.OSMainContainer, MineOSCore.localization.inputPassword)
|
||||
local inputTextBox = container.layout:addChild(GUI.inputTextBox(1, 1, 36, 3, 0xEEEEEE, 0x666666, 0xEEEEEE, 0x262626, nil, "Password", true, "*"))
|
||||
local inputField = container.layout:addChild(GUI.inputField(1, 1, 36, 3, 0xEEEEEE, 0x666666, 0x666666, 0xEEEEEE, 0x262626, nil, nil, true, "*"))
|
||||
local label = container.layout:addChild(GUI.label(1, 1, 36, 1, 0xFF4940, " ")):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top)
|
||||
|
||||
container.panel.eventHandler = function(mainContainer, object, eventData)
|
||||
if eventData[1] == "touch" then
|
||||
local hash = require("SHA2").hash(inputTextBox.text or "")
|
||||
if hash == MineOSCore.OSSettings.passwordHash then
|
||||
container:delete()
|
||||
MineOSCore.OSMainContainer:draw()
|
||||
buffer.draw()
|
||||
elseif hash == "c925be318b0530650b06d7f0f6a51d8289b5925f1b4117a43746bc99f1f81bc1" then
|
||||
GUI.error(MineOSCore.localization.mineOSCreatorUsedMasterPassword)
|
||||
container:delete()
|
||||
MineOSCore.OSMainContainer:draw()
|
||||
buffer.draw()
|
||||
else
|
||||
label.text = MineOSCore.localization.incorrectPassword
|
||||
MineOSCore.OSMainContainer:draw()
|
||||
buffer.draw()
|
||||
end
|
||||
inputField.onInputFinished = function()
|
||||
local hash = require("SHA2").hash(inputField.text or "")
|
||||
if hash == MineOSCore.OSSettings.passwordHash then
|
||||
container:delete()
|
||||
MineOSCore.OSMainContainer:draw()
|
||||
buffer.draw()
|
||||
elseif hash == "c925be318b0530650b06d7f0f6a51d8289b5925f1b4117a43746bc99f1f81bc1" then
|
||||
GUI.error(MineOSCore.localization.mineOSCreatorUsedMasterPassword)
|
||||
container:delete()
|
||||
MineOSCore.OSMainContainer:draw()
|
||||
buffer.draw()
|
||||
else
|
||||
label.text = MineOSCore.localization.incorrectPassword
|
||||
MineOSCore.OSMainContainer:draw()
|
||||
buffer.draw()
|
||||
end
|
||||
end
|
||||
|
||||
MineOSCore.OSMainContainer:draw()
|
||||
buffer.draw()
|
||||
inputField:startInput()
|
||||
end
|
||||
|
||||
local function setPassword()
|
||||
local container = MineOSCore.addUniversalContainer(MineOSCore.OSMainContainer, MineOSCore.localization.passwordProtection)
|
||||
local inputTextBox1 = container.layout:addChild(GUI.inputTextBox(1, 1, 36, 3, 0xEEEEEE, 0x666666, 0xEEEEEE, 0x262626, nil, MineOSCore.localization.inputPassword, true, "*"))
|
||||
local inputTextBox2 = container.layout:addChild(GUI.inputTextBox(1, 1, 36, 3, 0xEEEEEE, 0x666666, 0xEEEEEE, 0x262626, nil, MineOSCore.localization.confirmInputPassword, true, "*"))
|
||||
local inputField1 = container.layout:addChild(GUI.inputField(1, 1, 36, 3, 0xEEEEEE, 0x666666, 0x666666, 0xEEEEEE, 0x262626, nil, MineOSCore.localization.inputPassword, true, "*"))
|
||||
local inputField2 = container.layout:addChild(GUI.inputField(1, 1, 36, 3, 0xEEEEEE, 0x666666, 0x666666, 0xEEEEEE, 0x262626, nil, MineOSCore.localization.confirmInputPassword, true, "*"))
|
||||
local label = container.layout:addChild(GUI.label(1, 1, 36, 1, 0xFF4940, " ")):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top)
|
||||
|
||||
MineOSCore.OSMainContainer:draw()
|
||||
@ -143,11 +145,11 @@ local function setPassword()
|
||||
|
||||
container.panel.eventHandler = function(mainContainer, object, eventData)
|
||||
if eventData[1] == "touch" then
|
||||
if inputTextBox1.text == inputTextBox2.text then
|
||||
if inputField1.text == inputField2.text then
|
||||
container:delete()
|
||||
|
||||
|
||||
MineOSCore.OSSettings.protectionMethod = "password"
|
||||
MineOSCore.OSSettings.passwordHash = require("SHA2").hash(inputTextBox1.text or "")
|
||||
MineOSCore.OSSettings.passwordHash = require("SHA2").hash(inputField1.text or "")
|
||||
MineOSCore.saveOSSettings()
|
||||
else
|
||||
label.text = MineOSCore.localization.passwordsAreDifferent
|
||||
@ -167,7 +169,7 @@ end
|
||||
|
||||
local function setProtectionMethod()
|
||||
local container = MineOSCore.addUniversalContainer(MineOSCore.OSMainContainer, MineOSCore.localization.protectYourComputer)
|
||||
|
||||
|
||||
local comboBox = container.layout:addChild(GUI.comboBox(1, 1, 36, 3, 0xEEEEEE, 0x262626, 0x666666, 0xEEEEEE))
|
||||
comboBox:addItem(MineOSCore.localization.biometricProtection)
|
||||
comboBox:addItem(MineOSCore.localization.passwordProtection)
|
||||
@ -263,7 +265,14 @@ end
|
||||
|
||||
local function changeWallpaper()
|
||||
if MineOSCore.OSSettings.wallpaper and fs.exists(MineOSCore.OSSettings.wallpaper) then
|
||||
MineOSCore.OSMainContainer.background.wallpaper = image.transform(image.load(MineOSCore.OSSettings.wallpaper), MineOSCore.OSMainContainer.width, MineOSCore.OSMainContainer.height)
|
||||
MineOSCore.OSMainContainer.background.wallpaper = image.load(MineOSCore.OSSettings.wallpaper)
|
||||
if MineOSCore.OSSettings.wallpaperMode == 1 then
|
||||
MineOSCore.OSMainContainer.background.wallpaper = image.transform(MineOSCore.OSMainContainer.background.wallpaper, MineOSCore.OSMainContainer.width, MineOSCore.OSMainContainer.height)
|
||||
MineOSCore.OSMainContainer.background.wallpaperPosition.x, MineOSCore.OSMainContainer.background.wallpaperPosition.y = 1, 1
|
||||
else
|
||||
MineOSCore.OSMainContainer.background.wallpaperPosition.x = math.floor(MineOSCore.OSMainContainer.width / 2 - image.getWidth(MineOSCore.OSMainContainer.background.wallpaper) / 2)
|
||||
MineOSCore.OSMainContainer.background.wallpaperPosition.y = math.floor(MineOSCore.OSMainContainer.height / 2 - image.getHeight(MineOSCore.OSMainContainer.background.wallpaper) / 2)
|
||||
end
|
||||
else
|
||||
MineOSCore.OSMainContainer.background.wallpaper = nil
|
||||
end
|
||||
@ -348,12 +357,12 @@ end
|
||||
local function createOSWindow()
|
||||
MineOSCore.OSMainContainer = GUI.fullScreenContainer()
|
||||
|
||||
MineOSCore.OSMainContainer.background = GUI.object(1, 1, 1, 1)
|
||||
MineOSCore.OSMainContainer.background = MineOSCore.OSMainContainer:addChild(GUI.object(1, 1, 1, 1))
|
||||
MineOSCore.OSMainContainer.background.wallpaperPosition = {x = 1, y = 1}
|
||||
MineOSCore.OSMainContainer.background.draw = function(object)
|
||||
buffer.square(object.x, object.y, object.width, object.height, MineOSCore.OSSettings.backgroundColor or colors.background, 0x0, " ")
|
||||
if object.wallpaper then
|
||||
buffer.image(object.x, object.y, object.wallpaper)
|
||||
else
|
||||
buffer.square(object.x, object.y, object.width, object.height, MineOSCore.OSSettings.backgroundColor or colors.background, 0x0, " ")
|
||||
buffer.image(object.wallpaperPosition.x, object.wallpaperPosition.y, object.wallpaper)
|
||||
end
|
||||
end
|
||||
MineOSCore.OSMainContainer.background.eventHandler = function(mainContainer, object, eventData)
|
||||
@ -363,8 +372,7 @@ local function createOSWindow()
|
||||
end
|
||||
end
|
||||
end
|
||||
MineOSCore.OSMainContainer:addChild(MineOSCore.OSMainContainer.background)
|
||||
|
||||
|
||||
MineOSCore.OSMainContainer.desktopCounters = MineOSCore.OSMainContainer:addChild(GUI.container(1, 1, 1, 1))
|
||||
|
||||
MineOSCore.OSMainContainer.iconField = MineOSCore.OSMainContainer:addChild(
|
||||
@ -472,7 +480,7 @@ local function createOSWindow()
|
||||
local menu = GUI.contextMenu(eventData[3], eventData[4])
|
||||
menu:addItem(MineOSCore.localization.emptyTrash).onTouch = function()
|
||||
local container = MineOSCore.addUniversalContainer(MineOSCore.OSMainContainer, MineOSCore.localization.areYouSure)
|
||||
|
||||
|
||||
container.layout:addChild(GUI.button(1, 1, 30, 3, 0xEEEEEE, 0x262626, 0xA, 0x262626, "OK")).onTouch = function()
|
||||
for file in fs.list(MineOSCore.paths.trash) do
|
||||
fs.remove(MineOSCore.paths.trash .. file)
|
||||
@ -481,7 +489,7 @@ local function createOSWindow()
|
||||
MineOSCore.OSMainContainer.updateAndDraw()
|
||||
end
|
||||
|
||||
container.panel.onTouch = function()
|
||||
container.panel.onTouch = function()
|
||||
container:delete()
|
||||
MineOSCore.OSMainContainer:draw()
|
||||
buffer.draw()
|
||||
@ -534,13 +542,13 @@ local function createOSWindow()
|
||||
menu:addItem(MineOSCore.localization.shutdown).onTouch = function()
|
||||
-- ecs.TV(0)
|
||||
require("computer").shutdown()
|
||||
end
|
||||
end
|
||||
menu:addSeparator()
|
||||
menu:addItem(MineOSCore.localization.returnToShell).onTouch = function()
|
||||
MineOSCore.OSMainContainer:stopEventHandling()
|
||||
ecs.prepareToExit()
|
||||
os.exit()
|
||||
end
|
||||
end
|
||||
menu:show()
|
||||
end
|
||||
|
||||
@ -585,7 +593,7 @@ local function createOSWindow()
|
||||
menu:addSeparator()
|
||||
menu:addItem(MineOSCore.localization.screensaver).onTouch = function()
|
||||
local container = MineOSCore.addUniversalContainer(MineOSCore.OSMainContainer, MineOSCore.localization.screensaver)
|
||||
|
||||
|
||||
local comboBox = container.layout:addChild(GUI.comboBox(1, 1, 36, 3, 0xEEEEEE, 0x262626, 0x666666, 0xEEEEEE))
|
||||
comboBox:addItem(MineOSCore.localization.screensaverDisabled)
|
||||
for file in fs.list(screensaversPath) do
|
||||
@ -611,25 +619,47 @@ local function createOSWindow()
|
||||
end
|
||||
end
|
||||
end
|
||||
menu:addItem(MineOSCore.localization.colorScheme).onTouch = function()
|
||||
local container = MineOSCore.addUniversalContainer(MineOSCore.OSMainContainer, MineOSCore.localization.colorScheme)
|
||||
|
||||
menu:addItem(MineOSCore.localization.appearance).onTouch = function()
|
||||
local container = MineOSCore.addUniversalContainer(MineOSCore.OSMainContainer, MineOSCore.localization.wallpaperProperties)
|
||||
|
||||
local inputField = container.layout:addChild(GUI.inputField(1, 1, 36, 3, 0xEEEEEE, 0x666666, 0x999999, 0xEEEEEE, 0x262626, MineOSCore.OSSettings.wallpaper, MineOSCore.localization.wallpaperPath, true))
|
||||
local comboBox = container.layout:addChild(GUI.comboBox(1, 1, 36, 3, 0xEEEEEE, 0x262626, 0x666666, 0xEEEEEE))
|
||||
comboBox.selectedItem = MineOSCore.OSSettings.wallpaperMode or 1
|
||||
comboBox:addItem(MineOSCore.localization.wallpaperModeStretch)
|
||||
comboBox:addItem(MineOSCore.localization.wallpaperModeCenter)
|
||||
|
||||
container.layout:addChild(GUI.label(1, 1, 36, 1, 0xEEEEEE, MineOSCore.localization.colorScheme)):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top)
|
||||
local backgroundColorSelector = container.layout:addChild(GUI.colorSelector(1, 1, 36, 3, MineOSCore.OSSettings.backgroundColor or colors.background, MineOSCore.localization.backgroundColor))
|
||||
local interfaceColorSelector = container.layout:addChild(GUI.colorSelector(1, 1, 36, 3, MineOSCore.OSSettings.interfaceColor or colors.interface, MineOSCore.localization.interfaceColor))
|
||||
|
||||
comboBox.onItemSelected = function()
|
||||
MineOSCore.OSSettings.wallpaperMode = comboBox.selectedItem
|
||||
MineOSCore.saveOSSettings()
|
||||
changeWallpaper()
|
||||
|
||||
MineOSCore.OSMainContainer:draw()
|
||||
buffer.draw()
|
||||
end
|
||||
|
||||
inputField.onInputFinished = function()
|
||||
MineOSCore.OSSettings.wallpaper = inputField.text
|
||||
MineOSCore.saveOSSettings()
|
||||
changeWallpaper()
|
||||
|
||||
MineOSCore.OSMainContainer:draw()
|
||||
buffer.draw()
|
||||
end
|
||||
|
||||
backgroundColorSelector.onTouch = function()
|
||||
MineOSCore.OSSettings.backgroundColor, MineOSCore.OSSettings.interfaceColor = backgroundColorSelector.color, interfaceColorSelector.color
|
||||
MineOSCore.OSMainContainer.menu.colors.default.background = MineOSCore.OSSettings.interfaceColor
|
||||
MineOSCore.saveOSSettings()
|
||||
|
||||
|
||||
MineOSCore.OSMainContainer:draw()
|
||||
buffer.draw()
|
||||
end
|
||||
interfaceColorSelector.onTouch = backgroundColorSelector.onTouch
|
||||
|
||||
MineOSCore.OSMainContainer:draw()
|
||||
buffer.draw()
|
||||
|
||||
container.panel.eventHandler = function(mainContainer, object, eventData)
|
||||
if eventData[1] == "touch" then
|
||||
container:delete()
|
||||
@ -637,7 +667,11 @@ local function createOSWindow()
|
||||
buffer.draw()
|
||||
end
|
||||
end
|
||||
|
||||
MineOSCore.OSMainContainer:draw()
|
||||
buffer.draw()
|
||||
end
|
||||
|
||||
menu:addItem(MineOSCore.localization.contextMenuRemoveWallpaper, not MineOSCore.OSMainContainer.background.wallpaper).onTouch = function()
|
||||
MineOSCore.OSSettings.wallpaper = nil
|
||||
MineOSCore.saveOSSettings()
|
||||
@ -651,14 +685,14 @@ local function createOSWindow()
|
||||
local menu = GUI.contextMenu(item3.x, item3.y + 1)
|
||||
menu:addItem(MineOSCore.localization.screenResolution).onTouch = function()
|
||||
local container = MineOSCore.addUniversalContainer(MineOSCore.OSMainContainer, MineOSCore.localization.screenResolution)
|
||||
|
||||
local widthTextBox = container.layout:addChild(GUI.inputTextBox(1, 1, 36, 3, 0xEEEEEE, 0x666666, 0xEEEEEE, 0x262626, tostring(MineOSCore.OSSettings.resolution and MineOSCore.OSSettings.resolution[1] or 160), "Width", true))
|
||||
|
||||
local widthTextBox = container.layout:addChild(GUI.inputField(1, 1, 36, 3, 0xEEEEEE, 0x666666, 0x666666, 0xEEEEEE, 0x262626, tostring(MineOSCore.OSSettings.resolution and MineOSCore.OSSettings.resolution[1] or 160), "Width", true))
|
||||
widthTextBox.validator = function(text)
|
||||
local number = tonumber(text)
|
||||
if number then return number >= 1 and number <= 160 end
|
||||
end
|
||||
|
||||
local heightTextBox = container.layout:addChild(GUI.inputTextBox(1, 1, 36, 3, 0xEEEEEE, 0x666666, 0xEEEEEE, 0x262626, tostring(MineOSCore.OSSettings.resolution and MineOSCore.OSSettings.resolution[2] or 50), "Height", true))
|
||||
local heightTextBox = container.layout:addChild(GUI.inputField(1, 1, 36, 3, 0xEEEEEE, 0x666666, 0x666666, 0xEEEEEE, 0x262626, tostring(MineOSCore.OSSettings.resolution and MineOSCore.OSSettings.resolution[2] or 50), "Height", true))
|
||||
heightTextBox.validator = function(text)
|
||||
local number = tonumber(text)
|
||||
if number then return number >= 1 and number <= 50 end
|
||||
@ -771,9 +805,3 @@ while true do
|
||||
buffer.draw()
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
489
lib/GUI.lua
489
lib/GUI.lua
@ -929,271 +929,6 @@ function GUI.error(...)
|
||||
mainContainer:startEventHandling()
|
||||
end
|
||||
|
||||
----------------------------------------- Universal keyboard-input function -----------------------------------------
|
||||
|
||||
local function findValue(t, whatToSearch)
|
||||
if type(t) ~= "table" then return end
|
||||
for key, value in pairs(t) do
|
||||
if type(key) == "string" and string.match(key, "^" .. whatToSearch) then
|
||||
local valueType, postfix = type(value), ""
|
||||
if valueType == "function" or (valueType == "table" and getmetatable(value) and getmetatable(value).__call) then
|
||||
postfix = "()"
|
||||
elseif valueType == "table" then
|
||||
postfix = "."
|
||||
end
|
||||
return key .. postfix
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function findTable(whereToSearch, t, whatToSearch)
|
||||
local beforeFirstDot = string.match(whereToSearch, "^[^%.]+%.")
|
||||
-- Если вообще есть таблица, где надо искать
|
||||
if beforeFirstDot then
|
||||
beforeFirstDot = unicode.sub(beforeFirstDot, 1, -2)
|
||||
if t[beforeFirstDot] then
|
||||
return findTable(unicode.sub(whereToSearch, unicode.len(beforeFirstDot) + 2, -1), t[beforeFirstDot], whatToSearch)
|
||||
else
|
||||
-- Кароч, слушай суда: вот в эту зону хуйня может зайти толька
|
||||
-- тагда, кагда ты вручную ебенишь массив вида "abc.cda.blabla.test"
|
||||
-- без автозаполнения, т.е. он МОЖЕТ быть неверным, однако прога все
|
||||
-- равно проверяет на верность, и вот если НИ ХУЯ такого говнища типа
|
||||
-- ... .blabla не существует, то интерхпретатор захуяривается СУДЫ
|
||||
-- И ЧТОБ БОЛЬШЕ ВОПРОСОВ НЕ ЗАДАВАЛ!11!
|
||||
end
|
||||
-- Или если таблиц либо ваще нету, либо рекурсия суда вон вошла
|
||||
else
|
||||
return findValue(t[whereToSearch], whatToSearch)
|
||||
end
|
||||
end
|
||||
|
||||
local function autocompleteVariables(sourceText)
|
||||
local varPath = string.match(sourceText, "[a-zA-Z0-9%.%_]+$")
|
||||
if varPath then
|
||||
local prefix = string.sub(sourceText, 1, -unicode.len(varPath) - 1)
|
||||
local whereToSearch = string.match(varPath, "[a-zA-Z0-9%.%_]+%.")
|
||||
|
||||
if whereToSearch then
|
||||
whereToSearch = unicode.sub(whereToSearch, 1, -2)
|
||||
local findedTable = findTable(whereToSearch, _G, unicode.sub(varPath, unicode.len(whereToSearch) + 2, -1))
|
||||
return findedTable and prefix .. whereToSearch .. "." .. findedTable or sourceText
|
||||
else
|
||||
local findedValue = findValue(_G, varPath)
|
||||
return findedValue and prefix .. findedValue or sourceText
|
||||
end
|
||||
else
|
||||
return sourceText
|
||||
end
|
||||
end
|
||||
|
||||
local function inputFieldDraw(inputField)
|
||||
if inputField.x < 1 or inputField.y < 1 or inputField.x + inputField.width - 1 > buffer.width or inputField.y > buffer.height then return inputField end
|
||||
if inputField.oldPixels then
|
||||
buffer.paste(inputField.x, inputField.y, inputField.oldPixels)
|
||||
else
|
||||
inputField.oldPixels = buffer.copy(inputField.x, inputField.y, inputField.width, 1)
|
||||
end
|
||||
|
||||
if inputField.highlightLuaSyntax then
|
||||
require("syntax").highlightString(inputField.x, inputField.y, inputField.text, 2)
|
||||
else
|
||||
buffer.text(
|
||||
inputField.x,
|
||||
inputField.y,
|
||||
inputField.colors.text,
|
||||
unicode.sub(
|
||||
inputField.textMask and string.rep(inputField.textMask, unicode.len(inputField.text)) or inputField.text,
|
||||
inputField.textCutFrom,
|
||||
inputField.textCutFrom + inputField.width - 1
|
||||
)
|
||||
)
|
||||
end
|
||||
|
||||
if inputField.cursorBlinkState then
|
||||
buffer.text(inputField.x + inputField.cursorPosition - inputField.textCutFrom, inputField.y, inputField.cursorColor, inputField.cursorSymbol)
|
||||
end
|
||||
|
||||
return inputField
|
||||
end
|
||||
|
||||
local function inputFieldSetCursorPosition(inputField, newPosition)
|
||||
if newPosition < 1 then
|
||||
newPosition = 1
|
||||
elseif newPosition > unicode.len(inputField.text) + 1 then
|
||||
newPosition = unicode.len(inputField.text) + 1
|
||||
end
|
||||
|
||||
if newPosition > inputField.textCutFrom + inputField.width - 1 then
|
||||
inputField.textCutFrom = inputField.textCutFrom + newPosition - (inputField.textCutFrom + inputField.width - 1)
|
||||
elseif newPosition < inputField.textCutFrom then
|
||||
inputField.textCutFrom = newPosition
|
||||
end
|
||||
|
||||
inputField.cursorPosition = newPosition
|
||||
|
||||
return inputField
|
||||
end
|
||||
|
||||
local function inputFieldBeginInput(inputField)
|
||||
inputField.cursorBlinkState = true; inputField:draw(); buffer.draw()
|
||||
|
||||
while true do
|
||||
local e = { event.pull(inputField.cursorBlinkDelay) }
|
||||
if e[1] == "touch" or e[1] == "drag" then
|
||||
if inputField:isClicked(e[3], e[4]) then
|
||||
inputField:setCursorPosition(inputField.textCutFrom + e[3] - inputField.x)
|
||||
inputField.cursorBlinkState = true; inputField:draw(); buffer.draw()
|
||||
else
|
||||
inputField.cursorBlinkState = false; inputField:draw(); buffer.draw()
|
||||
return inputField
|
||||
end
|
||||
elseif e[1] == "key_down" then
|
||||
if e[4] == 28 then
|
||||
inputField.cursorBlinkState = false; inputField:draw(); buffer.draw()
|
||||
return inputField
|
||||
elseif e[4] == 15 then
|
||||
if inputField.autocompleteVariables then
|
||||
inputField.text = autocompleteVariables(inputField.text)
|
||||
inputField:setCursorPosition(unicode.len(inputField.text) + 1)
|
||||
inputField.cursorBlinkState = true; inputField:draw(); buffer.draw()
|
||||
end
|
||||
elseif e[4] == 203 then
|
||||
inputField:setCursorPosition(inputField.cursorPosition - 1)
|
||||
inputField.cursorBlinkState = true; inputField:draw(); buffer.draw()
|
||||
elseif e[4] == 205 then
|
||||
inputField:setCursorPosition(inputField.cursorPosition + 1)
|
||||
inputField.cursorBlinkState = true; inputField:draw(); buffer.draw()
|
||||
elseif e[4] == 14 then
|
||||
inputField.text = unicode.sub(unicode.sub(inputField.text, 1, inputField.cursorPosition - 1), 1, -2) .. unicode.sub(inputField.text, inputField.cursorPosition, -1)
|
||||
inputField:setCursorPosition(inputField.cursorPosition - 1)
|
||||
inputField.cursorBlinkState = true; inputField:draw(); buffer.draw()
|
||||
else
|
||||
if not keyboard.isControl(e[3]) then
|
||||
inputField.text = unicode.sub(inputField.text, 1, inputField.cursorPosition - 1) .. unicode.char(e[3]) .. unicode.sub(inputField.text, inputField.cursorPosition, -1)
|
||||
inputField:setCursorPosition(inputField.cursorPosition + 1)
|
||||
inputField.cursorBlinkState = true; inputField:draw(); buffer.draw()
|
||||
end
|
||||
end
|
||||
elseif e[1] == "clipboard" then
|
||||
inputField.text = unicode.sub(inputField.text, 1, inputField.cursorPosition - 1) .. e[3] .. unicode.sub(inputField.text, inputField.cursorPosition, -1)
|
||||
inputField:setCursorPosition(inputField.cursorPosition + unicode.len(e[3]))
|
||||
inputField.cursorBlinkState = true; inputField:draw(); buffer.draw()
|
||||
else
|
||||
inputField.cursorBlinkState = not inputField.cursorBlinkState; inputField:draw(); buffer.draw()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function GUI.inputField(x, y, width, textColor, text, textMask, highlightLuaSyntax, autocompleteVariables)
|
||||
local inputField = GUI.object(x, y, width, 1)
|
||||
|
||||
inputField.textCutFrom = 1
|
||||
inputField.cursorPosition = 1
|
||||
inputField.cursorColor = 0x00A8FF
|
||||
inputField.cursorSymbol = "┃"
|
||||
inputField.cursorBlinkDelay = 0.4
|
||||
inputField.cursorBlinkState = false
|
||||
|
||||
inputField.colors = {text = textColor}
|
||||
inputField.text = text
|
||||
inputField.textMask = textMask
|
||||
inputField.highlightLuaSyntax = highlightLuaSyntax
|
||||
inputField.autocompleteVariables = autocompleteVariables
|
||||
|
||||
inputField.setCursorPosition = inputFieldSetCursorPosition
|
||||
inputField.draw = inputFieldDraw
|
||||
inputField.input = inputFieldBeginInput
|
||||
|
||||
inputField:setCursorPosition(unicode.len(inputField.text) + 1)
|
||||
|
||||
return inputField
|
||||
end
|
||||
|
||||
----------------------------------------- Input Text Box object -----------------------------------------
|
||||
|
||||
local function drawInputTextBox(inputTextBox)
|
||||
local background = inputTextBox.isFocused and inputTextBox.colors.focused.background or inputTextBox.colors.default.background
|
||||
local foreground = inputTextBox.isFocused and inputTextBox.colors.focused.text or inputTextBox.colors.default.text
|
||||
local y = math.floor(inputTextBox.y + inputTextBox.height / 2)
|
||||
|
||||
local text = inputTextBox.text or ""
|
||||
if inputTextBox.isFocused then
|
||||
if inputTextBox.eraseTextOnFocus then
|
||||
text = ""
|
||||
else
|
||||
text = inputTextBox.text or ""
|
||||
end
|
||||
else
|
||||
if inputTextBox.text == "" or not inputTextBox.text then
|
||||
text = inputTextBox.placeholderText or ""
|
||||
end
|
||||
end
|
||||
|
||||
if background then
|
||||
buffer.square(inputTextBox.x, inputTextBox.y, inputTextBox.width, inputTextBox.height, background, foreground, " ")
|
||||
end
|
||||
|
||||
local inputField = GUI.inputField(inputTextBox.x + 1, y, inputTextBox.width - 2, foreground, text, inputTextBox.textMask, inputTextBox.highlightLuaSyntax, inputTextBox.autocompleteVariables)
|
||||
if inputTextBox.isFocused then
|
||||
inputField:input()
|
||||
if inputTextBox.validator then
|
||||
if inputTextBox.validator(inputField.text) then
|
||||
inputTextBox.text = inputField.text
|
||||
end
|
||||
else
|
||||
inputTextBox.text = inputField.text
|
||||
end
|
||||
else
|
||||
local oldHighlightLuaSyntaxValue = inputField.highlightLuaSyntax
|
||||
inputField.highlightLuaSyntax = false
|
||||
inputField:draw()
|
||||
inputField.highlightLuaSyntax = oldHighlightLuaSyntaxValue
|
||||
end
|
||||
|
||||
return inputTextBox
|
||||
end
|
||||
|
||||
local function inputTextBoxBeginInput(inputTextBox)
|
||||
inputTextBox.isFocused = true
|
||||
inputTextBox:draw()
|
||||
inputTextBox.isFocused = false
|
||||
|
||||
return inputTextBox
|
||||
end
|
||||
|
||||
local function inputTextBoxEventHandler(mainContainer, object, eventData)
|
||||
if eventData[1] == "touch" then
|
||||
object:input()
|
||||
mainContainer:draw()
|
||||
buffer.draw()
|
||||
callMethod(object.onInputFinished, mainContainer, object, eventData, object.text)
|
||||
end
|
||||
end
|
||||
|
||||
function GUI.inputTextBox(x, y, width, height, inputTextBoxColor, textColor, inputTextBoxFocusedColor, textFocusedColor, text, placeholderText, eraseTextOnFocus, textMask, highlightLuaSyntax, autocompleteVariables)
|
||||
local inputTextBox = GUI.object(x, y, width, height)
|
||||
inputTextBox.colors = {
|
||||
default = {
|
||||
background = inputTextBoxColor,
|
||||
text = textColor
|
||||
},
|
||||
focused = {
|
||||
background = inputTextBoxFocusedColor,
|
||||
text = textFocusedColor
|
||||
}
|
||||
}
|
||||
|
||||
inputTextBox.eventHandler = inputTextBoxEventHandler
|
||||
inputTextBox.text = text
|
||||
inputTextBox.placeholderText = placeholderText
|
||||
inputTextBox.draw = drawInputTextBox
|
||||
inputTextBox.input = inputTextBoxBeginInput
|
||||
inputTextBox.eraseTextOnFocus = eraseTextOnFocus
|
||||
inputTextBox.textMask = textMask
|
||||
|
||||
return inputTextBox
|
||||
end
|
||||
|
||||
----------------------------------------- Text Box object -----------------------------------------
|
||||
|
||||
local function drawTextBox(object)
|
||||
@ -2251,10 +1986,232 @@ function GUI.layout(x, y, width, height, columnCount, rowCount)
|
||||
return layout
|
||||
end
|
||||
|
||||
----------------------------------------- Universal keyboard-input function -----------------------------------------
|
||||
|
||||
local function inputDraw(input)
|
||||
if input.oldPixels then
|
||||
buffer.paste(input.x, input.y, input.oldPixels)
|
||||
else
|
||||
input.oldPixels = buffer.copy(input.x, input.y, input.width, 1)
|
||||
end
|
||||
|
||||
buffer.text(
|
||||
input.x,
|
||||
input.y,
|
||||
input.colors.text,
|
||||
unicode.sub(
|
||||
input.textMask and string.rep(input.textMask, unicode.len(input.text)) or input.text,
|
||||
input.textCutFrom,
|
||||
input.textCutFrom + input.width - 1
|
||||
)
|
||||
)
|
||||
|
||||
if input.cursorBlinkState then
|
||||
buffer.text(input.x + input.cursorPosition - input.textCutFrom, input.y, input.cursorColor, input.cursorSymbol)
|
||||
end
|
||||
|
||||
return input
|
||||
end
|
||||
|
||||
local function inputSetCursorPosition(input, newPosition)
|
||||
if newPosition < 1 then
|
||||
newPosition = 1
|
||||
elseif newPosition > unicode.len(input.text) + 1 then
|
||||
newPosition = unicode.len(input.text) + 1
|
||||
end
|
||||
|
||||
if newPosition > input.textCutFrom + input.width - 1 then
|
||||
input.textCutFrom = input.textCutFrom + newPosition - (input.textCutFrom + input.width - 1)
|
||||
elseif newPosition < input.textCutFrom then
|
||||
input.textCutFrom = newPosition
|
||||
end
|
||||
|
||||
input.cursorPosition = newPosition
|
||||
|
||||
return input
|
||||
end
|
||||
|
||||
local function inputBeginInput(input)
|
||||
input.cursorBlinkState = true; input:draw(); buffer.draw()
|
||||
|
||||
while true do
|
||||
local e = { event.pull(input.cursorBlinkDelay) }
|
||||
if e[1] == "touch" or e[1] == "drag" then
|
||||
if input:isClicked(e[3], e[4]) then
|
||||
input:setCursorPosition(input.textCutFrom + e[3] - input.x)
|
||||
input.cursorBlinkState = true; input:draw(); buffer.draw()
|
||||
else
|
||||
input.cursorBlinkState = false; input:draw(); buffer.draw()
|
||||
return input
|
||||
end
|
||||
elseif e[1] == "key_down" then
|
||||
-- Return
|
||||
if e[4] == 28 then
|
||||
input.cursorBlinkState = false; input:draw(); buffer.draw()
|
||||
return input
|
||||
-- Arrows left/right
|
||||
elseif e[4] == 203 then
|
||||
input:setCursorPosition(input.cursorPosition - 1)
|
||||
elseif e[4] == 205 then
|
||||
input:setCursorPosition(input.cursorPosition + 1)
|
||||
-- Backspace
|
||||
elseif e[4] == 14 then
|
||||
input.text = unicode.sub(unicode.sub(input.text, 1, input.cursorPosition - 1), 1, -2) .. unicode.sub(input.text, input.cursorPosition, -1)
|
||||
input:setCursorPosition(input.cursorPosition - 1)
|
||||
-- Delete
|
||||
elseif e[4] == 211 then
|
||||
input.text = unicode.sub(input.text, 1, input.cursorPosition - 1) .. unicode.sub(input.text, input.cursorPosition + 1, -1)
|
||||
else
|
||||
if not keyboard.isControl(e[3]) then
|
||||
input.text = unicode.sub(input.text, 1, input.cursorPosition - 1) .. unicode.char(e[3]) .. unicode.sub(input.text, input.cursorPosition, -1)
|
||||
input:setCursorPosition(input.cursorPosition + 1)
|
||||
end
|
||||
end
|
||||
|
||||
input.cursorBlinkState = true; input:draw(); buffer.draw()
|
||||
elseif e[1] == "clipboard" then
|
||||
input.text = unicode.sub(input.text, 1, input.cursorPosition - 1) .. e[3] .. unicode.sub(input.text, input.cursorPosition, -1)
|
||||
input:setCursorPosition(input.cursorPosition + unicode.len(e[3]))
|
||||
input.cursorBlinkState = true; input:draw(); buffer.draw()
|
||||
else
|
||||
input.cursorBlinkState = not input.cursorBlinkState; input:draw(); buffer.draw()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function GUI.input(x, y, width, textColor, text, textMask)
|
||||
local input = GUI.object(x, y, width, 1)
|
||||
|
||||
input.textCutFrom = 1
|
||||
input.cursorPosition = 1
|
||||
input.cursorColor = 0x00A8FF
|
||||
input.cursorSymbol = "┃"
|
||||
input.cursorBlinkDelay = 0.4
|
||||
input.cursorBlinkState = false
|
||||
|
||||
input.colors = {text = textColor}
|
||||
input.text = text
|
||||
input.textMask = textMask
|
||||
|
||||
input.setCursorPosition = inputSetCursorPosition
|
||||
input.draw = inputDraw
|
||||
input.startInput = inputBeginInput
|
||||
|
||||
input:setCursorPosition(unicode.len(input.text) + 1)
|
||||
|
||||
return input
|
||||
end
|
||||
|
||||
----------------------------------------- Input Text Box object -----------------------------------------
|
||||
|
||||
local function drawInputTextBox(inputField)
|
||||
local background = inputField.isFocused and inputField.colors.focused.background or inputField.colors.default.background
|
||||
local y = math.floor(inputField.y + inputField.height / 2)
|
||||
|
||||
local text, foreground, textMask = inputField.text or "", inputField.colors.default.text, inputField.textMask
|
||||
if inputField.isFocused then
|
||||
if inputField.eraseTextOnFocus then
|
||||
text = ""
|
||||
else
|
||||
text = inputField.text or ""
|
||||
end
|
||||
|
||||
foreground = inputField.colors.focused.text
|
||||
else
|
||||
if inputField.text == "" or not inputField.text then
|
||||
text, foreground, textMask = inputField.placeholderText or "", inputField.colors.placeholderText, nil
|
||||
end
|
||||
end
|
||||
|
||||
if background then
|
||||
buffer.square(inputField.x, inputField.y, inputField.width, inputField.height, background, foreground, " ")
|
||||
end
|
||||
|
||||
local input = GUI.input(inputField.x + 1, y, inputField.width - 2, foreground, text, textMask)
|
||||
input.onKeyDown = inputField.onKeyDown
|
||||
|
||||
if inputField.isFocused then
|
||||
input:startInput()
|
||||
if inputField.validator then
|
||||
if inputField.validator(input.text) then
|
||||
inputField.text = input.text
|
||||
end
|
||||
else
|
||||
inputField.text = input.text
|
||||
end
|
||||
else
|
||||
input:draw()
|
||||
end
|
||||
|
||||
return inputField
|
||||
end
|
||||
|
||||
local function inputFieldStartInput(inputField)
|
||||
inputField.isFocused = true
|
||||
inputField:draw()
|
||||
inputField.isFocused = false
|
||||
callMethod(inputField.onInputFinished, inputField.text)
|
||||
|
||||
return inputField
|
||||
end
|
||||
|
||||
local function inputFieldEventHandler(mainContainer, object, eventData)
|
||||
if eventData[1] == "touch" then
|
||||
object:startInput()
|
||||
mainContainer:draw()
|
||||
buffer.draw()
|
||||
end
|
||||
end
|
||||
|
||||
function GUI.inputField(x, y, width, height, backgroundColor, textColor, placeholderTextColor, backgroundFocusedColor, textFocusedColor, text, placeholderText, eraseTextOnFocus, textMask)
|
||||
local inputField = GUI.object(x, y, width, height)
|
||||
inputField.colors = {
|
||||
default = {
|
||||
background = backgroundColor,
|
||||
text = textColor
|
||||
},
|
||||
focused = {
|
||||
background = backgroundFocusedColor,
|
||||
text = textFocusedColor
|
||||
},
|
||||
placeholderText = placeholderTextColor
|
||||
}
|
||||
|
||||
inputField.eventHandler = inputFieldEventHandler
|
||||
inputField.text = text
|
||||
inputField.placeholderText = placeholderText
|
||||
inputField.draw = drawInputTextBox
|
||||
inputField.startInput = inputFieldStartInput
|
||||
inputField.eraseTextOnFocus = eraseTextOnFocus
|
||||
inputField.textMask = textMask
|
||||
|
||||
return inputField
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
-- buffer.start()
|
||||
|
||||
-- local mainContainer = GUI.fullScreenContainer()
|
||||
-- mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D))
|
||||
|
||||
-- local inputField = mainContainer:addChild(GUI.inputField(2, 2, 30, 3, 0xEEEEEE, 0x555555, 0x999999, 0xFFFFFF, 0x2D2D2D, "Hello world", "Placeholder text"))
|
||||
|
||||
-- inputField.validator = function(text)
|
||||
-- if tonumber(text) then
|
||||
-- GUI.error("It's a number!")
|
||||
-- end
|
||||
-- return true
|
||||
-- end
|
||||
|
||||
-- inputField.onInputFinished = function()
|
||||
-- -- Do something when input finished
|
||||
-- end
|
||||
|
||||
-- mainContainer:draw()
|
||||
-- buffer.draw(true)
|
||||
-- mainContainer:startEventHandling()
|
||||
|
||||
-- -- Создаем полноэкранный контейнер, добавляем темно-серую панель
|
||||
-- local mainContainer = GUI.fullScreenContainer()
|
||||
-- mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D))
|
||||
@ -2282,7 +2239,7 @@ end
|
||||
-- mainContainer:draw()
|
||||
-- buffer.draw()
|
||||
-- end
|
||||
-- -- В ячейке 3ч1 задаем горизонтальную ориентацию объектов, расстояние между ними в 2 пикселя, а также выравнивание по правому верхнему краю
|
||||
-- -- В ячейке 3x1 задаем горизонтальную ориентацию объектов, расстояние между ними в 2 пикселя, а также выравнивание по правому верхнему краю
|
||||
-- layout:setCellDirection(3, 1, GUI.directions.horizontal)
|
||||
-- layout:setCellSpacing(3, 1, 2)
|
||||
-- layout:setCellAlignment(3, 1, GUI.alignment.horizontal.right, GUI.alignment.vertical.bottom)
|
||||
|
||||
@ -808,7 +808,7 @@ end
|
||||
local function addUniversalContainerWithInputTextBoxes(parentWindow, path, text, title, placeholder)
|
||||
local container = MineOSCore.addUniversalContainer(parentWindow, title)
|
||||
|
||||
container.inputTextBox = container.layout:addChild(GUI.inputTextBox(1, 1, 36, 3, 0xEEEEEE, 0x666666, 0xEEEEEE, 0x262626, text, placeholder, false))
|
||||
container.inputField = container.layout:addChild(GUI.inputField(1, 1, 36, 3, 0xEEEEEE, 0x666666, 0x666666, 0xEEEEEE, 0x262626, text, placeholder, false))
|
||||
container.label = container.layout:addChild(GUI.label(1, 1, 36, 3, 0xFF4940, " ")):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top)
|
||||
container.panel.eventHandler = function(mainContainer, object, eventData)
|
||||
if eventData[1] == "touch" then
|
||||
@ -839,8 +839,8 @@ end
|
||||
function MineOSCore.newApplication(parentWindow, path)
|
||||
local container = addUniversalContainerWithInputTextBoxes(parentWindow, path, nil, MineOSCore.localization.contextMenuNewApplication, MineOSCore.localization.applicationName)
|
||||
|
||||
container.inputTextBox.onInputFinished = function()
|
||||
local finalPath = path .. container.inputTextBox.text .. ".app/"
|
||||
container.inputField.onInputFinished = function()
|
||||
local finalPath = path .. container.inputField.text .. ".app/"
|
||||
if checkFileToExists(container, finalPath) then
|
||||
fs.makeDirectory(finalPath .. "/Resources/")
|
||||
fs.copy(MineOSCore.paths.icons .. "SampleIcon.pic", finalPath .. "/Resources/Icon.pic")
|
||||
@ -856,11 +856,11 @@ end
|
||||
function MineOSCore.newFile(parentWindow, path)
|
||||
local container = addUniversalContainerWithInputTextBoxes(parentWindow, path, nil, MineOSCore.localization.contextMenuNewFile, MineOSCore.localization.fileName)
|
||||
|
||||
container.inputTextBox.onInputFinished = function()
|
||||
if checkFileToExists(container, path .. container.inputTextBox.text) then
|
||||
local file = io.open(path .. container.inputTextBox.text, "w")
|
||||
container.inputField.onInputFinished = function()
|
||||
if checkFileToExists(container, path .. container.inputField.text) then
|
||||
local file = io.open(path .. container.inputField.text, "w")
|
||||
file:close()
|
||||
MineOSCore.safeLaunch(MineOSCore.paths.applications .. "/MineCode IDE.app/Main.lua", "open", path .. container.inputTextBox.text)
|
||||
MineOSCore.safeLaunch(MineOSCore.paths.applications .. "/MineCode IDE.app/Main.lua", "open", path .. container.inputField.text)
|
||||
computer.pushSignal("MineOSCore", "updateFileList")
|
||||
end
|
||||
end
|
||||
@ -869,9 +869,9 @@ end
|
||||
function MineOSCore.newFolder(parentWindow, path)
|
||||
local container = addUniversalContainerWithInputTextBoxes(parentWindow, path, nil, MineOSCore.localization.contextMenuNewFolder, MineOSCore.localization.folderName)
|
||||
|
||||
container.inputTextBox.onInputFinished = function()
|
||||
if checkFileToExists(container, path .. container.inputTextBox.text) then
|
||||
fs.makeDirectory(path .. container.inputTextBox.text)
|
||||
container.inputField.onInputFinished = function()
|
||||
if checkFileToExists(container, path .. container.inputField.text) then
|
||||
fs.makeDirectory(path .. container.inputField.text)
|
||||
computer.pushSignal("MineOSCore", "updateFileList")
|
||||
end
|
||||
end
|
||||
@ -880,9 +880,9 @@ end
|
||||
function MineOSCore.rename(parentWindow, path)
|
||||
local container = addUniversalContainerWithInputTextBoxes(parentWindow, path, fs.name(path), MineOSCore.localization.contextMenuRename, MineOSCore.localization.newName)
|
||||
|
||||
container.inputTextBox.onInputFinished = function()
|
||||
if checkFileToExists(container, fs.path(path) .. container.inputTextBox.text) then
|
||||
fs.rename(path, fs.path(path) .. container.inputTextBox.text)
|
||||
container.inputField.onInputFinished = function()
|
||||
if checkFileToExists(container, fs.path(path) .. container.inputField.text) then
|
||||
fs.rename(path, fs.path(path) .. container.inputField.text)
|
||||
computer.pushSignal("MineOSCore", "updateFileList")
|
||||
end
|
||||
end
|
||||
@ -891,10 +891,10 @@ end
|
||||
function MineOSCore.launchWithArguments(parentWindow, path)
|
||||
local container = addUniversalContainerWithInputTextBoxes(parentWindow, path, nil, MineOSCore.localization.launchWithArguments)
|
||||
|
||||
container.inputTextBox.onInputFinished = function()
|
||||
container.inputField.onInputFinished = function()
|
||||
local args = {}
|
||||
if container.inputTextBox.text then
|
||||
for arg in container.inputTextBox.text:gmatch("[^%s]+") do
|
||||
if container.inputField.text then
|
||||
for arg in container.inputField.text:gmatch("[^%s]+") do
|
||||
table.insert(args, arg)
|
||||
end
|
||||
end
|
||||
|
||||
@ -21,13 +21,13 @@ end
|
||||
--------------------------------------------------------------------------------------------------------------
|
||||
|
||||
local function changeInputsValueToCurrentColor(window)
|
||||
window.inputs[1].inputTextBox.text = tostring(window.color.rgb.red)
|
||||
window.inputs[2].inputTextBox.text = tostring(window.color.rgb.green)
|
||||
window.inputs[3].inputTextBox.text = tostring(window.color.rgb.blue)
|
||||
window.inputs[4].inputTextBox.text = tostring(math.floor(window.color.hsb.hue))
|
||||
window.inputs[5].inputTextBox.text = tostring(math.floor(window.color.hsb.saturation))
|
||||
window.inputs[6].inputTextBox.text = tostring(math.floor(window.color.hsb.brightness))
|
||||
window.inputs[7].inputTextBox.text = string.format("%06X", window.color.hex)
|
||||
window.inputs[1].inputField.text = tostring(window.color.rgb.red)
|
||||
window.inputs[2].inputField.text = tostring(window.color.rgb.green)
|
||||
window.inputs[3].inputField.text = tostring(window.color.rgb.blue)
|
||||
window.inputs[4].inputField.text = tostring(math.floor(window.color.hsb.hue))
|
||||
window.inputs[5].inputField.text = tostring(math.floor(window.color.hsb.saturation))
|
||||
window.inputs[6].inputField.text = tostring(math.floor(window.color.hsb.brightness))
|
||||
window.inputs[7].inputField.text = string.format("%06X", window.color.hex)
|
||||
window.colorPanel.colors.background = window.color.hex
|
||||
end
|
||||
|
||||
@ -143,26 +143,26 @@ function palette.window(x, y, startColor)
|
||||
window.OKButton = window:addChild(GUI.button(58, 6, 12, 1, 0x444444, 0xFFFFFF, 0x88FF88, 0xFFFFFF, "OK"))
|
||||
window.cancelButton = window:addChild(GUI.button(58, 8, 12, 1, 0xFFFFFF, 0x444444, 0x88FF88, 0xFFFFFF, "Cancel"))
|
||||
|
||||
local function onAnyInputFinished(mainContainer, object, eventData)
|
||||
local function onAnyInputFinished()
|
||||
refreshBigRainbow(window)
|
||||
createCrestsCoordinates(window)
|
||||
mainContainer:draw()
|
||||
window:getFirstParent():draw()
|
||||
buffer.draw()
|
||||
end
|
||||
|
||||
local function onHexInputFinished(mainContainer, object, eventData, newText)
|
||||
switchColorFromHex(window, tonumber("0x" .. newText))
|
||||
onAnyInputFinished(mainContainer, object, eventData)
|
||||
local function onHexInputFinished()
|
||||
switchColorFromHex(window, tonumber("0x" .. window.inputs[7].inputField.text))
|
||||
onAnyInputFinished()
|
||||
end
|
||||
|
||||
local function onRgbInputFinished(mainContainer, object, eventData, newText)
|
||||
switchColorFromRgb(window, tonumber(window.inputs[1].inputTextBox.text), tonumber(window.inputs[2].inputTextBox.text), tonumber(window.inputs[3].inputTextBox.text))
|
||||
onAnyInputFinished(mainContainer, object, eventData)
|
||||
local function onRgbInputFinished()
|
||||
switchColorFromRgb(window, tonumber(window.inputs[1].inputField.text), tonumber(window.inputs[2].inputField.text), tonumber(window.inputs[3].inputField.text))
|
||||
onAnyInputFinished()
|
||||
end
|
||||
|
||||
local function onHsbInputFinished(mainContainer, object, eventData, newText)
|
||||
switchColorFromHsb(window, tonumber(window.inputs[4].inputTextBox.text), tonumber(window.inputs[5].inputTextBox.text), tonumber(window.inputs[6].inputTextBox.text))
|
||||
onAnyInputFinished(mainContainer, object, eventData)
|
||||
local function onHsbInputFinished()
|
||||
switchColorFromHsb(window, tonumber(window.inputs[4].inputField.text), tonumber(window.inputs[5].inputField.text), tonumber(window.inputs[6].inputField.text))
|
||||
onAnyInputFinished()
|
||||
end
|
||||
|
||||
local function rgbValidaror(text)
|
||||
@ -197,9 +197,9 @@ function palette.window(x, y, startColor)
|
||||
for i = 1, #window.inputs do
|
||||
window:addChild(GUI.label(58, y, 2, 1, 0x000000, window.inputs[i].shortcut))
|
||||
|
||||
window.inputs[i].inputTextBox = window:addChild(GUI.inputTextBox(61, y, 9, 1, 0xFFFFFF, 0x444444, 0xFFFFFF, 0x000000, "", "", true))
|
||||
window.inputs[i].inputTextBox.validator = window.inputs[i].validator
|
||||
window.inputs[i].inputTextBox.onInputFinished = window.inputs[i].onInputFinished
|
||||
window.inputs[i].inputField = window:addChild(GUI.inputField(61, y, 9, 1, 0xFFFFFF, 0x444444, 0x444444, 0xFFFFFF, 0x000000, "", "", true))
|
||||
window.inputs[i].inputField.validator = window.inputs[i].validator
|
||||
window.inputs[i].inputField.onInputFinished = window.inputs[i].onInputFinished
|
||||
|
||||
y = y + 2
|
||||
end
|
||||
|
||||
Loading…
Reference in New Issue
Block a user