# colors.py

Created by ikario198

Created on September 19, 2022

6.42 KB

Colors v1.1.
Python Util for Numworks, all models.
By Ilyas RAHMOUN & Vincent ROBERT. June 2022.

#### Changelog

Colors v1.0 - 10/06/2022:
- Initial util

Colors v1.1 - 19/09/2022:
- The [Ans] key is now used to exit the program cleanly

```from kandinsky import fill_rect as rec, draw_string as txt
from ion import keydown

# Colors 1.1 NumWorks, 19.09.2022
# Par Ilyas RAHMOUN & Vincent ROBERT
# https://nsi.xyz/colors <3

bar = 1
rgb = [148,113,222]
black,grey,red,green,blue = ((42,)*3),(184,188,184),(255,0,0),(0,255,0),(0,0,255)
rgb_t = (red,green,blue)
cuts = (42,0,20,54,86,132,177,210,242,255)

def rgb_to_hex(clr):
return ("{:0>2}".format(hex(clr[0])[2:])+"{:0>2}".format(hex(clr[1])[2:])+"{:0>2}".format(
hex(clr[2])[2:])).upper()

def gui():
clrs=((42*3,42/3,42*5),(42*2,42/7,42*4),(42,42*2,42*5),(42/2,42*5,42*2),
(42*6,42*5,42),(42*6,42*3,42),(42*6,42,42))
for k in range(7):
for j in range(19):
if chrs[k]>>j&1==1:
rec(24+12*k+(j%3)*3,10+(j//3)*3,3,3,clrs[k])
txt("24 bits",28,50,black)
for n in range(3):
rec(28,115+(n+1)*20,255,6,grey)
rec(28,115+(n+1)*20,rgb[n],6,(255*(n+1==bar),42,42))
rec(22+rgb[n],112+(n+1)*20,12,12,(255*(n+1==bar),42,42))
txt("R   G   B", 209,5)
rgb_txt=("R:","G:","B:")
for i in range(3):
txt(str(rgb_txt[i]),3,109+(i+1)*20,black)
for i in range(9):
txt(str(i+1),12+(33*i)+12*(i==4)+24*(i>4),103,black)
update_info_display()

def contrast(clr):
lum=(299*clr[0]+587*clr[1]+114*clr[2])/1000
if lum>125:
return black
else:
return "white"

def update_info_display():
for i in range(3):
txt(str("%03d"%rgb[i]),288,109+20*(i+1),black)
txt("("+str("%03d"%rgb[0])+","+str("%03d" % rgb[1])+","+str("%03d"%rgb[2])+")",189,30)
txt("#"+str(rgb_to_hex(rgb)),220,55)
rec(132,0,56,100,rgb)
for i in range(4):
rec(0+33*i,80,33,20,(rgb[0]+int((255-rgb[0])*(4-i)/5),
rgb[1]+int((255-rgb[1])*(4-i)/5),rgb[2]+int((255-rgb[2])*(4-i)/5)))
for i in range(4):
rec(188+33*i,80,33,20,(rgb[0]*(4-i)//5,rgb[1]*(4-i)//5,rgb[2]*(4-i)//5))
rec(0,200,320,22,rgb)
txt("Colored by nsi.xyz/colors",33,202,contrast(rgb),rgb)

def number_key(k):
return 7*(k==30)+8*(k==31)+9*(k==32)+4*(k==36)+5*(k==37)+6*(k==38)+1*(
k==42)+2*(k==43)+3*(k==44)+0*(k==48)

def sliding_bars_updater(old):
if not old:
for i in range(3):
rec(28,115+(i+1)*20,255,6,grey)
rec(rgb[i]+22,112+(i+1)*20,12,12,rgb_t[i])
rec(28,115+(i+1)*20,rgb[i],6,rgb_t[i])
else:
for i in range(3):
rec(rgb[i]+22,112+(i+1)*20,12,12,"white")

def selected_sliding_bar(selected):
rec(28,115+bar*20,255,6,grey)
color_s=rgb_t[bar-1] if selected else black
rec(28,115+bar*20,rgb[bar-1],6,color_s)
rec(22+rgb[bar-1],112+bar*20,12,12,color_s)

def keyboard_listener(current):
if keydown(i):
return i
return current

if num==5:
return rgb
elif num<5:
return [rgb[0]+int((255-rgb[0])*(5-num)/5),rgb[1]+int((255-rgb[1])*(5-num)/5),
rgb[2]+int((255-rgb[2])*(5-num)/5)]
else:
return [rgb[0]*(10-num)//5,rgb[1]*(10-num)//5,rgb[2]*(10-num)//5]

def update_slide_bar(old, bar_type, bar_color, cursor):
rec(old+19,112+bar_type*20,18,12,"white")
rec(28,115+bar_type*20,255,6,grey)
rec(28,115 + bar_type * 20, cursor, 6, bar_color)
rec(cursor + 22, 112 + bar_type * 20, 12, 12, bar_color)

def slide_bar_interaction(bar_type, bar_color, cursor):
last_key, interaction = None, None
key_sum, num, old = 0, 120, 0
while not (keydown(1) or keydown(2)):
num = keyboard_listener(num)
if keydown(3) and cursor < 255:
if key_sum == 0 or key_sum == 30 or key_sum > 60:
old = cursor
cursor += 1
interaction = True
key_sum += 1
if keydown(0) and cursor > 0:
if key_sum == 0 or key_sum == -30 or key_sum < -60:
old = cursor
cursor -= 1
interaction = True
key_sum -= 1
if keydown(num) and last_key != num:
old = cursor
cursor = cuts[number_key(num)]
interaction = True
last_key = num
if interaction:
update_slide_bar(old, bar_type, bar_color, cursor)
rgb[bar_type - 1] = cursor
update_info_display()
interaction = False
if not (keydown(0) or keydown(3) or keydown(num)):
key_sum, num = 0, 120
last_key = None

global rgb
num, old = 120, 0
last_key, interaction = None, None
rec(154, 84, 12, 12, contrast(rgb))
while not keydown(2):
num = keyboard_listener(num)
if keydown(3) and last_key != 3:
old = rgb
rgb = [rgb[0] * 4 // 5, rgb[1] * 4 // 5, rgb[2] * 4 // 5]
interaction = True
last_key = 3
if keydown(0) and last_key != 0:
old = rgb
rgb = [rgb[0] + int((255 - rgb[0]) / 5), rgb[1] + int((255 - rgb[1]) / 5), rgb[2] + int((255 - rgb[2]) / 5)]
interaction = True
last_key = 0
if keydown(num) and last_key != num:
old = rgb
interaction = True
last_key = num
if interaction:
for i in range(3):
update_slide_bar(old[i], i + 1, black, rgb[i])
update_info_display()
rec(154, 84, 12, 12, contrast(rgb))
interaction = False
if not (keydown(0) or keydown(3) or keydown(num)):
num = 120
last_key = None

def colors():
global bar
last_key, num = None, 42
gui()
while not keydown(51):
if keydown(2) and bar < 3 and last_key != 2:
if bar != 0:
selected_sliding_bar(0)
bar += 1
selected_sliding_bar(1)
last_key = 2
if keydown(1) and bar > 0 and last_key != 1:
selected_sliding_bar(0)
bar -= 1
if bar != 0:
selected_sliding_bar(1)
last_key = 1
if keydown(3) or keydown(0) or keydown(keyboard_listener(num)):
slide_bar_interaction(bar, rgb_t[bar - 1], rgb[bar - 1])
if bar == 0: