1package gtk
2
3// #include <gtk/gtk.h>
4// #include "gtk.go.h"
5import "C"
6import (
7	"runtime"
8	"unsafe"
9
10	"github.com/gotk3/gotk3/gdk"
11	"github.com/gotk3/gotk3/glib"
12)
13
14/*
15 * GtkIconView
16 */
17
18// IconView is a representation of GTK's GtkIconView.
19type IconView struct {
20	Container
21}
22
23// native returns a pointer to the underlying GtkIconView.
24func (v *IconView) native() *C.GtkIconView {
25	if v == nil || v.GObject == nil {
26		return nil
27	}
28	p := unsafe.Pointer(v.GObject)
29	return C.toGtkIconView(p)
30}
31
32func marshalIconView(p uintptr) (interface{}, error) {
33	c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
34	obj := glib.Take(unsafe.Pointer(c))
35	return wrapIconView(obj), nil
36}
37
38func wrapIconView(obj *glib.Object) *IconView {
39	return &IconView{Container{Widget{glib.InitiallyUnowned{obj}}}}
40}
41
42// IconViewNew is a wrapper around gtk_icon_view_new().
43func IconViewNew() (*IconView, error) {
44	c := C.gtk_icon_view_new()
45	if c == nil {
46		return nil, nilPtrErr
47	}
48
49	return wrapIconView(glib.Take(unsafe.Pointer(c))), nil
50}
51
52// IconViewNewWithModel is a wrapper around gtk_icon_view_new_with_model().
53func IconViewNewWithModel(model ITreeModel) (*IconView, error) {
54	c := C.gtk_icon_view_new_with_model(model.toTreeModel())
55	if c == nil {
56		return nil, nilPtrErr
57	}
58	obj := glib.Take(unsafe.Pointer(c))
59	return wrapIconView(obj), nil
60}
61
62// SetModel is a wrapper around gtk_icon_view_set_model().
63func (v *IconView) SetModel(model ITreeModel) {
64	C.gtk_icon_view_set_model(v.native(), model.toTreeModel())
65}
66
67// GetModel is a wrapper around gtk_icon_view_get_model().
68func (v *IconView) GetModel() (*TreeModel, error) {
69	c := C.gtk_icon_view_get_model(v.native())
70	if c == nil {
71		return nil, nilPtrErr
72	}
73	obj := glib.Take(unsafe.Pointer(c))
74	return wrapTreeModel(obj), nil
75}
76
77// SetTextColumn is a wrapper around gtk_icon_view_set_text_column().
78func (v *IconView) SetTextColumn(column int) {
79	C.gtk_icon_view_set_text_column(v.native(), C.gint(column))
80}
81
82// GetTextColumn is a wrapper around gtk_icon_view_get_text_column().
83func (v *IconView) GetTextColumn() int {
84	return int(C.gtk_icon_view_get_text_column(v.native()))
85}
86
87// SetMarkupColumn is a wrapper around gtk_icon_view_set_markup_column().
88func (v *IconView) SetMarkupColumn(column int) {
89	C.gtk_icon_view_set_markup_column(v.native(), C.gint(column))
90}
91
92// GetMarkupColumn is a wrapper around gtk_icon_view_get_markup_column().
93func (v *IconView) GetMarkupColumn() int {
94	return int(C.gtk_icon_view_get_markup_column(v.native()))
95}
96
97// SetPixbufColumn is a wrapper around gtk_icon_view_set_pixbuf_column().
98func (v *IconView) SetPixbufColumn(column int) {
99	C.gtk_icon_view_set_pixbuf_column(v.native(), C.gint(column))
100}
101
102// GetPixbufColumn is a wrapper around gtk_icon_view_get_pixbuf_column().
103func (v *IconView) GetPixbufColumn() int {
104	return int(C.gtk_icon_view_get_pixbuf_column(v.native()))
105}
106
107// GetPathAtPos is a wrapper around gtk_icon_view_get_path_at_pos().
108func (v *IconView) GetPathAtPos(x, y int) *TreePath {
109	var (
110		cpath *C.GtkTreePath
111		path  *TreePath
112	)
113
114	cpath = C.gtk_icon_view_get_path_at_pos(v.native(), C.gint(x), C.gint(y))
115
116	if cpath != nil {
117		path = &TreePath{cpath}
118		runtime.SetFinalizer(path, (*TreePath).free)
119	}
120
121	return path
122}
123
124// GetItemAtPos is a wrapper around gtk_icon_view_get_item_at_pos().
125func (v *IconView) GetItemAtPos(x, y int) (*TreePath, *CellRenderer) {
126	var (
127		cpath *C.GtkTreePath
128		ccell *C.GtkCellRenderer
129		path  *TreePath
130		cell  *CellRenderer
131	)
132
133	C.gtk_icon_view_get_item_at_pos(v.native(), C.gint(x), C.gint(y), &cpath, &ccell)
134
135	if cpath != nil {
136		path = &TreePath{cpath}
137		runtime.SetFinalizer(path, (*TreePath).free)
138	}
139
140	if ccell != nil {
141		cell = wrapCellRenderer(glib.Take(unsafe.Pointer(ccell)))
142	}
143
144	return path, cell
145}
146
147// ConvertWidgetToBinWindowCoords is a wrapper around gtk_icon_view_convert_widget_to_bin_window_coords().
148func (v *IconView) ConvertWidgetToBinWindowCoords(x, y int) (int, int) {
149	var bx, by C.gint
150
151	C.gtk_icon_view_convert_widget_to_bin_window_coords(v.native(), C.gint(x), C.gint(y), &bx, &by)
152
153	return int(bx), int(by)
154}
155
156// SetCursor is a wrapper around gtk_icon_view_set_selection_mode().
157func (v *IconView) SetCursor(path *TreePath, cell *CellRenderer, startEditing bool) {
158	C.gtk_icon_view_set_cursor(v.native(), path.native(), cell.native(), gbool(startEditing))
159}
160
161// GetCursor is a wrapper around gtk_icon_view_get_cursor().
162func (v *IconView) GetCursor() (*TreePath, *CellRenderer) {
163	var (
164		cpath *C.GtkTreePath
165		ccell *C.GtkCellRenderer
166		path  *TreePath
167		cell  *CellRenderer
168	)
169
170	C.gtk_icon_view_get_cursor(v.native(), &cpath, &ccell)
171
172	if cpath != nil {
173		path = &TreePath{cpath}
174		runtime.SetFinalizer(path, (*TreePath).free)
175	}
176
177	if ccell != nil {
178		cell = wrapCellRenderer(glib.Take(unsafe.Pointer(ccell)))
179	}
180
181	return path, cell
182}
183
184// func (v *IconView) SelectedForeach() {}
185
186// SetSelectionMode is a wrapper around gtk_icon_view_set_selection_mode().
187func (v *IconView) SetSelectionMode(mode SelectionMode) {
188	C.gtk_icon_view_set_selection_mode(v.native(), C.GtkSelectionMode(mode))
189}
190
191// GetSelectionMode is a wrapper around gtk_icon_view_get_selection_mode().
192func (v *IconView) GetSelectionMode() SelectionMode {
193	return SelectionMode(C.gtk_icon_view_get_selection_mode(v.native()))
194}
195
196// SetItemOrientation is a wrapper around gtk_icon_view_set_item_orientation().
197func (v *IconView) SetItemOrientation(orientation Orientation) {
198	C.gtk_icon_view_set_item_orientation(v.native(), C.GtkOrientation(orientation))
199}
200
201// GetItemOrientation is a wrapper around gtk_icon_view_get_item_orientation().
202func (v *IconView) GetItemOrientation() Orientation {
203	return Orientation(C.gtk_icon_view_get_item_orientation(v.native()))
204}
205
206// SetColumns is a wrapper around gtk_icon_view_set_columns().
207func (v *IconView) SetColumns(columns int) {
208	C.gtk_icon_view_set_columns(v.native(), C.gint(columns))
209}
210
211// GetColumns is a wrapper around gtk_icon_view_get_columns().
212func (v *IconView) GetColumns() int {
213	return int(C.gtk_icon_view_get_columns(v.native()))
214}
215
216// SetItemWidth is a wrapper around gtk_icon_view_set_item_width().
217func (v *IconView) SetItemWidth(width int) {
218	C.gtk_icon_view_set_item_width(v.native(), C.gint(width))
219}
220
221// GetItemWidth is a wrapper around gtk_icon_view_get_item_width().
222func (v *IconView) GetItemWidth() int {
223	return int(C.gtk_icon_view_get_item_width(v.native()))
224}
225
226// SetSpacing is a wrapper around gtk_icon_view_set_spacing().
227func (v *IconView) SetSpacing(spacing int) {
228	C.gtk_icon_view_set_spacing(v.native(), C.gint(spacing))
229}
230
231// GetSpacing is a wrapper around gtk_icon_view_get_spacing().
232func (v *IconView) GetSpacing() int {
233	return int(C.gtk_icon_view_get_spacing(v.native()))
234}
235
236// SetRowSpacing is a wrapper around gtk_icon_view_set_row_spacing().
237func (v *IconView) SetRowSpacing(rowSpacing int) {
238	C.gtk_icon_view_set_row_spacing(v.native(), C.gint(rowSpacing))
239}
240
241// GetRowSpacing is a wrapper around gtk_icon_view_get_row_spacing().
242func (v *IconView) GetRowSpacing() int {
243	return int(C.gtk_icon_view_get_row_spacing(v.native()))
244}
245
246// SetColumnSpacing is a wrapper around gtk_icon_view_set_column_spacing().
247func (v *IconView) SetColumnSpacing(columnSpacing int) {
248	C.gtk_icon_view_set_column_spacing(v.native(), C.gint(columnSpacing))
249}
250
251// GetColumnSpacing is a wrapper around gtk_icon_view_get_column_spacing().
252func (v *IconView) GetColumnSpacing() int {
253	return int(C.gtk_icon_view_get_column_spacing(v.native()))
254}
255
256// SetMargin is a wrapper around gtk_icon_view_set_margin().
257func (v *IconView) SetMargin(margin int) {
258	C.gtk_icon_view_set_margin(v.native(), C.gint(margin))
259}
260
261// GetMargin is a wrapper around gtk_icon_view_get_margin().
262func (v *IconView) GetMargin() int {
263	return int(C.gtk_icon_view_get_margin(v.native()))
264}
265
266// SetItemPadding is a wrapper around gtk_icon_view_set_item_padding().
267func (v *IconView) SetItemPadding(itemPadding int) {
268	C.gtk_icon_view_set_item_padding(v.native(), C.gint(itemPadding))
269}
270
271// GetItemPadding is a wrapper around gtk_icon_view_get_item_padding().
272func (v *IconView) GetItemPadding() int {
273	return int(C.gtk_icon_view_get_item_padding(v.native()))
274}
275
276// SetActivateOnSingleClick is a wrapper around gtk_icon_view_set_activate_on_single_click().
277func (v *IconView) SetActivateOnSingleClick(single bool) {
278	C.gtk_icon_view_set_activate_on_single_click(v.native(), gbool(single))
279}
280
281// ActivateOnSingleClick is a wrapper around gtk_icon_view_get_activate_on_single_click().
282func (v *IconView) ActivateOnSingleClick() bool {
283	return gobool(C.gtk_icon_view_get_activate_on_single_click(v.native()))
284}
285
286// GetCellRect is a wrapper around gtk_icon_view_get_cell_rect().
287func (v *IconView) GetCellRect(path *TreePath, cell *CellRenderer) *gdk.Rectangle {
288	var crect C.GdkRectangle
289
290	C.gtk_icon_view_get_cell_rect(v.native(), path.native(), cell.native(), &crect)
291
292	return gdk.WrapRectangle(uintptr(unsafe.Pointer(&crect)))
293}
294
295// SelectPath is a wrapper around gtk_icon_view_select_path().
296func (v *IconView) SelectPath(path *TreePath) {
297	C.gtk_icon_view_select_path(v.native(), path.native())
298}
299
300// UnselectPath is a wrapper around gtk_icon_view_unselect_path().
301func (v *IconView) UnselectPath(path *TreePath) {
302	C.gtk_icon_view_unselect_path(v.native(), path.native())
303}
304
305// PathIsSelected is a wrapper around gtk_icon_view_path_is_selected().
306func (v *IconView) PathIsSelected(path *TreePath) bool {
307	return gobool(C.gtk_icon_view_path_is_selected(v.native(), path.native()))
308}
309
310// GetSelectedItems is a wrapper around gtk_icon_view_unselect_path().
311func (v *IconView) GetSelectedItems() *glib.List {
312	clist := C.gtk_icon_view_get_selected_items(v.native())
313	if clist == nil {
314		return nil
315	}
316
317	glist := glib.WrapList(uintptr(unsafe.Pointer(clist)))
318	glist.DataWrapper(func(ptr unsafe.Pointer) interface{} {
319		return &TreePath{(*C.GtkTreePath)(ptr)}
320	})
321	runtime.SetFinalizer(glist, func(glist *glib.List) {
322		glist.FreeFull(func(item interface{}) {
323			path := item.(*TreePath)
324			C.gtk_tree_path_free(path.GtkTreePath)
325		})
326	})
327
328	return glist
329}
330
331// SelectAll is a wrapper around gtk_icon_view_select_all().
332func (v *IconView) SelectAll() {
333	C.gtk_icon_view_select_all(v.native())
334}
335
336// UnselectAll is a wrapper around gtk_icon_view_unselect_all().
337func (v *IconView) UnselectAll() {
338	C.gtk_icon_view_unselect_all(v.native())
339}
340
341// ItemActivated is a wrapper around gtk_icon_view_item_activated().
342func (v *IconView) ItemActivated(path *TreePath) {
343	C.gtk_icon_view_item_activated(v.native(), path.native())
344}
345
346// ScrollToPath is a wrapper around gtk_icon_view_scroll_to_path().
347func (v *IconView) ScrollToPath(path *TreePath, useAlign bool, rowAlign, colAlign float64) {
348	C.gtk_icon_view_scroll_to_path(v.native(), path.native(), gbool(useAlign),
349		C.gfloat(rowAlign), C.gfloat(colAlign))
350}
351
352// GetVisibleRange is a wrapper around gtk_icon_view_get_visible_range().
353func (v *IconView) GetVisibleRange() (*TreePath, *TreePath) {
354	var (
355		cpathStart, cpathEnd *C.GtkTreePath
356		pathStart, pathEnd   *TreePath
357	)
358
359	C.gtk_icon_view_get_visible_range(v.native(), &cpathStart, &cpathEnd)
360
361	if cpathStart != nil {
362		pathStart = &TreePath{cpathStart}
363		runtime.SetFinalizer(pathStart, (*TreePath).free)
364	}
365
366	if cpathEnd != nil {
367		pathEnd = &TreePath{cpathEnd}
368		runtime.SetFinalizer(pathEnd, (*TreePath).free)
369	}
370
371	return pathStart, pathEnd
372}
373
374// SetTooltipItem is a wrapper around gtk_icon_view_set_tooltip_item().
375func (v *IconView) SetTooltipItem(tooltip *Tooltip, path *TreePath) {
376	C.gtk_icon_view_set_tooltip_item(v.native(), tooltip.native(), path.native())
377}
378
379// SetTooltipCell is a wrapper around gtk_icon_view_set_tooltip_cell().
380func (v *IconView) SetTooltipCell(tooltip *Tooltip, path *TreePath, cell *CellRenderer) {
381	C.gtk_icon_view_set_tooltip_cell(v.native(), tooltip.native(), path.native(), cell.native())
382}
383
384// GetTooltipContext is a wrapper around gtk_icon_view_get_tooltip_context().
385func (v *IconView) GetTooltipContext(x, y int, keyboardTip bool) (*TreeModel, *TreePath, *TreeIter) {
386	var (
387		cmodel *C.GtkTreeModel
388		cpath  *C.GtkTreePath
389		citer  *C.GtkTreeIter
390		model  *TreeModel
391		path   *TreePath
392		iter   *TreeIter
393	)
394
395	px := C.gint(x)
396	py := C.gint(y)
397	if !gobool(C.gtk_icon_view_get_tooltip_context(v.native(),
398		&px,
399		&py,
400		gbool(keyboardTip),
401		&cmodel,
402		&cpath,
403		citer,
404	)) {
405		return nil, nil, nil
406	}
407
408	if cmodel != nil {
409		model = wrapTreeModel(glib.Take(unsafe.Pointer(cmodel)))
410	}
411
412	if cpath != nil {
413		path = &TreePath{cpath}
414		runtime.SetFinalizer(path, (*TreePath).free)
415	}
416
417	if citer != nil {
418		iter = &TreeIter{*citer}
419		runtime.SetFinalizer(iter, (*TreeIter).free)
420	}
421
422	return model, path, iter
423}
424
425// SetTooltipColumn is a wrapper around gtk_icon_view_set_tooltip_column().
426func (v *IconView) SetTooltipColumn(column int) {
427	C.gtk_icon_view_set_tooltip_column(v.native(), C.gint(column))
428}
429
430// GetTooltipColumn is a wrapper around gtk_icon_view_get_tooltip_column().
431func (v *IconView) GetTooltipColumn() int {
432	return int(C.gtk_icon_view_get_tooltip_column(v.native()))
433}
434
435// GetItemRow is a wrapper around gtk_icon_view_get_item_row().
436func (v *IconView) GetItemRow(path *TreePath) int {
437	return int(C.gtk_icon_view_get_item_row(v.native(), path.native()))
438}
439
440/*
441func (v *IconView) EnableModelDragSource() {}
442
443func (v *IconView) EnableModelDragDest() {}
444
445func (v *IconView) UnsetModelDragSource() {}
446
447func (v *IconView) UnsetModelDragDest() {}
448*/
449
450// SetReorderable is a wrapper around gtk_icon_view_set_reorderable().
451func (v *IconView) SetReorderable(reorderable bool) {
452	C.gtk_icon_view_set_reorderable(v.native(), gbool(reorderable))
453}
454
455// GetReorderable is a wrapper around gtk_icon_view_get_reorderable().
456func (v *IconView) GetReorderable() bool {
457	return gobool(C.gtk_icon_view_get_reorderable(v.native()))
458}
459
460/*
461func (v *IconView) SetDragDestItem() {}
462
463func (v *IconView) GetDragDestItem() {}
464
465func (v *IconView) GetDestItemAtPos() {}
466
467func (v *IconView) CreateDragIcon() {}
468*/
469