Pb avec les TreeGadget

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Pb avec les TreeGadget

Message par lionel_om »

Bonjour j'aimerais savoir si on peut détecter que l'utilisateur a cliqué sur un noeud d'un TreeGadget (le case +).

Car je voulais faire un genre de PathRequester(), le pb c'est que j'étais obligé de le remplir complétement(et donc entièrement scanner mon DD), car je n'arrive pas à détecté que l'utilisateur descent dans l'arborescence en cliquant sur les '+'. Qd il fait une double clique sur un item, cela ne pose pas de pb, ms dans le cas précédent si.

Donc est-ce qq1 connait une méthode... (j'ai regardé dans l'aide, ms je n'ai rien trouvé)
Merci
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Pas évident!

On peut détecter si un noeud est ouvert ou fermé, mais pour le clic sur la croix, c'est une autre histoire!
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

OK merci.
Bon tant pis.
c'étais juste pour m'amuser à faire un petit programme sans trop d'intérêt, mais bon... :?

Je m'amuserais pe etre à coder une fonction de repérage, mais car ça ne me semble pas aussi complexe que ça... Il faudrait mémoriser l'état des anciens noeuds et donc déterminer celui qui à été sélectionné...
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

J'ai trouvé un petit code avec 2 fonctions pour le repérage des clique sur les noeuds !! :D

Voici mon code :

Code : Tout sélectionner

#CLICK_ON_NODE = 13100
#TREE = 0
Dim StateOfNodes(1000)

Declare CompleteTableOfNode(GadgetNum.b)
Declare.l DetectClickOnNodeCross(GadgetNum.b)

; creation de l'arbre (prit des exemples PureBasic)

If OpenWindow(0,0,0,355,180,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"TreeGadget") And CreateGadgetList(WindowID(0)) 
    TreeGadget(#TREE, 10,10,160,160)                                       ; TreeGadget standard 
      For a=0 To 10 
        AddGadgetItem (#TREE, -1, "Normal Item "+Str(a))    ; if you want to add an image, use 
        AddGadgetItem (#TREE, -1, "Node "+Str(a))           ; UseImage(x) as 4th parameter 
        OpenTreeGadgetNode(ID) 
          AddGadgetItem(#TREE, -1, "Sub-Item 1") 
          AddGadgetItem(#TREE, -1, "Sub-Item 2") 
          AddGadgetItem(#TREE, -1, "Sub-Item 3") 
          AddGadgetItem(#TREE, -1, "Sub-Item 4") 
        CloseTreeGadgetNode(ID) 
        AddGadgetItem (#TREE, -1, "File "+Str(a)) 
      Next 

    
    
; liste les états des différents noeuds
CompleteTableOfNode(#TREE)
 
 OpenConsole()
    
    
    Repeat
      EventID = WaitWindowEvent()


      ; clique sur un noeud      
      If EventID = #CLICK_ON_NODE
        NodeClicked = DetectClickOnNodeCross(#TREE)
        If NodeClicked <> -1
          PrintN(Str(NodeClicked) + " : " + GetGadgetItemText(#TREE,NodeClicked,0))
        EndIf        
      EndIf
    
    
    Until EventID=#PB_Event_CloseWindow 
  EndIf 



CloseConsole()


End



Procedure CompleteTableOfNode(GadgetNum.b)
  For i = 0 To CountGadgetItems(GadgetNum)-1
    StateOfNodes(i) = #PB_Tree_Expanded & GetGadgetItemState(GadgetNum,i)
  Next i
EndProcedure

Procedure.l DetectClickOnNodeCross(GadgetNum.b)
  For i = 0 To CountGadgetItems(GadgetNum)-1
    If StateOfNodes(i) <> #PB_Tree_Expanded & GetGadgetItemState(GadgetNum,i)
      StateOfNodes(i) = #PB_Tree_Expanded & GetGadgetItemState(GadgetNum,i)
      ProcedureReturn(i)
    EndIf
  Next i
  ProcedureReturn(-1)
EndProcedure
Je n'ai pas rencontré de problème. Tout semble bien marcher !!! 8) :D
Je n'ai pas tresté avec plusieurs arbres, il pourait y avoir des conflits. Dans un cas multi objets, il faudrait faire ca de façon un peu plus rigoureuse.

Mais là ça marche ! :P
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Bon, ben tant pis, moi, j'avais fait ça:

Code : Tout sélectionner

Info.TV_HITTESTINFO 

If OpenWindow(0,0,0,355,180,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"TreeGadget")
  
  If CreateGadgetList(WindowID(0)) 
    TreeGadget(0, 10,10,160,160)                         ; TreeGadget standard 
    For a=0 To 10 
      AddGadgetItem (ID, -1, "Normal Item "+Str(a))    ; if you want to add an image, use 
      AddGadgetItem (ID, -1, "Node "+Str(a))           ; UseImage(x) as 4th parameter 
      OpenTreeGadgetNode(ID) 
      AddGadgetItem(ID, -1, "Sub-Item 1") 
      AddGadgetItem(ID, -1, "Sub-Item 2") 
      AddGadgetItem(ID, -1, "Sub-Item 3") 
      AddGadgetItem(ID, -1, "Sub-Item 4") 
      CloseTreeGadgetNode(ID) 
      AddGadgetItem (ID, -1, "File "+Str(a)) 
    Next 
  EndIf
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_EventGadget
        
        Select EventGadgetID()
          
          Case 0
            If EventType() = #PB_EventType_LeftClick
              
              GetCursorPos_(@Pos.POINT)
              ScreenToClient_(GadgetID(0),@Pos.POINT)
              
              Info\pt\x = Pos\x : Info\pt\y = Pos\y
              SendMessage_(GadgetID(0),#TVM_HITTEST,0,@Info)
              
              If Info\flags & #TVHT_ONITEMBUTTON
                SendMessage_(GadgetID(0),#TVM_SELECTITEM,#TVGN_CARET,Info\hItem)
                Debug "L'élément "+Str(GetGadgetState(0))+" a été selectionné"
              EndIf
              
              If GetGadgetItemState(0,GetGadgetState(0)) &#PB_Tree_Expanded
                Debug "la branche est ouverte"
              ElseIf GetGadgetItemState(0,GetGadgetState(0)) &#PB_Tree_Collapsed
                Debug "la branche est fermée"
              EndIf
            EndIf
            
        EndSelect
      Case #PB_EventCloseWindow
        Quit = #True
    EndSelect
  Until Quit
EndIf 
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Ton prog doit être plus efficace que le mien, il possède moins de contraite (pas de tableau...), mais bon j ene pige pas tout (le manque d'expérience sous PB :? )

Merci pour cette réponse en tt cas ! :D
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Répondre