diff --git a/lib/palette.lua b/lib/palette.lua new file mode 100644 index 00000000..5cc4f8f9 --- /dev/null +++ b/lib/palette.lua @@ -0,0 +1,256 @@ +local component = require("component") +local event = require("event") +local term = require("term") +local unicode = require("unicode") +local ecs = require("ECSAPI") +local colorlib = require("colorlib") + +local gpu = component.gpu + +local palette = {} + +------------------------------------------------------------------------------------ + + + +--РИСОВАТЬ ПАЛИТРОЧКУ +function palette.drawPalette(x,y,oldColor) + + local windowSizeX = 73 + local windowSizeY = 22 + local x,y = ecs.correctStartCoords(x,y,windowSizeX,windowSizeY) + + local MasterHue = 360 + local MasterSat = 100 + local MasterBri = 100 + MasterHue,MasterSat,MasterBri = colorlib.HEXtoHSB(oldColor) + local MasterColor = colorlib.HSBtoHEX(MasterHue,MasterSat,MasterBri) + + local rainbowBigWidth = 40 + local rainbowBigHeight = 19 + local masterColorX = x+rainbowBigWidth+9 + local masterColorY = y+2 + + local krestX,krestY = 0,0 + local oldKrest = {} + + ------------------------------------------------------------------------------------ + + --ОБЪЕКТЫ + local objects = {} + local function newObj(class,name,key,value) + objects[class] = objects[class] or {} + objects[class][name] = objects[class][name] or {} + objects[class][name][key] = value + end + + local function drawSelector(x,y) + gpu.setBackground(ecs.windowColors.background) + gpu.setForeground(0x000000) + gpu.set(x,y,">") + gpu.set(x+4,y,"<") + end + + local function drawRainbow(x,y,width,height) + local pizda = 360/height + + --gpu.setBackground(ecs.windowColors.background) + --gpu.fill(x,y,5,height+1," ") + + for i=1,height do + for j=1,width do + gpu.setBackground(colorlib.HSBtoHEX(i*pizda-1,100,100)) + gpu.set(x+j,y+i," ") + end + end + + x = x + 1 + y = y + 1 + newObj("palette","small","x1",x);newObj("palette","small","x2",x+width-1);newObj("palette","small","y1",y);newObj("palette","small","y2",y+height-1) + end + + local function drawKREST(pointX,pointY) + --ЭТО КУРСОРЧИК КРЕСТИК + ecs.invertedText(pointX-2,pointY,"̶") + ecs.invertedText(pointX+2,pointY,"̶") + ecs.invertedText(pointX-1,pointY,"̶") + ecs.invertedText(pointX+1,pointY,"̶") + ecs.invertedText(pointX,pointY-1,"|") + ecs.invertedText(pointX,pointY+1,"|") + end + + local function drawRainbowBig(x,y,width,height,MasterColor) + + --ЖИРНАЯ ГЛАВНАЯ ПИЗДОРАДУГА, ВЕРНЕЕ, ЕЕ ОЧИСТКА + gpu.setBackground(ecs.windowColors.background) + gpu.fill(x+width+1,y,6,height+2," ") + + --gpu.setBackground(ecs.colors.red) + gpu.fill(x,y,width+2,1," ") + gpu.fill(x,y,1,height," ") + gpu.fill(x,y+height+1,width+2,1," ") + gpu.fill(x+width+1,y,1,height," ") + + --РАСЧЕТ ВСЯКОЙ ШНЯГИ + --local hue, sat, bri = colorlib.HEXtoHSB(MasterColor) + local hue, sat, bri = MasterHue,MasterSat,MasterBri + --hue = hue - 1 + --MasterColor = hue + + --МИНИ-РАДУГА + local xMini = x+width+2 + drawRainbow(xMini,y,3,height) + + --СЕЛЕКТОР МИНИ-РАДУГИ + local miniHue = ecs.adaptiveRound(hue*height/360) + drawSelector(xMini,y+miniHue) + + --ВОТ ТУТ УЖЕ САМА БОЛЬШАЯ ШНЯГА + local pizda1 = 100/width + local pizda2 = 100/height + + for i=1,height do + for j=1,width do + gpu.setBackground(colorlib.HSBtoHEX(MasterHue,j*pizda1,100-i*pizda2)) + gpu.set(x+j,y+i," ") + end + end + + newObj("palette","big","x1",x+1);newObj("palette","big","x2",x+width);newObj("palette","big","y1",y+1);newObj("palette","big","y2",y+height) + end + + local function drawMasterColor(x,y,MasterColor) + gpu.setBackground(MasterColor) + gpu.fill(x,y,5,5," ") + gpu.setBackground(oldColor) + gpu.fill(x+5,y,5,5," ") + end + + local function drawButton(x,y,width,text,backColor,textColor) + gpu.setBackground(backColor) + gpu.setForeground(textColor) + local textPosX = x + math.floor(width/2-unicode.len(text)/2) + gpu.fill(x,y,width,1," ") + gpu.set(textPosX,y,text) + newObj("buttons",text,"x1",x);newObj("buttons",text,"x2",x+width-1);newObj("buttons",text,"y1",y);newObj("buttons",text,"y2",y) + end + + local function getInfoAboutColor(MasterColor) + local rr,gg,bb = colorlib.HEXtoRGB(MasterColor) + local hh,ss,ll = colorlib.HEXtoHSB(MasterColor) + + local colorInfo = { + {"R:",math.floor(rr)}, + {"G:",math.floor(gg)}, + {"B:",math.floor(bb)}, + {"H:",ecs.adaptiveRound(MasterHue)}, + {"S:",math.floor(MasterSat)}, + {"B:",math.floor(MasterBri)}, + {"# ",string.format("%x", MasterColor)}, + } + + return colorInfo + end + + local function drawInfoAboutColors(x,y,MasterColor) + local colorInfo = getInfoAboutColor(MasterColor) + + for i=1,#colorInfo do + gpu.setBackground(ecs.windowColors.background) + gpu.setForeground(0x000000) + gpu.set(x,y+i*2-2,colorInfo[i][1].." ") + + gpu.setBackground(0xffffff) + gpu.setForeground(0x111111) + gpu.fill(x+3,y+i*2-2,7,1," ") + gpu.set(x+3,y+i*2-2,tostring(colorInfo[i][2])) + end + end + + ------------------------------------------------------- + + local function recalculateKrest() + krestX = ecs.adaptiveRound(x + 1 + MasterSat * rainbowBigWidth / 100) + krestY = ecs.adaptiveRound(y + 2 + rainbowBigHeight - (MasterBri * rainbowBigHeight / 100)) + end + + local function drawNuzhnoe() + drawRainbowBig(x+1,y+1,rainbowBigWidth,rainbowBigHeight,MasterColor) + drawMasterColor(masterColorX,masterColorY,MasterColor) + drawInfoAboutColors(masterColorX,masterColorY+6,MasterColor) + drawKREST(krestX,krestY) + end + + ecs.emptyWindow(x,y,windowSizeX,windowSizeY,"Выберите цвет") + + drawButton(masterColorX+12,masterColorY+1,10,"OK",ecs.colors.lightBlue,0xffffff) + drawButton(masterColorX+12,masterColorY+3,10,"Cancel",0xaaaaaa,0x000000) + + recalculateKrest() + drawRainbowBig(x+1,y+1,rainbowBigWidth,rainbowBigHeight,MasterColor) + drawMasterColor(masterColorX,masterColorY,MasterColor) + drawInfoAboutColors(masterColorX,masterColorY+6,MasterColor) + oldKrest = ecs.rememberOldPixels(krestX-2,krestY-1,krestX+2,krestY+1) + drawKREST(krestX,krestY) + + + while true do + local eventData = {event.pull()} + if eventData[1] == "touch" or eventData[1] == "drag" then + + if ecs.clickedAtArea(eventData[3],eventData[4],objects["palette"]["small"]["x1"],objects["palette"]["small"]["y1"],objects["palette"]["small"]["x2"],objects["palette"]["small"]["y2"]) then + local CYKA = {gpu.get(eventData[3],eventData[4])} + MasterHue = colorlib.HEXtoHSB(CYKA[3]) + CYKA = nil + MasterColor = colorlib.HSBtoHEX(MasterHue,MasterSat,MasterBri) + + + drawRainbowBig(x+1,y+1,rainbowBigWidth,rainbowBigHeight,MasterColor) + drawMasterColor(masterColorX,masterColorY,MasterColor) + drawInfoAboutColors(masterColorX,masterColorY+6,MasterColor) + + oldKrest = ecs.rememberOldPixels(krestX-2,krestY-1,krestX+2,krestY+1) + drawKREST(krestX,krestY) + + elseif ecs.clickedAtArea(eventData[3],eventData[4],objects["palette"]["big"]["x1"],objects["palette"]["big"]["y1"],objects["palette"]["big"]["x2"],objects["palette"]["big"]["y2"]) then + + local CYKA = {gpu.get(eventData[3],eventData[4])} + local PIDOR = {colorlib.HEXtoHSB(CYKA[3])} + MasterSat,MasterBri = PIDOR[2],PIDOR[3] + MasterColor = colorlib.HSBtoHEX(MasterHue,MasterSat,MasterBri) + PIDOR = nil + CYKA = nil + + ecs.drawOldPixels(oldKrest) + krestX,krestY = eventData[3],eventData[4] + oldKrest = ecs.rememberOldPixels(krestX-2,krestY-1,krestX+2,krestY+1) + + --drawRainbowBig(x+1,y+1,rainbowBigWidth,rainbowBigHeight,MasterColor) + drawMasterColor(masterColorX,masterColorY,MasterColor) + drawInfoAboutColors(masterColorX,masterColorY+6,MasterColor) + drawKREST(krestX,krestY) + elseif ecs.clickedAtArea(eventData[3],eventData[4],objects["buttons"]["OK"]["x1"],objects["buttons"]["OK"]["y1"],objects["buttons"]["OK"]["x2"],objects["buttons"]["OK"]["y2"]) then + drawButton(objects["buttons"]["OK"]["x1"],objects["buttons"]["OK"]["y1"],10,"OK",ecs.colors.blue,0xffffff) + os.sleep(0.3) + return MasterColor,MasterHue,MasterSat,MasterBri + elseif ecs.clickedAtArea(eventData[3],eventData[4],objects["buttons"]["Cancel"]["x1"],objects["buttons"]["Cancel"]["y1"],objects["buttons"]["Cancel"]["x2"],objects["buttons"]["Cancel"]["y2"]) then + drawButton(objects["buttons"]["Cancel"]["x1"],objects["buttons"]["Cancel"]["y1"],10,"Cancel",ecs.colors.blue,0xffffff) + os.sleep(0.3) + return nil + end + + --[[elseif eventData[1] == "key_up" then + + if eventData[4] == 57 then + MasterHue,MasterSat,MasterBri = 360,100,100 + MasterColor = colorlib.HSBtoHEX(MasterHue,MasterSat,MasterBri) + recalculateKrest() + drawNuzhnoe() + end]] + end + end +end + +------------------------------------------------------------------------------------ + +return palette