5

wx haskell ドラッグ アンド ドロップの例を探しています。まだ見つかっていません。

利用可能なものはありますか? またはヒント?

ここのところ:

  • イベントを見ることができますon drag(ただし、「オンドロップ」はありません)
  • マウスはちょうどleft upオンターゲットを与えています
  • ドロップ ターゲットを on object にアタッチするはずのコメントが表示されますが、それがどのように呼び出されるかわかりません。

    Graphics.UI.WXCore.DragAndDrop

    L51

    -- | 「ドロップソース」を作成します。次に、「dragAndDrop」でターゲットの「DataObject」をこの「DataObject」に置き換えます。

    dropSource :: DataObject a -> ウィンドウ b -> 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
4

1 に答える 1

2

概要 :

  • Graphics.UI.WXCore.DragAndDrop から dropTarget と dropSource を作成します。
  • Graphics.UI.WXCore.Events から呼び出す場所から、ソースウィジェットでイベント " on drag" を使用します。dragAndDrop

私の間違いと間違った仮定:

  • ターゲットで「オンドロップ」イベントを探していました。次の理由により、存在せず、必要ありません。
  • 「ドラッグ中」の場合、他のイベントは中断されます。もはやmouse upまたはmouse down。(DnD) ターゲットでリリースされていない場合、ドラッグは中止され、通常のイベントが再開されます。[0]
  • 「貼り付け」を行うには textEntry にフォーカスが必要ですが、それでもドロップが発生することに注意してください。コンソールの「on drag Activated」を見てください。
  • 交換されるテキストは、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

于 2013-04-08T20:31:00.330 に答える