Re: Sammlung beliebter API-Calls
Verfasst: 03.03.2010 22:48
				
				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)