Skip to content

Commit 4a12d30

Browse files
committed
Merge pull request #123 from jverzani/master
tidy up store interface and fix selected
2 parents 8ee6d4e + c7d802f commit 4a12d30

File tree

2 files changed

+88
-27
lines changed

2 files changed

+88
-27
lines changed

src/lists.jl

Lines changed: 73 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ function iter_from_string_index(store, index::String)
106106
if !isvalid(store, iter)
107107
error("invalid index: $index")
108108
end
109-
iter
109+
iter
110110
end
111111

112112
### GtkListStore
@@ -143,6 +143,13 @@ function unshift!(listStore::GtkListStore, values::Tuple)
143143
iter[]
144144
end
145145

146+
## insert before
147+
function Base.insert!(listStore::GtkListStoreLeaf, iter::TRI, values)
148+
newiter = Gtk.mutable(GtkTreeIter)
149+
ccall((:gtk_list_store_insert_before,Gtk.libgtk),Void,(Ptr{GObject},Ptr{GtkTreeIter},Ptr{GtkTreeIter}), listStore, newiter, iter)
150+
list_store_set_values(listStore, newiter, values)
151+
newiter[]
152+
end
146153

147154

148155
function delete!(listStore::GtkListStore, iter::TRI)
@@ -151,28 +158,26 @@ function delete!(listStore::GtkListStore, iter::TRI)
151158
listStore
152159
end
153160

161+
Base.deleteat!(listStore::GtkListStore, iter::TRI) = delete!(listStore, iter)
162+
163+
154164
empty!(listStore::GtkListStore) =
155165
ccall((:gtk_list_store_clear,libgtk), Void, (Ptr{GObject},),listStore)
156166

157167
## by index
158168

159169
## insert into a list store after index
160170
function Base.insert!(listStore::GtkListStoreLeaf, index::Int, values)
161-
index < 1 && return(unshift!(listStore, values))
162-
163-
index = min(index, length(listStore))
164-
iter = Gtk.mutable(GtkTreeIter)
165-
siter = iter_from_index(listStore, index)
166-
ccall((:gtk_list_store_insert_after,Gtk.libgtk),Void,(Ptr{GObject},Ptr{GtkTreeIter},Ptr{GtkTreeIter}), listStore, iter, siter)
167-
list_store_set_values(listStore, iter, values)
168-
iter
169-
end
171+
index > length(listStore) && return(push!(listStore, values))
170172

171-
function Base.splice!(listStore::GtkListStoreLeaf, index::Int)
172173
iter = iter_from_index(listStore, index)
173-
delete!(listStore, iter)
174+
insert!(listStore, iter, values)
174175
end
175176

177+
Base.deleteat!(listStore::GtkListStoreLeaf, index::Int) = delete!(listStore, iter_from_index(listStore, index))
178+
Base.pop!(listStore::GtkListStoreLeaf) = deleteat!(listStore, length(listStore))
179+
Base.shift!(listSTore::GtkListStoreLeaf) = deleteat!(listStore, 1)
180+
176181

177182

178183

@@ -183,6 +188,15 @@ isvalid(listStore::GtkListStore, iter::TRI) =
183188
length(listStore::GtkListStore) =
184189
ccall((:gtk_tree_model_iter_n_children,libgtk), Cint, (Ptr{GObject},Ptr{GtkTreeIter}),listStore, C_NULL)
185190

191+
size(listStore::GtkListStore) = (length(listStore), ncolumns(GtkTreeModel(listStore)))
192+
193+
Base.getindex(listStore::GtkListStore, iter::TRI, column::Integer) = getindex(GtkTreeModel(listStore), iter, column)
194+
Base.getindex(listStore::GtkListStore, iter::TRI) = getindex(GtkTreeModel(listStore), iter)
195+
Base.getindex(listStore::GtkListStore, row::Int, column) = getindex(listStore, iter_from_index(listStore, row), column)
196+
Base.getindex(listStore::GtkListStore, row::Int) = getindex(listStore, iter_from_index(listStore, row))
197+
198+
199+
186200
### GtkTreeStore
187201

188202
function GtkTreeStoreLeaf(types::Type...)
@@ -226,18 +240,10 @@ function unshift!(treeStore::GtkTreeStore, values::Tuple, parent=nothing)
226240
iter[]
227241
end
228242

229-
function delete!(treeStore::GtkTreeStore, iter::TRI)
230-
# not sure what to do with the return value here
231-
deleted = ccall((:gtk_tree_store_remove,libgtk),Cint,(Ptr{GObject},Ptr{GtkTreeIter}), treeStore, mutable(iter))
232-
treeStore
233-
end
234-
235-
236-
## insert by index
237243
## index can be :parent or :sibling
238244
## insertion can be :after or :before
239-
function Base.insert!(treeStore::GtkTreeStoreLeaf, index::Vector{Int}, values; how::Symbol=:parent, where::Symbol=:after)
240-
piter = iter_from_index(treeStore, index)
245+
function Base.insert!(treeStore::GtkTreeStoreLeaf, piter::TRI, values; how::Symbol=:parent, where::Symbol=:after)
246+
241247
iter = Gtk.mutable(GtkTreeIter)
242248
if how == :parent
243249
if where == :after
@@ -257,6 +263,21 @@ function Base.insert!(treeStore::GtkTreeStoreLeaf, index::Vector{Int}, values; h
257263
end
258264

259265

266+
function delete!(treeStore::GtkTreeStore, iter::TRI)
267+
# not sure what to do with the return value here
268+
deleted = ccall((:gtk_tree_store_remove,libgtk),Cint,(Ptr{GObject},Ptr{GtkTreeIter}), treeStore, mutable(iter))
269+
treeStore
270+
end
271+
272+
Base.deleteat!(treeStore::GtkTreeStore, iter::TRI) = delete!(treeStore, iter)
273+
274+
## insert by index
275+
function Base.insert!(treeStore::GtkTreeStoreLeaf, index::Vector{Int}, values; how::Symbol=:parent, where::Symbol=:after)
276+
piter = iter_from_index(treeStore, index)
277+
insert!(treeStore, iter, values; how=how, where=where)
278+
end
279+
280+
260281
function Base.splice!(treeStore::GtkTreeStoreLeaf, index::Vector{Int})
261282
iter = iter_from_index(treeStore, index)
262283
delete!(treeStore, iter)
@@ -409,24 +430,49 @@ add_attribute(treeColumn::GtkTreeViewColumn, renderer::GtkCellRenderer,
409430
(Ptr{GObject},Ptr{GObject},Ptr{Uint8},Cint),treeColumn,renderer,bytestring(attribute),column)
410431

411432
### GtkTreeSelection
412-
413433
function selected(selection::GtkTreeSelection)
434+
hasselection(selection) || error("No selection for GtkTreeSelection")
435+
414436
model = mutable(Ptr{GtkTreeModel})
415437
iter = mutable(GtkTreeIter)
438+
416439
ret = bool(ccall((:gtk_tree_selection_get_selected,libgtk),Cint,
417440
(Ptr{GObject},Ptr{Ptr{GtkTreeModel}},Ptr{GtkTreeIter}),selection,model,iter))
418-
if !ret
419-
error("No selection of GtkTreeSelection")
441+
442+
!ret && error("No selection of GtkTreeSelection")
443+
444+
iter[]
445+
end
446+
447+
function selected_rows(selection::GtkTreeSelection)
448+
hasselection(selection) || return GtkTreeIter[]
449+
450+
model = mutable(Ptr{GtkTreeModel})
451+
452+
paths = Gtk.GLib.GList(ccall((:gtk_tree_selection_get_selected_rows, Gtk.libgtk),
453+
Ptr{Gtk._GSList{Gtk.GtkTreePath}},
454+
(Ptr{GObject}, Ptr{GtkTreeModel}),
455+
selection, model))
456+
457+
iters = GtkTreeIter[]
458+
for path in paths
459+
it = mutable(GtkTreeIter)
460+
ret = bool( ccall((:gtk_tree_model_get_iter,libgtk), Cint, (Ptr{GObject},Ptr{GtkTreeIter},Ptr{GtkTreePath}),
461+
model,it,path))
462+
ret && push!(iters, it[])
420463
end
421-
convert(GtkTreeModel, model[]), iter[]
464+
465+
iters
466+
422467
end
423468

469+
424470
length(selection::GtkTreeSelection) =
425471
ccall((:gtk_tree_selection_count_selected_rows,libgtk), Cint, (Ptr{GObject},),selection)
426472

427473
hasselection(selection::GtkTreeSelection) = length(selection) > 0
428474

429-
select!(selection::GtkTreeSelection, iter::TRI) =
475+
Base.select!(selection::GtkTreeSelection, iter::TRI) =
430476
ccall((:gtk_tree_selection_select_iter,libgtk), Void,
431477
(Ptr{GObject},Ptr{GtkTreeIter}),selection, mutable(iter))
432478

test/gui.jl

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,8 @@ destroy(dlg)
450450
## List view
451451
ls=@ListStore(Int32,Bool)
452452
push!(ls,(33,true))
453+
push!(ls,(44,true))
454+
insert!(ls, 2, (35, false))
453455
tv=@TreeView(TreeModel(ls))
454456
r1=@CellRendererText()
455457
r2=@CellRendererToggle()
@@ -458,8 +460,21 @@ c2=@TreeViewColumn("B", r2,{"active" => 1})
458460
push!(tv,c1)
459461
push!(tv,c2)
460462
w = @Window(tv, "List View")|>showall
463+
464+
465+
## selection
466+
selmodel = Gtk.G_.selection(tv)
467+
@assert hasselection(selmodel) == false
468+
select!(selmodel, Gtk.iter_from_index(ls, 1)[])
469+
@assert hasselection(selmodel) == true
470+
iter = selected(selmodel)
471+
@assert ls[iter, 1] == 33
472+
deleteat!(ls, iter)
473+
@assert isvalid(ls, iter) == false
474+
461475
destroy(w)
462476

477+
463478
## Tree view
464479
ts=@TreeStore(String)
465480
iter1 = push!(ts,("one",))

0 commit comments

Comments
 (0)