Page 1 sur 1

TreeGadget : Ajout d'un frère sur un noeud

Publié : jeu. 05/juil./2007 15:56
par Droopy
Salut,
Voici le code qui me pose soucis

Code : Tout sélectionner

#WINDOW=0

Enumeration ; gadgets
  #Tree
  #StatusBar
EndEnumeration

Enumeration ; Menu
#AjoutEnfant
#AjoutFrere
#Supprimer
EndEnumeration

Procedure CB(Window, message, wParam, lParam) ; CallBack pour Treegadget éditable
  Result = #PB_ProcessPureBasicEvents    
  
  If Window =WindowID(#WINDOW) 
    
    If message=#WM_NOTIFY 
      ; ======================= 
      ; Treeview Notifications 
      ; ======================= 
      
      *tvinfo.NMTVDISPINFO=lParam 
      If *tvinfo\hdr\hwndFrom=GadgetID(#Tree) 
        If *tvinfo\hdr\code=#TVN_BEGINLABELEDIT 
          ; 
          ;something to do before editing ... 
          ; 
        EndIf 
        
        If *tvinfo\hdr\code=#TVN_ENDLABELEDIT And *tvinfo\item\pszText<>0 
          ; 
          ;get result ...its work !! 
          ; 
          Debug "Selected Item: "+Str(GetGadgetState(#Tree)) 
          Debug "The new label is: "+PeekS(*tvinfo\item\pszText)                
          Result= 1      
        EndIf 
      EndIf              
    EndIf 
  EndIf 
  
  ProcedureReturn Result 
EndProcedure 

OpenWindow(0, 0, 0, 640,480, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
CreateGadgetList(WindowID(0))
TreeGadget(#Tree, 10, 10, 620, 440,#PB_Tree_AlwaysShowSelection)
CreateStatusBar(#StatusBar,WindowID(0))
AddGadgetItem (#Tree, -1, "Root", 0, 55)
AddStatusBarField(70)
AddStatusBarField(70)
AddStatusBarField(500)

;/ Treegadget éditable
SetWindowLong_(GadgetID(#Tree),#GWL_STYLE,GetWindowLong_(GadgetID(#Tree),#GWL_STYLE) | #TVS_EDITLABELS) 
SetWindowCallback(@CB())

CreatePopupMenu(0)
MenuItem(#AjoutEnfant,"Ajout enfant")
MenuItem(#AjoutFrere, "Ajout frère")
MenuItem(#Supprimer,"Supprimer")

Repeat
  evt=WaitWindowEvent()
  
  Select evt
    
    Case #WM_RBUTTONDOWN
      DisplayPopupMenu(0,WindowID(0))
      
    Case #PB_Event_Gadget
      
      Select EventGadget()
        
        Case #Tree ;/ Affiche infos sur l'élément du Treegadget sélectionné
          StatusBarText(#StatusBar,0,"Element n° "+Str(GetGadgetState(#Tree)))
          StatusBarText(#StatusBar,1,"Niveau n° "+Str(GetGadgetItemAttribute(#Tree,GetGadgetState(#Tree),#PB_Tree_SubLevel)))
          StatusBarText(#StatusBar,2,GetGadgetText(#Tree))
          
      EndSelect
      
    Case #PB_Event_Menu
      
      Select EventMenu()
        
        Case #AjoutEnfant
          ElementSelectionne=GetGadgetState(#Tree)
          Niveau=GetGadgetItemAttribute(#Tree,ElementSelectionne,#PB_Tree_SubLevel)
          AddGadgetItem(#Tree,ElementSelectionne+1,"Enfant",0,Niveau+1)
          SetGadgetState(#Tree,ElementSelectionne+1)
          
        Case #AjoutFrere
          ElementSelectionne=GetGadgetState(#Tree)
          Niveau=GetGadgetItemAttribute(#Tree,ElementSelectionne,#PB_Tree_SubLevel)
          AddGadgetItem(#Tree,ElementSelectionne+1,"Frère",0,Niveau)
          SetGadgetState(#Tree,ElementSelectionne+1)
          
        Case #Supprimer
          ElementSelectionne=GetGadgetState(#Tree)
          RemoveGadgetItem(#Tree,ElementSelectionne)
      EndSelect
      
  EndSelect
Until evt = #PB_Event_CloseWindow
La création d'un enfant ne pose pas de problème.
La création d'un frère fonctionne sauf quand on sélectionne un noeud (dans ce cas un enfant est créé ) :x

Publié : jeu. 05/juil./2007 16:14
par Ollivier
Ca devrait t'aider:

Code : Tout sélectionner

#WINDOW=0 

Enumeration ; gadgets 
  #Tree 
  #StatusBar 
EndEnumeration 

Enumeration ; Menu 
#AjoutEnfant 
#AjoutFrere 
#Supprimer 
EndEnumeration 

Procedure CB(Window, message, wParam, lParam) ; CallBack pour Treegadget éditable 
  Result = #PB_ProcessPureBasicEvents    
  
  If Window =WindowID(#WINDOW) 
    
    If message=#WM_NOTIFY 
      ; ======================= 
      ; Treeview Notifications 
      ; ======================= 
      
      *tvinfo.NMTVDISPINFO=lParam 
      If *tvinfo\hdr\hwndFrom=GadgetID(#Tree) 
        If *tvinfo\hdr\code=#TVN_BEGINLABELEDIT 
          ; 
          ;something to do before editing ... 
          ; 
        EndIf 
        
        If *tvinfo\hdr\code=#TVN_ENDLABELEDIT And *tvinfo\item\pszText<>0 
          ; 
          ;get result ...its work !! 
          ; 
          Debug "Selected Item: "+Str(GetGadgetState(#Tree)) 
          Debug "The new label is: "+PeekS(*tvinfo\item\pszText)                
          Result= 1      
        EndIf 
      EndIf              
    EndIf 
  EndIf 
  
  ProcedureReturn Result 
EndProcedure 

OpenWindow(0, 0, 0, 640,480, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
CreateGadgetList(WindowID(0)) 
TreeGadget(#Tree, 10, 10, 620, 440,#PB_Tree_AlwaysShowSelection) 
CreateStatusBar(#StatusBar,WindowID(0)) 
AddGadgetItem (#Tree, -1, "Root", 0, 55) 
AddStatusBarField(70) 
AddStatusBarField(70) 
AddStatusBarField(500) 

;/ Treegadget éditable 
SetWindowLong_(GadgetID(#Tree),#GWL_STYLE,GetWindowLong_(GadgetID(#Tree),#GWL_STYLE) | #TVS_EDITLABELS) 
SetWindowCallback(@CB()) 

CreatePopupMenu(0) 
MenuItem(#AjoutEnfant,"Ajout enfant") 
MenuItem(#AjoutFrere, "Ajout frère") 
MenuItem(#Supprimer,"Supprimer") 

Repeat 
  evt=WaitWindowEvent() 
  
  Select evt 
    
    Case #WM_RBUTTONDOWN 
      DisplayPopupMenu(0,WindowID(0)) 
      
    Case #PB_Event_Gadget 
      
      Select EventGadget() 
        
        Case #Tree ;/ Affiche infos sur l'élément du Treegadget sélectionné 
          StatusBarText(#StatusBar,0,"Element n° "+Str(GetGadgetState(#Tree))) 
          StatusBarText(#StatusBar,1,"Niveau n° "+Str(GetGadgetItemAttribute(#Tree,GetGadgetState(#Tree),#PB_Tree_SubLevel))) 
          StatusBarText(#StatusBar,2,GetGadgetText(#Tree)) 
          
      EndSelect 
      
    Case #PB_Event_Menu 
      
      Select EventMenu() 
        
        Case #AjoutEnfant 
;          ElementSelectionne=GetGadgetState(#Tree) 
;          Niveau=GetGadgetItemAttribute(#Tree,ElementSelectionne,#PB_Tree_SubLevel) 
;          AddGadgetItem(#Tree,ElementSelectionne+1,"Enfant",0,Niveau+1) 
;          SetGadgetState(#Tree,ElementSelectionne+1) 
          ElementSelectionne=GetGadgetState(#Tree) 
          Niveau=GetGadgetItemAttribute(#Tree,ElementSelectionne,#PB_Tree_SubLevel) 
          AddGadgetItem(#Tree,ElementSelectionne+1,"Enfant",0,Niveau+1) 
          SetGadgetState(#Tree,ElementSelectionne+1) 
          
        Case #AjoutFrere 
;          ElementSelectionne=GetGadgetState(#Tree) 
;          Niveau=GetGadgetItemAttribute(#Tree,ElementSelectionne,#PB_Tree_SubLevel)
;          AddGadgetItem(#Tree,ElementSelectionne+1,"Frère",0,Niveau) 
;          SetGadgetState(#Tree,ElementSelectionne+1) 
          ElementSelectionne=GetGadgetState(#Tree) 
          Niveau=GetGadgetItemAttribute(#Tree,ElementSelectionne,#PB_Tree_SubLevel)
          AddGadgetItem(#Tree,-1,"Frère",0,Niveau) 
          SetGadgetState(#Tree,ElementSelectionne) 
          
        Case #Supprimer 
          ElementSelectionne=GetGadgetState(#Tree) 
          RemoveGadgetItem(#Tree,ElementSelectionne) 
      EndSelect 
      
  EndSelect 
Until evt = #PB_Event_CloseWindow

Publié : jeu. 05/juil./2007 16:25
par Ollivier
J'ai mis -1 dans le paramètre Position de AddGadgetItem() de ta condition "Frère".
J'ai voulu trop bien faire en corrigeant aussi la condition "enfant", ce qui induit en erreur.
J'ai réédité le code de mon post, et ce code là fonctionne bien.

Publié : jeu. 05/juil./2007 19:52
par Droopy
Merci Ollivier, mais ça buggue encore quand on ajoute un frère à un enfant de la branche du haut
--> Cela créé un frère dans la branche du bas :cry:

Image

Publié : ven. 06/juil./2007 2:45
par Ollivier
J'ai repris tout à zéro pour faire un source rentab à ce sujet.

Code : Tout sélectionner

#Gad_Tree = 0 
#Menu_TreeEdit = 0 
#ItemIns_Enfant = 0 
#ItemIns_Frere = 1 
#ItemSuppr = 2 
#ItemProper = 3 

  If OpenWindow(0, 0, 0, 355, 180, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
    CreateGadgetList(WindowID(0) )    
    TreeGadget(#Gad_Tree, 10, 10, 340, 160)    
    AddGadgetItem(#Gad_Tree, 0, "Root", 0, 0)    
    ;Boucle principale    
    CreatePopupMenu(#Menu_TreeEdit) 
    OpenSubMenu("Ajouter") 
      MenuItem(#ItemIns_Enfant, "Enfant") 
      MenuItem(#ItemIns_Frere, "Frere")    
    CloseSubMenu() 
    MenuItem(#ItemSuppr, "Enlever") 
    MenuItem(#ItemProper, "Propriétés") 
  Else 
  
    End 
    
  EndIf 
  
  Repeat 
    Select WaitWindowEvent()    
    Case #PB_Event_CloseWindow 
      End    
    Case #WM_RBUTTONDOWN 
      DisplayPopupMenu(0,WindowID(0)) 
    Case #PB_Event_Menu 
      Select EventMenu()      
      Case #ItemIns_Enfant 
        ; On vérif qu'il y a une sélection /!\ Important : Merci Flype :) 
        If GetGadgetState(#Gad_Tree) <> -1 
          ; On récup la sélection 
          Item = GetGadgetState(#Gad_Tree) 
          ; On récup alors le niveau de la sélection 
          ItemNiveau = GetGadgetItemAttribute(#Gad_Tree, Item, #PB_Tree_SubLevel) 
          ; On mémorise le total: à 2 fois ça servira 
          ExitFor = CountGadgetItems(#Gad_Tree) 
          ; On va rechercher l'enfant cadet 
          For i = Item + 1 To ExitFor 
            TestNiveau = GetGadgetItemAttribute(#Gad_Tree, i, #PB_Tree_SubLevel) 
            ; Dès qu'on trouve un frère, un tonton ou autre... 
            If TestNiveau <= ItemNiveau 
              ; On signale que le cadet était juste avant 
              Item = i - 1 
              ; Et on arrête de chercher 
              i = ExitFor 
            EndIf 
          Next i 
          ; On rajoute le bébé! 
          AddGadgetItem(#Gad_Tree, Item + 1, "Root"+ Str(n), 0, ItemNiveau + 1) 
          ; Et on ouvre la famille 
          SetGadgetItemState(#Gad_Tree, Item, #PB_Tree_Expanded) 
          n + 1 ; ça ça sert pas à grand chose, juste pour écrire "Root n" 
        EndIf 
      Case #ItemIns_Frere 
        ; On vérif qu'il y a une sélection 
        If GetGadgetState(#Gad_Tree) <> -1 
          ; On récup la sélection 
          Item = GetGadgetState(#Gad_Tree) 
          ; On récup alors le niveau de la sélection 
          ItemNiveau = GetGadgetItemAttribute(#Gad_Tree, Item, #PB_Tree_SubLevel) 
          ; On mémorise le total: à 2 fois ça servira 
          ExitFor = CountGadgetItems(#Gad_Tree) 
          ; On va rechercher le dernier des descendants, neveux compris
          For i = Item + 1 To ExitFor 
            TestNiveau = GetGadgetItemAttribute(#Gad_Tree, i, #PB_Tree_SubLevel) 
            ;Si c'est un frère, un fils, un neveu... 
            If TestNiveau => ItemNiveau 
              ; On le mémorise au cas où ce soit le dernier 
              Item = i 
            EndIf 
            ;Si c'est un tonton ou autre parent germain, recherche achevée 
            If TestNiveau < ItemNiveau            
              i = ExitFor 
            EndIf 
          Next i 
          ; On insère le nouveau frère cadet 
          AddGadgetItem(#Gad_Tree, Item + 1, "Root"+Str(n), 0, ItemNiveau) 
          n + 1 ; ça ça sert pas à grand chose, juste pour écrire "Root n" 
        EndIf 
      Case #ItemSuppr 
        If GetGadgetState(#Gad_Tree) <> -1 
          ; On récup la sélection 
          Item = GetGadgetState(#Gad_Tree) 
          ; On lui pete la gueule 
          RemoveGadgetItem(#Gad_Tree, Item) 
          n + 1 ; ça ça sert pas à grand chose, juste pour écrire "Root n" 
        EndIf 
      Case #ItemProper
        MessageRequester("Heplà...", "A 4h du mat, faut pô me demander la lune!", 0)
      EndSelect 
    EndSelect 
  ForEver
Je me suis pris la tête pour une de ces histoires de famille... :D
XLC

Publié : ven. 06/juil./2007 23:24
par Droopy
Nickel :D
Je vais analyser ça et tenter de comprendre ou j'ai fauté.

Merci Ollivier de t'être penché sur mon problème :wink: