Für das obige Resultat habe ich mein Beispiel etwas abgewandelt. Mit der neuen Konstante
#ColumnsWithCheckBox kann jetzt über eine Zeichenkette festgelegt werden, welche Spalte
eine CheckBox enthalten soll. Ein Pluszeichen bedeutet, daß die zugehörige Spalte eine
CheckBox enthalten wird, ein Minuszeichen dagegen, daß die Spalte nicht mit einer CheckBox
ausgestattet wird. Die Zeichenkette "++--" bedeutet also, daß nur die Spalten 1 und 2 eine
CheckBox erhalten werden.
Code: Alles auswählen
EnableExplicit
#G_TYPE_BOOLEAN = 5 << 2
#G_TYPE_STRING = 16 << 2
#NumColumns = 4
#NumRows = 3
#ColumnsWithCheckBox = "++--"
Structure RendererEntry
Pointer.I
Column.I
EndStructure
NewList ToggleRenderer.RendererEntry()
Define CellText.GValue
Define CheckBoxState.GValue
Define Column.I
Define ColumnCount.I
Define Info.S
Define *ListStore.GtkListStore
Define Row.I
Define RowContent.S
Define *ScrolledWindow.GtkScrolledWindow
Define TreeIter.GtkTreeIter
Define *TreeView.GtkTreeView
Define *TypeList.I
Define *VBox.GtkVBox
Define *Window.GtkWindow
ProcedureC OnCheckBoxToggled(*ToggleRenderer, *TreePathString, *ListStore.GtkListStore)
Shared ToggleRenderer.RendererEntry()
Protected CheckBoxState.GValue
Protected Column.I
Protected TreeIter.GtkTreeIter
Protected *TreePath
ForEach ToggleRenderer()
If ToggleRenderer()\Pointer = *ToggleRenderer
Column = ToggleRenderer()\Column
Break
EndIf
Next
*TreePath = gtk_tree_path_new_from_string_(*TreePathString)
If *TreePath
If gtk_tree_model_get_iter_(*ListStore, @TreeIter, *TreePath)
gtk_tree_model_get_value_(*ListStore, @TreeIter, Column, @CheckBoxState)
CheckBoxState\data\v_long = CheckBoxState\data\v_long ! 1
gtk_list_store_set_value_(*ListStore, @TreeIter, Column, @CheckBoxState)
g_value_unset_(@CheckBoxState)
EndIf
gtk_tree_path_free_(*TreePath)
EndIf
EndProcedure
ProcedureC AddRow(RowContent.S)
Shared *ListStore.GtkListStore
Protected CellText.GValue
Protected ColumnCount.I
Protected i.I
Protected Text.S
Protected TreeIter.GtkTreeIter
CellText\g_type = #G_TYPE_STRING
gtk_list_store_append_(*ListStore, @TreeIter)
For i = 1 To CountString(RowContent, "+") + 1
Text = StringField(RowContent, i, "+")
CellText\data\v_pointer = @Text
If Mid(#ColumnsWithCheckBox, i, 1) = "+"
ColumnCount + 1
EndIf
gtk_list_store_set_value_(*ListStore, @TreeIter, ColumnCount, @CellText)
ColumnCount + 1
Next i
EndProcedure
ProcedureC AddColumn(Column.I, Header.S)
Shared ColumnCount.I
Shared ToggleRenderer.RendererEntry()
Shared *TreeView.GtkTreeView
Protected *CellRenderer.GtkCellRenderer
Protected *Column.GtkTreeViewColumn
Protected *TreeModel
*TreeModel = gtk_tree_view_get_model_(*TreeView)
*Column = gtk_tree_view_column_new_()
If Mid(#ColumnsWithCheckBox, Column + 1, 1) = "+"
*CellRenderer = gtk_cell_renderer_toggle_new_()
gtk_tree_view_column_pack_start_(*Column, *CellRenderer, #False)
gtk_tree_view_column_add_attribute_(*Column, *CellRenderer, "active", ColumnCount)
g_signal_connect_data_(*CellRenderer, "toggled", @OnCheckBoxToggled(), *TreeModel, 0, 0)
AddElement(ToggleRenderer())
ToggleRenderer()\Pointer = *CellRenderer
ToggleRenderer()\Column = ColumnCount
ColumnCount + 1
EndIf
*CellRenderer = gtk_cell_renderer_text_new_()
gtk_tree_view_column_set_title_(*Column, Header)
gtk_tree_view_column_pack_start_(*Column, *CellRenderer, #False)
gtk_tree_view_column_add_attribute_(*Column, *CellRenderer, "text", ColumnCount)
gtk_tree_view_append_column_(*TreeView, *Column)
ColumnCount + 1
EndProcedure
; ----- Variablentyp-Liste für die einzelnen Spalten anlegen
*TypeList = AllocateMemory(#NumColumns * 2 * SizeOf(Integer))
For Column = 1 To #NumColumns
If Mid(#ColumnsWithCheckBox, Column, 1) = "+"
PokeI(*TypeList + SizeOf(Integer) * ColumnCount, #G_TYPE_BOOLEAN)
ColumnCount + 1
EndIf
PokeI(*TypeList + SizeOf(Integer) * ColumnCount, #G_TYPE_STRING)
ColumnCount + 1
Next Column
; ----- ListStore anlegen und mit Werten füllen
*ListStore = gtk_list_store_newv_(ColumnCount, *TypeList)
FreeMemory(*TypeList)
For Row = 1 To #NumRows
RowContent = ""
For Column = 1 To #NumColumns
RowContent + "Z" + Str(Row) + "S" + Str(Column)
If Column < #NumColumns
RowContent + "+"
EndIf
Next Column
AddRow(RowContent)
Next Row
; ----- TreeView anlegen
*TreeView = gtk_tree_view_new_with_model_(*ListStore)
g_object_unref_(*ListStore)
; ----- Spalten anlegen
ColumnCount = 0
For Column = 0 To #NumColumns - 1
AddColumn(Column, "Spalte " + Str(Column + 1))
Next Column
; ----- Fenster öffnen und ButtonGadget definieren
OpenWindow(0, 0, 0, 270, 145, "Spalte 1 + 2 mit Checkbox", #PB_Window_ScreenCentered)
ButtonGadget(1, 55, 10, 150, 23, "Auswahl anzeigen") ; y = 10 ist der vertikale Abstand zum
; TreeView, nicht die y-Position innerhalb
; des Fensters !
; ----- TreeView in PureBASIC-Fenster integrieren und anzeigen
*Window = WindowID(0)
*VBox = *Window\bin\child ; Von PureBASIC angelegte GtkVBox ermitteln
*ScrolledWindow = gtk_scrolled_window_new_(0, 0) ; Neues GtkScrolledWindow anlegen
gtk_scrolled_window_set_shadow_type_(*ScrolledWindow, #GTK_SHADOW_IN) ; Umrandungs-Stil des GtkScrolledWindow
; festlegen
gtk_scrolled_window_set_policy_(*ScrolledWindow, #GTK_POLICY_AUTOMATIC, #GTK_POLICY_AUTOMATIC) ; Scroll-Balken
; ausblenden, wenn kein Scrolling benötigt
; wird
gtk_widget_set_size_request_(*ScrolledWindow, WindowWidth(0) - 10, 86) ; ScrolledWindow auf feste Größe setzen
gtk_box_pack_start_(*VBox, *ScrolledWindow, #True, #True, 0) ; GtkScrolledWindow in GtkVBox einfügen
gtk_box_reorder_child_(*VBox, *ScrolledWindow, 0) ; GtkScrolledWindow an die 1.Position der
; Gadgets innerhalb der GtkVBox setzen und
; damit an den oberen Rand des Fensters
gtk_container_add_(*ScrolledWindow, *TreeView) ; TreeView in GtkScrolledWindow einfügen
gtk_container_set_border_width_(*Window, 5) ; Umrandungsbreite des Containers festlegen
gtk_widget_show_all_(*Window) ; Alle Gadgets im Fenster sichtbar machen
Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
If EventGadget() = 1
Break
EndIf
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
; ----- Zell-Inhalte und CheckBox-Stati auslesen und anzeigen
ColumnCount = 0
For Column = 0 To #NumColumns - 1
Info + "- Spalte " + Str(Column + 1) + " -" + #CR$
If Mid(#ColumnsWithCheckBox, Column + 1, 1) = "+"
ColumnCount + 1
EndIf
For Row = 0 To #NumRows - 1
If gtk_tree_model_get_iter_from_string_(*ListStore, @TreeIter, Str(Row))
gtk_tree_model_get_value_(*ListStore, @TreeIter, ColumnCount, @CellText)
Info + PeekS(CellText\data\v_pointer)
If Mid(#ColumnsWithCheckBox, Column + 1, 1) = "+"
gtk_tree_model_get_value_(*ListStore, @TreeIter, ColumnCount - 1, @CheckBoxState)
If CheckBoxState\data\v_long
Info + ": ja"
Else
Info + ": nein"
EndIf
g_value_unset_(@CheckBoxState)
EndIf
g_value_unset_(@CellText)
Info + #CR$
EndIf
Next Row
ColumnCount + 1
Info + #CR$
Next Column
MessageRequester("Auswahl", Info)