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

现在我想让每个单元格都可以右键单击,但 gtk2hs 只提供激活一行,没有激活哪个单元格的信息,或者使列标题可单击。

gtk2hs 中的方法是什么,用于响应点击事件的信息,关于点击了哪一行和哪一列(对于该列,数字索引是完美的,所以我可以使用这个索引来修改我的列表开始),而不诉诸讨厌的东西,比如Table在运行时使用 a 和删除/添加标签。

我正在使用 gtk2hs (gtk3) 版本 0.12.5.6

4

1 回答 1

1

您可以采用 此 Python 答案中描述的解决方案。

buttonPressEvent可以在您的函数中安装回调,prepareCols检查事件是否为鼠标右键单击,然后将事件坐标解码为TreeStore路径:

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]
于 2015-01-16T14:13:52.530 回答