
--# Passing data using multiple maps

include GtkEngine.e

include std/map.e

constant docs = `<u><b>Passing data using Maps</b></u>

Another way to attach data to controls.

This creates a separate map for each person, and 
passes just that map to the called routine.

Each field must be named, and can be accessed later by
name rather than position.

Maps can be saved to disk, and loaded as necessary.
`
constant jerrymap = load_map(locate_file("resources/Jerry.map"))
constant justinmap = load_map(locate_file("resources/Justin.map"))

constant win = create(GtkWindow,"border=10,size=300x100,position=1")
    connect(win,"destroy","Quit")

constant panel = create(GtkBox,"orientation=VERTICAL")
    add(win,panel)

constant lbl = create(GtkLabel)
    set(lbl,"markup",docs)
    add(panel,lbl)

constant 
    btn1 = create(GtkButton,"gtk-quit","Quit"),
    btn2 = create(GtkButton,"emblem-ok-symbolic#_Jerry","ShowInfo",jerrymap), -- link by map id;
    btn3 = create(GtkButton,"emblem-ok-symbolic#_Justin","ShowInfo",justinmap),
    btn4 = create(GtkButton,"gtk-save","Save"),
    box = create(GtkButtonBox)
    set(btn4,"sensitive",FALSE)
    add(box,{btn1,btn2,btn3,btn4})
    pack(panel,-box)

show_all(win)
main()

--------------------------------------------------------------
global function ShowInfo(atom ctl, object amap) -- map id passed
---------------------------------------------------------------
amap = pairs(amap) 
for i = 1 to length(amap) do
    amap[i] = text:format("[]=[]",amap[i])
end for

Info(,"Student",
    text:format("Name: [{name}]",amap), -- retrieve items by key;
    text:format(" age: [{age}]\n bal: $[{bal}]",amap),,
    locate_file(text:format("[{pix}]",amap)))
return 1
end function

-------------------------
global function Save()
-------------------------
-- here's how to save a couple of maps
-- either way works, use whichever is easier;

map a = map:new_from_kvpairs({
    {"name","Jerry Smith"},
    {"age",`16`}, -- note, numbers must be quoted somehow;
    {"bal",`49.95`},
    {"city","Buffalo NY"},
    {"phone","000-555-1212"},
    {"pix","thumbnails/Jerry.jpg"}})
    
map b = map:new_from_string("""
    name="Justin Jones",
    age='14',
    bal='12.99', 
    city="Reno, NV",
    phone=123-456-6789,
    pix=thumbnails/Justin.jpg""")

-- SM_RAW map is encoded, so not readable except to a programmer,
-- and the file is Binary mime type, so no apps to read it are usually available;
save_map(a,canonical_path("~/demos/resources/Jerry.map"),SM_TEXT)
save_map(b,canonical_path("~/demos/resources/Justin.map"),SM_TEXT)

return 1
end function
