
---------------------------------------------------------------------------------------
--# Demonstrates how to connect and process changes to listviews.

-- When you use CellRendererToggles as a set of radio buttons,
-- you have to handle the action yourself, this function is not
-- built into GTK. See RadioToggled function below.

-- However, I can't think of many reasons you might want to have
-- radio buttons in a list. You'd usually just set the list to 
-- select mode single, and click on one to select.
----------------------------------------------------------------------------------------

include GtkEngine.e

constant docs = `<u><b>GtkListView</b></u>
First column is editable,
second and third clickable.
Run from x-term to see changes.
`
constant win = create(GtkWindow,"position=1,border_width=10,$destroy=Quit")

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

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

sequence distros = {
    {"Debian",		FALSE,	FALSE,	"debian.org", "debian-swirl"},
    {"OpenSuse",	TRUE,	FALSE,	"suse.de", "xfce-system"},
    {"Fedora",		FALSE,	FALSE,	"redhat.com", "xfce-system"},
    {"Ubuntu",		TRUE,	FALSE,	"ubuntu.org","ubuntu-logo"},
    {"Mint",		TRUE,	TRUE,	"linuxmint.org","cs-linuxmint"}
}

for i = 1 to length(distros) do
    distros[i][5] = create(GdkPixbuf,distros[i][5],20,20,1)
end for
display(distros)

constant liststore = create(GtkListStore,{gSTR,gBOOL,gBOOL,gSTR,gPIX})
    set(liststore,"data",distros)

constant treeview = create(GtkTreeView,{
    {"model",liststore},
    {"tooltip column",4}})

constant selection = get(treeview,"selection")

constant rend0 = create(GtkCellRendererPixbuf) ?rend0
constant col0 = create(GtkTreeViewColumn) ? col0 
  set(col0,"pack start",rend0)
  set(col0,"add attribute",rend0,"pixbuf",5)
  set(treeview,"append column",col0)

constant rend1 = create(GtkCellRendererText)
    set(rend1,"editable",TRUE)

constant col1 = create(GtkTreeViewColumn,{
    {"title","Linux Distro"},
    {"pack start",rend1},
    {"fixed width",90},
    {"add attribute",rend1,"text",1}})
    set(treeview,"append column",col1)
    connect(rend1,"edited",_("NameEdited"))

constant rend2 = create(GtkCellRendererToggle)
    set(rend2,"activatable",TRUE)

constant col2 = create(GtkTreeViewColumn,{
    {"title","Have"},
    {"pack start",rend2},
    {"fixed width",40},
    {"add attribute",rend2,"active",2}})
    set(treeview,"append column",col2)
    connect(rend2,"toggled",_("CheckToggled"),rend2)

constant rend3 = create(GtkCellRendererToggle,{
    {"radio",TRUE},
    {"activatable",TRUE},
    {"cell-background","skyblue"}})
    connect(rend3,"toggled",_("RadioToggled"))

constant col3 = create(GtkTreeViewColumn,{
    {"title","Best"},
    {"pack start",rend3},
    {"fixed width",40},
    {"add attribute",rend3,"active",3}})
    set(treeview,"append column",col3)

add(panel,treeview)

constant box = create(GtkButtonBox),
    btn1 = create(GtkButton,"gtk-quit","Quit"),
    btn2 = create(GtkButton,"gtk-ok",_("ShowList"))
    add(box,{btn1,btn2})
    pack_end(panel,box)
  
show_all(win)
main()

------------------------------------------------------------------------
function NameEdited(atom rend, object path, object newtext)
------------------------------------------------------------------------
-- the newtext param contains the updated text
integer row = get(selection,"selected row")  
    set(liststore,"col data",row,1,peek_string(newtext))
return 1
end function

-----------------------------------------------------------
function CheckToggled(atom ctl, atom rend)
-----------------------------------------------------------
-- there's no new value param provided for this function,
-- so we have to get the value from the store, flip it, 
-- and put it back;
integer row = get(selection,"selected row") 
distros[row][2] = not get(ctl,"active")
set(liststore,"clear")
set(liststore,"data",distros)
return 1
end function

-----------------------------------------------------------------
function RadioToggled()
-----------------------------------------------------------------
integer row = get(selection,"selected row")
-- toggle all buttons;
    distros = get(liststore,"data")
    for i = 1 to length(distros) do
	    distros[i][3] = (i=row)
    end for
    set(liststore,"clear")
    set(liststore,"data",distros)
return 1
end function 

-----------------------------------------------------------------
function ShowList()
-----------------------------------------------------------------
object data = get(liststore,"data")
for i = 1 to length(data) do
    display("Distro: [:9] Tried: []  Favorite: [] URL: []",data[i])
end for
return 1
end function



