表格对每个单元格的点击事件做出反应
Tables reacting to click events on a per-cell basis
我有时间table在table中展示。
这是我当前解决方案的示例:
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 只提供激活行,没有激活哪个单元格的信息,或者使列 header 可点击.
gtk2hs 的方法是什么,对于一个 table 响应点击事件的信息,关于点击了哪一行和哪一列(对于该列,数字索引将是完美的,所以我可以使用此索引来修改我开始使用的列表),而无需诉诸讨厌的事情,例如在运行时使用 Table
和 deleting/adding 标签。
我使用的是 gtk2hs (gtk3) 版本 0.12.5.6
您可以采用
this Python answer.
可以在您的 prepareCols
函数中安装一个 buttonPressEvent
回调,检查事件是否为鼠标右键单击,然后将事件坐标解码为 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]
我有时间table在table中展示。
这是我当前解决方案的示例:
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 只提供激活行,没有激活哪个单元格的信息,或者使列 header 可点击.
gtk2hs 的方法是什么,对于一个 table 响应点击事件的信息,关于点击了哪一行和哪一列(对于该列,数字索引将是完美的,所以我可以使用此索引来修改我开始使用的列表),而无需诉诸讨厌的事情,例如在运行时使用 Table
和 deleting/adding 标签。
我使用的是 gtk2hs (gtk3) 版本 0.12.5.6
您可以采用 this Python answer.
可以在您的 prepareCols
函数中安装一个 buttonPressEvent
回调,检查事件是否为鼠标右键单击,然后将事件坐标解码为 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]