Page 1 sur 1

TreeGadget - Déplacer des élements

Publié : lun. 13/juin/2011 15:54
par Le Soldat Inconnu
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.

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

Re: TreeGadget - Déplacer des élements

Publié : lun. 13/juin/2011 17:02
par Kwai chang caine
Cool merci Soldat 8)

Re: TreeGadget - Déplacer des élements

Publié : lun. 13/juin/2011 17:22
par Le Soldat Inconnu
Bon, si ça marche pour KCC, il ne doit pas rester de bug :mrgreen:

Re: TreeGadget - Déplacer des élements

Publié : lun. 13/juin/2011 17:33
par nico
Fonctionne bien :)

Re: TreeGadget - Déplacer des élements

Publié : mar. 14/juin/2011 9:10
par GeBonet
Parfait, comme toujours... :D
Mais cela m'as rappelé un code d'Olivier sur le sujet qui était (et Est aussi) très bien...Ci-dessous !

Je me demande s'il n'y a pas moyen de faire un "Mixte" des deux car la création des "parents enfants chez Olivier est pas mal... :?:

- Souplesse de création + Déplacement !

Code : Tout sélectionner

;*************************************************************************************
; Arbr(Action, Arbre, Clef, Racine)  Traite l'arbre représenté par un TreeGadget
;                                                                                                       Ollivier 07/07
;*************************************************************************************
;
;Entrées  ACTION.      LONG Contient le n° de l'action que la procédure doit exécuter
;         ARBRE.       LONG Contient le n° du TreeGadget que la procédure doit modifier
;         CLEF.        LONG Contient le n° du GadgetItem auquel la procédure se réfère
;         RACINE.      STRING Contient la chaîne (GadgetItemText) que la procédure peut utiliser
;         >>>> (Pour les fichiers) Contient le nom du fichier que la procédure peut traiter
;
;Sortie   REACTION.    LONG
;         >>>> (Pour les fichiers) Contient la réussite du transfert avec le fichier traité
;
; -------------------------------------------------------------------------------------
; ACTION = 0 : Efface entièrement l'arbre
; -------------------------------------------------------------------------------------
;Entrees: ARBRE  N° de l'arbre à effacer
;         RACINE Contenu de la clef racine une fois l'arbre effacé

;Rem      S'il n'y a plus de clef, il n'y a plus d'édition possible.
;         Donc une clef racine est recréée après l'effacement de l'arbre

;Sortie   REACTION Pointeur vers la chaîne contenant le rapport d'erreur
;         
; -------------------------------------------------------------------------------------
; ACTION = 1 : Crée une clef 'soeur ainée' de la clef spécifiée
; -------------------------------------------------------------------------------------
;Entrees: ARBRE  N° de l'arbre à modifier
;         CLEF   N° de la clef spécifiée
;         RACINE Contenu de la clef 'soeur ainée'
;
;Rem  La 'soeur ainée' est la première clef dans la liste
;         qui contient la clef spécifiée.
;         Une liste peut être considérée comme l'ensemble de clef contigües de même
;         niveau.
;         La 'soeur ainée' a le même niveau que la clef spécifiée

;Sortie   REACTION Pointeur vers la chaîne contenant le rapport d'erreur
 ;        
; -------------------------------------------------------------------------------------
; ACTION = 2 : Crée une clef 'soeur cadette' de la clef spécifiée
; -------------------------------------------------------------------------------------
;Entrees: ARBRE  N° de l'arbre à modifier
;         CLEF   N° de la clef spécifiée
;         RACINE Contenu de la clef 'soeur cadette'

;Rem      La 'soeur cadette' est la clef qui succède immédiatement
;         à la clef spécifiée
;         La 'soeur cadette' a le même niveau que la clef spécifiée

;Sortie   REACTION Pointeur vers la chaîne contenant le rapport d'erreur
 ;        
; -------------------------------------------------------------------------------------
; ACTION = 3 : Crée une clef 'soeur benjamine' de la clef spécifiée
; -------------------------------------------------------------------------------------
;Entrees: ARBRE  N° de l'arbre à modifier
;         CLEF   N° de la clef spécifiée
;         RACINE Contenu de la clef 'soeur benjamine'

;Rem      La 'soeur benjamine' est la dernière clef dans la liste
;         qui contient la clef spécifiée
;         La 'soeur benjamine' a le même niveau que la clef spécifiée
;
;Sortie   REACTION Pointeur vers la chaîne contenant le rapport d'erreur
;         
; -------------------------------------------------------------------------------------
; ACTION = 4 : Crée une clef 'fille ainée' de la clef spécifiée
; -------------------------------------------------------------------------------------
;Entrees: ARBRE  N° de l'arbre à modifier
;               CLEF   N° de la clef spécifiée
;               RACINE Contenu de la clef 'fille ainée'
;
;Rem  La 'fille ainée' est la première clef dans la sous-liste
;         contenue par la clef spécifiée
;         La 'fille ainée' a un niveau N+1 par rapport au niveau N
;         de la clef spécifiée
;
;Sortie   REACTION Pointeur vers la chaîne contenant le rapport d'erreur
 ;        
; -------------------------------------------------------------------------------------
; ACTION = 5 : Crée une clef 'fille benjamine' de la clef spécifiée
; -------------------------------------------------------------------------------------
;Entrees: ARBRE  N° de l'arbre à modifier
;               CLEF   N° de la clef spécifiée
;               RACINE Contenu de la clef 'fille benjamine'

;Rem      La 'fille benjamine' est la dernière clef dans la sous-liste
;         contenue par la clef spécifiée
;         La 'fille benjamine' a un niveau N+1 par rapport au niveau N
;         de la clef spécifiée

;Sortie   REACTION Pointeur vers la chaîne contenant le rapport d'erreur
;         
; -------------------------------------------------------------------------------------
; ACTION = 8 : Enregistre l'arbre dans un fichier spécifié
; -------------------------------------------------------------------------------------
;Entrees: ARBRE  N° de l'arbre à enregistrer
;         RACINE Nom du fichier d'enregistrement

;Rem      Le format utilisé est une succession de champs
;         STRING + LONG pour chaque clef.
;         STRING = Contenu de la clé en cours d'enregistrement
;         LONG   = Niveau de la clé en cours d'enregistrement

;Sortie   REACTION Pointeur vers la chaîne contenant le rapport d'erreur
 ;        
; -------------------------------------------------------------------------------------
; ACTION = 9 : Charge l'arbre depuis un fichier spécifié
; -------------------------------------------------------------------------------------
;Entrees: ARBRE  N° de l'arbre à charger
;         RACINE Nom du fichier de chargement

;Rem      Le format utilisé est une succession de champs
;         STRING + LONG pour chaque clef.
;         STRING = Contenu de la clé en cours d'enregistrement
;         LONG   = Niveau de la clé en cours d'enregistrement

;Sortie   REACTION Pointeur vers la chaîne contenant le rapport d'erreur 
; ******************************************************************************************
;
Procedure.l Arbr(Action.l, Arbre.l, Clef.l, Racine.S)
  Reaction.l = 0
  ClefFinale.l = CountGadgetItems(Arbre) - 1
  If Action <= 5
    JeunesseClef.l = GetGadgetItemAttribute(Arbre, Clef, #PB_Tree_SubLevel)
    Select Action
        Case 0:; ClearGadgetItemList(Arbre)
            Clef = -1: JeunesseClef = 0
        Case 1
            For i = Clef To 0 Step -1
                Jeunesse = GetGadgetItemAttribute(Arbre, i, #PB_Tree_SubLevel)
                If Jeunesse < JeunesseClef
                    Clef = i: i = 0
                ElseIf Jeunesse = 0
                    Clef = -1: i = 0: EndIf
            Next i
    Case 2, 3, 5
          ClefFinale = CountGadgetItems(Arbre)
          For i = Clef + 1 To ClefFinale
            Jeunesse = GetGadgetItemAttribute(Arbre, i, #PB_Tree_SubLevel)
            If Action = 5: If Jeunesse <= JeunesseClef: Clef = i - 1: i = ClefFinale: EndIf
            ElseIf Action = 2: If Jeunesse > JeunesseClef: Clef = i: EndIf
              If Jeunesse <= JeunesseClef: i = ClefFinale: EndIf
            Else: If Jeunesse => JeunesseClef: Clef = i: EndIf
              If Jeunesse < JeunesseClef: i = ClefFinale: EndIf
            EndIf
          Next
          If Action = 5: JeunesseClef + 1: EndIf
        Case 4
            JeunesseClef + 1
    EndSelect   
    AddGadgetItem(Arbre, Clef + 1, Racine, 0, JeunesseClef)
    If Action = 4 Or Action = 5: SetGadgetItemState(Arbre, Clef, #PB_Tree_Expanded): EndIf
  Else
    Select Action     
    Case 8
      Reaction.l = CreateFile(#PB_Any, Racine)
      If Reaction <> 0
        For i = 0 To ClefFinale
          WriteLong(Reaction, GetGadgetItemAttribute(Arbre, i, #PB_Tree_SubLevel) )
          WriteStringN(Reaction, GetGadgetItemText(Arbre, i) )
        Next
      EndIf
    Case 9: Reaction = ReadFile(#PB_Any, Racine)
      If Reaction <> 0
        ;i.l = 0
        ;ClearGadgetItemList(Arbre)
        Repeat
          Level.l = ReadLong(Reaction)
          String.s = ReadString(Reaction)
          AddGadgetItem(Arbre, i, String, 0, Level): i + 1
        Until Eof(Reaction)
      EndIf     
    EndSelect
    If IsFile(Reaction): CloseFile(Reaction): EndIf
    ProcedureReturn Reaction
  EndIf
EndProcedure

Global DSt.S = ""
DSt + "GFFGFFG8F0GDF68F0GBF68F770G4F7G1F8FG070G3F77FFF8FG078G4F7F888FG07866G3F77FFFG078"
DSt + "G06G3FG378F4G06G2FG278FFF4G06G2FG178G0F4G06G2FG078G1F4G06G2FG17G1F466G5FG07G1F46"
DSt + "GFF4GFFGFFGFFGFFG6FGBCFG09CG9ECFG09GBCF99GEF99FFGB7F99GD7F99FFGB7F99GEF99FFGB9FG"
DSt + "19G9B9FGF9FF7GFF7FFGB7FFGE7FF7FFGB7FF7GFF7FFGB7FFGE7G1FGB7GFFG2FGB7FFGE7FF7FFGB7"
DSt + "FF7GFF7FFGB7FFGE7FF7FFGB7FF7GFF7FFGB9FG19G9B9FGF9F99GEF99FFGBCFG09CG9ECFG09GBCFF"
DSt + "7GFF7FFGB7FFGE7G1FGB7GFFG2FGB7FFGE7FF7FFGB7FF7GFF7FFGB7FFGE7FF7FFGB7FF7GFF7FFGB9"
DSt + "FG19G9B9FGF9F99GEF99FFGB7F99GD7F99FFGB7F99GEF99FFGBCFG09CG9ECFG09GBCGFFFFGB9G1F9"
DSt + "G9B9G1FGB9G1F99GEF99FFFGACFG19CG8ECFG19GACFF7GFF7FFFGA7FFGE7FF7FFFGA7FF7GFF7FFFG"
DSt + "A7FFGE7FF7FFFGA7FF7GFF7FFFGA7FFGE7G2FGA7GFFFFGB9G1F9G9B9G1FGB9G1F99GEF99FFFGA7F9"
DSt + "9GD7F99FFFGA7F99GEF99FFFGA7F99GD7F99FFFGA7F99GEF99FFFGA7F99GD7F99FFFGA7F99GEF99F"
DSt + "FFGACFG19CG8ECFG19GACGFFFFG20G57000FFG20G170007G00FG20G170007G00FG20G170007G00FG"
DSt + "20G170007G00FG20G170007G00FG20G57G00FGF0F000G9F000F000G1F000G1F000F000G0F07F70G0"
DSt + "F000F000G0F7FF70G0F000F000G2F70G1F000F000G2F0G2F000F000G9F000F000G2F0G2F000F000G"
DSt + "2F7G2F000F0FGB0F0FGF0GFFGFFGFFGFFG6F00GDF0FF0GFFF0F0GEF00GDF000G6F000GCF0EEEG50G"
DSt + "3F0G7E0G3F0G7E0G3F0G7E0G3F0G0EG80FFF0EEE0G7E0FFF0EE0G7E0G0F0E0G7E0G1F00G7E0G2FG9"
DSt + "0GFFG4F"

Procedure.l ValHex(a.s)
  x = Asc(a): If x < 58: S = x - 48: Else: S = x - 55: EndIf: ProcedureReturn S
EndProcedure

Procedure RecupIco()
  Ico.S = ""
  For i = 1 To Len(DSt): A.S = Mid(DSt, i, 1)
    If A = "G": N.S = Mid(DSt, i + 1, 1)
      A = Mid(DSt, i + 2, 1): For j = 1 To 4 + ValHex(N): Ico + A: Next: i + 2
    Else: Ico + A
    EndIf
  Next: Adr = 0
  For ix = 0 To 7
    CreateImage(ix, 20, 20): StartDrawing(ImageOutput(ix) )
      For y = 0 To 19
        For x = 0 To 19
          Adr + 1: Pt = ValHex(Mid(Ico, Adr, 1))
          If Pt & 8: coef = 255: Else: coef = 128: EndIf
          R = ((Pt & 4) >> 2) * coef: V = ((Pt & 2) >> 1) * coef: B = ((Pt & 1) ) * coef
          C = RGB(R, V, B): If Pt = 7: C = RGB(192, 192, 192): EndIf         
          If Pt = 8: C = RGB(128, 128, 128): EndIf: Plot(x, y, C)
        Next
      Next
      StopDrawing()
    Next
EndProcedure

Procedure Enreg(Gadget)
  Repeat
    Repeat         
      Name.S = SaveFileRequester("Enregistrer sous", "", "Tout type de fichier|*.*;Base de données|*.BDD", 1)
      If Name = "": Goto ExitEnreg: EndIf
      If 0 Or FileSize(Name) = -2: MessageRequester("Message", "Nom de fichier invalide !", 0): EndIf
    Until FileSize(Name) <> -2 
    If FileSize(Name) <> -1
      Mess = MessageRequester("Message", "Le fichier " + Name + " existe déjà ! Voulez-vous l'écraser ?", #PB_MessageRequester_YesNoCancel)
      If Mess = #PB_MessageRequester_Cancel: Goto ExitEnreg: EndIf
    EndIf
  Until FileSize(Name) = -1 Or Mess = #PB_MessageRequester_Yes
  Arbr(8, Gadget, 0, Name)
ExitEnreg:
EndProcedure

Procedure Charge(Gadget)
  Name.S = OpenFileRequester("Ouvrir", "", "Tout type de fichier|*.*;Base de données|*.BDD", 1)
  If FileSize(Name) < 0
    MessageRequester("Message", "Nom de fichier incorrect ou inexistant !", 0)   
  Else
    Arbr(9, Gadget, 0, Name)
  EndIf
EndProcedure

;************************************************************************ 
; PREPARATION MENU
;************************************************************************ 
  ; On récupère les icônes
  ;************************
  RecupIco()

  ; On crée la fenêtre du menu
  ;****************************
  OpenWindow(0, 10, 10, 28, 28 * 8, "x", #PB_Window_BorderLess)
  StickyWindow(0, 1)
  HideWindow(0, 1)

  ; On crée les boutons du menu
  ;******************************
  ; CreateGadgetList(WindowID(0) )
  For i = 0 To 7
    ButtonImageGadget(i, 0, 28 * i, 28, 28, ImageID(i) )
  Next i
 
  ; On rajoute un peu d'aide
  ;**************************
  GadgetToolTip(0, "Détruire l'arbre")
  GadgetToolTip(1, "Crée une clé 'soeur ainée'")
  GadgetToolTip(2, "Crée une clé 'soeur cadette'")
  GadgetToolTip(3, "Crée une clé 'soeur benjamine'")
  GadgetToolTip(4, "Crée une clé 'enfant ainé'")
  GadgetToolTip(5, "Crée une clé 'enfant benjamin'")
  GadgetToolTip(6, "Enregistrer sous")
  GadgetToolTip(7, "Ouvrir")
;************************************************************************ 
;************************************************************************
 
;************************************************************************ 
;  PREPARATION FENETRE PRINCIPALE
;************************************************************************ 
  ; On crée la fenêtre
  ;********************
  OpenWindow(1, 0, 0, 400, 450, "ArBr", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_SizeGadget)
 
  ; On crée le TreeGadget
  ;***********************
  ; CreateGadgetList(WindowID(1) )
  Global Gadget = TreeGadget(-1, 0, 0, 400, 450, #PB_Tree_AlwaysShowSelection)
  
  LoadFont(0, "Verdana", 16, #PB_Font_Italic)
  SetGadgetFont(Gadget, FontID(0) )
 
  ; On crée un menu PopUp
  ;***********************
  CreatePopupMenu(0)
  MenuItem(0, "Renommer")
  MenuItem(1, "Supprimer")
 
  ; Derniers préparatifs
  ;**********************
  Arbr(0, Gadget, 0, "(vide)")
  SetGadgetState(Gadget, 0)
  ResizeWindow(0, WindowX(1) - 30, WindowY(1) + 30, #PB_Ignore, #PB_Ignore)
  HideWindow(0, 0) 
 
;************************************************************************ 
;************************************************************************ 
 
  ; On fait une boucle d'événements
  ;*********************************
Global Modified.l = 0 

Repeat
    Ev = WaitWindowEvent()   
    Selected = GetGadgetState(Gadget)
    Select Ev
;
        Case #WM_RBUTTONDOWN
                DisplayPopupMenu(0, WindowID(1) )     
        Case #PB_Event_Gadget
                Gadg = EventGadget()
                Select Gadg
                    Case 0: Nouv = 0     
                        Arbr(0, Gadget, 0, "(vide_" + Str(Nouv) + ")"): Modified = 1
                      Case 1, 2, 3, 4, 5
                        ;If Selected <> -1
                        ;  OldSelected = Selected
                        Nouv + 1
                        Arbr(Gadg, Gadget, Selected, "(vide_" + Str(Nouv) + ")"): Modified = 1
                        ;Else
                        ;  Selected = OldSelected
                        ;EndIf
                      Case 6
                        Enreg(Gadget)
                      Case 7
                        Charge(Gadget)
                EndSelect
;                
       Case #PB_Event_Menu
        
            Select EventMenu()
               Case 0
                    SetGadgetItemText(Gadget, Selected, InputRequester("Renommer", "Entrez le nouveau nom :", GetGadgetItemText(Gadget, Selected) ) )
                    Modified = 1
               Case 1
                    If MessageRequester("Confirmer", "Voulez-vous réellement supprimer " + GetGadgetItemText(Gadget, Selected) + " ?", #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
                      RemoveGadgetItem(Gadget, Selected): Modified = 1
                      If CountGadgetItems(Gadget) = 0
                        Arbr(0, Gadget, 0, "(vide)")
                      EndIf
                    EndIf
          EndSelect
;
        Case #PB_Event_SizeWindow
            ResizeGadget(Gadget, 0, 0, WindowWidth(1), WindowHeight(1) )     
        Case #PB_Event_MoveWindow
            ResizeWindow(0, WindowX(1) - 30, WindowY(1) + 30, #PB_Ignore, #PB_Ignore)
        Case #PB_Event_CloseWindow
            If Modified
                Mess = MessageRequester("Message", "Le document n'a pas été enregistré. Souhaitez-vous le faire maintenant ?", #PB_MessageRequester_YesNoCancel)
                Select Mess
                    Case #PB_MessageRequester_Yes
                        Enreg(Gadget)
                    Case #PB_MessageRequester_No
                        Quit = 1
                EndSelect
            Else
                    Quit = 1
            EndIf     
    EndSelect
Until Quit = 1
Mais bon, ce n'est qu'une suggestion :D
Et merci pour ce code LSI...
Gerhard

Re: TreeGadget - Déplacer des élements

Publié : mar. 14/juin/2011 16:20
par dayvid
Cool merci :P

Re: TreeGadget - Déplacer des élements

Publié : lun. 05/mars/2012 22:45
par Le Soldat Inconnu
Mise à jour, je viens de trouver un bug. Voir le code dans le premier sujet

Re: TreeGadget - Déplacer des élements

Publié : mar. 06/mars/2012 10:01
par djes
Ce sujet est très intéressant, si j'étais modo je le mettrais dans un topic spécial sur les interfaces. Qu'est-ce que ça peut être galère la manipulation des arbres, j'ai horreur de ça !