103 lines
3 KiB
Nim
103 lines
3 KiB
Nim
# http://zetcode.com/gui/gtk2/gtktreeview/
|
|
# dynamiclistview.c
|
|
|
|
import gintro/[glib, gobject, gtk]
|
|
import gintro/gio except ListStore
|
|
|
|
const
|
|
LIST_ITEM = 0
|
|
N_COLUMNS = 1
|
|
|
|
var list: TreeView
|
|
|
|
# we need the following two procs for now -- later we will not use that ugly cast...
|
|
proc typeTest(o: gobject.Object; s: string): bool =
|
|
let gt = g_type_from_name(s)
|
|
return g_type_check_instance_is_a(cast[ptr TypeInstance00](o.impl), gt).toBool
|
|
|
|
proc listStore(o: gobject.Object): gtk.ListStore =
|
|
assert(typeTest(o, "GtkListStore"))
|
|
cast[gtk.ListStore](o)
|
|
|
|
proc appendItem(widget: Button; entry: Entry) =
|
|
var
|
|
val: Value
|
|
iter: TreeIter
|
|
let store = listStore(getModel(list))
|
|
let gtype = gStringGetType() # typeFromName("gchararray")
|
|
discard init(val, gtype)
|
|
setString(val, entry.text)
|
|
store.append(iter)
|
|
store.setValue(iter, LIST_ITEM, val)
|
|
entry.text = ""
|
|
|
|
proc removeItem(widget: Button; selection: TreeSelection) =
|
|
var
|
|
ls: ListStore
|
|
iter: TreeIter
|
|
let store = list.getModel.listStore#getListStore(list)
|
|
if not store.getIterFirst(iter):
|
|
return
|
|
if getSelected(selection, ls, iter):
|
|
discard store.remove(iter)
|
|
|
|
proc onRemoveAll(widget: Button; selection: TreeSelection) =
|
|
var
|
|
iter: TreeIter
|
|
#let store = getListStore(list)
|
|
let store = list.getModel.listStore
|
|
if not store.getIterFirst(iter):
|
|
return
|
|
clear(store)
|
|
|
|
proc initList(list: TreeView) =
|
|
let renderer = newCellRendererText()
|
|
let column = newTreeViewColumn()
|
|
column.title = "List Item"
|
|
column.packStart(renderer, true)
|
|
column.addAttribute(renderer, "text", LIST_ITEM)
|
|
discard list.appendColumn(column)
|
|
let gtype = gStringGetType() # typeFromName("gchararray")
|
|
let store = newListStore(N_COLUMNS, cast[ptr GType]( unsafeaddr gtype)) # cast due to bug in gtk.nim
|
|
list.setModel(store)
|
|
|
|
proc appActivate(app: Application) =
|
|
let
|
|
window = newApplicationWindow(app)
|
|
sw = newScrolledWindow()
|
|
hbox = newBox(Orientation.horizontal, 5)
|
|
vbox = newBox(Orientation.vertical, 0)
|
|
add = newButton("Add")
|
|
remove = newButton("Remove")
|
|
removeAll = newButton("Remove All")
|
|
entry = newEntry()
|
|
window. title = "List view"
|
|
window.position = WindowPosition.center
|
|
window.borderWidth = 10
|
|
window.setSizeRequest(370, 270)
|
|
list = newTreeView()
|
|
sw.add(list)
|
|
sw.setPolicy(PolicyType.automatic, PolicyType.automatic)
|
|
sw.setShadowType(ShadowType.etchedIn)
|
|
list.setHeadersVisible(false)
|
|
vbox.packStart(sw, true, true, 5)
|
|
entry.setSizeRequest(120, -1)
|
|
hbox.packStart(add, false, true, 3)
|
|
hbox.packStart(entry, false, true, 3)
|
|
hbox.packStart(remove, false, true, 3)
|
|
hbox.packStart(removeAll, false, true, 3)
|
|
vbox.packStart(hbox, false, true, 3)
|
|
window.add(vbox)
|
|
initList(list)
|
|
let selection = getSelection(list)
|
|
connect(add, "clicked", appendItem, entry)
|
|
connect(remove, "clicked", removeItem, selection)
|
|
connect(removeAll, "clicked", onRemoveAll, selection)
|
|
showAll(window)
|
|
|
|
proc main =
|
|
let app = newApplication("org.gtk.example")
|
|
connect(app, "activate", appActivate)
|
|
discard run(app)
|
|
|
|
main()
|