From 9e7a02755e5de73e7012e52a27f81fdd89ec8c67 Mon Sep 17 00:00:00 2001 From: igor Date: Wed, 3 Jan 2018 15:36:38 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=BD=D0=B3=20=D0=B1=D0=B8=D0=B1=D0=BB=D0=B8=D0=BE?= =?UTF-8?q?=D1=82=D0=B5=D0=BA=D0=B8=20=D0=BF=D0=B0=D0=BB=D0=B8=D1=82=D1=80?= =?UTF-8?q?=D1=8B=20(=D1=81=D0=BD=D0=B5=D1=81=20=D0=B5=D0=B5=20=D0=BD?= =?UTF-8?q?=D0=B0=20=D1=85=D1=83=D0=B9),=20=D1=84=D0=B8=D0=BA=D1=81=D1=8B?= =?UTF-8?q?=20GUI.error=20=D0=B8=20=D0=BF=D1=80=D0=BE=D1=87=D0=B5=D0=B9=20?= =?UTF-8?q?=D1=85=D1=83=D0=B9=D0=BD=D0=B8,=20=D1=81=D0=B2=D1=8F=D0=B7?= =?UTF-8?q?=D0=B0=D0=BD=D0=BD=D0=BE=D0=B9=20=D1=81=20=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=BC=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD=D1=8B=D0=BC?= =?UTF-8?q?=D0=B8=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Applications.cfg | 36 +-- Applications/3DPrint/3DPrint.lua | 5 +- Applications/3DTest/3DTest.lua | 4 +- Applications/GeoScan2/Main.lua | 5 +- Applications/MineCodeIDE/Main.lua | 3 +- Applications/MultiScreen/MultiScreen.lua | 2 +- Applications/Palette/Palette.lua | 2 +- Applications/Photoshop/Photoshop.lua | 5 +- Applications/Shooting/Shooting.lua | 2 +- Applications/Spinner/Main.lua | 4 +- Documentation/GUI.md | 7 +- lib/ECSAPI.lua | 2 +- lib/GUI.lua | 331 ++++++++++++++++++++--- lib/OpenComputersGL/Materials.lua | 4 +- lib/color.lua | 13 +- lib/palette.lua | 284 +------------------ 16 files changed, 338 insertions(+), 371 deletions(-) diff --git a/Applications.cfg b/Applications.cfg index 15e20a57..593b75e5 100644 --- a/Applications.cfg +++ b/Applications.cfg @@ -272,14 +272,14 @@ path="/lib/ECSAPI.lua", url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/ECSAPI.lua", type="Library", - version=1.15, + version=1.16, }, { path="/lib/color.lua", url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/color.lua", type="Library", preloadFile=true, - version=1.12, + version=1.13, }, { path="/lib/FormatModules/OCIF.lua", @@ -319,7 +319,7 @@ url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/GUI.lua", type="Library", preloadFile=true, - version=2.06, + version=2.07, }, { path="/lib/rayEngine.lua", @@ -351,12 +351,6 @@ type="Library", version=1.18, }, - { - path="/lib/palette.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/palette.lua", - type="Library", - version=1.23, - }, { path="/lib/doubleBuffering.lua", url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/doubleBuffering.lua", @@ -386,25 +380,25 @@ path="/lib/OpenComputersGL/Main.lua", url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/OpenComputersGL/Main.lua", type="Library", - version=1.11, + version=1.12, }, { path="/lib/OpenComputersGL/Materials.lua", url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/OpenComputersGL/Materials.lua", type="Library", - version=1.11, + version=1.12, }, { path="/lib/OpenComputersGL/Renderer.lua", url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/OpenComputersGL/Renderer.lua", type="Library", - version=1.11, + version=1.12, }, { path="/lib/MeowEngine/Main.lua", url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/MeowEngine/Main.lua", type="Library", - version=1.11, + version=1.12, }, ----------------------------------------------------- Скрипты и дополнения к ним -------------------------------------------------------------------------- @@ -474,7 +468,7 @@ type="Application", icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/MineCodeIDE/Icon.pic", forceDownload=true, - version=1.86, + version=1.87, resources={ { path="/Localization/Russian.lang", @@ -503,7 +497,7 @@ icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/3DTest/Icon.pic", createShortcut=true, forceDownload=true, - version=1.23, + version=1.24, }, { path="/MineOS/Applications/HEX", @@ -521,7 +515,7 @@ type="Application", icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Spinner/Icon.pic", createShortcut=true, - version=1.01, + version=1.02, resources={ { path="/1.pic", @@ -587,7 +581,7 @@ type="Application", icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/GeoScan2/Icon.pic", createShortcut=true, - version=1.11, + version=1.12, resources={ { path="/Earth.pic", @@ -650,7 +644,7 @@ type="Application", icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/3DPrint/Icon.pic", createShortcut=true, - version=1.14, + version=1.15, }, { path="/MineOS/Applications/FlappyBird", @@ -805,7 +799,7 @@ type="Application", icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Palette/Icon.pic", createShortcut=true, - version=1.06, + version=1.07, }, { path="/MineOS/Applications/Stargate", @@ -944,7 +938,7 @@ type="Application", icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Photoshop/Icon.pic", forceDownload=true, - version=1.10, + version=1.11, resources={ { path="/Localization/Russian.lang", @@ -962,7 +956,7 @@ type="Application", icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Shooting/Icon.pic", createShortcut=true, - version=1.02, + version=1.03, }, { path="/MineOS/Applications/HoloClock", diff --git a/Applications/3DPrint/3DPrint.lua b/Applications/3DPrint/3DPrint.lua index 127d3cb7..b864b0b1 100755 --- a/Applications/3DPrint/3DPrint.lua +++ b/Applications/3DPrint/3DPrint.lua @@ -10,7 +10,6 @@ local buffer = require("doubleBuffering") local context = require("context") local bigLetters = require("bigLetters") local ecs = require("ECSAPI") -local palette = require("palette") local printer local gpu = component.gpu @@ -82,7 +81,7 @@ local shapeColors = {} local HUE = 0 local HUEAdder = math.floor(360 / maxShapeCount) for i = 1, maxShapeCount do - shapeColors[i] = color.HSBToHEX(HUE, 100, 100) + shapeColors[i] = color.HSBToHEX(HUE, 1, 1) HUE = HUE + HUEAdder end HUE, HUEAdder = nil, nil @@ -375,7 +374,7 @@ local function drawDrawingZone() if currentLayer >= selectionStartPoint.z and currentLayer <= selectionEndPoint.z then if shape ~= currentShape then local h, s, b = color.HEXToHSB(shapeColors[shape]) - s = 30 + s = 0.3 -- ecs.error("РИСУЮ") drawPixel(selectionStartPoint.x, 18 - selectionStartPoint.y - yDifference, selectionEndPoint.x - selectionStartPoint.x + 1, yDifference, color.HSBToHEX(h, s, b)) -- drawPixel(selectionStartPoint.x, selectionStartPoint.z, selectionEndPoint.x - selectionStartPoint.x + 1, selectionEndPoint.z - selectionStartPoint.z + 1, shapeColors[shape], trasparency) diff --git a/Applications/3DTest/3DTest.lua b/Applications/3DTest/3DTest.lua index 08e6ff6b..cf2a9bd1 100755 --- a/Applications/3DTest/3DTest.lua +++ b/Applications/3DTest/3DTest.lua @@ -141,7 +141,7 @@ local hue, hueStep = 0, 360 / 9 for z = -1, 1 do for x = -1, 1 do if not (x == 0 and z == 0) then - setBlock(x, 0, z, color.HSBToHEX(hue, 100, 100)) + setBlock(x, 0, z, color.HSBToHEX(hue, 1, 1)) hue = hue + hueStep end end @@ -232,7 +232,7 @@ end -- elseif mesh.triangles[triangleIndex].brightness < minimumBrightness then -- mesh.triangles[triangleIndex].brightness = minimumBrightness -- end --- mesh.triangles[triangleIndex][4] = materials.newSolidMaterial(color.HSBToHEX(mesh.hue, 100, mesh.triangles[triangleIndex].brightness)) +-- mesh.triangles[triangleIndex][4] = materials.newSolidMaterial(color.HSBToHEX(mesh.hue, 1, mesh.triangles[triangleIndex].brightness)) -- end -- end diff --git a/Applications/GeoScan2/Main.lua b/Applications/GeoScan2/Main.lua index 4d576403..40e85e5e 100755 --- a/Applications/GeoScan2/Main.lua +++ b/Applications/GeoScan2/Main.lua @@ -152,9 +152,10 @@ mainContainer.projectorYOffsetSlider.roundValues = true objectY = objectY + 3 local function setButtonColorFromPalette(button) - local selectedColor = require("palette").show("auto", "auto", button.colors.default.background) + local selectedColor = GUI.palette(math.floor(mainContainer.width / 2 - 35), math.floor(mainContainer.height / 2 - 12), button.colors.default.background):show() if selectedColor then button.colors.default.background = selectedColor end - mainContainer:draw(); buffer.draw() + mainContainer:draw() + buffer.draw() end local function updateProjectorColors() diff --git a/Applications/MineCodeIDE/Main.lua b/Applications/MineCodeIDE/Main.lua index 30d68708..f8b0563b 100755 --- a/Applications/MineCodeIDE/Main.lua +++ b/Applications/MineCodeIDE/Main.lua @@ -20,7 +20,6 @@ local unicode = require("unicode") local web = require("web") local image = require("image") local keyboard = require("keyboard") -local palette = require("palette") local GUI = require("GUI") local MineOSPaths = require("MineOSPaths") local MineOSCore = require("MineOSCore") @@ -993,7 +992,7 @@ local function selectAndPasteColor() startColor = tonumber(unicode.sub(mainContainer.codeView.lines[mainContainer.codeView.selections[1].from.line], mainContainer.codeView.selections[1].from.symbol, mainContainer.codeView.selections[1].to.symbol)) or startColor end - local selectedColor = require("palette").show("auto", "auto", startColor) + local selectedColor = GUI.palette(math.floor(mainContainer.width / 2 - 35), math.floor(mainContainer.height / 2 - 12), startColor):show() if selectedColor then paste({string.format("0x%06X", selectedColor)}) end diff --git a/Applications/MultiScreen/MultiScreen.lua b/Applications/MultiScreen/MultiScreen.lua index 1410ea8a..40fe254f 100644 --- a/Applications/MultiScreen/MultiScreen.lua +++ b/Applications/MultiScreen/MultiScreen.lua @@ -169,7 +169,7 @@ local function configurator() gpu.setResolution(baseResolution.width, baseResolution.height) gpu.setDepth(8) - local color = color.HSBToHEX(counter / monitorCount * 360, 100, 100) + local color = color.HSBToHEX(counter / monitorCount * 360, 1, 1) gpu.setBackground(color) gpu.setForeground(0xffffff - color) gpu.fill(1, 1, baseResolution.width, baseResolution.height, " ") diff --git a/Applications/Palette/Palette.lua b/Applications/Palette/Palette.lua index 4a3923f1..22ef415b 100755 --- a/Applications/Palette/Palette.lua +++ b/Applications/Palette/Palette.lua @@ -3,7 +3,7 @@ local MineOSInterface = require("MineOSInterface") local mainContainer, window = MineOSInterface.addWindow( MineOSInterface.windowFromContainer( - require("palette").container(1, 1, 0x9900FF) + require("GUI").palette(1, 1, 0x9900FF) ) ) diff --git a/Applications/Photoshop/Photoshop.lua b/Applications/Photoshop/Photoshop.lua index be1a46e0..3bf3eb94 100755 --- a/Applications/Photoshop/Photoshop.lua +++ b/Applications/Photoshop/Photoshop.lua @@ -15,7 +15,6 @@ local component = require("component") local keyboard = require("keyboard") local buffer = require("doubleBuffering") local color = require("color") -local palette = require("palette") local event = require("event") ------------------------------------------------ Переменные -------------------------------------------------------------- @@ -1007,10 +1006,10 @@ while true do for key in pairs(obj["Colors"]) do if ecs.clickedAtArea(e[3], e[4], obj["Colors"][key][1], obj["Colors"][key][2], obj["Colors"][key][3], obj["Colors"][key][4]) then if key == 1 then - currentBackground = palette.show(math.floor(buffer.getWidth() / 2 - 35), math.floor(buffer.getHeight() / 2 - 12), currentBackground) or currentBackground + currentBackground = GUI.palette(math.floor(buffer.getWidth() / 2 - 35), math.floor(buffer.getHeight() / 2 - 12), currentBackground):show() or currentBackground drawAll() elseif key == 2 or key == 3 then - currentForeground = palette.show(math.floor(buffer.getWidth() / 2 - 35), math.floor(buffer.getHeight() / 2 - 12), currentForeground) or currentForeground + currentForeground = GUI.palette(math.floor(buffer.getWidth() / 2 - 35), math.floor(buffer.getHeight() / 2 - 12), currentForeground):show() or currentForeground drawAll() elseif key == 4 then buffer.text(obj["Colors"][key][1], obj["Colors"][key][2], 0xFF0000, "←→") diff --git a/Applications/Shooting/Shooting.lua b/Applications/Shooting/Shooting.lua index aed93f4e..6a6fd18d 100644 --- a/Applications/Shooting/Shooting.lua +++ b/Applications/Shooting/Shooting.lua @@ -147,7 +147,7 @@ end local function AddPlayer(name) if not players[name] then - players[name] = {0, color.HSBToHEX(math.random(0, 359), 100, math.random(50, 100))} + players[name] = {0, color.HSBToHEX(math.random(0, 359), 1, math.random(50, 100) / 100)} end end diff --git a/Applications/Spinner/Main.lua b/Applications/Spinner/Main.lua index 9fae7bab..aa873380 100644 --- a/Applications/Spinner/Main.lua +++ b/Applications/Spinner/Main.lua @@ -53,7 +53,7 @@ mainContainer.eventHandler = function(mainContainer, object, eventData) elseif spinnerHue < 0 then spinnerHue = 360 end - changeColor(spinnerHue, 100) + changeColor(spinnerHue, 1) end currentSpinner = currentSpinner + 1 @@ -76,7 +76,7 @@ spinnerImage.height = image.getHeight(spinners[currentSpinner]) spinnerImage.localX = math.floor(mainContainer.width / 2 - spinnerImage.width / 2) spinnerImage.localY = math.floor(mainContainer.height / 2 - spinnerImage.height/ 2) -changeColor(spinnerHue, 100) +changeColor(spinnerHue, 1) buffer.flush() mainContainer:draw() buffer.draw(true) diff --git a/Documentation/GUI.md b/Documentation/GUI.md index 561e0e01..abd5fbe6 100644 --- a/Documentation/GUI.md +++ b/Documentation/GUI.md @@ -59,14 +59,13 @@ GUI - многофункциональная графическая библио | Библиотека | Функционал | | ------ | ------ | +| *[GUI](https://github.com/IgorTimofeev/OpenComputers/blob/master/lib/GUI.lua)* | Данная библиотека | | *[advancedLua](https://github.com/IgorTimofeev/OpenComputers/blob/master/lib/advancedLua.lua)* | Дополнение стандартных библиотек Lua множеством функций: быстрой сериализацией таблиц, переносом строк, методами обработки бинарных данных и т.д. | | *[color](https://github.com/IgorTimofeev/OpenComputers/blob/master/lib/color.lua)* | Экструзия цветовых каналов, альфа-блендинг, поддержка различных палитр и конвертации цвета в 8-битный формат | | *[doubleBuffering](https://github.com/IgorTimofeev/OpenComputers/blob/master/lib/doubleBuffering.lua)* | Двойная буферизация графического контекста и различные методы растеризации примитивов | | *[image](https://github.com/IgorTimofeev/OpenComputers/blob/master/lib/image.lua)* | Реализация стандарта изображений для OpenComputers и базовые методы их обработки: транспонирование, обрезка, поворот, отражение и т.д. | | *[OCIF](https://github.com/IgorTimofeev/OpenComputers/blob/master/lib/FormatModules/OCIF.lua)* | Модуль формата изображения OCIF (OpenComputers Image Format) для библиотеки image, написанный с учетом особенностей мода и реализующий эффективное сжатие пиксельных данных | | *[syntax](https://github.com/IgorTimofeev/OpenComputers/blob/master/lib/syntax.lua)* | Подсветка lua-синтаксиса для виджета CodeView | -| *[palette](https://github.com/IgorTimofeev/OpenComputers/blob/master/lib/palette.lua)* | Окно для работы с цветом в режиме HSV и выборе конкретных цветовых данных для виджета ColorSelector | -| *[GUI](https://github.com/IgorTimofeev/OpenComputers/blob/master/lib/GUI.lua)* | Данная библиотека | Вы можете использовать имеющиеся выше ссылки для установки зависимостей вручную или запустить автоматический [установщик](https://pastebin.com/ryhyXUKZ), загружающий все необходимые файлы за вас: @@ -554,7 +553,7 @@ GUI.**button**( x, y, width, height, buttonColor, textColor, buttonPressedColor, | *int* | textPressedColor | Цвет текста при нажатии | | *string* | text | Текст на кнопке | -Создать объект типа "кнопка". Каждая кнопка имеет два состояния (*pressed = true/false*), автоматически переключаемые при нажатии. Для назначения какого-либо действия кнопке после ее нажатия создайте для нее метод *.onTouch()*. +Привычный всем объект кнопки имеет два состояния (*pressed = true/false*), автоматически переключаемые при нажатии. Для назначения какого-либо действия кнопке после нажатия создайте для нее метод *.onTouch()*. Существует два дополнительных варианта кнопки, имеющие визуально разные стили: @@ -1962,7 +1961,7 @@ local animationDurationStep = (animationDurationMax - animationDurationMin) / co -- Добавляем в главный контейнер указанное число свитчей for i = 1, count do - local switchColor = color.HSBToHEX(hue, 100, 100) + local switchColor = color.HSBToHEX(hue, 1, 1) local switch = mainContainer:addChild( newSwitch( x, diff --git a/lib/ECSAPI.lua b/lib/ECSAPI.lua index b30b376f..42d00b0a 100755 --- a/lib/ECSAPI.lua +++ b/lib/ECSAPI.lua @@ -2038,7 +2038,7 @@ function ecs.universalWindow(x, y, width, background, closeWindowAfter, ...) local screenWidth, screenHeight = component.gpu.getResolution() local paletteX, paletteY = math.floor(screenWidth / 2 - paletteWidth / 2), math.floor(screenHeight / 2 - paletteHeight / 2) local oldPixels = ecs.rememberOldPixels(paletteX, paletteY, paletteX + paletteWidth - 1, paletteY + paletteHeight - 1) - local color = require("palette").show(paletteX, paletteY, objects[key][3]) + local color = require("GUI").palette(paletteX, paletteY, objects[key][3]):show() ecs.drawOldPixels(oldPixels) objects[key][3] = color or oldColor diff --git a/lib/GUI.lua b/lib/GUI.lua index 45eb9934..c41e095b 100755 --- a/lib/GUI.lua +++ b/lib/GUI.lua @@ -1,5 +1,6 @@ require("advancedLua") +local component = require("component") local computer = require("computer") local keyboard = require("keyboard") local fs = require("filesystem") @@ -72,6 +73,8 @@ GUI.colors = { }, } +GUI.paletteConfigPath = "/lib/.palette.cfg" + ----------------------------------------- Interface objects ----------------------------------------- local function callMethod(method, ...) @@ -499,43 +502,45 @@ local function buttonPlayAnimation(button, onFinish) ):start(button.animationDuration) end -local function buttonEventHandler(mainContainer, button, eventData) - if eventData[1] == "touch" then - if button.animated then - buttonPlayAnimation(button, function(mainContainer, animation) - if button.onTouch then - button.onTouch(mainContainer, button, eventData) - end - - animation:delete() - - if not button.switchMode then - buttonPlayAnimation(button, function(mainContainer, animation) - animation:delete() - end) - end - end) - else - button.pressed = not button.pressed - - if button.switchMode then - mainContainer:draw() - buffer.draw() - else - mainContainer:draw() - buffer.draw() - button.pressed = not button.pressed - - os.sleep(0.2) - - mainContainer:draw() - buffer.draw() - end - +local function buttonPress(button, mainContainer) + if button.animated then + buttonPlayAnimation(button, function(mainContainer, animation) if button.onTouch then button.onTouch(mainContainer, button, eventData) end + + animation:delete() + + if not button.switchMode then + buttonPlayAnimation(button, function(mainContainer, animation) + animation:delete() + end) + end + end) + else + button.pressed = not button.pressed + + mainContainer:draw() + buffer.draw() + + if not button.switchMode then + button.pressed = not button.pressed + + os.sleep(0.2) + + mainContainer:draw() + buffer.draw() end + + if button.onTouch then + button.onTouch(mainContainer, button, eventData) + end + end +end + +local function buttonEventHandler(mainContainer, button, eventData) + if eventData[1] == "touch" then + button:press() end end @@ -626,6 +631,7 @@ local function buttonCreate(x, y, width, height, backgroundColor, textColor, bac button.animated = true button.pressed = false + button.press = buttonPress button.eventHandler = buttonEventHandler return button @@ -885,8 +891,7 @@ function GUI.error(...) mainContainer.eventHandler = function(mainContainer, object, eventData) if eventData[1] == "key_down" and eventData[4] == 28 then - button:pressAndRelease() - button.onTouch() + button:press(mainContainer) end end @@ -1059,7 +1064,7 @@ local function colorSelectorEventHandler(mainContainer, object, eventData) mainContainer:draw() buffer.draw() - object.color = require("palette").show(math.floor(mainContainer.width / 2 - 35), math.floor(mainContainer.height / 2 - 12), object.color) or object.color + object.color = GUI.palette(math.floor(mainContainer.width / 2 - 35), math.floor(mainContainer.height / 2 - 12), object.color or object.color):show() object.pressed = false mainContainer:draw() @@ -3525,6 +3530,260 @@ function GUI.tabBar(x, y, width, height, horizontalTabOffset, spaceBetweenTabs, return tabBar end +-------------------------------------------------------------------------------------------------------------- + +local function paletteShow(palette) + local mainContainer = GUI.fullScreenContainer() + mainContainer:addChild(palette) + + palette.OKButton.onTouch = function(mainContainer, object, eventData) + mainContainer:stopEventHandling() + end + + palette.cancelButton.onTouch = function(mainContainer, object, eventData) + mainContainer:stopEventHandling() + end + + mainContainer:draw() + buffer.draw() + mainContainer:startEventHandling() + + return palette.color.hex +end + +function GUI.palette(x, y, startColor) + local palette = GUI.container(x, y, 71, 25) + + palette.color = {hsb = {}, rgb = {}} + palette:addChild(GUI.panel(1, 1, palette.width, palette.height, 0xEEEEEE)) + + local bigImage = palette:addChild(GUI.image(1, 1, image.create(50, 25))) + local bigCrest = palette:addChild(GUI.object(1, 1, 5, 3)) + + local function paletteDrawBigCrestPixel(x, y, symbol) + local background, foreground = buffer.get(x, y) + local r, g, b = color.HEXToRGB(background) + buffer.set(x, y, background, (r + g + b) / 3 >= 127 and 0x0 or 0xFFFFFF, symbol) + end + + bigCrest.draw = function(object) + paletteDrawBigCrestPixel(object.x, object.y + 1, "─") + paletteDrawBigCrestPixel(object.x + 1, object.y + 1, "─") + paletteDrawBigCrestPixel(object.x + 3, object.y + 1, "─") + paletteDrawBigCrestPixel(object.x + 4, object.y + 1, "─") + paletteDrawBigCrestPixel(object.x + 2, object.y, "│") + paletteDrawBigCrestPixel(object.x + 2, object.y + 2, "│") + end + + local miniImage = palette:addChild(GUI.image(53, 1, image.create(3, 25))) + + local miniCrest = palette:addChild(GUI.object(52, 1, 5, 1)) + miniCrest.draw = function(object) + buffer.text(object.x, object.y, 0x0, ">") + buffer.text(object.x + 4, object.y, 0x0, "<") + end + + local colorPanel = palette:addChild(GUI.panel(58, 2, 12, 3, 0x0)) + palette.OKButton = palette:addChild(GUI.roundedButton(58, 6, 12, 1, 0x444444, 0xFFFFFF, 0x2D2D2D, 0xFFFFFF, "OK")) + palette.cancelButton = palette:addChild(GUI.roundedButton(58, 8, 12, 1, 0xFFFFFF, 0x666666, 0x2D2D2D, 0xFFFFFF, "Cancel")) + + local function paletteRefreshBigImage() + local saturationStep, brightnessStep, saturation, brightness = 1 / bigImage.width, 1 / bigImage.height, 0, 1 + for j = 1, bigImage.height do + for i = 1, bigImage.width do + image.set(bigImage.image, i, j, color.optimize(color.HSBToHEX(palette.color.hsb.hue, saturation, brightness)), 0x0, 0x0, " ") + saturation = saturation + saturationStep + end + saturation, brightness = 0, brightness - brightnessStep + end + end + + local function paletteRefreshMiniImage() + local hueStep, hue = 360 / miniImage.height, 0 + for j = 1, miniImage.height do + for i = 1, miniImage.width do + image.set(miniImage.image, i, j, color.optimize(color.HSBToHEX(hue, 1, 1)), 0x0, 0, " ") + end + hue = hue + hueStep + end + end + + local function paletteUpdateCrestsCoordinates() + bigCrest.localX = math.floor((bigImage.width - 1) * palette.color.hsb.saturation) - 1 + bigCrest.localY = math.floor((bigImage.height - 1) - (bigImage.height - 1) * palette.color.hsb.brightness) + miniCrest.localY = math.floor(palette.color.hsb.hue / 360 * miniImage.height) + end + + local inputs + + local function paletteUpdateInputs() + inputs[1].text = tostring(palette.color.rgb.red) + inputs[2].text = tostring(palette.color.rgb.green) + inputs[3].text = tostring(palette.color.rgb.blue) + inputs[4].text = tostring(math.floor(palette.color.hsb.hue)) + inputs[5].text = tostring(math.floor(palette.color.hsb.saturation * 100)) + inputs[6].text = tostring(math.floor(palette.color.hsb.brightness * 100)) + inputs[7].text = string.format("%06X", palette.color.hex) + colorPanel.colors.background = palette.color.hex + end + + local function paletteSwitchColorFromHex(hex) + palette.color.hex = hex + palette.color.rgb.red, palette.color.rgb.green, palette.color.rgb.blue = color.HEXToRGB(hex) + palette.color.hsb.hue, palette.color.hsb.saturation, palette.color.hsb.brightness = color.RGBToHSB(palette.color.rgb.red, palette.color.rgb.green, palette.color.rgb.blue) + paletteUpdateInputs() + end + + local function paletteSwitchColorFromHsb(hue, saturation, brightness) + palette.color.hsb.hue, palette.color.hsb.saturation, palette.color.hsb.brightness = hue, saturation, brightness + palette.color.rgb.red, palette.color.rgb.green, palette.color.rgb.blue = color.HSBToRGB(hue, saturation, brightness) + palette.color.hex = color.RGBToHEX(palette.color.rgb.red, palette.color.rgb.green, palette.color.rgb.blue) + paletteUpdateInputs() + end + + local function paletteSwitchColorFromRgb(red, green, blue) + palette.color.rgb.red, palette.color.rgb.green, palette.color.rgb.blue = red, green, blue + palette.color.hsb.hue, palette.color.hsb.saturation, palette.color.hsb.brightness = color.RGBToHSB(red, green, blue) + palette.color.hex = color.RGBToHEX(red, green, blue) + paletteUpdateInputs() + end + + local function onAnyInputFinished() + paletteRefreshBigImage() + paletteUpdateCrestsCoordinates() + palette:getFirstParent():draw() + buffer.draw() + end + + local function onHexInputFinished() + paletteSwitchColorFromHex(tonumber("0x" .. inputs[7].text)) + onAnyInputFinished() + end + + local function onRgbInputFinished() + paletteSwitchColorFromRgb(tonumber(inputs[1].text), tonumber(inputs[2].text), tonumber(inputs[3].text)) + onAnyInputFinished() + end + + local function onHsbInputFinished() + paletteSwitchColorFromHsb(tonumber(inputs[4].text), tonumber(inputs[5].text) / 100, tonumber(inputs[6].text) / 100) + onAnyInputFinished() + end + + local function rgbValidaror(text) + local number = tonumber(text) if number and number >= 0 and number <= 255 then return true end + end + + local function hValidator(text) + local number = tonumber(text) if number and number >= 0 and number <= 359 then return true end + end + + local function sbValidator(text) + local number = tonumber(text) if number and number >= 0 and number <= 100 then return true end + end + + local function hexValidator(text) + if string.match(text, "^[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]$") then + return true + end + end + + inputs = { + { shortcut = "R:", validator = rgbValidaror, onInputFinished = onRgbInputFinished }, + { shortcut = "G:", validator = rgbValidaror, onInputFinished = onRgbInputFinished }, + { shortcut = "B:", validator = rgbValidaror, onInputFinished = onRgbInputFinished }, + { shortcut = "H:", validator = hValidator, onInputFinished = onHsbInputFinished }, + { shortcut = "S:", validator = sbValidator, onInputFinished = onHsbInputFinished }, + { shortcut = "L:", validator = sbValidator, onInputFinished = onHsbInputFinished }, + { shortcut = "0x", validator = hexValidator, onInputFinished = onHexInputFinished } + } + + local y = 10 + for i = 1, #inputs do + palette:addChild(GUI.label(58, y, 2, 1, 0x000000, inputs[i].shortcut)) + + local validator, onInputFinished = inputs[i].validator, inputs[i].onInputFinished + inputs[i] = palette:addChild(GUI.input(61, y, 9, 1, 0xFFFFFF, 0x666666, 0x666666, 0xFFFFFF, 0x000000, "", "", true)) + inputs[i].validator = validator + inputs[i].onInputFinished = onInputFinished + + y = y + 2 + end + + local favourites + if fs.exists(GUI.paletteConfigPath) then + favourites = table.fromFile(GUI.paletteConfigPath) + else + favourites = {} + for i = 1, 6 do favourites[i] = color.HSBToHEX(math.random(0, 360), 1, 1) end + table.toFile(GUI.paletteConfigPath, favourites) + end + + local favouritesContainer = palette:addChild(GUI.container(58, 24, 12, 1)) + for i = 1, #favourites do + favouritesContainer:addChild(GUI.button(i * 2 - 1, 1, 2, 1, favourites[i], 0x0, 0x0, 0x0, " ")).onTouch = function(mainContainer, object, eventData) + paletteSwitchColorFromHex(button.colors.default.background) + paletteRefreshBigImage() + paletteUpdateCrestsCoordinates() + mainContainer:draw() + buffer.draw() + end + end + + palette:addChild(GUI.button(58, 25, 12, 1, 0xFFFFFF, 0x444444, 0x2D2D2D, 0xFFFFFF, "+")).onTouch = function(mainContainer, object, eventData) + local favouriteExists = false + for i = 1, #favourites do + if favourites[i] == palette.color.hex then + favouriteExists = true + break + end + end + + if not favouriteExists then + table.insert(favourites, 1, palette.color.hex) + table.remove(favourites, #favourites) + for i = 1, #favourites do + favouritesContainer.children[i].colors.default.background = favourites[i] + favouritesContainer.children[i].colors.pressed.background = 0x0 + end + + table.toFile(GUI.paletteConfigPath, favourites) + + mainContainer:draw() + buffer.draw() + end + end + + bigImage.eventHandler = function(mainContainer, object, eventData) + if eventData[1] == "touch" or eventData[1] == "drag" and bigImage:isClicked(eventData[3], eventData[4]) then + bigCrest.localX, bigCrest.localY = eventData[3] - palette.x - 1, eventData[4] - palette.y + paletteSwitchColorFromHex(select(3, component.gpu.get(eventData[3], eventData[4]))) + mainContainer:draw() + buffer.draw() + end + end + bigCrest.eventHandler = bigImage.eventHandler + + miniImage.eventHandler = function(mainContainer, object, eventData) + if eventData[1] == "touch" or eventData[1] == "drag" then + miniCrest.localY = eventData[4] - palette.y + 1 + paletteSwitchColorFromHsb((eventData[4] - miniImage.y) * 360 / miniImage.height, palette.color.hsb.saturation, palette.color.hsb.brightness) + paletteRefreshBigImage() + mainContainer:draw() + buffer.draw() + end + end + + palette.show = paletteShow + + paletteSwitchColorFromHex(startColor) + paletteUpdateCrestsCoordinates() + paletteRefreshBigImage() + paletteRefreshMiniImage() + + return palette +end + ----------------------------------------------------------------------------------------------------- -- buffer.clear() diff --git a/lib/OpenComputersGL/Materials.lua b/lib/OpenComputersGL/Materials.lua index 9498be7f..28ad815d 100755 --- a/lib/OpenComputersGL/Materials.lua +++ b/lib/OpenComputersGL/Materials.lua @@ -12,8 +12,8 @@ materials.types = { function materials.newDebugTexture(width, height, h) local texture = {width = width, height = height} - local bStep = 100 / height - local sStep = 100 / width + local bStep = 1 / height + local sStep = 1 / width local s, b = 0, 0 local blackSquare = false diff --git a/lib/color.lua b/lib/color.lua index eadd0078..84a8c5ee 100755 --- a/lib/color.lua +++ b/lib/color.lua @@ -31,22 +31,21 @@ local function RGBToHSB(r, g, b) local max, min = math.max(r, g, b), math.min(r, g, b) if max == min then - return 0, max == 0 and 0 or (1 - min / max) * 100, max / 255 * 100 + return 0, max == 0 and 0 or (1 - min / max), max / 255 elseif max == r and g >= b then - return 60 * (g - b) / (max - min), max == 0 and 0 or (1 - min / max) * 100, max / 255 * 100 + return 60 * (g - b) / (max - min), max == 0 and 0 or (1 - min / max), max / 255 elseif max == r and g < b then - return 60 * (g - b) / (max - min) + 360, max == 0 and 0 or (1 - min / max) * 100, max / 255 * 100 + return 60 * (g - b) / (max - min) + 360, max == 0 and 0 or (1 - min / max), max / 255 elseif max == g then - return 60 * (b - r) / (max - min) + 120, max == 0 and 0 or (1 - min / max) * 100, max / 255 * 100 + return 60 * (b - r) / (max - min) + 120, max == 0 and 0 or (1 - min / max), max / 255 elseif max == b then - return 60 * (r - g) / (max - min) + 240, max == 0 and 0 or (1 - min / max) * 100, max / 255 * 100 + return 60 * (r - g) / (max - min) + 240, max == 0 and 0 or (1 - min / max), max / 255 else - return 0, max == 0 and 0 or (1 - min / max) * 100, max / 255 * 100 + return 0, max == 0 and 0 or (1 - min / max), max / 255 end end local function HSBToRGB(h, s, b) - s, b = s / 100, b / 100 local integer, fractional = math.modf(h / 60) local p, q, t = b * (1 - s), b * (1 - s * fractional), b * (1 - (1 - fractional) * s) diff --git a/lib/palette.lua b/lib/palette.lua index 631b23ad..f5e35a5e 100755 --- a/lib/palette.lua +++ b/lib/palette.lua @@ -1,285 +1,3 @@ -require("advancedLua") -local component = require("component") -local fs = require("filesystem") -local color = require("color") -local image = require("image") -local buffer = require("doubleBuffering") -local GUI = require("GUI") --------------------------------------------------------------------------------------------------------------- - -local palette = {} -local pathToFavouritesConfig, favourites = fs.path(getCurrentScript()) .. ".palette.cfg" - -local function saveFavourites() - table.toFile(pathToFavouritesConfig, favourites) -end - --------------------------------------------------------------------------------------------------------------- - -local function changeInputsValueToCurrentColor(window) - window.inputs[1].input.text = tostring(window.color.rgb.red) - window.inputs[2].input.text = tostring(window.color.rgb.green) - window.inputs[3].input.text = tostring(window.color.rgb.blue) - window.inputs[4].input.text = tostring(math.floor(window.color.hsb.hue)) - window.inputs[5].input.text = tostring(math.floor(window.color.hsb.saturation)) - window.inputs[6].input.text = tostring(math.floor(window.color.hsb.brightness)) - window.inputs[7].input.text = string.format("%06X", window.color.hex) - window.colorPanel.colors.background = window.color.hex -end - -local function switchColorFromHex(window, hex) - window.color.hex = hex - window.color.rgb.red, window.color.rgb.green, window.color.rgb.blue = color.HEXToRGB(hex) - window.color.hsb.hue, window.color.hsb.saturation, window.color.hsb.brightness = color.RGBToHSB(window.color.rgb.red, window.color.rgb.green, window.color.rgb.blue) - changeInputsValueToCurrentColor(window) -end - -local function switchColorFromHsb(window, hue, saturation, brightness) - window.color.hsb.hue, window.color.hsb.saturation, window.color.hsb.brightness = hue, saturation, brightness - window.color.rgb.red, window.color.rgb.green, window.color.rgb.blue = color.HSBToRGB(hue, saturation, brightness) - window.color.hex = color.RGBToHEX(window.color.rgb.red, window.color.rgb.green, window.color.rgb.blue) - changeInputsValueToCurrentColor(window) -end - -local function switchColorFromRgb(window, red, green, blue) - window.color.rgb.red, window.color.rgb.green, window.color.rgb.blue = red, green, blue - window.color.hsb.hue, window.color.hsb.saturation, window.color.hsb.brightness = color.RGBToHSB(red, green, blue) - window.color.hex = color.RGBToHEX(red, green, blue) - changeInputsValueToCurrentColor(window) -end - --------------------------------------------------------------------------------------------------------------- - -local function refreshBigRainbow(window) - local saturationStep, brightnessStep, saturation, brightness = 100 / image.getWidth(window.bigRainbow.image), 100 / (image.getHeight(window.bigRainbow.image)), 0, 100 - for j = 1, image.getHeight(window.bigRainbow.image) do - for i = 1, image.getWidth(window.bigRainbow.image) do - image.set(window.bigRainbow.image, i, j, color.optimize(color.HSBToHEX(window.color.hsb.hue, saturation, brightness)), 0x0, 0x0, " ") - saturation = saturation + saturationStep - end - saturation, brightness = 0, brightness - brightnessStep - end -end - -local function refreshMiniRainbow(window) - local hueStep, hue = 360 / (image.getHeight(window.miniRainbow.image)), 0 - for j = 1, image.getHeight(window.miniRainbow.image) do - for i = 1, image.getWidth(window.miniRainbow.image) do - image.set(window.miniRainbow.image, i, j, color.optimize(color.HSBToHEX(hue, 100, 100)), 0x0, 0x0, " ") - end - hue = hue + hueStep - end -end - --------------------------------------------------------------------------------------------------------------- - -local function createCrestsCoordinates(window) - window.bigCrest.localX = math.floor((window.bigRainbow.width - 1) * window.color.hsb.saturation / 100) - 1 - window.bigCrest.localY = math.floor((window.bigRainbow.height - 1) - (window.bigRainbow.height - 1) * window.color.hsb.brightness / 100) - window.miniCrest.localY = math.floor(window.color.hsb.hue / 360 * window.miniRainbow.height) -end - -local function drawBigCrestPixel(window, x, y, symbol) - if window.bigRainbow:isClicked(x, y) then - local background, foreground = buffer.get(x, y) - if background >= 0x888888 then - foreground = 0x000000 - else - foreground = 0xFFFFFF - end - buffer.set(x, y, background, foreground, symbol) - end -end - --------------------------------------------------------------------------------------------------------------- - -function palette.container(x, y, startColor) - local window = GUI.container(x, y, 71, 25) - - window.color = {hsb = {}, rgb = {}} - window:addChild(GUI.panel(1, 1, window.width, window.height, 0xEEEEEE)) - - window.bigRainbow = window:addChild(GUI.image(1, 1, image.create(50, 25))) - window.bigCrest = window:addChild(GUI.object(1, 1, 5, 3)) - window.bigCrest.draw = function(object) - drawBigCrestPixel(window, object.x, object.y + 1, "─") - drawBigCrestPixel(window, object.x + 1, object.y + 1, "─") - drawBigCrestPixel(window, object.x + 3, object.y + 1, "─") - drawBigCrestPixel(window, object.x + 4, object.y + 1, "─") - drawBigCrestPixel(window, object.x + 2, object.y, "│") - drawBigCrestPixel(window, object.x + 2, object.y + 2, "│") - end - window.bigRainbow.eventHandler = function(mainContainer, object, eventData) - if eventData[1] == "touch" or eventData[1] == "drag" and window.bigRainbow:isClicked(eventData[3], eventData[4]) then - window.bigCrest.localX, window.bigCrest.localY = eventData[3] - window.x - 1, eventData[4] - window.y - switchColorFromHex(window, select(3, component.gpu.get(eventData[3], eventData[4]))) - mainContainer:draw() - buffer.draw() - end - end - window.bigCrest.eventHandler = window.bigRainbow.eventHandler - - window.miniRainbow = window:addChild(GUI.image(53, 1, image.create(3, 25))) - window.miniCrest = window:addChild(GUI.object(52, 1, 5, 1)) - window.miniCrest.draw = function(object) - buffer.text(object.x, object.y, 0x0, ">") - buffer.text(object.x + 4, object.y, 0x0, "<") - end - window.miniRainbow.eventHandler = function(mainContainer, object, eventData) - if eventData[1] == "touch" or eventData[1] == "drag" then - window.miniCrest.localY = eventData[4] - window.y + 1 - switchColorFromHsb(window, (eventData[4] - window.miniRainbow.y) * 360 / window.miniRainbow.height, window.color.hsb.saturation, window.color.hsb.brightness) - refreshBigRainbow(window) - mainContainer:draw() - buffer.draw() - end - end - - window.colorPanel = window:addChild(GUI.panel(58, 2, 12, 3, 0x0)) - window.OKButton = window:addChild(GUI.roundedButton(58, 6, 12, 1, 0x444444, 0xFFFFFF, 0x2D2D2D, 0xFFFFFF, "OK")) - window.cancelButton = window:addChild(GUI.roundedButton(58, 8, 12, 1, 0xFFFFFF, 0x444444, 0x2D2D2D, 0xFFFFFF, "Cancel")) - - local function onAnyInputFinished() - refreshBigRainbow(window) - createCrestsCoordinates(window) - window:getFirstParent():draw() - buffer.draw() - end - - local function onHexInputFinished() - switchColorFromHex(window, tonumber("0x" .. window.inputs[7].input.text)) - onAnyInputFinished() - end - - local function onRgbInputFinished() - switchColorFromRgb(window, tonumber(window.inputs[1].input.text), tonumber(window.inputs[2].input.text), tonumber(window.inputs[3].input.text)) - onAnyInputFinished() - end - - local function onHsbInputFinished() - switchColorFromHsb(window, tonumber(window.inputs[4].input.text), tonumber(window.inputs[5].input.text), tonumber(window.inputs[6].input.text)) - onAnyInputFinished() - end - - local function rgbValidaror(text) - local num = tonumber(text) if num and num >= 0 and num <= 255 then return true end - end - - local function hValidator(text) - local num = tonumber(text) if num and num >= 0 and num <= 359 then return true end - end - - local function sbValidator(text) - local num = tonumber(text) if num and num >= 0 and num <= 100 then return true end - end - - local function hexValidator(text) - if string.match(text, "^[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]$") then - return true - end - end - - window.inputs = { - { shortcut = "R:", validator = rgbValidaror, onInputFinished = onRgbInputFinished }, - { shortcut = "G:", validator = rgbValidaror, onInputFinished = onRgbInputFinished }, - { shortcut = "B:", validator = rgbValidaror, onInputFinished = onRgbInputFinished }, - { shortcut = "H:", validator = hValidator, onInputFinished = onHsbInputFinished }, - { shortcut = "S:", validator = sbValidator, onInputFinished = onHsbInputFinished }, - { shortcut = "L:", validator = sbValidator, onInputFinished = onHsbInputFinished }, - { shortcut = "0x", validator = hexValidator, onInputFinished = onHexInputFinished } - } - - local y = 10 - for i = 1, #window.inputs do - window:addChild(GUI.label(58, y, 2, 1, 0x000000, window.inputs[i].shortcut)) - - window.inputs[i].input = window:addChild(GUI.input(61, y, 9, 1, 0xFFFFFF, 0x444444, 0x444444, 0xFFFFFF, 0x000000, "", "", true)) - window.inputs[i].input.validator = window.inputs[i].validator - window.inputs[i].input.onInputFinished = window.inputs[i].onInputFinished - - y = y + 2 - end - - if fs.exists(pathToFavouritesConfig) then - favourites = table.fromFile(pathToFavouritesConfig) - else - favourites = {} - for i = 1, 6 do favourites[i] = math.random(0x000000, 0xFFFFFF) end - saveFavourites() - end - - palette.favouritesContainer = window:addChild(GUI.container(58, 24, 12, 1)) - for i = 1, #favourites do - local button = palette.favouritesContainer:addChild(GUI.button(i * 2 - 1, 1, 2, 1, favourites[i], 0x0, 0x0, 0x0, " ")) - button.onTouch = function(mainContainer, object, eventData) - switchColorFromHex(window, button.colors.default.background) - refreshBigRainbow(window) - createCrestsCoordinates(window) - mainContainer:draw() - buffer.draw() - end - end - - window:addChild(GUI.button(58, 25, 12, 1, 0xFFFFFF, 0x444444, 0x88FF88, 0xFFFFFF, "+")).onTouch = function(mainContainer, object, eventData) - local favouriteExists = false - for i = 1, #favourites do - if favourites[i] == window.color.hex then - favouriteExists = true - break - end - end - - if not favouriteExists then - table.insert(favourites, 1, window.color.hex) - table.remove(favourites, #favourites) - for i = 1, #favourites do - palette.favouritesContainer.children[i].colors.default.background = favourites[i] - palette.favouritesContainer.children[i].colors.pressed.background = 0x0 - end - saveFavourites() - mainContainer:draw() - buffer.draw() - end - end - - switchColorFromHex(window, startColor) - createCrestsCoordinates(window) - refreshBigRainbow(window) - refreshMiniRainbow(window) - - return window -end - -function palette.show(x, y, startColor) - local mainContainer = GUI.fullScreenContainer() - - local selectedColor - local window = mainContainer:addChild(palette.container(x, y, startColor)) - window.OKButton.onTouch = function(mainContainer, object, eventData) - mainContainer:stopEventHandling() - selectedColor = window.color.hex - end - window.cancelButton.onTouch = function(mainContainer, object, eventData) - mainContainer:stopEventHandling() - end - - mainContainer:draw() - buffer.draw() - mainContainer:startEventHandling() - - window = nil - - return selectedColor -end - --------------------------------------------------------------------------------------------------------------- - --- buffer.start() --- buffer.draw(true) --- GUI.error(tostring(palette.show(5, 5, 0xFF00FF))) - --------------------------------------------------------------------------------------------------------------- - -return palette +error("/lib/palette.lua is no longer supported. User GUI.palette instead") \ No newline at end of file