
hab das mal bißchen zusammen gebuttert:
Code: Alles auswählen
ImportC ""
g_object_set_double(*Object, Property.p-ascii, Value.d, NULL) As "g_object_set"
EndImport
;EnableExplicit
#G_TYPE_BOOLEAN = 5 << 2
#G_TYPE_STRING = 16 << 2
#NumColumns = 5
#Obstarten = "Loeschen+Zurueck+Absender+Betreff+Nachricht"
Structure RendererEntry
Pointer.I
Column.I
EndStructure
NewList ToggleRenderer.RendererEntry()
Define CellText.GValue
Define CheckBoxState.GValue
Define Column.I
Define i.I
Define Info.S
Define j.I
Define *ListStore.GtkListStore
Define NumRows.I
Define *ScrolledWindow.GtkScrolledWindow
Define TreeIter.GtkTreeIter
Define *TreeView.GtkTreeView
Define *TypeList.I
Define *VBox.GtkVBox
Define *Window.GtkWindow
Define *CellRenderers
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(TextList.S)
Shared *ListStore.GtkListStore
Shared NumRows.I
Protected CellText.GValue
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(TextList, "+") + 1
Text = StringField(TextList, i, "+")
CellText\data\v_pointer = @Text
gtk_list_store_set_value_(*ListStore, @TreeIter, i * 2 - 1+4, @CellText)
Next i
NumRows + 1
EndProcedure
Procedure SetColumnAlign(tree_view, Column, Alignment.d)
Protected *Column2, *CellRenderers2, Count, Index
*Column2 = gtk_tree_view_get_column_(tree_view, Column)
If *Column2
; This only aligns the title text
gtk_tree_view_column_set_alignment_(*Column2, Alignment)
; Align the text renderers as well
*CellRenderers2 = gtk_tree_view_column_get_cell_renderers_(*Column2)
If *CellRenderers2
Count = g_list_length_(*CellRenderers2)
For Index = 0 To Count-1
g_object_set_double(g_list_nth_data_(*CellRenderers2, Index), "xalign", Alignment, #Null)
Next Index
g_list_free_(*CellRenderers2)
EndIf
EndIf
EndProcedure
ProcedureC AddColumn(Column.I, Header.S)
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 Column < 2
*CellRenderer = gtk_cell_renderer_toggle_new_()
gtk_tree_view_column_pack_start_(*Column, *CellRenderer, #False)
gtk_tree_view_column_add_attribute_(*Column, *CellRenderer, "active", Column * 2)
g_signal_connect_data_(*CellRenderer, "toggled", @OnCheckBoxToggled(), *TreeModel, 0, 0)
AddElement(ToggleRenderer())
ToggleRenderer()\Pointer = *CellRenderer
ToggleRenderer()\Column = Column * 2
EndIf
*CellRenderer = gtk_cell_renderer_text_new_()
gtk_tree_view_column_set_title_(*Column, Header)
gtk_tree_view_column_pack_start_(*Column, *CellRenderer, #False)
If Column > 1
gtk_tree_view_column_add_attribute_(*Column, *CellRenderer, "text", Column * 2 + 1)
EndIf
gtk_tree_view_append_column_(*TreeView, *Column)
SetColumnAlign(*TreeView,Column,0.5)
EndProcedure
; ----- Variablentyp-Liste für die einzelnen Spalten anlegen (2 pro Spalte)
*TypeList = AllocateMemory(#NumColumns * 2 * SizeOf(Integer))
For i = 0 To #NumColumns - 1
PokeI(*TypeList + SizeOf(Integer) * i * 2, #G_TYPE_BOOLEAN)
PokeI(*TypeList + SizeOf(Integer) * i * 2 + SizeOf(Integer), #G_TYPE_STRING)
Next i
; ----- ListStore anlegen und mit Werten füllen
*ListStore = gtk_list_store_newv_(#NumColumns * 2, *TypeList)
FreeMemory(*TypeList)
AddRow("Kirschen+Aepfel+Johannisbeeren")
AddRow("Pflaumen+Birnen+Stachelbeeren")
AddRow("Nektarinen+Quitten+Heidelbeeren")
; ----- TreeView anlegen
*TreeView = gtk_tree_view_new_with_model_(*ListStore)
g_object_unref_(*ListStore)
; ----- Spalten anlegen
For i = 0 To #NumColumns - 1
AddColumn(i, StringField(#Obstarten, i + 1, "+"))
Next i
; ----- Fenster öffnen und ButtonGadget definieren
OpenWindow(0, 0, 0, 800, 600, "Auswahl von Obstsorten", #PB_Window_ScreenCentered)
ButtonGadget(1, 75, 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
For j = 0 To #NumColumns - 1
Info + "- " + StringField(#Obstarten, j + 1, "+") + " -" + #CR$
For i = 0 To NumRows - 1
If gtk_tree_model_get_iter_from_string_(*ListStore, @TreeIter, Str(i))
gtk_tree_model_get_value_(*ListStore, @TreeIter, j * 2, @CheckBoxState)
gtk_tree_model_get_value_(*ListStore, @TreeIter, j * 2 + 1, @CellText)
If CheckBoxState\data\v_long
Info + PeekS(CellText\data\v_pointer) + ": ja" + #CR$
Else
Info + PeekS(CellText\data\v_pointer) + ": nein" + #CR$
EndIf
g_value_unset_(@CheckBoxState)
g_value_unset_(@CellText)
EndIf
Next i
Info + #CR$
Next j
MessageRequester("Auswahl", Info)
die Checkboxabfrage wird noch nicht funktionieren!