Monter ou descendre des éléments dans un tree

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Stefou
Messages : 234
Inscription : jeu. 18/janv./2007 14:08

Monter ou descendre des éléments dans un tree

Message 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
  
  
  
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

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

Message par dayvid »

Merci à toi Stefou, c'est utile merci :)
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

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

Message 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)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Stefou
Messages : 234
Inscription : jeu. 18/janv./2007 14:08

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

Message 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+
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

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

Message par Kwai chang caine »

No problem ....c'etait pour aider :wink:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

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

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Répondre