Page 1 sur 1

Monter ou descendre des éléments dans un tree

Publié : sam. 26/mai/2012 17:19
par Stefou
:? :? :? Salut à tous :? :? :?

Je viens de passer la journée la dessus,alors que pensais passer une petite heure dessus !!!
J'avais bien trouvé un code du LSI mais avec une liste et là je voulais le faire directement dans le TreeGadget.

Le but : Monter ou descendre des éléments du Tree sans changer leur profondeur !

En plus il y a une fonction qui déplace avec un DragAndDrop mais qui elle ne garde pas les profondeurs.

N’hésitez pas si vous trouvez des bug a me les signaler.

Gros poutou à tous et à +...

Code : Tout sélectionner

Procedure Monte_element_tree_meme_niveau(id_tree)
  Debug "Procedure Monte_element_tree_meme_niveau(id_tree)"
  pos=GetGadgetState(id_tree)
  
  If pos>-1
    niv= GetGadgetItemAttribute(id_tree,pos,#PB_Tree_SubLevel)
    
    pos_ou_inserer=pos-1
    If GetGadgetItemAttribute(id_tree,pos_ou_inserer,#PB_Tree_SubLevel)>niv
      ;si l'élément précedent est plus profond
      Repeat ; on recul jusqu'a être au même niveau
        pos_ou_inserer-1
      Until GetGadgetItemAttribute(id_tree,pos_ou_inserer,#PB_Tree_SubLevel)=niv Or pos_ou_inserer=-1
      
    EndIf
    

    If GetGadgetItemAttribute(id_tree,pos_ou_inserer,#PB_Tree_SubLevel)<niv
      
      Repeat
        pos_ou_inserer-1
      Until niv-GetGadgetItemAttribute(id_tree,pos_ou_inserer,#PB_Tree_SubLevel)=<1 Or pos_ou_inserer=-1
      
      pos_ou_inserer+1
      
    EndIf
    
    
    
    If pos_ou_inserer>0 Or ( pos_ou_inserer=0 And niv=0 )
      pos_apres_au_meme_niv=pos
      Repeat
        pos_apres_au_meme_niv+1
      Until GetGadgetItemAttribute(id_tree,pos_apres_au_meme_niv,#PB_Tree_SubLevel)<=niv Or pos_apres_au_meme_niv>=CountGadgetItems(id_tree)

      s_pos_ou_inserer=pos_ou_inserer
      pos_a_bouger=pos
      For i=pos To pos_apres_au_meme_niv-1
        
        state=GetGadgetItemData(id_tree,pos_a_bouger)
        AddGadgetItem(id_tree,pos_ou_inserer,GetGadgetItemText(id_tree,pos_a_bouger),0,GetGadgetItemAttribute(id_tree,pos_a_bouger,#PB_Tree_SubLevel))
        SetGadgetItemData(id_tree,pos_ou_inserer,state)
        pos_ou_inserer+1
        pos_a_bouger+2
      Next

      RemoveGadgetItem(id_tree,pos_apres_au_meme_niv)
      SetGadgetState(id_tree,s_pos_ou_inserer)
      
      
    EndIf
    
    
  EndIf
  
EndProcedure

Procedure Descend_element_tree_meme_niveau(id_tree)
  Debug "----------------------------"
  pos=GetGadgetState(id_tree)
  
  If pos>-1
    niv= GetGadgetItemAttribute(id_tree,pos,#PB_Tree_SubLevel)
    
    pos_apres_au_meme_niv=pos
    Repeat
      pos_apres_au_meme_niv+1
    Until GetGadgetItemAttribute(id_tree,pos_apres_au_meme_niv,#PB_Tree_SubLevel)<=niv Or pos_apres_au_meme_niv>=CountGadgetItems(id_tree)
    
    pos_ou_inserer=pos_apres_au_meme_niv
    If GetGadgetItemAttribute(id_tree,pos_ou_inserer,#PB_Tree_SubLevel)=niv

      If GetGadgetItemAttribute(id_tree,pos_ou_inserer+1,#PB_Tree_SubLevel)>niv
        Repeat
          pos_ou_inserer+1
        Until  niv-GetGadgetItemAttribute(id_tree,pos_ou_inserer,#PB_Tree_SubLevel)>=0 Or pos_ou_inserer>=CountGadgetItems(id_tree)
        pos_ou_inserer-1
      EndIf
      pos_ou_inserer+1
    ElseIf niv-GetGadgetItemAttribute(id_tree,pos_ou_inserer,#PB_Tree_SubLevel)=1
      pos_ou_inserer+1
    ElseIf niv-GetGadgetItemAttribute(id_tree,pos_ou_inserer,#PB_Tree_SubLevel)>1
      Repeat
        pos_ou_inserer+1
      Until  niv-GetGadgetItemAttribute(id_tree,pos_ou_inserer,#PB_Tree_SubLevel)=1 Or pos_ou_inserer>=CountGadgetItems(id_tree)
      pos_ou_inserer+1
    EndIf

    
    If pos_ou_inserer<=CountGadgetItems(id_tree)
      
      pos_insert=pos_ou_inserer-1
      For i=pos To pos_apres_au_meme_niv-1
        If GetGadgetItemAttribute(id_tree,i,#PB_Tree_SubLevel)<niv
          Break
        EndIf
        pos_insert+1
        state=GetGadgetItemData(id_tree,i)
        AddGadgetItem(id_tree,pos_insert,GetGadgetItemText(id_tree,i),0,GetGadgetItemAttribute(id_tree,i,#PB_Tree_SubLevel))
        SetGadgetItemData(id_tree,pos_insert,state)
      Next
      
      RemoveGadgetItem(id_tree,GetGadgetState(id_tree))
      SetGadgetState(id_tree,pos_ou_inserer-(pos_apres_au_meme_niv-pos))
      
    EndIf
    
  EndIf
EndProcedure



Procedure DeplaceOuCopieElementTree(id_tree,pos_origine,pos_destination,type)
  If pos_origine<>pos_destination
    
    niv_origine= GetGadgetItemAttribute(id_tree,pos_origine,#PB_Tree_SubLevel)
    niv_destination= GetGadgetItemAttribute(id_tree,pos_destination,#PB_Tree_SubLevel)
    
    decal_niv=niv_destination-niv_origine+1
    pos_fin_a_copier=pos_origine
    Repeat
      pos_fin_a_copier+1
    Until GetGadgetItemAttribute(id_tree,pos_fin_a_copier,#PB_Tree_SubLevel)<=niv_origine Or pos_apres_au_meme_niv>=CountGadgetItems(id_tree)
    
    pos_insert=pos_destination
    
    decal_pos=0
    For i=pos_origine To pos_fin_a_copier-1
      
      
      pos_insert+1
      niv_insert=GetGadgetItemAttribute(id_tree,i+decal_pos,#PB_Tree_SubLevel)+decal_niv
      
      state=GetGadgetItemData(id_tree,i+decal_pos)
      AddGadgetItem(id_tree,pos_insert,GetGadgetItemText(id_tree,i+decal_pos),0,GetGadgetItemAttribute(id_tree,i+decal_pos,#PB_Tree_SubLevel)+decal_niv)
      SetGadgetItemData(id_tree,pos_insert,state)
      
      If pos_origine>pos_destination
        decal_pos+1
      EndIf
    Next
    RemoveGadgetItem(id_tree,pos_origine+decal_pos)
    
  EndIf
  
EndProcedure
  
  
If OpenWindow(0, 0, 0, 320, 610, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
  TreeGadget(0, 10, 10, 250, 600,#PB_Tree_AlwaysShowSelection)      
  ButtonGadget(1,270,20,20,20,"^")
  ButtonGadget(2,270,50,20,20,"v"); liste arborescente standard
  StringGadget(3,270,80,40,20,"")
  EnableGadgetDrop(0, #PB_Drop_Private, #PB_Drag_Move | #PB_Drag_Copy ,1)
  
  ; liste arborescente avec cases à cocher + sans lignes reliant les noeuds
  num=-1
  
  For a = 0 To 5
    num+1
    AddGadgetItem (id, -1, Str(num)+" - Partie  "+Str(a)+Str(b)+Str(c)+Str(d), 0, 0) ; si vous souhaitez ajouter une image, utilisez 
    SetGadgetItemData(id,num,Val(Str(num)+Str(a)+Str(b)+Str(c)+Str(d)))
    If Random(1)=1
      For b = 0 To 5
        num+1
        AddGadgetItem (id, -1, Str(num)+" - Sous Partie  "+Str(a)+Str(b)+Str(c)+Str(d), 0, 1) ; si vous souhaitez ajouter une image, utilisez 
        SetGadgetItemData(id,num,Val(Str(num)+Str(a)+Str(b)+Str(c)+Str(d)))
        If Random(1)=1
          For c = 0 To 5
            num+1
            AddGadgetItem (id, -1, Str(num)+" - Elément  "+Str(a)+Str(b)+Str(c)+Str(d), 0, 2) ; si vous souhaitez ajouter une image, utilisez 
            SetGadgetItemData(id,num,Val(Str(num)+Str(a)+Str(b)+Str(c)+Str(d)))
            If Random(1)=1
              For d = 0 To 5
                num+1
                AddGadgetItem (id, -1, Str(num)+" - SS Elément  "+Str(a)+Str(b)+Str(c)+Str(d), 0, 3) ; si vous souhaitez ajouter une image, utilisez 
                SetGadgetItemData(id,num,Val(Str(num)+Str(a)+Str(b)+Str(c)+Str(d)))
              Next
            EndIf
            
          Next
          If Random(1)=1
            num+1
            AddGadgetItem (id, -1, Str(num)+" - Sous Partie  "+Str(a)+Str(b)+Str(c)+Str(d), 0, 1) ; si vous souhaitez ajouter une image, utilisez 
            SetGadgetItemData(id,num,Val(Str(num)+Str(a)+Str(b)+Str(c)+Str(d)))
          EndIf
        EndIf
        
      Next
    EndIf
  Next
  
  For i=0 To 15;CountGadgetItems(0)
    SetGadgetItemState(0,i,#PB_Tree_Expanded)
  Next
  
  Repeat 
    event=WaitWindowEvent()
    If event=#PB_Event_Gadget
      Select EventGadget()
        Case 0
          Select EventType() 
            Case #PB_EventType_LeftClick
              SetGadgetText(3,Str(GetGadgetItemData(0,GetGadgetState(0))))
            Case #PB_EventType_DragStart
              Debug "start "+Str(GetGadgetState(0))
              start=GetGadgetState(0)
              DragPrivate(1,#PB_Drag_Move)
              
              
          EndSelect
          
        Case 1
          Monte_element_tree_meme_niveau(0)
        Case 2
          Descend_element_tree_meme_niveau(0)
      EndSelect
    ElseIf event= #PB_Event_GadgetDrop
      Select EventGadget()
        Case 0
          DeplaceOuCopieElementTree(0,start,GetGadgetState(0),EventDropAction())
      EndSelect
      
    EndIf
    
  Until  event= #PB_Event_CloseWindow
  
  
  
  
EndIf
  
  
  

Re: Monter ou descendre des éléments dans un tree

Publié : sam. 26/mai/2012 19:08
par dayvid
Merci à toi Stefou, c'est utile merci :)

Re: Monter ou descendre des éléments dans un tree

Publié : sam. 26/mai/2012 22:25
par Kwai chang caine
Salut STEPHOU, ça faisait un bail :D
J'ai essayé je ne sais pas si c'est l'effet voulu, mais quand on drag/drop un ss element sur un autre ss element du meme niveau dans le meme element, cela ne le deplace pas a coté du sous element, comme le ferait un comportement "habituel", mais ça créé un noeud regroupant les deux sous elements 8O

Autrement joli boulot 8)

Re: Monter ou descendre des éléments dans un tree

Publié : dim. 27/mai/2012 6:57
par Stefou
Salut Kwai Chang caine

Effectivement le drag and drop n'est pas top, ce n'était pas ma priorité !
Je l'ai laissé quand même, cela peut donner des idée ...

a+

Re: Monter ou descendre des éléments dans un tree

Publié : dim. 27/mai/2012 22:23
par Kwai chang caine
No problem ....c'etait pour aider :wink:

Re: Monter ou descendre des éléments dans un tree

Publié : mer. 30/mai/2012 14:09
par Le Soldat Inconnu
Salut,

j'ai bien une solution qui traine ici : (et qui fonctionne avec le drag & drop)
http://www.purebasic.fr/french/viewtopi ... treegadget