Je m'essaie au DragNDrop sur un TreeGadget.
J'arrive a déplacer les items (suppression/insertion).
Mais quel a été ma surprise de voir que DragNDrop ne gérer pas le scrolling !
Si je déplace un item au-dessus ou au-dessous de la partie visible de la liste,
pas de déplacement !
Sur le coup, j'ai pensé qu'une subtilité m'avais écharpé. Mais apparemment non !
C'est bien le DragNDrop qui ne gère pas le scrolling (ou le gadget !)
Je n'ai pas trouvé d'exemples qui gère les ascenseurs en fonction du déplacement du curseur.
Je suppose qui faille utilisé les APIs, ou/et une callback.
Le développe sous linux, si quelqu'un a du code qui fonctionne, merci a lui d'avance !
Je poste mon code de test, enfin mon code de développement (épurer au maximum),
pour illustrer le problème (si problème il y a, car j'ai parfaitement pu m'y prendre comme un pied)
Merci d'avance pour tous vos essais, et vos commentaires !
Code : Tout sélectionner
; Utilisation d'un TreeGadget des liste de contacts
; Utilisation du DragNDrop pour déplace les contacts
; Le DragNDrop ne gére pas le scrolling (déplacement) des items ???
; En dehors de la partie visible ???
EnableExplicit
Enumeration Fenetre
;{
#f1
EndEnumeration
;}
Enumeration Gadget
;{
#Tree
EndEnumeration
;}
;{
Enumeration Divers
#PrivateType = 10 ; variable pour #PB_Drop_Private
;}
EndEnumeration
; Les structures
; Les variables
Global f1Quitter ; Variable boucle principale
Global aa.b ; Variable boucle de test
Global PositionDepart.l ; Variable position item de départ du DragNDrop
Global PositionArriver.l ; Variable position item d'Arriver du DragNDrop
;Global *PositionRelatif
Global PDItem$ ; Variable temporaire PositionDépartItem
Global PAItem$ ; Variable temporaire PositionArrivertItem
; ##################################################
; Les Procédures
; ##################################################
Procedure.b CreationFenetre()
If OpenWindow(#f1, 100, 100, 300, 400, "Test Drag-Drop", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget)
; Menu, raccourci et menu popup
; Gadget
TreeGadget(#Tree,0,0,300,400,#PB_Tree_NoLines | #PB_Tree_NoButtons | #PB_Tree_AlwaysShowSelection)
; rempli la liste
For aa = 0 To 50
AddGadgetItem(#Tree, -1, "Item" + Str(aa), 0, 0)
Next aa
ProcedureReturn 1
Else
ProcedureReturn 0
EndIf
EndProcedure
; ##################################################
; Début programme
; ##################################################
; Lecture fichier initialisation
; Chargement des images
; Lecture fichier données
CreationFenetre()
; 1er cas OK
;EnableGadgetDrop(#Tree, #PB_Drop_Text, #PB_Drag_Move)
; 2ème cas OK
EnableGadgetDrop(#Tree, #PB_Drop_Private, #PB_Drag_Move, #PrivateType)
;
SetGadgetState(#Tree, 25) ; positionnement au millieu de la liste
; ##################################################
; Boucle des evenements de la Fenétre principale
; ##################################################
Repeat
Select WaitWindowEvent()
Case #PB_Event_Menu
Select EventMenu()
EndSelect
Case #PB_Event_Gadget
Select EventGadget()
Case #Tree
Select EventType()
Case #PB_EventType_LeftClick ; Clic gauche
Case #PB_EventType_RightClick ; Clic droit, ouvre menu popup.
Case #PB_EventType_LeftDoubleClick ; Double-clic gauche
Case #PB_EventType_RightDoubleClick ; Double-Clic droit sur un élément.
Case #PB_EventType_Change ; L'élément courant a changé
Case #PB_EventType_DragStart ; Début d'un Drag-Drop (Glisser & Déposer).
PositionDepart = GetGadgetState(#Tree)
;Niveau = GetGadgetItemAttribute(#Tree, PositionDepart, #PB_Tree_SubLevel)
PDItem$ = GetGadgetItemText(#Tree, PositionDepart)
Debug "Position Départ = "+Str(PositionDepart);+" "+ "Niveau = "+Str(Niveau)
; 1er cas avec #PB_Drop_Text, ça marche ?? OK
; Transfert du texte (départ : Dragtexte, arriver : EventDropText)
;DragText(PDItem$, #PB_Drag_Move)
;RemoveGadgetItem(#Tree, PositionDepart)
; 2ème cas avec #PrivateType, ça marche
; Lance une opération de 'Drag & Drop' limitée à l'appicaton elle-même.
; Apparement dans ce cas on ne transfert pas le texte, on utilise les variable globales !
; ne pas effacer l'item de départ
DragPrivate(#PrivateType, #PB_Drag_Move)
;EndIf
EndSelect
EndSelect
Case #PB_Event_GadgetDrop ; Fin de l'opération Drag-Drop sur un gadget
Select EventGadget()
Case #Tree
Select EventDropType() ; Receptions des données
Case #PB_Drop_Private
Select EventDropPrivate()
Case #PrivateType ; Drop' limitée à l'appicaton elle-même.
; Pas de texte a récuperer, utilisés les variables globales : PositionDepart et PositionArriver
PositionArriver = GetGadgetState(#Tree)
PDItem$ = GetGadgetItemText(#Tree, PositionDepart)
RemoveGadgetItem(#Tree, PositionDepart) ; Supprime l'item de départ
Debug "Position Arriver = "+Str(PositionArriver)
AddGadgetItem(#Tree, PositionArriver, PDItem$) ; Insérer l'item (A faire après la sélection)
EndSelect
;Case #PB_Drop_Image
;Case #PB_Drop_Files
Case #PB_Drop_Text ; Ici Drop' limitée à l'appicaton elle-même, ça marche aussi ?
; Ici du texte a récupérer
; PositionArriver = GetGadgetState(#Tree)
; PAItem$ = EventDropText()
; Debug "Position Arriver = "+Str(PositionArriver);+" "+ "Niveau = "+Str(Niveau)
; ; Insertion est autorisé au même niveau (a la place de l'item)
; AddGadgetItem(#Tree, PositionArriver, PAItem$); , 0,1); ImageID(#ImagePersonne), 1)
EndSelect
EndSelect
Case #PB_Event_WindowDrop ; : Une opération DragNDrop s'est terminée sur une fenêtre
Case #PB_Event_CloseWindow
;FichierPreferencesEcriture()
f1Quitter = 1
Default
EndSelect
Until f1Quitter = 1
CloseWindow(#f1)
End