From 030605c2f006dd21f0ac7784e366f1e0fa37de8b Mon Sep 17 00:00:00 2001 From: Igor Timofeev Date: Sun, 4 Jun 2017 11:39:42 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D1=80=D1=8B=20=D0=BE=D0=B1=D0=BE=D0=B5=D0=B2,=20=D1=83=D0=BB?= =?UTF-8?q?=D1=83=D1=87=D1=88=D0=B5=D0=BD=D0=BD=D0=BE=D0=B5=20=D1=82=D0=B5?= =?UTF-8?q?=D0=BA=D1=81=D1=82=D0=BE=D0=B2=D0=BE=D0=B5=20=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Applications.cfg | 26 +- Applications/AppMarket/AppMarket.lua | 2 +- Applications/GeoScan2/GeoScan2.lua | 4 +- Applications/MineCodeIDE/MineCodeIDE.lua | 50 +-- Applications/PrintImage/PrintImage.lua | 8 +- Applications/RayWalk/RayWalk.lua | 10 +- Applications/Stargate/Stargate.lua | 32 +- Applications/VK/VK.lua | 6 +- Documentation/GUI.md | 43 +- MineOS/Localization/English.lang | 5 + MineOS/Localization/Russian.lang | 5 + MineOS/OS.lua | 132 +++--- lib/GUI.lua | 489 +++++++++++------------ lib/MineOSCore.lua | 32 +- lib/palette.lua | 42 +- 15 files changed, 446 insertions(+), 440 deletions(-) diff --git a/Applications.cfg b/Applications.cfg index c87a9671..abad733f 100644 --- a/Applications.cfg +++ b/Applications.cfg @@ -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", diff --git a/Applications/AppMarket/AppMarket.lua b/Applications/AppMarket/AppMarket.lua index 12b558c6..3035ed65 100755 --- a/Applications/AppMarket/AppMarket.lua +++ b/Applications/AppMarket/AppMarket.lua @@ -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) diff --git a/Applications/GeoScan2/GeoScan2.lua b/Applications/GeoScan2/GeoScan2.lua index 3b41c4a7..804063f4 100644 --- a/Applications/GeoScan2/GeoScan2.lua +++ b/Applications/GeoScan2/GeoScan2.lua @@ -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) diff --git a/Applications/MineCodeIDE/MineCodeIDE.lua b/Applications/MineCodeIDE/MineCodeIDE.lua index 6411e239..e23953f4 100755 --- a/Applications/MineCodeIDE/MineCodeIDE.lua +++ b/Applications/MineCodeIDE/MineCodeIDE.lua @@ -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)) diff --git a/Applications/PrintImage/PrintImage.lua b/Applications/PrintImage/PrintImage.lua index 8f8b1b33..0fc1ba05 100755 --- a/Applications/PrintImage/PrintImage.lua +++ b/Applications/PrintImage/PrintImage.lua @@ -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() diff --git a/Applications/RayWalk/RayWalk.lua b/Applications/RayWalk/RayWalk.lua index d7112306..a577d520 100755 --- a/Applications/RayWalk/RayWalk.lua +++ b/Applications/RayWalk/RayWalk.lua @@ -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 diff --git a/Applications/Stargate/Stargate.lua b/Applications/Stargate/Stargate.lua index e76e6f45..cb91bc64 100755 --- a/Applications/Stargate/Stargate.lua +++ b/Applications/Stargate/Stargate.lua @@ -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 diff --git a/Applications/VK/VK.lua b/Applications/VK/VK.lua index 6afbf362..3a02372e 100755 --- a/Applications/VK/VK.lua +++ b/Applications/VK/VK.lua @@ -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 diff --git a/Documentation/GUI.md b/Documentation/GUI.md index 45c9c120..05edab8d 100644 --- a/Documentation/GUI.md +++ b/Documentation/GUI.md @@ -403,7 +403,7 @@ mainContainer:startEventHandling() ![Imgur](http://i.imgur.com/4Hl5G7l.png?1) -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() Результат: -![Imgur](http://i.imgur.com/CNYHJKF.png?1) +![Imgur](http://i.imgur.com/8cUO1vy.png) -![Imgur](http://i.imgur.com/AdOIiXQ.png?1) +![Imgur](http://i.imgur.com/4jHPQfl.png) + +![Imgur](http://i.imgur.com/PV0RQOq.png) 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) diff --git a/MineOS/Localization/English.lang b/MineOS/Localization/English.lang index 1b7b27e0..be62902d 100644 --- a/MineOS/Localization/English.lang +++ b/MineOS/Localization/English.lang @@ -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", diff --git a/MineOS/Localization/Russian.lang b/MineOS/Localization/Russian.lang index d32f000e..debb6a9a 100644 --- a/MineOS/Localization/Russian.lang +++ b/MineOS/Localization/Russian.lang @@ -87,7 +87,12 @@ mineOSCreatorUsedMasterPassword = "Создатель операционной системы использовал мастер-ключ", loginToSystem = "Вход в систему", + appearance = "Внешний вид", + wallpaperProperties = "Параметры обоев", colorScheme = "Цветовая схема", + wallpaperPath = "Путь к обоям", + wallpaperModeStretch = "Растянуть", + wallpaperModeCenter = "По центру", backgroundColor = "Цвет фона", interfaceColor = "Цвет интерфейса", screenResolution = "Разрешение экрана", diff --git a/MineOS/OS.lua b/MineOS/OS.lua index 733a722e..9caad2cd 100755 --- a/MineOS/OS.lua +++ b/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 - - - - - - diff --git a/lib/GUI.lua b/lib/GUI.lua index 275d62eb..09b35820 100755 --- a/lib/GUI.lua +++ b/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) diff --git a/lib/MineOSCore.lua b/lib/MineOSCore.lua index 875b929b..23faaf39 100755 --- a/lib/MineOSCore.lua +++ b/lib/MineOSCore.lua @@ -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 diff --git a/lib/palette.lua b/lib/palette.lua index af6c16cd..82ee7fcd 100755 --- a/lib/palette.lua +++ b/lib/palette.lua @@ -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