@ 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!
Treegadget: Wie das Element bei Rechtsclick feststellen
Re: Treegadget: Wie das Element bei Rechtsclick feststellen
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
no Keyboard, press any key
no mouse, you need a cat