TreeGadget node being detected

Just starting out? Need help? Post your questions and find answers here.
BarryG
Addict
Addict
Posts: 3324
Joined: Thu Apr 18, 2019 8:17 am

TreeGadget node being detected

Post by BarryG »

I have a TreeGadget with several nodes... and I only want to know when an item is double-clicked, and not when a node is double-clicked.

If you run the below and double-click any node button (the "+/-" square), you get the debug message. How can I avoid that? Thanks.

Code: Select all

If OpenWindow(0, 0, 0, 355, 180, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  TreeGadget(0, 10, 10, 160, 160)                                         ; TreeGadget standard
  TreeGadget(1, 180, 10, 160, 160, #PB_Tree_CheckBoxes | #PB_Tree_NoLines); TreeGadget with Checkboxes + NoLines
  For ID = 0 To 1
    For a = 0 To 10
      AddGadgetItem (ID, -1, "Normal Item "+Str(a), 0, 0) ; if you want to add an image, use
      AddGadgetItem (ID, -1, "Node "+Str(a), 0, 0)        ; ImageID(x) as 4th parameter
      AddGadgetItem(ID, -1, "Sub-Item 1", 0, 1)           ; These are on the 1st sublevel
      AddGadgetItem(ID, -1, "Sub-Item 2", 0, 1)
      AddGadgetItem(ID, -1, "Sub-Item 3", 0, 1)
      AddGadgetItem(ID, -1, "Sub-Item 4", 0, 1)
      AddGadgetItem (ID, -1, "File "+Str(a), 0, 0) ; sublevel 0 again
    Next
  Next
  Repeat
    ev=WaitWindowEvent()
    If ev=#PB_Event_Gadget
      Debug "node button double-clicked" ; Don't want this for nodes!
    EndIf
  Until ev=#PB_Event_CloseWindow
EndIf
infratec
Always Here
Always Here
Posts: 6874
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: TreeGadget node being detected

Post by infratec »

Code: Select all

If OpenWindow(0, 0, 0, 355, 180, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  TreeGadget(0, 10, 10, 160, 160)                                         ; TreeGadget standard
  TreeGadget(1, 180, 10, 160, 160, #PB_Tree_CheckBoxes | #PB_Tree_NoLines); TreeGadget with Checkboxes + NoLines
  For ID = 0 To 1
    i = 0
    For a = 0 To 10
      AddGadgetItem (ID, i, "Normal Item "+Str(a), 0, 0) ; if you want to add an image, use-1
      i + 1
      AddGadgetItem (ID, i, "Node "+Str(a), 0, 0)        ; ImageID(x) as 4th parameter
      SetGadgetItemData(ID, i, -1)
      i + 1
      AddGadgetItem(ID, i, "Sub-Item 1", 0, 1)           ; These are on the 1st sublevel
      i + 1
      AddGadgetItem(ID, i, "Sub-Item 2", 0, 1)
      i + 1
      AddGadgetItem(ID, i, "Sub-Item 3", 0, 1)
      i + 1
      AddGadgetItem(ID, i, "Sub-Item 4", 0, 1)
      i + 1
      AddGadgetItem (ID, i, "File "+Str(a), 0, 0) ; sublevel 0 again
    Next
  Next
  Repeat
    ev=WaitWindowEvent()
    If ev=#PB_Event_Gadget
      Select EventGadget()
        Case 0
          If EventType() = #PB_EventType_LeftDoubleClick
            If GetGadgetItemData(EventGadget(), GetGadgetState(EventGadget())) <> -1
              Debug "node button double-clicked" ; Don't want this for nodes!
            EndIf
          EndIf
      EndSelect
    EndIf
  Until ev=#PB_Event_CloseWindow
EndIf
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4663
Joined: Sun Apr 12, 2009 6:27 am

Re: TreeGadget node being detected

Post by RASHAD »

Node level = 0
Checked for any sub level > 0

Code: Select all

If OpenWindow(0, 0, 0, 355, 180, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  TreeGadget(0, 10, 10, 160, 160)                                         ; TreeGadget standard
  TreeGadget(1, 180, 10, 160, 160, #PB_Tree_CheckBoxes | #PB_Tree_NoLines); TreeGadget with Checkboxes + NoLines
  For ID = 0 To 1
    For a = 0 To 10
      AddGadgetItem (ID, -1, "Normal Item "+Str(a), 0, 0) ; if you want to add an image, use
      AddGadgetItem (ID, -1, "Node "+Str(a), 0, 0)        ; ImageID(x) as 4th parameter
      AddGadgetItem(ID, -1, "Sub-Item 1", 0, 1)           ; These are on the 1st sublevel
      AddGadgetItem(ID, -1, "Sub-Item 2", 0, 1)
      AddGadgetItem(ID, -1, "Sub-Item 3", 0, 1)
      AddGadgetItem(ID, -1, "Sub-Item 4", 0, 1)
      AddGadgetItem (ID, -1, "File "+Str(a), 0, 0) ; sublevel 0 again
    Next
  Next
  Repeat
    ev=WaitWindowEvent()
    If ev=#PB_Event_Gadget
      Select EventGadget()
        Case 0 , 1
          If EventType() = #PB_EventType_LeftDoubleClick
            If GetGadgetItemAttribute(EventGadget(), GetGadgetState(EventGadget()), #PB_Tree_SubLevel) > 0
              Debug GetGadgetState(EventGadget())
            EndIf
          EndIf
      EndSelect
    EndIf
  Until ev=#PB_Event_CloseWindow
EndIf

Last edited by RASHAD on Sat Oct 09, 2021 3:49 pm, edited 1 time in total.
Egypt my love
User avatar
mk-soft
Always Here
Always Here
Posts: 5405
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: TreeGadget node being detected

Post by mk-soft »

Here with multi sub level ...

Sorry Update 2

Code: Select all

If OpenWindow(0, 0, 0, 355, 180, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  TreeGadget(0, 10, 10, 160, 160)                                         ; TreeGadget standard
  TreeGadget(1, 180, 10, 160, 160, #PB_Tree_CheckBoxes | #PB_Tree_NoLines); TreeGadget with Checkboxes + NoLines
 For ID = 0 To 1
    For a = 0 To 10
      AddGadgetItem (ID, -1, "Normal Item "+Str(a), 0, 0) ; if you want to add an image, use
      AddGadgetItem (ID, -1, "Node "+Str(a), 0, 0)        ; ImageID(x) as 4th parameter
      AddGadgetItem(ID, -1, "Sub-Node 1", 0, 1)           ; These are on the 1st sublevel
      AddGadgetItem(ID, -1, "Sub-Item 1.1", 0, 2)           ; These are on the 1st sublevel
      AddGadgetItem(ID, -1, "Sub-Item 1.2", 0, 2)           ; These are on the 1st sublevel
      AddGadgetItem(ID, -1, "Sub-Item 2", 0, 1)
      AddGadgetItem(ID, -1, "Sub-Item 3", 0, 1)
      AddGadgetItem(ID, -1, "Sub-Item 4", 0, 1)
      AddGadgetItem (ID, -1, "File "+Str(a), 0, 0) ; sublevel 0 again
    Next
  Next
  
  Repeat
    ev=WaitWindowEvent()
    If ev=#PB_Event_Gadget
      Select EventGadget()
        Case 0
          If EventType() = #PB_EventType_LeftDoubleClick
            item   = GetGadgetState(0)
            level  = GetGadgetItemAttribute(0, item, #PB_Tree_SubLevel)
            level2 = GetGadgetItemAttribute(0, item + 1, #PB_Tree_SubLevel)
            If level2 <= level
              Debug "item button double-clicked " + item ; Don't want this for nodes!
            Else
              Debug "node button double-clicked " + item ; Don't want this for nodes!
            EndIf
          EndIf
      EndSelect
    EndIf
  Until ev=#PB_Event_CloseWindow
EndIf
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4663
Joined: Sun Apr 12, 2009 6:27 am

Re: TreeGadget node being detected

Post by RASHAD »

Just set backcolor = $feffff to any item you do not want to check it

Code: Select all

If OpenWindow(0, 0, 0, 355, 180, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  TreeGadget(0, 10, 10, 160, 160)                                         ; TreeGadget standard
  TreeGadget(1, 180, 10, 160, 160, #PB_Tree_CheckBoxes | #PB_Tree_NoLines); TreeGadget with Checkboxes + NoLines
  For ID = 0 To 1
    i = 0
    For a = 0 To 10
      AddGadgetItem (ID, i, "Normal Item "+Str(a), 0, 0) ; if you want to add an image, use-1
      i + 1
      AddGadgetItem (ID, i, "Node "+Str(a), 0, 0)        ; ImageID(x) as 4th parameter
      SetGadgetItemColor(ID,i,#PB_Gadget_BackColor ,$feffff)
      i + 1
      AddGadgetItem(ID, i, "Sub-Item 1", 0, 1)           ; These are on the 1st sublevel
      i + 1
      AddGadgetItem(ID, i, "Sub-Item 2", 0, 1)
      i + 1
      AddGadgetItem(ID, i, "Sub-Item 3", 0, 1)
      i + 1
      AddGadgetItem(ID, i, "Sub-Item 4", 0, 1)
      i + 1
      AddGadgetItem (ID, i, "File "+Str(a), 0, 0) ; sublevel 0 again
    Next
  Next
  Repeat
    ev=WaitWindowEvent()
    If ev=#PB_Event_Gadget
      Select EventGadget()
        Case 0,1
          If EventType() = #PB_EventType_LeftDoubleClick
            If GetGadgetItemColor(EventGadget(),GetGadgetState(EventGadget()),#PB_Gadget_BackColor) = -1
              Debug GetGadgetState(EventGadget())
            EndIf
          EndIf
      EndSelect
    EndIf
  Until ev=#PB_Event_CloseWindow
EndIf
Egypt my love
BarryG
Addict
Addict
Posts: 3324
Joined: Thu Apr 18, 2019 8:17 am

Re: TreeGadget node being detected

Post by BarryG »

I appreciate all the replies, and I tried them all carefully but none of them work... I still want to get events for items double-clicked, but not when any node expand/collapse button is double-clicked. All the above replies fail with this requirement, ie. I get the unwanted debug output for any node double-clicked, or have no debug output when an item is double-clicked. You need to switch between double-clicking items and nodes, and you'll see the failure.

I need to know the difference because if the user accidentally double-clicks a node button by mistake (like I do), then the events for the last item that was double-clicked get incorrectly fired and actioned again, so I need to know when to ignore such accidental double-clicks.

Thanks for trying, anyway. I haven't been able to do it either, so maybe it's just not possible (or needs some "hit test" check?).
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4663
Joined: Sun Apr 12, 2009 6:27 am

Re: TreeGadget node being detected

Post by RASHAD »

Maybe the next snippet will suit your needs
I hope so :)

Code: Select all

Global ID

#TVM_MAPHTREEITEMTOACCID = #TV_FIRST + 43

Procedure winCB(hWnd, uMsg, WParam, LParam)
  Protected *NMHDR.NMHDR
  
  Select uMsg
    Case #WM_NOTIFY
      *NMHDR = LParam
      Select *NMHDR\hwndFrom 
        Case GadgetID(0)
          If *NMHDR\code = #NM_DBLCLK And GetGadgetItemData(0,ID) = 1
            ProcedureReturn 1
          EndIf
      EndSelect
  EndSelect
  
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure


If OpenWindow(0, 0, 0, 355, 180, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  TreeGadget(0, 10, 10, 160, 160)
  SetWindowLongPtr_(GadgetID(0), #GWL_STYLE, GetWindowLongPtr_(GadgetID(0), #GWL_STYLE)|#TVS_TRACKSELECT)
  AddGadgetItem (0, 0, "Normal Item "+Str(a), 0, 0)
  For a = 0 To 10     
    i + 1
    AddGadgetItem (0, i, "Node "+Str(a), 0, 0)
    SetGadgetItemData(0,i,1)
    i + 1
    AddGadgetItem(0, i, "Sub-Item 1", 0, 1)
    i + 1
    AddGadgetItem(0, i, "Sub-Item 2", 0, 1)
    i + 1
    AddGadgetItem(0, i, "Sub-Item 3", 0, 1)
    i + 1
    AddGadgetItem(0, i, "Sub-Item 4", 0, 1)
    i + 1      
    AddGadgetItem (0, i, "Normal Item "+Str(a+1), 0, 0)
  Next
  
  SetWindowCallback(@WinCB())
  
  tv.TV_HITTESTINFO
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Quit = 1
        
      Case #WM_MOUSEMOVE
        GetCursorPos_(@tv\pt)
        ScreenToClient_(GadgetID(0),@tv\pt)
        itemH = SendMessage_(GadgetID(0),#TVM_HITTEST,0,tv)
        ID = SendMessage_(GadgetID(0),#TVM_MAPHTREEITEMTOACCID,itemH,0)-1
        
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 0
            If EventType() = #PB_EventType_LeftDoubleClick
              Debug ID
            EndIf
        EndSelect
    EndSelect
  Until Quit = 1
EndIf

Edit : Bug fixed
Last edited by RASHAD on Sun Oct 10, 2021 1:56 pm, edited 1 time in total.
Egypt my love
BarryG
Addict
Addict
Posts: 3324
Joined: Thu Apr 18, 2019 8:17 am

Re: TreeGadget node being detected

Post by BarryG »

Nope, doesn't work, Rashad. Thanks for trying. I run the code, then double-click on the very first item ("Normal Item 0"). I get a debug output of 0 - great! But then if I move the mouse a little lower and double-click just to the left of the second "Normal Item 0", I get a debug output of 6 even though that item isn't even selected.

Don't worry about it; it's not a simple fix and it's not worth spending more time on.
User avatar
mk-soft
Always Here
Always Here
Posts: 5405
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: TreeGadget node being detected

Post by mk-soft »

The TreeViewGadget (WC_TREEVIEW) offers only limited functionality. A double-click event applies to the entire gadget and no distinction is made between items or nodes.

Code: Select all

;-TOP

Procedure winCB(hWnd, uMsg, WParam, LParam)
  Protected *NMHDR.NMHDR, Gadget
  
  Select uMsg
    Case #WM_NOTIFY
      *NMHDR = LParam
      Gadget = *NMHDR\idFrom
      If IsGadget(Gadget) And GadgetType(Gadget) = #PB_GadgetType_Tree
        Select *NMHDR\code
          Case #TVN_ITEMEXPANDING
            Debug "#TVN_ITEMEXPANDING"
          Case #TVN_ITEMEXPANDED
            Debug "#TVN_ITEMEXPANDED"
          Case #TVN_ITEMCHANGED
            Debug "#TVN_ITEMCHANGED"
            PostEvent(#PB_Event_Gadget, EventWindow(), Gadget, #PB_EventType_StatusChange)
          Case #NM_DBLCLK
            Debug "#NM_DBLCLK"
        EndSelect
      EndIf
  EndSelect
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

If OpenWindow(0, 0, 0, 355, 180, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  TreeGadget(0, 10, 10, 160, 160)                                         ; TreeGadget standard
  TreeGadget(1, 180, 10, 160, 160, #PB_Tree_CheckBoxes | #PB_Tree_NoLines); TreeGadget with Checkboxes + NoLines
  
  SetWindowCallback(@winCB())
  
  For ID = 0 To 1
    For a = 0 To 10
      AddGadgetItem (ID, -1, "Normal Item "+Str(a), 0, 0) ; if you want to add an image, use
      AddGadgetItem (ID, -1, "Node "+Str(a), 0, 0)        ; ImageID(x) as 4th parameter
      AddGadgetItem(ID, -1, "Sub-Node 1", 0, 1)           ; These are on the 1st sublevel
      AddGadgetItem(ID, -1, "Sub-Item 1.1", 0, 2)         ; These are on the 1st sublevel
      AddGadgetItem(ID, -1, "Sub-Item 1.2", 0, 2)         ; These are on the 1st sublevel
      AddGadgetItem(ID, -1, "Sub-Item 2", 0, 1)
      AddGadgetItem(ID, -1, "Sub-Item 3", 0, 1)
      AddGadgetItem(ID, -1, "Sub-Item 4", 0, 1)
      AddGadgetItem (ID, -1, "File "+Str(a), 0, 0) ; sublevel 0 again
    Next
  Next
  
  Repeat
    ev=WaitWindowEvent()
    If ev=#PB_Event_Gadget
      Select EventGadget()
        Case 0
          If EventType() = #PB_EventType_StatusChange
            item   = GetGadgetState(0)
            Debug "item status change " + item ; Don't want this for nodes!
            
          EndIf
      EndSelect
    EndIf
  Until ev=#PB_Event_CloseWindow
EndIf
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
BarryG
Addict
Addict
Posts: 3324
Joined: Thu Apr 18, 2019 8:17 am

Re: TreeGadget node being detected

Post by BarryG »

Thanks mk-soft, I think this is the answer (ie. I don't get false double-clicks with it).
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4663
Joined: Sun Apr 12, 2009 6:27 am

Re: TreeGadget node being detected

Post by RASHAD »

Previous post updated
The items selected automatic by tracking not by clicking
Egypt my love
BarryG
Addict
Addict
Posts: 3324
Joined: Thu Apr 18, 2019 8:17 am

Re: TreeGadget node being detected

Post by BarryG »

Still doesn't work, Rashad. I double-click the very first item ("Normal Item 0"), and get a debug output of 0. But then if I "accidentally" double-click the tree lines next to "Normal Item 3", the debug output shows 18, even though item 0 is still selected/highlighted.

I wonder if this is actually a PureBasic bug that I've found? Because surely GetGadgetState() should be returning whichever item is actually selected?
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4663
Joined: Sun Apr 12, 2009 6:27 am

Re: TreeGadget node being detected

Post by RASHAD »

@BarryG
That it's strange
Tested with PB 5.73 x86 Windows 11 x64
Egypt my love
Post Reply