2013-04-07 14 views
5

Poszukuję przykładowego polecenia przeciągnij i upuść wx. Jeszcze nie znalazłem.wx haskell Przeciągnij i upuść przykład

Dostępne? lub wskazówki?

tej pory:

  • widzę zdarzenie on drag (ale nie „na drop”)
  • mysz jest po prostu dając left up na cel
  • widzę jakiś komentarz, gdzie jestem rzekomą do attache cel upuszczania na obiekt, ale nie widzę jak to jest wywoływana:

    Graphics.UI.WXCore.DragAndDrop

    L 51

    - | Utwórz "DropSource". Następnie "dragAndDrop" zastąp cel 'DataObject' obiektu docelowego 'DataObject'.

    dropSource :: DataObject a -> b Okno -> IO (DropSource())

  • nie widzę gdzie jest warstwa WX powyżej Graphics.UI.WXCore.DragAndDrop

  • to (zbyt) Chyba stary: [0]: http://bb10.com/haskell-wxhaskell-general/2007-08/msg00035.html

Zresztą dość rozmyta teraz ...


edit: to jest tam, gdzie stoję teraz: w przeciągu nie dostaję aktywowane, więc nie ma dragAndDrop ani (na myszy w Xinput jest tylko tam, aby zobaczyć, co się dzieje) (dragger jest to, co dostałem z [O]), ale robię nie dostać z tego zdarzenia)

--- test where DnD from yinput to xinput 
module Main where 

import CustoWidget 
import Graphics.UI.WX hiding (empty) 
import Data.Graph.Inductive 
import Data.Maybe 
import Control.Monad 
import Graphics.UI.WX.Events 
import Graphics.UI.WXCore.WxcClassesMZ 
import Graphics.UI.WXCore.WxcClassesAL 
import Graphics.UI.WXCore.DragAndDrop 
import Graphics.UI.WXCore.Events 
import Debug.Trace 
main 
    = start ballsFrame 
    -- @next : try andrun start within a state 

ballsFrame 
    = do 

     f  <- frame [text := "Layout test"] 
     p  <- panel f []      -- panel for color and tab management. 
     ok  <- button p [text := "Ok"] 
     can <- button p [text := "Cancel", on command := infoDialog f "Info" "Pressed 'Cancel'"] 
     xinput <- textEntry p [text := "100", alignment := AlignRight] 
     yinput <- textEntry p [text := "100", alignment := AlignRight] 

     set f [defaultButton := ok 
      ,layout := container p $ 
         margin 10 $ 
         column 5 [boxed "coordinates" (grid 5 5 [[label "x:", hfill $ widget xinput] 
                   ,[label "y:", hfill $ widget yinput]]) 
           ,floatBottomRight $ row 5 [widget ok,widget can]] 
           ] 
     set xinput [ on mouse := showMe] --, on keyboard := showMeK 
     set yinput [ ] --on mouse := showMe, on keyboard := showMeK ] 
--  fileDropTarget xinput (\pt file -> putStrLn $ show file) 


     -- prepare the drop source 

     textdata <- textDataObjectCreate "" 
     drop <- dropTarget xinput textdata 

     textdata' <- textDataObjectCreate "text" 
     src <- dropSource textdata' yinput 

     -- activate on drag the do drag drop 
     set yinput [ on drag := onDrag src] 
     set ok [ on command := onOk f textdata] 




     return() 



onDrag s p = trace ("on drag " ++ show s ++ " " ++ show p) 
    dragAndDrop s Default (\_ -> return()) 



onOk f textdata = do 

      txt <- textDataObjectGetText textdata 
      infoDialog f "resultText" txt 
      close f 

showMe = \x -> do putStrLn $ show x 

dragger win wout = do 
      textdata <- textDataObjectCreate "" 
      drop <- dropTarget wout textdata 
      textdata' <- textDataObjectCreate "text" 
      src <- dropSource textdata' win 
      dragAndDrop src Default (\_ -> return()) 
      txt <- textDataObjectGetText textdata 
      infoDialog wout "resultText" txt 

Odpowiedz

2

Podsumowanie:

  • stworzyć dropTarget i dropSource: od Graphics.UI.WXCore.DragAndDrop
  • użyć zdarzenia "on drag" od źródła widget, skąd byś powołać dragAndDrop z Graphics.UI.WXCore.Events

moich błędów i błędnych założeniach:

  • ja szukałem „w spadku” wydarzenie, na tarczy. nie istnieje i nie jest potrzebny, ponieważ:
  • Po "przeciągnięciu" pozostałe zdarzenia są zawieszone. nie więcej niż mouse up lub mouse down. Jeśli nie zostanie zwolniony w miejscu docelowym (DnD), przeciąganie zostanie przerwane i wznowione zostaną normalne zdarzenia. [0]
  • Należy zauważyć, że textEntry potrzebuje fokusu, aby uzyskać "wklejanie", jednak kropla nadal występuje. spójrz na "na przeciągu aktywowanym" na konsoli.
  • Tekst wymieniany to ten z DataObjects (a nie ze źródła, jeśli byłby to textEntry.). zobacz "tekst upuszczony".

Następujący kod zrzuca zdarzenia, na konsoli do eksperymentu:

module Main where 


import Graphics.UI.WX hiding (empty) 

import Data.Maybe 
import Control.Monad 
import Graphics.UI.WX.Events 
import Graphics.UI.WXCore.WxcClassesMZ 
--import Graphics.UI.WXCore.WxcClassesAL 
import Graphics.UI.WXCore.DragAndDrop 
import Graphics.UI.WXCore.Events 

main 
    = start dndtest 


dndtest 
    = do 

     f  <- frame [text := "Drag And Drop test"] 
     p  <- panel f []      
     ok  <- button p [text := "Ok"] 
     xinput <- textEntry p [text := "here :"] 
     yinput <- staticText p [text := "drag me"] 

     set f [defaultButton := ok 
      ,layout := container p $ 
         margin 10 $ 
         column 5 [boxed "coordinates" (grid 5 5 [[label "source:", hfill $ widget yinput] 
                   ,[label "target(focus first):", hfill $ widget xinput] 
                   ]) 
           ,floatBottomRight $ row 5 [widget ok]] 
           ] 

     set xinput [ on enter := onEnter] 

     set yinput [ ] 
--------------------------------------------------------- 
--- meaningful stuff starts here 
--------------------------------------------------------- 

     -- prepare the drop source : create a DataObject and associate it with the source 
     textdata' <- textDataObjectCreate "text dropped" 
     src <- dropSource textdata' yinput 

     -- prepare the drop target: create a DataObject (placeholder here) and associate it with the target 
     textdata <- textDataObjectCreate ".." 
     drop <- dropTarget xinput textdata 


     -- activate on drag the do dragdrop. this will replace the target dataObject with the source one. 
     -- Try with and without giving focus to the textEntry field 
     -- Try and source from your favorite editor also (focus first!) 
     set yinput [ on drag := onDrag src ] 
--------------------------------------------------------- 
--- meaningful stuff stops here 
--------------------------------------------------------- 

     set ok [ on command := close f ] 
     return() 





--onDrag:: Graphics.UI.WXCore.WxcClassTypes.DropSource a -> Point -> IO() 
onDrag s p = do 
    dragAndDrop s Default (\_ -> return()) 
    putStrLn "on Drag activated:" 



showMeE :: EventMouse -> IO() 
showMeE (MouseMotion point mod) = putStr "" --- discard meaningless Motion event 
showMeE e = putStrLn $ show e 


onEnter p = putStrLn $ "on Enter:" ++ show p 

I widać inne dodatkami mogę zbadania, jak zmiana kursora podczas przeciągania lub reakcję na różne warianty spadku .

[0]: http://docs.wxwidgets.org/2.8/wx_wxdndoverview.html

Powiązane problemy