-------------------------------------
-- 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.