TreeGadget #PB_Tree_ThreeState - user can select "in between" state

Mac OSX specific forum
868Mhz
New User
New User
Posts: 9
Joined: Sat Aug 19, 2023 6:44 pm

TreeGadget #PB_Tree_ThreeState - user can select "in between" state

Post by 868Mhz »

Hi, the help file for TreeGadget states:
The #PB_Tree_ThreeState flag can be used in combination with the #PB_Tree_CheckBoxes flag to get checkboxes that can have an "on", "off" and "in between" state. The user can only select the "on" or "off" states. The "in between" state can be set programmatically using the SetGadgetItemState() function.
But on Mac, the “in between” state is also selectable by the user (on Windows it is as described in the help).

Is this an error in the help file or a bug in PB?

My system:
MacBook Pro with M1 Pro, Sonoma 14.12, BT Keyboard MX MCHNCL, Purebasic 6.04LTS

Code: Select all

EnableExplicit

#wndMain = 0
#tree    = 0

Define a.i

If OpenWindow(#wndMain, 0, 0, 400, 300, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  TreeGadget(#tree,     0, 0, 400, 300, #PB_Tree_CheckBoxes | #PB_Tree_ThreeState) 
  For a = 0 To 10
    AddGadgetItem(#tree, -1, "Normal Item "+Str(a), 0, 0)
    AddGadgetItem(#tree, -1, "Node "+Str(a), 0, 0)
    AddGadgetItem(#tree, -1, "Sub-Item 1", 0, 1)
    AddGadgetItem(#tree, -1, "Sub-Item 2", 0, 1)
    AddGadgetItem(#tree, -1, "Sub-Item 3", 0, 1)
    AddGadgetItem(#tree, -1, "Sub-Item 4", 0, 1)
    AddGadgetItem(#tree, -1, "File "+Str(a), 0, 0)
  Next
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
User avatar
Mindphazer
Enthusiast
Enthusiast
Posts: 460
Joined: Mon Sep 10, 2012 10:41 am
Location: Savoie

Re: TreeGadget #PB_Tree_ThreeState - user can select "in between" state

Post by Mindphazer »

Hi,
I guess it's an error in the help, as the "in-between" state can be selected on MacOS, even in a no-Purebasic application...
MacBook Pro 16" M4 Pro - 24 Gb - MacOS 15.4.1 - Iphone 15 Pro Max - iPad at home
...and unfortunately... Windows at work...
868Mhz
New User
New User
Posts: 9
Joined: Sat Aug 19, 2023 6:44 pm

Re: TreeGadget #PB_Tree_ThreeState - user can select "in between" state

Post by 868Mhz »

Thanks Mindphazer.

I tried to suppress the “in between” state in my program below, but it won’t work.
Every now and then a checkbox will show the in between state. If this is the case, the checkbox
will change to checked if I select another item in the tree and then click once again the wrong one
(not on the checkbox, but on the items text).

Any idea what’s wrong with my code?

Code: Select all

EnableExplicit

#wndMain = 0
#tree    = 0

Define a, event, value, item

If OpenWindow(#wndMain, 0, 0, 400, 800, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  TreeGadget(#tree,     0, 0, 400, 800, #PB_Tree_CheckBoxes | #PB_Tree_ThreeState) 
  For a = 0 To 10
    AddGadgetItem(#tree, -1, "Normal Item "+Str(a), 0, 0)
    AddGadgetItem(#tree, -1, "Node "+Str(a), 0, 0)
    AddGadgetItem(#tree, -1, "Sub-Item 1", 0, 1)
    AddGadgetItem(#tree, -1, "Sub-Item 2", 0, 1)
    AddGadgetItem(#tree, -1, "Sub-Item 3", 0, 1)
    AddGadgetItem(#tree, -1, "Sub-Item 4", 0, 1)
    AddGadgetItem (#tree, -1, "File "+Str(a), 0, 0)
  Next
  
  Repeat 
    event = WaitWindowEvent()  
    Select event
      Case #PB_Event_Gadget
        Select EventGadget()
          Case #tree
            Select EventType()
              Case #PB_EventType_LeftClick
                item  = GetGadgetState(#tree)
                value = GetGadgetItemState(#tree, item)
                If value & #PB_Tree_Inbetween
                  value = value & ~#PB_Tree_Inbetween
                  SetGadgetItemState(#tree, item, value | #PB_Tree_Checked)
                  SetGadgetState(#tree, item)
                EndIf
            EndSelect      
        EndSelect
    EndSelect
  Until event = #PB_Event_CloseWindow
EndIf
User avatar
Piero
Addict
Addict
Posts: 923
Joined: Sat Apr 29, 2023 6:04 pm
Location: Italy

Re: TreeGadget #PB_Tree_ThreeState - user can select "in between" state

Post by Piero »

868Mhz wrote: Fri Dec 22, 2023 4:03 pm I tried to suppress the “in between” state in my program
Any idea what’s wrong with my code?
While keeping | #PB_Tree_ThreeState?

This seems to work here:

Code: Select all

If value & #PB_Tree_Inbetween
   value = value & ~#PB_Tree_Inbetween
   If value & #PB_Tree_Checked
      value = 0
   Else
      value = #PB_Tree_Checked
   EndIf
   SetGadgetItemState(#tree, item, value)
   SetGadgetState(#tree, item)
EndIf
868Mhz
New User
New User
Posts: 9
Joined: Sat Aug 19, 2023 6:44 pm

Re: TreeGadget #PB_Tree_ThreeState - user can select "in between" state

Post by 868Mhz »

Thanks Piero, but I get the same result with your code.
If you click multiple times e.g. on the first items checkbox in the tree (Normal Item 0), after a while (sometimes after 7 clicks, sometimes after the 20. click, it differs and is not constant), the checkbox shows the "-" for in between. The user should only get the checkbox checked or unchecked when he clicks the box.
I like to set the in between state for the node via program (all subnotes unchecked -> node checkbox unchecked, all subnotes checked -> node checkbox checked, all else -> node checkbox in between). But to do this, first the "user action" has to be reliable restricted to checked/unchecked without in between.
User avatar
Piero
Addict
Addict
Posts: 923
Joined: Sat Apr 29, 2023 6:04 pm
Location: Italy

Re: TreeGadget #PB_Tree_ThreeState - user can select "in between" state

Post by Piero »

868Mhz wrote: Fri Dec 22, 2023 6:55 pm Thanks Piero, but I get the same result with your code.
:oops:
Grrr...
And with this?

Code: Select all

EnableExplicit

#wndMain = 0
#tree    = 0

Define a, event, value, item

If OpenWindow(#wndMain, 0, 0, 400, 800, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
   TreeGadget(#tree,     0, 0, 400, 800, #PB_Tree_CheckBoxes | #PB_Tree_ThreeState) 
   For a = 0 To 10
      AddGadgetItem(#tree, -1, "Normal Item "+Str(a), 0, 0)
      AddGadgetItem(#tree, -1, "Node "+Str(a), 0, 0)
      AddGadgetItem(#tree, -1, "Sub-Item 1", 0, 1)
      AddGadgetItem(#tree, -1, "Sub-Item 2", 0, 1)
      AddGadgetItem(#tree, -1, "Sub-Item 3", 0, 1)
      AddGadgetItem(#tree, -1, "Sub-Item 4", 0, 1)
      AddGadgetItem (#tree, -1, "File "+Str(a), 0, 0)
   Next
   
   Repeat 
      event = WaitWindowEvent()  
      Select event
         Case #PB_Event_Gadget
            Select EventGadget()
               Case #tree
                  Select EventType()
                     Case #PB_EventType_LeftDoubleClick
                        item  = GetGadgetState(#tree)
                        value = GetGadgetItemState(#tree, item)
                        If value & #PB_Tree_Inbetween
                           value = value & ~#PB_Tree_Inbetween 
                           SetGadgetItemState(#tree, item, value | #PB_Tree_Checked)
                           SetGadgetState(#tree, item)
                        EndIf
                     Case #PB_EventType_LeftClick
                        item  = GetGadgetState(#tree)
                        value = GetGadgetItemState(#tree, item)
                        If value & #PB_Tree_Inbetween
                           value = value & ~#PB_Tree_Inbetween 
                           SetGadgetItemState(#tree, item, value | #PB_Tree_Checked)
                           SetGadgetState(#tree, item)
                        EndIf
                  EndSelect      
            EndSelect
      EndSelect
   Until event = #PB_Event_CloseWindow
EndIf
868Mhz
New User
New User
Posts: 9
Joined: Sat Aug 19, 2023 6:44 pm

Re: TreeGadget #PB_Tree_ThreeState - user can select "in between" state

Post by 868Mhz »

Ah, that's it.
Some of the clicks come through as double clicks.

I would never have thought of that. Thank you very much, Piero.
User avatar
Piero
Addict
Addict
Posts: 923
Joined: Sat Apr 29, 2023 6:04 pm
Location: Italy

Re: TreeGadget #PB_Tree_ThreeState - user can select "in between" state

Post by Piero »

I wish I could tell you: "You are very welcome!", but my right index finger doesn't want to agree :?

Gotta go now: the top models are calling me!
Post Reply