2015-01-12 5 views
3

테이블에 표시 할 시간표가 있습니다. 여기 셀 단위로 클릭 이벤트에 반응하는 테이블

내 현재 솔루션의 샘플입니다 : 이제

import Graphics.UI.Gtk 
import Control.Monad.IO.Class 

main = do 
    initGUI 
    window <- windowNew 
    view <- treeViewNew 
    store <- listStoreNew initialData 
    treeViewSetModel view store 
    containerAdd window view 
    prepareCols view store 
    window `on` deleteEvent $ liftIO mainQuit >> return False 
    widgetShowAll window 
    mainGUI 

initialData :: [[String]] 
initialData = [["foo", "bar"], ["baz", "42"]] 

prepareCols :: TreeView -> ListStore [String] -> IO() 
prepareCols view store = do 
    size <- listStoreGetSize store 
    mapM_ (addColumn view store) [0..size-1] 

addColumn :: TreeView -> ListStore [String] -> Int -> IO() 
addColumn view store i = addTextColumn view store (!! i) $ show i 

addTextColumn :: (TreeViewClass view 
       , TreeModelClass (model row) 
       , TypedTreeModelClass model 
       ) 
       => view -> model row -> (row -> String) -> String -> IO() 
addTextColumn view model f name = do 
    col <- treeViewColumnNew 
    rend <- cellRendererTextNew 
    treeViewColumnSetTitle col name 
    treeViewColumnPackStart col rend True 
    cellLayoutSetAttributes col rend model (\row -> [ cellText := f row ]) 
    treeViewColumnSetExpand col True 
    treeViewAppendColumn view col 
    return() 

내가 모든 세포를 마우스 오른쪽 클릭을하고 싶습니다,하지만 세포가 활성화 된 정보없이, 행 activable를 만들기 위해 제공 gtk2hs, 또는 열 헤더 클릭 할 수 있습니다.

정보가 포함 된 클릭 이벤트에 응답하는 테이블에 대해 클릭 한 행 및 열 (숫자 인덱스가 완벽 할 때이 인덱스를 사용할 수 있음)에 대해 gtk2hs로 이동하는 방법은 무엇입니까? Table을 사용하고 런타임에 레이블을 삭제/추가하는 것과 같은 불쾌한 일에 의지하지 않고 시작한 목록 수정).

임 사용 gtk2hs (gtk3) 버전 0.12.5.6

답변

1

당신은 this Python answer에 설명 된 솔루션을 채택 할 수있다.

buttonPressEvent 콜백 이벤트가 오른쪽 마우스 클릭임을 확인하고 다음 이벤트가 TreeStore 경로로 좌표를 디코딩하여 prepareCols 기능을 설치할 수 있습니다 : 더`gtk2hs` 지식

onPathRightClick :: (TreeViewClass view) 
       => view 
       -> (TreePath -> Int -> IO()) 
       -> IO (ConnectId view) 
onPathRightClick view callback = 
    on view buttonReleaseEvent $ (return False <*) $ runMaybeT $ do 
     RightButton <- lift eventButton 
     (x, y) <- lift eventCoordinates 
     let x' = round x 
      y' = round y 
     (path, col, _cellpoint) <- MaybeT . liftIO $ treeViewGetPathAtPos view (x', y') 
     colIdx <- MaybeT . liftIO $ findIndex (== col) <$> treeViewGetColumns view 
     liftIO $ callback path colIdx 

prepareCols :: TreeView -> ListStore [String] -> IO() 
prepareCols view store = do 
    size <- listStoreGetSize store 
    mapM_ (addColumn view store) [0..size-1] 
    void $ onPathRightClick view $ \path col -> do 
     putStrLn . unwords $ [ "Column:" , show col] 
     putStrLn . unwords $ [ "Path:" , show path] 
+0

누군가해야 아마도'onPathRightClick'을 적절한'Signal View (TreePath -> IO())'로 변형 할 것입니다.하지만 그렇게하기에는 라이브러리에 대해 충분히 알지 못합니다. – Cactus

+0

시작한 목록을 수정하려면 어떤 열을 클릭했는지 정보가 필요합니다 (예에서 'initialData'). 불행히도'TreeViewColumn'은이 정보를 포함하지 않습니다. 그래서 나는 수정할 데이터를 알아낼 수 없다. – Kritzefitz

+1

콜백에 전달하기 전에 열 색인을 찾는 내 대답을 편집했습니다. 당신이 할 수있는 또 다른 일은 (objectCreateAttribute'를 사용하여) 커스텀 속성을 당신이 필요한 컬럼 키를 포함하는'TreeViewColumn'에 붙이는 것입니다. 나는 그 일을 잘 해냈지만, 훨씬 더 배관이 필요합니다. – Cactus