I'm struggling very hard on the GtkTreeView Widget with a GtkListStore model in order to create a ListView.
I have try many things but I can't add any row to the GtkListStore.
Thanks in advance.
StarBootics
Code: Select all
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Project name : Gtk List View Example
; File Name : Gtk List View Example.pb
; File version: 1.0.0
; Programming : Partially working
; Programmed by : StarBootics
; Date : 08-04-2022
; Last Update : 08-04-2022
; PureBasic code : V6.00 Beta 6
; Platform : Linux
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Programming Notes
;
; I can't figure out what I'm doing wrong. The columns are
; created but I can't add any row to the GtkListStore. See
; GtkListView -> AppendItem() method.
;
; There is some references tutorials I have found but they are
; not very useful.
;
; https://docs.gtk.org/gtk3/treeview-tutorial.html
; https://zetcode.com/gui/gtk2/gtktreeview/
;
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
DeclareModule GtkWindow
Interface Window
GetID.i()
GetPosition(*PosX, *PosY)
SetPosition(Position.i = #GTK_WIN_POS_NONE)
SetSize(Width.l, Height.l)
SetTitle(Title.s)
SetResizable(Resizable.i)
SetBorderWidth(BorderWidth.l)
SetTransientFor(*Parent)
SetKeepAbove(Setting.i)
Move(X.l, Y.l)
Show()
SignalConnect(SignalName.s, *CallBack, UserData.i)
AddWidget(*Widget)
Free()
EndInterface
Declare.i New()
EndDeclareModule
Module GtkWindow
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Déclaration de la Structure <<<<<
Structure Private_Members
VirtualTable.i
*WindowID
EndStructure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les observateurs <<<<<
Procedure.i GetID(*This.Private_Members)
ProcedureReturn *This\WindowID
EndProcedure
Procedure GetPosition(*This.Private_Members, *PosX, *PosY)
gtk_window_get_position_(*This\WindowID, *PosX, *PosY)
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les mutateurs <<<<<
Procedure SetPosition(*This.Private_Members, Position.i = #GTK_WIN_POS_NONE)
gtk_window_set_position_(*This\WindowID, Position)
EndProcedure
Procedure SetSize(*This.Private_Members, Width.l, Height.l)
gtk_window_set_default_size_(*This\WindowID, Width, Height)
EndProcedure
Procedure SetTitle(*This.Private_Members, Title.s)
gtk_window_set_title_(*This\WindowID, Title)
EndProcedure
Procedure SetResizable(*This.Private_Members, Resizable.i)
gtk_window_set_resizable_(*This\WindowID, Resizable)
EndProcedure
Procedure SetBorderWidth(*This.Private_Members, BorderWidth.l)
gtk_container_set_border_width_(*This\WindowID, BorderWidth)
EndProcedure
Procedure SetTransientFor(*This.Private_Members, *Parent)
gtk_window_set_transient_for_(*This\WindowID, *Parent)
EndProcedure
Procedure SetKeepAbove(*This.Private_Members, Setting.i)
gtk_window_set_keep_above_(*This\WindowID, Setting)
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Move <<<<<
Procedure Move(*This.Private_Members, X.l, Y.l)
gtk_window_move_(*This\WindowID, X, Y)
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Show <<<<<
Procedure Show(*This.Private_Members)
gtk_widget_show_all_(*This\WindowID)
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Nom de la procédure <<<<<
Procedure SignalConnect(*This.Private_Members, SignalName.s, *CallBack, UserData.i)
g_signal_connect_(*This\WindowID, SignalName, *CallBack, UserData)
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Nom de la procédure <<<<<
Procedure AddWidget(*This.Private_Members, *Widget)
gtk_container_add_(*This\WindowID, *Widget)
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Le Destructeur <<<<<
Procedure Free(*This.Private_Members)
FreeStructure(*This)
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Le Constructeur <<<<<
Procedure.i New()
*This.Private_Members = AllocateStructure(Private_Members)
*This\VirtualTable = ?START_METHODS
*This\WindowID = gtk_window_new_(#GTK_WINDOW_TOPLEVEL)
ProcedureReturn *This
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les entrées de la table virtuelle <<<<<
DataSection
START_METHODS:
Data.i @GetID()
Data.i @GetPosition()
Data.i @SetPosition()
Data.i @SetSize()
Data.i @SetTitle()
Data.i @SetResizable()
Data.i @SetBorderWidth()
Data.i @SetTransientFor()
Data.i @SetKeepAbove()
Data.i @Move()
Data.i @Show()
Data.i @SignalConnect()
Data.i @AddWidget()
Data.i @Free()
END_METHODS:
EndDataSection
EndModule
DeclareModule GtkListView
Interface ListView
GetID.i()
AppendItem(Definition.s)
Free()
EndInterface
Declare.i New(ColumnNames.s)
EndDeclareModule
Module GtkListView
ImportC ""
gtk_tree_view_set_grid_lines(*Widget, Flag.i)
EndImport
Macro G_TYPE_MAKE_FUNDAMENTAL(x)
x << 2
EndMacro
#G_TYPE_INVALID = G_TYPE_MAKE_FUNDAMENTAL(0)
#G_TYPE_NONE = G_TYPE_MAKE_FUNDAMENTAL(1)
#G_TYPE_INTERFACE = G_TYPE_MAKE_FUNDAMENTAL(2)
#G_TYPE_CHAR = G_TYPE_MAKE_FUNDAMENTAL(3)
#G_TYPE_UCHAR = G_TYPE_MAKE_FUNDAMENTAL(4)
#G_TYPE_BOOLEAN = G_TYPE_MAKE_FUNDAMENTAL(5)
#G_TYPE_INT = G_TYPE_MAKE_FUNDAMENTAL(6)
#G_TYPE_UINT = G_TYPE_MAKE_FUNDAMENTAL(7)
#G_TYPE_LONG = G_TYPE_MAKE_FUNDAMENTAL(8)
#G_TYPE_ULONG = G_TYPE_MAKE_FUNDAMENTAL(9)
#G_TYPE_INT64 = G_TYPE_MAKE_FUNDAMENTAL(10)
#G_TYPE_UINT64 = G_TYPE_MAKE_FUNDAMENTAL(11)
#G_TYPE_ENUM = G_TYPE_MAKE_FUNDAMENTAL(12)
#G_TYPE_FLAGS = G_TYPE_MAKE_FUNDAMENTAL(13)
#G_TYPE_FLOAT = G_TYPE_MAKE_FUNDAMENTAL(14)
#G_TYPE_DOUBLE = G_TYPE_MAKE_FUNDAMENTAL(15)
#G_TYPE_STRING = G_TYPE_MAKE_FUNDAMENTAL(16)
#G_TYPE_POINTER = G_TYPE_MAKE_FUNDAMENTAL(17)
#G_TYPE_BOXED = G_TYPE_MAKE_FUNDAMENTAL(18)
#G_TYPE_PARAM = G_TYPE_MAKE_FUNDAMENTAL(19)
#G_TYPE_OBJECT = G_TYPE_MAKE_FUNDAMENTAL(20)
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Déclaration des Structures <<<<<
Structure Private_Members
VirtualTable.i
*ListViewID
*ScrolledWindowID
EndStructure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les observateurs <<<<<
Procedure.i GetID(*This.Private_Members)
ProcedureReturn *This\ScrolledWindowID
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur AppendColumn <<<<<
Procedure AppendItem(*This.Private_Members, Definition.s)
Protected Iter.GtkTreeIter, Value.GValue
*ListStore = gtk_tree_view_get_model_(*This\ListViewID)
gtk_list_store_append_(*ListStore, @Iter)
; Debug Iter\stamp
; Debug Iter\user_data
; Debug Iter\user_data2
; Debug Iter\user_data3
; Debug Iter\stamp
; gtk_list_store_insert_(*ListStore, @Iter, -1)
; Debug Iter\stamp
ColumnMax.l = CountString(Definition, Chr(10))
For ColumnID = 0 To ColumnMax
CellValue.s = StringField(Definition, ColumnID+1, Chr(10))
g_value_set_string_(@Value, CellValue)
gtk_list_store_set_value_(*ListStore, Iter, ColumnID, @Value)
Next
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Le Destructeur <<<<<
Procedure Free(*This.Private_Members)
FreeStructure(*This)
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Le Constructeur <<<<<
Procedure.i New(ColumnNames.s)
*This.Private_Members = AllocateStructure(Private_Members)
*This\VirtualTable = ?START_METHODS
*This\ScrolledWindowID = gtk_scrolled_window_new_(#Null, #Null)
gtk_scrolled_window_set_shadow_type_(*This\ScrolledWindowID, #GTK_SHADOW_IN)
*This\ListViewID = gtk_tree_view_new_()
gtk_container_add_(*This\ScrolledWindowID, *This\ListViewID)
ColumnMax.l = CountString(ColumnNames, Chr(10))
*GTYPE = AllocateMemory((ColumnMax+1) * SizeOf(Integer))
FillMemory(*GTYPE, (ColumnMax+1) * SizeOf(Integer), #G_TYPE_STRING, #PB_Integer)
; *Cursor = *GTYPE
For ColumnID = 0 To ColumnMax
*CellRenderer = gtk_cell_renderer_text_new_()
*TreeViewColumnID = gtk_tree_view_column_new_()
gtk_tree_view_column_add_attribute_(*TreeViewColumnID, *CellRenderer, "text", ColumnID)
gtk_tree_view_append_column_(*This\ListViewID, *TreeViewColumnID)
gtk_tree_view_column_set_title_(*TreeViewColumnID, StringField(ColumnNames, ColumnID+1, Chr(10)))
gtk_tree_view_append_column_(*This\ListViewID, *TreeViewColumnID)
; Debug Str(PeekI(*Cursor)) + " vs #G_TYPE_STRING (" + Str(#G_TYPE_STRING) + ")"
; *Cursor + SizeOf(Integer)
Next
*ListStore = gtk_list_store_newv_(ColumnMax, *GTYPE)
FreeMemory(*GTYPE)
gtk_tree_view_set_model_(*This\ListViewID, *ListStore)
g_object_unref_(*ListStore)
; gtk_tree_view_set_headers_clickable_(*This\ListViewID, #True)
; gtk_tree_view_columns_autosize_(*This\ListViewID)
gtk_tree_view_set_grid_lines(*This\ListViewID, 3)
ProcedureReturn *This
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les entrées de la table virtuelle <<<<<
DataSection
START_METHODS:
Data.i @GetID()
Data.i @AppendItem()
Data.i @Free()
END_METHODS:
EndDataSection
EndModule
CompilerIf #PB_Compiler_IsMainFile
ProcedureC WindowDeleteEventHandler(*Widget.GtkWidget, *Event.GdkEventAny, UserData.I)
;Debug "WindowDeleteEventHandler"
gtk_window_get_position_(*Widget, @X.l, @Y.l)
;Debug "Position (x,y) = (" + Str(X) + "," + Str(Y) + ")"
EndProcedure
ProcedureC WindowCloseHandler(*Widget.GtkWidget, *Event.GdkEventAny, UserData.I)
;Debug "WindowCloseHandler"
gtk_window_get_position_(*Widget, @X.l, @Y.l)
;Debug "Position (x,y) = (" + Str(X) + "," + Str(Y) + ")"
gtk_main_quit_()
EndProcedure
gtk_init_(0, 0)
MainWin.GtkWindow::Window = GtkWindow::New()
MainWin\SetSize(400, 300)
MainWin\SetTitle("GtkListView Example")
MainWin\SetPosition(#GTK_WIN_POS_CENTER)
MainWin\SetResizable(#False)
MainWin\SetBorderWidth(5)
MainWin\SignalConnect("delete-event", @WindowDeleteEventHandler(), 25)
MainWin\SignalConnect("destroy", @WindowCloseHandler(), 0)
ListView.GtkListView::ListView = GtkListView::New("File Name" + Chr(10) + "Status")
ListView\AppendItem("Vector2f - OOP.pb" + Chr(10) + "OK")
ListView\AppendItem("Vector3f - OOP.pb" + Chr(10) + "OK")
ListView\AppendItem("Vector4f - OOP.pb" + Chr(10) + "OK")
MainWin\AddWidget(ListView\GetID())
MainWin\Show()
gtk_main_()
MainWin\Free()
CompilerEndIf
; <<<<<<<<<<<<<<<<<<<<<<<
; <<<<< END OF FILE <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<