Page 1 sur 2

[Résolu] Problème Drag et Drop ListWiew vers Editor

Publié : sam. 04/mars/2017 15:56
par Shadow
Salut,

J'ai chercher comment faire pour Drag et Drop un élément d'une ListWiew vers un Editor
mais j'ai du mal chercher, pas trouvé, alors j'ai essayé et avancé un peut mais je bloque:

Voici mon début de code, je dois pas être très loins:

Code : Tout sélectionner

Enumeration 1
  #Fenetre
  #ListView
  #Editor
EndEnumeration

Procedure Ma_Fenetre()
  
  If OpenWindow(#Fenetre, 327, 177, 500, 300, "Exemple Drag et Drop Liste wiew vers Editor Gadget...",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered | #PB_Window_TitleBar)
    EditorGadget(#Editor, 2, 2, 496, 147)
    ListViewGadget(#ListView, 2, 151, 496, 147)
    
    For I = 1 To 6
      AddGadgetItem(#ListView, -1, "Element n°" + Str(I))
    Next
    
    EnableGadgetDrop(#Editor, #PB_Drop_Text, #PB_Drag_Copy)
    
    Repeat
      
      Event = WaitWindowEvent(1)
      EventWindow = EventWindow()
      EventGadget = EventGadget()
      EventMenu = EventMenu()
      EventType = EventType()
      
      Select Event 
          
        Case #PB_Event_Gadget
          
          Select EventGadget
              
            Case #ListView
              
              TexteDragEtDropListView$ = GetGadgetItemText(#ListView, GetGadgetState(#ListView))
              DragText(TexteDragEtDropListView$)
              
            Case #Editor
              
              
          EndSelect
          
        Case #PB_Event_Menu
          
          Select EventMenu
              
            Case 0
              
          EndSelect
          
        Case #PB_Event_GadgetDrop
          
          
        Case #PB_Event_CloseWindow  
          
      EndSelect
      
    Until Event = #PB_Event_CloseWindow
    
  EndIf
  
EndProcedure

Ma_Fenetre()

Re: Drag et Drop ListWiew vers Editor

Publié : sam. 04/mars/2017 16:08
par Ar-S
J'ai énuméré tes éléments de 0 à 5 plutôt que de 1 à 6 ça t'évitera de mauvaises surprises car les listes commencent à 0
Ensuite tout est dans Case #PB_Event_GadgetDrop

Code : Tout sélectionner

  
Enumeration 1
  #Fenetre
  #ListView
  #Editor
EndEnumeration

Procedure Ma_Fenetre()
 
  If OpenWindow(#Fenetre, 327, 177, 500, 300, "Exemple Drag et Drop Liste wiew vers Editor Gadget...",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered | #PB_Window_TitleBar)
    EditorGadget(#Editor, 2, 2, 496, 147)
    ListViewGadget(#ListView, 2, 151, 496, 147)
   
    For I = 0 To 5
      AddGadgetItem(#ListView, -1, "Element n°" + Str(I))
    Next
   
    EnableGadgetDrop(#Editor, #PB_Drop_Text, #PB_Drag_Copy)
   
    Repeat
     
      Event = WaitWindowEvent(1)
      EventWindow = EventWindow()
      EventGadget = EventGadget()
      EventMenu = EventMenu()
      EventType = EventType()
     
      Select Event
         
        Case #PB_Event_Gadget
         
          Select EventGadget
             
            Case #ListView
             
              TexteDragEtDropListView$ = GetGadgetItemText(#ListView, GetGadgetState(#ListView))
              DragText(TexteDragEtDropListView$)
             
            Case #Editor
             
             
          EndSelect
         
        Case #PB_Event_Menu
         
          Select EventMenu
             
            Case 0
             
          EndSelect
          
                
        Case #PB_Event_GadgetDrop
          NUM = GetGadgetState(#ListView) ; numéro de l'élément
          Titre$ = GetGadgetItemText(#ListView,NUM) ; Text de l'élément numéro NUM
          Debug "Ligne : "+NUM
          Debug "titre : " +Titre$
          ; Si tu veux en ajouter les éléments les uns apres les autres
          AddGadgetItem(#Editor, -1, Titre$)
          ; Si tu veux remplacer les textes à chaque fois
;           SetGadgetText(#Editor, Titre$)
          
        Case #PB_Event_CloseWindow 
         
      EndSelect
     
    Until Event = #PB_Event_CloseWindow
   
  EndIf
 
EndProcedure

Ma_Fenetre()
  
  
  ; 

Re: Drag et Drop ListWiew vers Editor

Publié : sam. 04/mars/2017 17:21
par Shadow
Super merci Ar'S :)

Dernière chose, comment faire pour ajouter l'élément
a l’emplacement du curseur dans l'éditeur ?

Avec:

Code : Tout sélectionner

SendMessage_(GadgetID(#Editor), #EM_REPLACESEL, -1, Texte$)
Mais j'aimerais voir le curseur dans l'éditeur et je ne le vois pas quand je Drag...

De plus quand je Drag et Drop du texte de l'éditeur lui même, il me met
l'élément sélectionné dans la ListWiew dans l'éditeur, pas bon ça...

Peut être comme ceci ?:

Code : Tout sélectionner

Enumeration 1
  #Fenetre
  #ListView
  #Editor
EndEnumeration

Procedure Ma_Fenetre()

  If OpenWindow(#Fenetre, 327, 177, 500, 300, "Exemple Drag et Drop Liste wiew vers Editor Gadget...",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered | #PB_Window_TitleBar)
    EditorGadget(#Editor, 2, 2, 496, 147)
    ListViewGadget(#ListView, 2, 151, 496, 147)
   
    For I = 0 To 5
      AddGadgetItem(#ListView, -1, "Element n°" + Str(I))
    Next
   
    EnableGadgetDrop(#Editor, #PB_Drop_Text, #PB_Drag_Copy)
    
    Repeat
     
      Event = WaitWindowEvent(1)
      EventWindow = EventWindow()
      EventGadget = EventGadget()
      EventMenu = EventMenu()
      EventType = EventType()
     
      Select Event
         
        Case #PB_Event_Gadget
         
          Select EventGadget
             
            Case #ListView
             
              TexteDragEtDropListView$ = GetGadgetItemText(#ListView, GetGadgetState(#ListView))
              DragText(TexteDragEtDropListView$)
             
            Case #Editor
             
          EndSelect
         
        Case #PB_Event_Menu
         
          Select EventMenu
             
            Case 0
             
          EndSelect
          
        Case #PB_Event_GadgetDrop
          
          If TexteDragEtDropListView$ <> ""
            
            NumeroElementListView = GetGadgetState(#ListView) ; Numéro de l'élément sélectionné du ListView
            TexteElementListView$ = GetGadgetItemText(#ListView, NumeroElementListView) ; Texte de l'élément sélectionné du ListView
            
            ; Ajouter l'éléments les uns apres les autres dans l'editeur.
            ; AddGadgetItem(#Editor, -1, TexteElementListView$)
            
            ; Ajouter l'éléments à la position du curseur dans l'editeur.
            SendMessage_(GadgetID(#Editor), #EM_REPLACESEL, -1, TexteElementListView$)
            TexteDragEtDropListView$ = ""
            
          EndIf
        
        Case #PB_Event_CloseWindow
         
      EndSelect
     
    Until Event = #PB_Event_CloseWindow
   
  EndIf

EndProcedure

Ma_Fenetre()
Par contre, je vois toujours pas le curseur dans l'éditeur quand le Drag...
Peut être que ça viens de PB et que ont peut pas faire autrement ?

Re: Drag et Drop ListWiew vers Editor

Publié : sam. 04/mars/2017 18:05
par Ar-S
Pour le curseur tu as tout ici : http://purebasic.fr/french/viewtopic.php?f=1&t=6319
Et pour placer l'élément aprés le curseur dans ma fonction D&Drop précédente je t'ai mis en commentaire la version pour remplir l'editor.
- Soit tu fais un getgadgettext() de l'editor et tu ajoutes contenu du DND (comme ça pas besoin d'API
- Soit tu places le contenu du DnD via les commandes du lien que je viens de te filer.

Re: Drag et Drop ListWiew vers Editor

Publié : sam. 04/mars/2017 18:13
par Shadow
Ah merci...

L'éditeur a déjà un drag et drop d'origine en interne et il accepte
aussi les données de d'autre éditeur chose que j’ignorais !

Mais ça ne fonctionne plus du coup avec ce code...

Re: Drag et Drop ListWiew vers Editor

Publié : sam. 04/mars/2017 18:20
par Marc56
Plus rapide encore: Autant utiliser le texte que le d&d "transporte" (= EventDropText())
https://www.purebasic.com/french/docume ... ptext.html

Code : Tout sélectionner

     Case #PB_Event_GadgetDrop
          SendMessage_(GadgetID(#Editor), #EM_REPLACESEL, -1, EventDropText())
          ; C'est tout, Merci PB :-)
Dérivé de l'exemple fourni dans la doc:
https://www.purebasic.com/french/docume ... op.pb.html

Re: Drag et Drop ListWiew vers Editor

Publié : sam. 04/mars/2017 18:35
par Shadow
Merci à vous :)

Donc voici le résulta optimisé au mieux:

Code : Tout sélectionner


Enumeration 1
  #Fenetre
  #ListView
  #Editor
EndEnumeration

If OpenWindow(#Fenetre, 327, 177, 500, 300, "Exemple Drag et Drop ListeWiew vers Editor Gadget...",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered | #PB_Window_TitleBar)
  EditorGadget(#Editor, 2, 2, 496, 147)
  ListViewGadget(#ListView, 2, 151, 496, 147)
  
  For I = 0 To 5
    AddGadgetItem(#ListView, -1, "Élément n°" + Str(I))
  Next
  
  EnableGadgetDrop(#Editor, #PB_Drop_Text, #PB_Drag_Copy)
  
  Repeat
    
    Event = WaitWindowEvent(1)
    
    If Event = #PB_Event_Gadget And EventType() = #PB_EventType_DragStart
      
      Select EventGadget()
          
        Case #ListView
          DragText(GetGadgetItemText(#ListView, GetGadgetState(#ListView)))
          
        Case #Editor
          
      EndSelect
      
    ElseIf Event = #PB_Event_GadgetDrop
      
      Select EventGadget()
          
        Case #Editor
          
          ; Ajouter l'éléments les uns apres les autres dans l'editeur.
          ; AddGadgetItem(#Editor, -1, TexteElementListView$)
          
          ; Ajouter l'éléments à la position du curseur dans l'editeur.
          SendMessage_(GadgetID(#Editor), #EM_REPLACESEL, -1, EventDropText())
          
      EndSelect
      
    ElseIf Event = #PB_Event_CloseWindow
      
    EndIf
    
  Until Event = #PB_Event_CloseWindow
  
EndIf
Cependant ont ne vois toujours pas le curseur dans l’éditeur pour orienté la position du Drop (Relâcher de la souris) :?
Je ne sais pas comment faire ça.

Re: Drag et Drop ListWiew vers Editor

Publié : sam. 04/mars/2017 21:02
par Ar-S
Dans l'API SendMessage_ c'est la constante #EM_SETSEL qu'il va falloir utiliser.
Après ton sendmessage ajoute :

Code : Tout sélectionner

SetActiveGadget(#Editor)
SendMessage_(GadgetID(#Editor), #EM_SETSEL, $fffffff, $fffffff)

Re: Drag et Drop ListWiew vers Editor

Publié : sam. 04/mars/2017 21:22
par Shadow
Fonctionne pas.

Re: Drag et Drop ListWiew vers Editor

Publié : sam. 04/mars/2017 21:43
par Shadow
Voila, là ça va être très clair:
https://www.dropbox.com/s/7ttw4ss23g2j9 ... m.mp4?dl=0

Scène 1, le curseur de la souris se déplace en même temps que le drag dans l'éditeur
Scène 2, le curseur est invisible...

Re: Drag et Drop ListWiew vers Editor

Publié : dim. 05/mars/2017 0:01
par Ar-S
Je passe. Plus le temps pour le moment.

Re: Drag et Drop ListWiew vers Editor

Publié : lun. 06/mars/2017 0:28
par Shadow
Est ce que quelqu’un peut m'aider svp ?
Fred si tu passe par là, est-ce un bug ?

Re: Drag et Drop ListWiew vers Editor

Publié : lun. 06/mars/2017 0:44
par falsam
Ce n'est pas un bug. L'insertion de ton item se fait au point d'insertion du curseur de l'EditorGadget().

Si tu souhaites placer ton item à un autre endroit de ton EditorGadget() alors place ton curseur d'insertion à un autre endroit de ton éditeur.

Re: Drag et Drop ListWiew vers Editor

Publié : lun. 06/mars/2017 0:59
par Shadow
Oui oui mais pourquoi le comportement change ?

Re: Drag et Drop ListWiew vers Editor

Publié : lun. 06/mars/2017 1:37
par falsam
Shadow a écrit :Dernière chose, comment faire pour ajouter l'élément a l’emplacement du curseur dans l'éditeur ?
Une petite bidouille de ce style pour une début de piste.

Code : Tout sélectionner

Declare Drag()

OpenWindow(0, 0, 0, 800, 600, "Drag & Drop")
EditorGadget(0, 0, 0, 800, 300)
AddGadgetItem(0, -1, LSet("", 20, #CRLF$))

ListViewGadget(1, 0, 305, 800, 300)
For I = 0 To 5
  AddGadgetItem(1, -1, "Élément n°" + Str(I))
Next

BindGadgetEvent(1, @Drag())

While WaitWindowEvent() ! #PB_Event_CloseWindow : Wend

Procedure Drag()
  DragText(GetGadgetItemText(1, GetGadgetState(1)), #PB_Drag_Copy)  
EndProcedure