Sammlung beliebter API-Calls

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Re: Sammlung beliebter API-Calls

Beitrag von Shardik »

Bild

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)
Benutzeravatar
kayfr72
Beiträge: 130
Registriert: 12.09.2004 19:13
Wohnort: Lehrberg

Re: Sammlung beliebter API-Calls

Beitrag von kayfr72 »

Ok habs geschnallt. Hab noch ein Problem. Bei mir steht die Checkbox allein in einer Zelle. Ich würde sie gern in die Mitte der Zelle haben wollen(center). Mit dem Text funktioniert mit einen Beispiel vom englischen Forum, aber die Checkbox weigert sich eisern in die Mitte zu rutschen. Wie geht das? Sorry ist die letzte Frage dann hab ich mein Grundgerüst zusammen,denke ich. :mrgreen: Ich buttle mich schon durch die Linux Programmierung!
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!
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Re: Sammlung beliebter API-Calls

Beitrag von Shardik »

kayfr72 hat geschrieben:die Checkboxabfrage wird noch nicht funktionieren!
Jetzt schon... :wink:
Ich habe noch eine Menge Fehler beseitigt und Dein Beispiel läuft jetzt ganz rund.
Leider habe ich das Zentrieren der CheckBox noch nicht hinbekommen und ich weiß
auch nicht, ob es überhaupt funktioniert. Ich habe freaks Prozedur übrigens heraus-
genommen, weil sie zum Zentrieren der CheckBoxes überhaupt nicht nötig ist, denn
Du hast die CellRenderer der CheckBoxes ja in der LinkedList ToggleRenderer()
gespeichert und kannst sie in einer ForEach..Next-Schleife aufrufen und mit
g_object_set_double() "traktieren" (ich habe dies vor der Repeat..Until-Schleife
versucht), aber es nutzt leider nichts. Mit den Text-Spalten funktioniert es übrigens
einwandfrei (sowohl mit meiner "abgespeckten" Version als auch mit freaks
SetColumnAlign()-Aufruf, bei der das Zentrieren der CheckBoxes ebenfalls nicht klappen
will)... /:->

Code: Alles auswählen

EnableExplicit

ImportC ""
  g_object_set_double(*Object, Property.p-ascii, Value.d, NULL) As "g_object_set"
EndImport

#G_TYPE_BOOLEAN = 5 << 2
#G_TYPE_STRING = 16 << 2

#NumColumns = 5
#ColumnHeader = "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 + 1, @CellText)
  Next i

  NumRows + 1
EndProcedure

ProcedureC AddColumn(Column.I, Header.S, CheckBoxMode.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_()
  gtk_tree_view_column_set_title_(*Column, Header)

  If CheckBoxMode
    *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)
    g_signal_connect_data_(*CellRenderer, "toggled", @OnCheckBoxToggled(), *TreeModel, 0, 0)

    AddElement(ToggleRenderer())
    ToggleRenderer()\Pointer = *CellRenderer
    ToggleRenderer()\Column = Column
  Else
    *CellRenderer = gtk_cell_renderer_text_new_()
    gtk_tree_view_column_pack_start_(*Column, *CellRenderer, #False)
    gtk_tree_view_column_add_attribute_(*Column, *CellRenderer, "text", Column)
  EndIf

  gtk_tree_view_append_column_(*TreeView, *Column)
EndProcedure

; ----- Variablentyp-Liste für die einzelnen Spalten anlegen (2 pro Spalte)

*TypeList = AllocateMemory(#NumColumns * SizeOf(Integer))

For i = 0 To #NumColumns - 1
  If i < 2
    PokeI(*TypeList + SizeOf(Integer) * i, #G_TYPE_BOOLEAN)
  Else
    PokeI(*TypeList + SizeOf(Integer) * i, #G_TYPE_STRING)
  EndIf
Next i

; ----- ListStore anlegen und mit Werten füllen

*ListStore = gtk_list_store_newv_(#NumColumns, *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
  If i < 2
    AddColumn(i, StringField(#ColumnHeader, i + 1, "+"), #True)
  Else
    AddColumn(i, StringField(#ColumnHeader, i + 1, "+"), #False)
  EndIf
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

ForEach ToggleRenderer()
  g_object_set_double(ToggleRenderer()\Pointer, "xalign", 0.5, 0)
Next

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(#ColumnHeader, j + 1, "+") + " -" + #CR$

  For i = 0 To NumRows - 1
    If gtk_tree_model_get_iter_from_string_(*ListStore, @TreeIter, Str(i))
      If j < 2
        gtk_tree_model_get_value_(*ListStore, @TreeIter, j, @CheckBoxState)

        If CheckBoxState\data\v_long
          Info + "ja" + #CR$
        Else
          Info + "nein" + #CR$
        EndIf

        g_value_unset_(@CheckBoxState)
      Else
        gtk_tree_model_get_value_(*ListStore, @TreeIter, j, @CellText)
        Info + PeekS(CellText\data\v_pointer) + #CR$
        g_value_unset_(@CellText)
      EndIf
    EndIf
  Next i

  Info + #CR$
Next j

MessageRequester("Auswahl", Info)
Benutzeravatar
kayfr72
Beiträge: 130
Registriert: 12.09.2004 19:13
Wohnort: Lehrberg

Re: Sammlung beliebter API-Calls

Beitrag von kayfr72 »

he, super und jetzt beantragen wir eine seperate Rubrik hier im Forum "GTK und SDL-Programmierung unter Linux" :bounce: Wer ist da der Ansprechpartner hier? :lol: Jetz kann ich endlich die Funktionen des Programms dazu klöppeln.

Nochwas @Shardik: Wie bestimme ich die Spaltenweite, wenn der Text länger ist und er vorher abschneiden soll. Betreff-Text oder Nachrichten-Text zu lang sind?

Edit:
funktioniert doch mit Zentrieren der Checkboxen. Ändere mal in..

Code: Alles auswählen

*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)
    
   gtk_cell_renderer_set_fixed_size_(*CellRenderer,50,0);Diesen ändern


dann gehts.
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Re: Sammlung beliebter API-Calls

Beitrag von Shardik »

kayfr72 hat geschrieben:Edit:
funktioniert doch mit Zentrieren der Checkboxen. Ändere mal in..
Das stimmt, allerdings werden dann die CheckBoxes in allen CheckBox-Spalten auf
den gleichen festen Abstand zum linken Rand der Spalte gesetzt. Da die beiden Spalten
aber unterschiedlich breit sind, empfiehlt es sich, den (wirkungslosen) Block in meinem
letzten Posting

Code: Alles auswählen

ForEach ToggleRenderer()
  g_object_set_double(ToggleRenderer()\Pointer, "xalign", 0.5, 0)
Next
durch diesen Block zu ersetzen, der den Abstand der CheckBoxes in den CheckBox-Spalten
vom linken Rand separat einstellt:

Code: Alles auswählen

FirstElement(ToggleRenderer())
gtk_cell_renderer_set_fixed_size_(ToggleRenderer()\Pointer, 70, 15)
NextElement(ToggleRenderer())
gtk_cell_renderer_set_fixed_size_(ToggleRenderer()\Pointer, 60, 15)
Ebenso kann dann der ImportC..EndImport-Block am Anfang gelöscht werden.
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Re: Sammlung beliebter API-Calls

Beitrag von Shardik »

kayfr72 hat geschrieben:Nochwas @Shardik: Wie bestimme ich die Spaltenweite, wenn der Text länger ist und er vorher abschneiden soll. Betreff-Text oder Nachrichten-Text zu lang sind?
Die Spaltenbreite von Textspalten kann ebenfalls mit gtk_cell_renderer_set_fixed_size_()
festgelegt werden. Allerdings ist dann ein Abschneiden von zu langen Texten nicht
möglich, da die Zelleninhalte mit AddRow() ja schon in den ListStore geschrieben
werden, bevor der TreeView angelegt und die Spalten definiert werden. Die Spaltenbreite
wird dann immer automatisch durch den längsten Eintrag bestimmt. Mit
gtk_cell_renderer_set_fixed_size_() kann man die Spaltenbreite in dem Beispiel lediglich
verbreitern, aber nicht so verkürzen, daß ein Eintrag abgeschnitten wird.

Der Vorgehensweise zum tatsächlichen Abschneiden von Zell-Einträgen besteht darin, in
der Prozedur AddColumn() vor dem Erstellen eines CellRenderer für Text-Spalten den Typ
der Spalte auf FIXED zu setzen und dann die Spaltenbreite vorzugeben:

Code: Alles auswählen

gtk_tree_view_column_set_sizing_(*Column, #GTK_TREE_VIEW_COLUMN_FIXED)
gtk_tree_view_column_set_fixed_width_(*Column, 40)
Hier ist noch einmal der komplette Code des von mir modifizierten Beispiels von kayfr72:

Code: Alles auswählen

EnableExplicit

#G_TYPE_BOOLEAN = 5 << 2
#G_TYPE_STRING = 16 << 2

#NumColumns = 5
#ColumnHeader = "Loeschen+Zurueck+Absender+Betreff+Nachricht"

Structure RendererEntry
  Pointer.I
  Column.I
EndStructure

NewList ToggleRenderer.RendererEntry()

Define *CellRenderer.GtkCellRendererToggle
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

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 + 1, @CellText)
  Next i

  NumRows + 1
EndProcedure

ProcedureC AddColumn(Column.I, Header.S, CheckBoxMode.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_()
  gtk_tree_view_column_set_title_(*Column, Header)

  If CheckBoxMode
    *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)
    g_signal_connect_data_(*CellRenderer, "toggled", @OnCheckBoxToggled(), *TreeModel, 0, 0)

    AddElement(ToggleRenderer())
    ToggleRenderer()\Pointer = *CellRenderer
    ToggleRenderer()\Column = Column
  Else
    gtk_tree_view_column_set_sizing_(*Column, #GTK_TREE_VIEW_COLUMN_FIXED)
    gtk_tree_view_column_set_fixed_width_(*Column, 40)
    *CellRenderer = gtk_cell_renderer_text_new_()
    gtk_tree_view_column_pack_start_(*Column, *CellRenderer, #False)
    gtk_tree_view_column_add_attribute_(*Column, *CellRenderer, "text", Column)
  EndIf

  gtk_tree_view_append_column_(*TreeView, *Column)
EndProcedure

; ----- Variablentyp-Liste für die einzelnen Spalten anlegen (2 pro Spalte)

*TypeList = AllocateMemory(#NumColumns * SizeOf(Integer))

For i = 0 To #NumColumns - 1
  If i < 2
    PokeI(*TypeList + SizeOf(Integer) * i, #G_TYPE_BOOLEAN)
  Else
    PokeI(*TypeList + SizeOf(Integer) * i, #G_TYPE_STRING)
  EndIf
Next i

; ----- ListStore anlegen und mit Werten füllen

*ListStore = gtk_list_store_newv_(#NumColumns, *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
  If i < 2
    AddColumn(i, StringField(#ColumnHeader, i + 1, "+"), #True)
  Else
    AddColumn(i, StringField(#ColumnHeader, i + 1, "+"), #False)
  EndIf
Next i

; ----- Fenster öffnen und ButtonGadget definieren

OpenWindow(0, 0, 0, 272, 145, "Auswahl von Obstsorten", #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

FirstElement(ToggleRenderer())
gtk_cell_renderer_set_fixed_size_(ToggleRenderer()\Pointer, 70, 15)
NextElement(ToggleRenderer())
gtk_cell_renderer_set_fixed_size_(ToggleRenderer()\Pointer, 60, 15)

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(#ColumnHeader, j + 1, "+") + " -" + #CR$

  For i = 0 To NumRows - 1
    If gtk_tree_model_get_iter_from_string_(*ListStore, @TreeIter, Str(i))
      If j < 2
        gtk_tree_model_get_value_(*ListStore, @TreeIter, j, @CheckBoxState)

        If CheckBoxState\data\v_long
          Info + "ja" + #CR$
        Else
          Info + "nein" + #CR$
        EndIf

        g_value_unset_(@CheckBoxState)
      Else
        gtk_tree_model_get_value_(*ListStore, @TreeIter, j, @CellText)
        Info + PeekS(CellText\data\v_pointer) + #CR$
        g_value_unset_(@CellText)
      EndIf
    EndIf
  Next i

  Info + #CR$
Next j

MessageRequester("Auswahl", Info)
Und so sieht dann das Ergebnis mit abgeschnittenen Zelltexten aus:

Bild
Antworten