2013-04-07 84 views
5

我正在寻找一个wx haskell拖放示例。我还没有找到。wx haskell拖放示例

任何可用的?或提示?

到目前为止:

  • 我可以看到一个on drag事件(但不可“水滴”)
  • 鼠标只是目标给予left up
  • 我看到一些评论,其中我应该到武官下降目标对象上,但我不知道它是如何调用:

    Graphics.UI.WXCore.DragAndDrop

    L 51

    - 创建'DropSource'。然后'dragAndDrop'用这个'DataObject'替换目标的'DataObject'。

    dropSource ::一个数据对象 - >窗口乙 - > IO(DropSource())

  • 我不能看到其中上述Graphics.UI.WXCore.DragAndDrop

  • 的WX层,这是(太)老我猜:[0]:http://bb10.com/haskell-wxhaskell-general/2007-08/msg00035.html

反正很模糊,现在...


编辑:此是我现在的立场: 在拖动没有得到激活,所以没有dragAndDrop (在鼠标在xinput只是在那里看看发生了什么) (dragger是我从[O]得到),但我做没有得到这个事件)

--- 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 

回答

2

摘要:

  • 创建的DropTarget和dropSource:从Graphics.UI.WXCore.DragAndDrop
  • 使用事件 “on drag” 关于部件,在那里你会调用dragAndDrop从Graphics.UI.WXCore.Events

我的失误和错误的假设:

  • 我一直在寻找一个“上滴”事件,对目标。不存在,也不需要,因为:
  • 当“拖动”时,其他事件被暂停。没有更多mouse upmouse down。 如果未在(DnD)目标上释放,则拖动将中止并恢复正常事件。 [0]
  • 请注意,textEntry需要重点才能获得“粘贴”,但仍会出现拖放。在控制台上查看“关于拖动激活”。
  • 交换的文本是来自DataObjects(而不是来自源,如果这将是一个textEntry)。看到“文字丢失”。

下面的代码转储在控制台上的事件,进行试验:

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 

我看到其他东西我可以探索,如在拖动期间改变光标,或在降的不同变体的反应。

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