TreeGadget - Déplacer des élements
Publié : lun. 13/juin/2011 15:54
Salut,
un petit code qui permet de déplacer des élément dans un TreeGadget.
4 boutons pour :
- Déplacer vers le haut
- Déplacer vers le bas
- Augmenter le niveau
- Diminuer le niveau
Déplacement des éléments par glisser déposer :
- Diminuer le niveau en déplaçant l'élément vers la gauche
- Augmenter le niveau en déplaçant l'élément vers la droite
- Déplacer l'élément vers le haut ou le bas
Quand on déplace ou change le niveau d'un élément, tous les enfants de l'élément sont également déplacer
Le TreeGadget doit être rempli à partir d'une List
Le code est portable, il suffit de supprimer les 2 APIs lockWindowUpdate_() qui ne servent qu'a éviter le clignotement du TreeGadget lors du remplissage avec les éléments.
un petit code qui permet de déplacer des élément dans un TreeGadget.
4 boutons pour :
- Déplacer vers le haut
- Déplacer vers le bas
- Augmenter le niveau
- Diminuer le niveau
Déplacement des éléments par glisser déposer :
- Diminuer le niveau en déplaçant l'élément vers la gauche
- Augmenter le niveau en déplaçant l'élément vers la droite
- Déplacer l'élément vers le haut ou le bas
Quand on déplace ou change le niveau d'un élément, tous les enfants de l'élément sont également déplacer
Le TreeGadget doit être rempli à partir d'une List
Le code est portable, il suffit de supprimer les 2 APIs lockWindowUpdate_() qui ne servent qu'a éviter le clignotement du TreeGadget lors du remplissage avec les éléments.
Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; Version de PB : 4.50
; Explication du programme :
; Arbre modifiable
Structure ArbreInfo
Nom.s
Niveau.l
Pliage.l
EndStructure
Global NewList Arbre.ArbreInfo()
#Arbre = 0
#Fenetre = 0
#Arbre_DragDrop_Deplacer = 0
Global DragDrop_Start, DragDrop_Start_X
Procedure Arbre_Pliage()
ForEach Arbre()
If GetGadgetItemState(#Arbre, ListIndex(Arbre())) & #PB_Tree_Expanded
Arbre()\Pliage = 1
Else
Arbre()\Pliage = 0
EndIf
Next
EndProcedure
Procedure Arbre_Niveau_Correction()
Niveau = 0
ForEach Arbre()
If Arbre()\Niveau > Niveau + 1
Arbre()\Niveau = Niveau + 1
EndIf
If Arbre()\Niveau < 0
Arbre()\Niveau = 0
EndIf
Niveau = Arbre()\Niveau
Next
EndProcedure
Procedure Arbre_Remplir(Position = -1)
LockWindowUpdate_(WindowID(0))
ClearGadgetItems(#Arbre)
ForEach Arbre()
AddGadgetItem(#Arbre, -1, Arbre()\Nom, 0, Arbre()\Niveau)
If Pliage
SetGadgetItemState(#Arbre, ListIndex(Arbre()) - 1, #PB_Tree_Expanded)
EndIf
Pliage = Arbre()\Pliage
Next
If Position >= 0
SetGadgetState(#Arbre, Position)
EndIf
LockWindowUpdate_(0)
EndProcedure
Procedure Arbre_Deplacer(Position, Mouvement)
Protected PositionFinale, *Deplacer1.ArbreInfo, *Deplacer2.ArbreInfo
Arbre_Pliage()
If Position >= 0
; Vérification
If Position + Mouvement < 0
Mouvement = -Position
EndIf
If Position + Mouvement >= ListSize(Arbre())
Mouvement = ListSize(Arbre()) - 1 - Position
EndIf
; Position finale
PositionFinale = Position + Mouvement
; Evolution du niveau entre le départ et l'arrivée
SelectElement(Arbre(), Position)
Niveau = Arbre()\Niveau
SelectElement(Arbre(), PositionFinale)
Evolution = Arbre()\Niveau - Niveau
If NextElement(Arbre())
If Arbre()\Niveau > Niveau + Evolution
Evolution + 1
EndIf
EndIf
; Nombre d'élément à déplacer (Regarde le nombre d'enfants à déplacer)
SelectElement(Arbre(), Position)
Suivant = 0
While NextElement(Arbre())
If Arbre()\Niveau <= Niveau
Break
EndIf
Suivant + 1
Wend
If Mouvement > 0 And Position + Suivant >= PositionFinale
Suivant = 0 ; Si le déplacement se fait dans un élément enfant, on ne déplace pas les enfants
EndIf
; Déplacement
Repeat
SelectElement(Arbre(), Position)
If Mouvement > 0
For i = 1 To Mouvement
*Deplacer1 = @Arbre()
NextElement(Arbre())
*Deplacer2 = @Arbre()
SwapElements(Arbre(), *Deplacer1, *Deplacer2)
ChangeCurrentElement(Arbre(), *Deplacer1)
Next
ElseIf Mouvement < 0
For i = 1 To -Mouvement
*Deplacer1 = @Arbre()
PreviousElement(Arbre())
*Deplacer2 = @Arbre()
SwapElements(Arbre(), *Deplacer1, *Deplacer2)
ChangeCurrentElement(Arbre(), *Deplacer1)
Next
Position + 1
EndIf
Arbre()\Niveau + Evolution
Suivant - 1
Until Suivant < 0
Arbre_Niveau_Correction()
Arbre_Remplir(PositionFinale)
EndIf
EndProcedure
Procedure Arbre_Niveau(Position, Evolution)
Arbre_Pliage()
If Position >= 0
SelectElement(Arbre(), Position)
Niveau = Arbre()\Niveau
; Vérification
If Niveau + Evolution < 0
Evolution = -Niveau
EndIf
If Evolution > 0
If PreviousElement(Arbre())
If Niveau + Evolution > Arbre()\Niveau + 1
Evolution = Arbre()\Niveau + 1 - Niveau
EndIf
NextElement(Arbre())
EndIf
EndIf
; Correction du pliage de l'arbre
If Evolution > 0
If PreviousElement(Arbre())
Arbre()\Pliage = 1
NextElement(Arbre())
EndIf
EndIf
If Evolution < 0
If NextElement(Arbre())
If Arbre()\Niveau = Niveau
PreviousElement(Arbre())
Arbre()\Pliage = 1
Else
PreviousElement(Arbre())
EndIf
EndIf
EndIf
; Change le niveau
Arbre()\Niveau + Evolution
While NextElement(Arbre())
If Arbre()\Niveau <= Niveau
Break
EndIf
Arbre()\Niveau + Evolution
Wend
Arbre_Niveau_Correction()
Arbre_Remplir(Position)
EndIf
EndProcedure
Procedure Arbre_GlisserDeposer()
Protected DragDrop_X, DragDrop_End
DragDrop_End = GetGadgetState(#Arbre)
If DragDrop_End = -1
DragDrop_End = CountGadgetItems(#Arbre) - 1
EndIf
DragDrop_X = WindowMouseX(#Fenetre) - DragDrop_Start_X
If DragDrop_End = DragDrop_Start
; On change le niveau de l'élément
If DragDrop_X > 8
Arbre_Niveau(DragDrop_Start, 1)
ElseIf DragDrop_X < -8
Arbre_Niveau(DragDrop_Start, -1)
EndIf
Else
; On déplace l'élément
Arbre_Deplacer(DragDrop_Start, DragDrop_End - DragDrop_Start)
EndIf
EndProcedure
; Création de la fenêtre et de la GadgetList
If OpenWindow(#Fenetre, 0, 0, 500, 500, "Arbre", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0
End
EndIf
TreeGadget(#Arbre, 0, 0, 300, 500, #PB_Tree_AlwaysShowSelection)
EnableGadgetDrop(#Arbre, #PB_Drop_Private, #PB_Drag_Move, #Arbre_DragDrop_Deplacer)
ButtonGadget(1, 300, 0, 200, 30, "Monter")
ButtonGadget(2, 300, 30, 200, 30, "Descendre")
ButtonGadget(3, 300, 60, 200, 30, "Niveau +")
ButtonGadget(4, 300, 90, 200, 30, "Niveau -")
TextGadget(5, 300, 120, 200, 50, "") ; Pour afficher des informations
; Remplissage de l'arbre
For i = 1 To 20
AddElement(Arbre())
Arbre()\Nom = "Elément " + Str(i)
Next
Arbre_Remplir()
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
Position = GetGadgetState(#Arbre)
Select EventGadget() ; Gadgets
Case #Arbre
Select EventType()
Case #PB_EventType_DragStart ; Glisser déposer
DragDrop_Start = Position
DragDrop_Start_X = WindowMouseX(#Fenetre)
DragPrivate(#Arbre_DragDrop_Deplacer, #PB_Drag_Move)
EndSelect
Case 1
Arbre_Deplacer(Position, -1)
Case 2
Arbre_Deplacer(Position, 1)
Case 3
Arbre_Niveau(Position, 1)
Case 4
Arbre_Niveau(Position, -1)
EndSelect
Case #PB_Event_GadgetDrop
; Opération de glisser déposer
Select EventGadget()
Case #Arbre
Select EventDropType()
Case #PB_Drop_Private
Select EventDropPrivate()
Case #Arbre_DragDrop_Deplacer
Arbre_GlisserDeposer()
EndSelect
EndSelect
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow