Treegadget: Wie das Element bei Rechtsclick feststellen

Anfängerfragen zum Programmieren mit PureBasic.
Onetime
Beiträge: 20
Registriert: 15.05.2018 20:02

Re: Treegadget: Wie das Element bei Rechtsclick feststellen

Beitrag von Onetime »

@ ccode_new: Ist auf jeden Fall schon mal ein guter Kompromiss bis vielleicht in PB nativ was besseres erfunden wird.

Danke noch mal an alle für die Hilfe!
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Treegadget: Wie das Element bei Rechtsclick feststellen

Beitrag von ccode_new »

Update!

Code: Alles auswählen

CompilerIf #PB_Compiler_OS = #PB_OS_Linux
  ImportC ""
    gtk_widget_style_get(*Widget.GtkWidget, PropertyName.P-UTF8, *Value, Null)
  EndImport
  
  Procedure.i GetRowHeight(GadgetID.i)
    Protected *Column.GtkTreeViewColumn
    Protected RowHeight.I
    Protected VerticalSeparator.I
    
    *Column = gtk_tree_view_get_column_(GadgetID(GadgetID), 0)
    gtk_tree_view_column_cell_get_size_(*Column, 0, 0, 0, 0, @RowHeight)
    gtk_widget_style_get(GadgetID(GadgetID), "vertical-separator", @VerticalSeparator, 0)
    
    ProcedureReturn RowHeight + VerticalSeparator
  EndProcedure
  
CompilerElseIf #PB_Compiler_OS = #PB_OS_Windows
  #TVM_GETITEMHEIGHT  = $111C
  
  Procedure.i GetRowHeight(GadgetID.i)
    ProcedureReturn SendMessage_(GadgetID(GadgetID),#TVM_GETITEMHEIGHT,0,0)
  EndProcedure
  
CompilerEndIf


Structure Ast
  y.i
  h.i
EndStructure

Structure MPos
  x.i
  y.i
EndStructure

Global WinMaus.MPos

Global NewList BaumAst.Ast()

Global TestFenster, BaumElement, PopMenu
Global Quit.b = #False, start.b = #True
Global KlickElement = -1, ypos = 0

Procedure TreeExpandAllItems(TreeId)
  Protected CurItem.i, CurState.i, ItemCnt.i = CountGadgetItems(TreeId)
  If ItemCnt <= 0: ProcedureReturn: EndIf
  For CurItem = 0 To ItemCnt-1
    CurState = GetGadgetItemState(TreeId, CurItem)
    CurState = CurState ! #PB_Tree_Collapsed
    If CurState & #PB_Tree_Checked
      CurState = #PB_Tree_Checked | #PB_Tree_Expanded
    ElseIf CurState & #PB_Tree_Inbetween
      CurState = #PB_Tree_Inbetween | #PB_Tree_Expanded
    Else
      CurState = #PB_Tree_Expanded
    EndIf
    SetGadgetItemState(TreeId, CurItem, CurState)   
  Next
EndProcedure

Procedure.b OverGadget(*MausPos.MPos, Element)
  If ((*MausPos\x >= GadgetX(Element)) And (*MausPos\x <= (GadgetX(Element) + GadgetWidth(Element))) And (*MausPos\y >= GadgetY(Element)) And (*MausPos\y <= GadgetY(Element) + GadgetHeight(Element)))
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure

Procedure.b OverItem(*MausPos.MPos, Element, Eintrag)
  ;Hier müsste man den Ausklappstatus mit einbeziehen!
  
  SelectElement(BaumAst(), Eintrag)
  If (*MausPos\y - GadgetY(Element)) < (BaumAst()\y + BaumAst()\h) And (*MausPos\y - GadgetY(Element)) >= BaumAst()\y
    ProcedureReturn #True
  EndIf
  
  ProcedureReturn #False
EndProcedure

Procedure Rechtsklick()
  ;TreeExpandAllItems(BaumElement)
  KlickElement = GetGadgetState(BaumElement)
  If OverGadget(WinMaus, BaumElement) = #True And OverItem(WinMaus, BaumElement, KlickElement) = #True
    DisplayPopupMenu(PopMenu, WindowID(TestFenster))
    Debug "Rechtsklick auf: "+Str(KlickElement)
  EndIf
EndProcedure

Procedure Linksklick()
  KlickElement = GetGadgetState(BaumElement)
  If OverGadget(WinMaus, BaumElement) = #True And OverItem(WinMaus, BaumElement, KlickElement) = #True
    Debug "Linksklick auf: "+Str(KlickElement)
  EndIf
EndProcedure

TestFenster = OpenWindow(#PB_Any, 0, 0, 800, 600, "TestFenster", #PB_Window_SystemMenu)
If IsWindow(TestFenster)
  BaumElement = TreeGadget(#PB_Any, 10, 10, 780, 580)
  ;   For i = 0 To 5
  ;     AddGadgetItem(BaumElement, i, "Eintrag: "+Str(i))
  ;   Next i
  
  For i = 1 To 2
    AddGadgetItem (BaumElement, -1, "Item "+ Str(i), 0, 0)
    AddGadgetItem(BaumElement, -1, "Item " + Str(i) + ".1", 0, 1)
    AddGadgetItem(BaumElement, -1, "Item " + Str(i) + ".2", 0, 1)
    AddGadgetItem(BaumElement, -1, "Item " + Str(i) + ".2.1", 0, 2)
    AddGadgetItem(BaumElement, -1, "Item " + Str(i) + ".2.2", 0, 2)
    AddGadgetItem(BaumElement, -1, "Item " + Str(i) + ".3", 0, 1)
  Next i
  
  TreeExpandAllItems(BaumElement) ;Es müssen alle Items ausgeklappt sein.
  
  If CreatePopupMenu(PopMenu)
    MenuItem(1, "Menü-Eintrag 1")
    MenuItem(2, "Menü-Eintrag 2")
    MenuItem(3, "Menü-Eintrag 3")
  EndIf
  
  BindGadgetEvent(BaumElement, @Rechtsklick(), #PB_EventType_RightClick) ;Funktioniert besser unter Windows! (Warum auch immer?)
  BindGadgetEvent(BaumElement, @Linksklick(), #PB_EventType_LeftClick)
  
  Repeat
    event = WindowEvent()
    
    WinMaus\x = WindowMouseX(TestFenster)
    WinMaus\y = WindowMouseY(TestFenster)
    
    Select event
      Case #PB_Event_CloseWindow
        Quit = #True
        
      Case #PB_Event_Menu
        Select EventMenu()
        EndSelect
        
      Case #PB_Event_Gadget
        Select EventGadget()
        EndSelect
    EndSelect
    
    If start = #True
      While WindowEvent() : Wend
      For i = 1 To CountGadgetItems(BaumElement)
        AddElement(BaumAst())
        BaumAst()\y = ypos
        BaumAst()\h = GetRowHeight(BaumElement) 
        ypos = (GetRowHeight(BaumElement) * i)
      Next i
      
      ;       ForEach BaumAst()
      ;         Debug BaumAst()\y + BaumAst()\h
      ;       Next
      
      start = #False
    EndIf
    
  Until Quit = #True
EndIf
End
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Antworten