-------------------------------------
-- Resistor Color Codes
-- Demonstrates ComboBoxes, images
----------------------------------------
include GtkEngine.e as gtk
include std/get.e
include std/filesys.e
constant
colors1 =
{"Black","Brown","Red","Orange","Yellow",
"Green","Blue","Violet","Gray","White"},
colors2 = colors1 & {"Gold","Silver"},
colors3 = {"Gold","Silver","None"},
tolerance = {" +/- 5%"," +/- 10%"," +/- 20%"},
wp = canonical_path("~/demos/colorcode/")
constant tens = create(GtkComboBoxText)
for i = 2 to length(colors1) do
set(tens,"append text",colors1[i])
end for
constant ones = create(GtkComboBoxText)
for i = 1 to length(colors1) do
set(ones,"append text",colors1[i])
end for
constant mult = create(GtkComboBoxText)
for i = 1 to length(colors2) do
set(mult,"append text",colors2[i])
end for
constant tol = create(GtkComboBoxText)
for i = 1 to length(colors3) do
set(tol,"append text",colors3[i])
end for
-----------------------------------------------------------
function format(integer t, integer o, integer m, integer p)
-- utility to format value display;
-----------------------------------------------------------
object v
object prec = "", fmt
integer i
atom min=0, max=0, var
v = sprintf("%d%d",{t,o})
if m < 1 then
v = value(v)
v = v[2]
end if
if m > 0 and m < 10 then
v &= repeat('0',m)
v = value(v)
v = v[2]
end if
if m = 10 then
v = value(v)
v = v[2] / 10
end if
if m = 11 then
v = value(v)
v = v[2] / 100
end if
if p > -1 then
prec = tolerance[p+1]
switch p do
case 0 then var = v * .05 break
case 1 then var = v * .10 break
case 2 then var = v * .20 break
end switch
min = v - var
max = v + var
fmt = "%g %s %s (%d ~ %d)"
else
fmt = "%g %s"
end if
if v >= 1e6 then
return sprintf(fmt,{v/1e6,"MegOhms",prec,min,max})
elsif v >= 1000 then
return sprintf(fmt,{v/1000,"KOhms",prec,min,max})
else
return sprintf(fmt,{v,"Ohms",prec,min,max})
end if
end function
object resistor -- an array of images
object valdisp = create(GtkLabel)
--------------------------------------------
function Update() -- called when values chg
--------------------------------------------
integer t,o,m,p
-- get selections from combo boxes,
t = gtk:get(tens,"active")+1
o = gtk:get(ones,"active")
m = gtk:get(mult,"active")
p = gtk:get(tol,"active")
if t >= 0 and o >= 0 and m >= 0 then
set(valdisp,"Text",format(t,o,m,p))
end if
-- set resistor color bands to match entered
-- values;
if t > -1 then
set(resistor[2],"from file",sprintf(wp & "bar%d.jpg",t))
end if
if o > -1 then
set(resistor[3],"from file",sprintf(wp & "bar%d.jpg",o))
end if
if m > -1 then
set(resistor[4],"from file",sprintf(wp & "bar%d.jpg",m))
end if
if p > -1 then
set(resistor[5],"from file",sprintf(wp & "end%d.jpg",p))
end if
return 0
end function
constant update = call_back(routine_id("Update"))
connect(tens,"changed",update)
connect(ones,"changed",update)
connect(mult,"changed",update)
connect(tol,"changed",update)
-- ----------------[ main ]--------------- --
constant win = create(GtkWindow)
connect(win,"destroy",quit)
set(win,"title","Resistor Color Codes")
set(win,"position",GTK_WIN_POS_CENTER)
set(win,"border width",10)
set(win,"resizable",FALSE)
constant panel = create(GtkVBox)
add(win,panel)
-- this creates a composite image of
-- a resistor;
resistor = repeat(0,5)
resistor[1] = create(GtkImage,wp & "leftend.jpg")
resistor[2] = create(GtkImage,wp & "bar1.jpg")
resistor[3] = create(GtkImage,wp & "bar0.jpg")
resistor[4] = create(GtkImage,wp & "bar0.jpg")
resistor[5] = create(GtkImage,wp & "end1.jpg")
constant top = create(GtkHBox)
set(top,"border width",30)
add(panel,top)
pack(top,resistor)
constant bot = create(GtkHBox)
add(panel,bot)
pack(bot,{tens,ones,mult,tol})
valdisp = create(GtkEntry)
add(panel,valdisp)
show_all(win)
main()
--Images for this program here.