gi-gtk-hs 0.2.0.1 → 0.3.1.0
raw patch · 8 files changed
+124/−111 lines, 8 filesdep ~gi-gdkdep ~gi-gdkpixbufdep ~gi-glib
Dependency ranges changed: gi-gdk, gi-gdkpixbuf, gi-glib, gi-gobject, gi-gtk, haskell-gi-base
Files
- gi-gtk-hs.cabal +7/−7
- src/Data/GI/Gtk/ComboBox.hs +10/−11
- src/Data/GI/Gtk/ModelView/CellLayout.hs +36/−19
- src/Data/GI/Gtk/ModelView/CustomStore.hs +16/−19
- src/Data/GI/Gtk/ModelView/ForestStore.hs +18/−19
- src/Data/GI/Gtk/ModelView/SeqStore.hs +14/−16
- src/Data/GI/Gtk/ModelView/TreeModel.hs +2/−2
- src/Data/GI/Gtk/ModelView/Types.hs +21/−18
gi-gtk-hs.cabal view
@@ -1,5 +1,5 @@ name: gi-gtk-hs-version: 0.2.0.1+version: 0.3.1.0 synopsis: A wrapper for gi-gtk, adding a few more idiomatic API parts on top description: A wrapper for gi-gtk, adding a few more idiomatic API parts on top homepage: https://github.com/haskell-gi/gi-gtk-hs@@ -32,12 +32,12 @@ transformers >=0.3.0.0 && <0.6, containers >=0.5.5.1 && <0.6, text >=1.2 && <1.3,- haskell-gi-base >=0.17 && <0.18,- gi-glib >=2.0.2 && <2.1,- gi-gobject >=2.0.2 && <2.1,- gi-gdk >=3.0.2 && <3.1,- gi-gtk >=3.0.2 && <3.1,- gi-gdkpixbuf >=2.0.2 && <2.1+ haskell-gi-base >=0.18 && <0.19,+ gi-glib >=2.0.6 && <2.1,+ gi-gobject >=2.0.6 && <2.1,+ gi-gdk >=3.0.6 && <3.1,+ gi-gtk >=3.0.6 && <3.1,+ gi-gdkpixbuf >=2.0.6 && <2.1 hs-source-dirs: src default-language: Haskell2010
src/Data/GI/Gtk/ComboBox.hs view
@@ -92,9 +92,9 @@ seqStoreInsert, seqStorePrepend, seqStoreAppend, seqStoreRemove, seqStoreSafeGetValue ) import GI.Gtk.Objects.ComboBox-import Data.GI.Gtk.ModelView.CellLayout (CellLayout(..), cellLayoutClear, cellLayoutPackStart, cellLayoutSetAttributeFunc, cellLayoutGetCells)+import Data.GI.Gtk.ModelView.CellLayout (CellLayout(..), cellLayoutClear, cellLayoutPackStart, cellLayoutSetDataFunction, cellLayoutGetCells) import GI.Gtk.Objects.CellRendererText (CellRendererText(..), cellRendererTextNew, setCellRendererTextText)-import GI.GObject.Objects.Object (Object, ObjectK, toObject)+import GI.GObject.Objects.Object (Object, toObject) type GQuark = Word32 @@ -167,7 +167,7 @@ -- 'comboBoxPrependText', 'comboBoxRemoveText' and 'comboBoxGetActiveText' -- can be called on a combo box only once 'comboBoxSetModelText' is called. ---comboBoxSetModelText :: (MonadIO m, ComboBoxK self) => self -> m (SeqStore Text)+comboBoxSetModelText :: (MonadIO m, IsComboBox self) => self -> m (SeqStore Text) comboBoxSetModelText combo = liftIO $ do layout <- unsafeCastTo CellLayout combo cellLayoutClear layout@@ -178,14 +178,13 @@ comboBoxSetEntryTextColumn combo 0 ren <- cellRendererTextNew cellLayoutPackStart layout ren True- cellLayoutSetAttributeFunc layout ren store (\iter -> do- customStoreGetRow store iter >>= setCellRendererTextText ren)+ cellLayoutSetDataFunction layout ren store (setCellRendererTextText ren) objectSetAttribute combo comboQuark (Just store) return store -- | Retrieve the model that was created with 'comboBoxSetModelText'. ---comboBoxGetModelText :: (MonadIO m, ComboBoxK self) => self -> m (SeqStore Text)+comboBoxGetModelText :: (MonadIO m, IsComboBox self) => self -> m (SeqStore Text) comboBoxGetModelText self = do (Just store) <- objectGetAttributeUnsafe self comboQuark return store@@ -194,7 +193,7 @@ -- you can only use this function with combo boxes constructed with -- 'comboBoxNewText'. Returns the index of the appended text. ---comboBoxAppendText :: (MonadIO m, ComboBoxK self) => self -> Text -> m Int32+comboBoxAppendText :: (MonadIO m, IsComboBox self) => self -> Text -> m Int32 comboBoxAppendText self text = do store <- comboBoxGetModelText self seqStoreAppend store text@@ -204,7 +203,7 @@ -- @comboBox@. Note that you can only use this function with combo boxes -- constructed with 'comboBoxNewText'. ---comboBoxInsertText :: (MonadIO m, ComboBoxK self) => self+comboBoxInsertText :: (MonadIO m, IsComboBox self) => self -> Int32 -- ^ @position@ - An index to insert @text@. -> Text -- ^ @text@ - A string. -> m ()@@ -216,7 +215,7 @@ -- you can only use this function with combo boxes constructed with -- 'comboBoxNewText'. ---comboBoxPrependText :: (Applicative m, MonadIO m, ComboBoxK self) => self -> Text -> m ()+comboBoxPrependText :: (Applicative m, MonadIO m, IsComboBox self) => self -> Text -> m () comboBoxPrependText self text = do store <- comboBoxGetModelText self seqStorePrepend store text@@ -224,7 +223,7 @@ -- | Removes the string at @position@ from @comboBox@. Note that you can only -- use this function with combo boxes constructed with 'comboBoxNewText'. ---comboBoxRemoveText :: (MonadIO m, ComboBoxK self) => self+comboBoxRemoveText :: (MonadIO m, IsComboBox self) => self -> Int32 -- ^ @position@ - Index of the item to remove. -> m () comboBoxRemoveText self position = do@@ -235,7 +234,7 @@ -- selected. Note that you can only use this function with combo boxes -- constructed with 'comboBoxNewText'. ---comboBoxGetActiveText :: (MonadIO m, ComboBoxK self) => self -> m (Maybe Text)+comboBoxGetActiveText :: (MonadIO m, IsComboBox self) => self -> m (Maybe Text) comboBoxGetActiveText self = do activeId <- comboBoxGetActive self if activeId < 0
src/Data/GI/Gtk/ModelView/CellLayout.hs view
@@ -49,7 +49,8 @@ module GI.Gtk.Interfaces.CellLayout -- , cellLayoutAddColumnAttribute , cellLayoutSetAttributes- , cellLayoutSetAttributeFunc+ , cellLayoutSetDataFunction+ , cellLayoutSetDataFunc' , convertIterFromParentToChildModel ) where @@ -62,9 +63,9 @@ import GI.Gtk.Objects.TreeModelFilter (TreeModelFilter(..), getTreeModelFilterChildModel, treeModelFilterConvertIterToChildIter) import GI.Gtk.Objects.TreeModelSort (TreeModelSort(..), getTreeModelSortModel, treeModelSortConvertIterToChildIter) import GI.Gtk.Structs.TreeIter- (treeIterStamp, treeIterUserData3, treeIterUserData2,- treeIterUserData, TreeIter(..))-import GI.Gtk.Objects.CellRenderer (CellRendererK, CellRenderer(..), toCellRenderer)+ (getTreeIterStamp, getTreeIterUserData3, getTreeIterUserData2,+ getTreeIterUserData, TreeIter(..))+import GI.Gtk.Objects.CellRenderer (IsCellRenderer, CellRenderer(..), toCellRenderer) import Data.GI.Gtk.ModelView.Types import Data.GI.Gtk.ModelView.TreeModel import Data.GI.Gtk.ModelView.CustomStore (customStoreGetRow)@@ -79,7 +80,7 @@ -- the model contains strings, you could have the \"text\" attribute of a -- 'CellRendererText' get its values from column 2. ----- cellLayoutAddColumnAttribute :: (MonadIO m, CellLayoutK self, CellRendererK cell) => self+-- cellLayoutAddColumnAttribute :: (MonadIO m, IsCellLayout self, IsCellRenderer cell) => self -- -> cell -- ^ @cell@ - A 'CellRenderer'. -- -> ReadWriteAttr cell a v -- ^ @attribute@ - An attribute of a renderer. -- -> ColumnId row v -- ^ @column@ - The virtual column of the model from which to@@ -105,33 +106,49 @@ -- pass the child model to this function. -- cellLayoutSetAttributes :: (MonadIO m,- CellLayoutK self,- CellRendererK cell,- TreeModelK (model row),- TypedTreeModelK model)+ IsCellLayout self,+ IsCellRenderer cell,+ IsTreeModel (model row),+ IsTypedTreeModel model) => self -> cell -- ^ @cell@ - A 'CellRenderer'. -> model row -- ^ @model@ - A model containing rows of type @row@. -> (row -> [AttrOp cell 'AttrSet]) -- ^ Function to set attributes on the cell renderer. -> m () cellLayoutSetAttributes self cell model attributes =- cellLayoutSetAttributeFunc self cell model $ \iter -> do+ cellLayoutSetDataFunc' self cell model $ \iter -> do row <- customStoreGetRow model iter set cell (attributes row) +-- | Like 'cellLayoutSetAttributes', but allows any IO action to be used+cellLayoutSetDataFunction :: (MonadIO m,+ IsCellLayout self,+ IsCellRenderer cell,+ IsTreeModel (model row),+ IsTypedTreeModel model)+ => self+ -> cell -- ^ @cell@ - A 'CellRenderer'.+ -> model row -- ^ @model@ - A model containing rows of type @row@.+ -> (row -> IO ()) -- ^ Function to set data on the cell renderer.+ -> m ()+cellLayoutSetDataFunction self cell model callback =+ cellLayoutSetDataFunc' self cell model $ \iter -> do+ row <- customStoreGetRow model iter+ callback row+ -- | Install a function that looks up a row in the model and sets the -- attributes of the 'CellRenderer' @cell@ using the row's content. ---cellLayoutSetAttributeFunc :: (MonadIO m,- CellLayoutK self,- CellRendererK cell,- TreeModelK model)+cellLayoutSetDataFunc' :: (MonadIO m,+ IsCellLayout self,+ IsCellRenderer cell,+ IsTreeModel model) => self -> cell -- ^ @cell@ - A 'CellRenderer'. -> model -- ^ @model@ - A model from which to draw data. -> (TreeIter -> IO ()) -- ^ Function to set attributes on the cell renderer. -> m ()-cellLayoutSetAttributeFunc self cell model func = liftIO $ do+cellLayoutSetDataFunc' self cell model func = liftIO $ cellLayoutSetCellDataFunc self cell . Just $ \_ (CellRenderer cellPtr') model' iter -> do iter <- convertIterFromParentToChildModel iter model' =<< toTreeModel model CellRenderer cellPtr <- toCellRenderer cell@@ -176,10 +193,10 @@ then return childIter else convertIterFromParentToChildModel childIter child childModel Nothing -> do- stamp <- get iter treeIterStamp- ud1 <- get iter treeIterUserData- ud2 <- get iter treeIterUserData2- ud3 <- get iter treeIterUserData3+ stamp <- getTreeIterStamp iter+ ud1 <- getTreeIterUserData iter+ ud2 <- getTreeIterUserData2 iter+ ud3 <- getTreeIterUserData3 iter error ("CellLayout: don't know how to convert iter "++show (stamp, ud1, ud2, ud3)++ " from model "++show parentModelPtr++" to model "++ show modelPtr++". Is it possible that you are setting the "++
src/Data/GI/Gtk/ModelView/CustomStore.hs view
@@ -67,18 +67,18 @@ import System.IO.Unsafe (unsafePerformIO) import Data.GI.Base.BasicTypes (GObject(..), GType, CGType(..), gtypeToCGType, gtypeInt, gtypeBoolean, gtypeString, gtypeInvalid) import Data.GI.Base.BasicConversions (gflagsToWord, withTextCString)-import Data.GI.Base.Overloading (ParentTypes) import Data.GI.Base.ManagedPtr (newObject, withManagedPtr) import Data.GI.Base.GValue (GValue(..)) import GI.GObject (Object) import GI.GdkPixbuf.Objects (Pixbuf(..)) import GI.Gtk.Flags (TreeModelFlags(..))-import GI.Gtk.Interfaces.TreeModel (TreeModel(..), TreeModelK)+import GI.Gtk.Interfaces.TreeModel (TreeModel(..), IsTreeModel(..)) import GI.Gtk.Structs (SelectionData(..), TreePath(..), TreeIter, treePathCopy, selectionDataCopy) import Data.GI.Gtk.ModelView.Types import GI.Gtk.Structs.TreeIter- (treeIterUserData3, treeIterUserData2, treeIterUserData,- treeIterStamp, TreeIter(..))+ (getTreeIterStamp, getTreeIterUserData, getTreeIterUserData2, getTreeIterUserData3,+ setTreeIterStamp, setTreeIterUserData, setTreeIterUserData2, setTreeIterUserData3,+ TreeIter(..)) import Data.GI.Base (newBoxed, set, get) import Data.GI.Base.Attributes (AttrOp(..)) import Data.GI.Base.Utils (maybeFromPtr)@@ -86,15 +86,14 @@ treeIterOverwrite :: MonadIO m => TreeIter -> TreeIter -> m () treeIterOverwrite iterOut iterIn = do- stamp <- get iterIn treeIterStamp- ud1 <- get iterIn treeIterUserData- ud2 <- get iterIn treeIterUserData2- ud3 <- get iterIn treeIterUserData3- set iterOut [- treeIterStamp := stamp,- treeIterUserData := ud1,- treeIterUserData2 := ud2,- treeIterUserData3 := ud3]+ stamp <- getTreeIterStamp iterIn+ ud1 <- getTreeIterUserData iterIn+ ud2 <- getTreeIterUserData2 iterIn+ ud3 <- getTreeIterUserData3 iterIn+ setTreeIterStamp iterOut stamp+ setTreeIterUserData iterOut ud1+ setTreeIterUserData2 iterOut ud2+ setTreeIterUserData3 iterOut ud3 -- A 'CustomStore' is backed by a Gtk2HsStore -- which is an instance of the GtkTreeModel GInterface@@ -106,9 +105,7 @@ -- models 'Data.GI.Gtk.ModelView.ListStore.ListStore' or -- 'Data.GI.Gtk.ModelView.TreeStore.TreeStore'. newtype CustomStore private row = CustomStore (ForeignPtr (CustomStore private row))--type instance ParentTypes (CustomStore private row) = CustomStoreParentTypes-type CustomStoreParentTypes = '[TreeModel, Object]+instance IsTreeModel (CustomStore private row) instance GObject (CustomStore private row) where gobjectIsInitiallyUnowned _ = False@@ -124,7 +121,7 @@ -- | Set or update a column mapping. This function should be used before -- the model is installed into a widget since the number of defined -- columns are only checked once by widgets.-customStoreSetColumn :: (MonadIO m, TypedTreeModelK model)+customStoreSetColumn :: (MonadIO m, IsTypedTreeModel model) => model row -- ^ the store in which to allocate a new column -> (ColumnId row ty) -- ^ the column that should be set -> (row -> ty) -- ^ the function that sets the property@@ -221,7 +218,7 @@ -- optionally the 'DragSourceIface' and the 'DragDestIface'. If the latter two -- are set to @Nothing@ a dummy interface is substituted that rejects every -- drag and drop.-customStoreNew :: (MonadIO m, TreeModelK (model row), TypedTreeModelK model) =>+customStoreNew :: (MonadIO m, IsTreeModel (model row), IsTypedTreeModel model) => private -- ^ Any private data the store needs to store. Usually an 'IORef'. -> (CustomStore private row -> model row) -> TreeModelIface row -- ^ Functions necessary to implement the 'TreeModel' interface.@@ -254,7 +251,7 @@ -- | Extract a row of the given model at the given 'TreeIter'. ---customStoreGetRow :: (MonadIO m, TypedTreeModelK model) => model row -> TreeIter -> m row+customStoreGetRow :: (MonadIO m, IsTypedTreeModel model) => model row -> TreeIter -> m row customStoreGetRow model iter = liftIO $ case toTypedTreeModel model of TypedTreeModel model -> do
src/Data/GI/Gtk/ModelView/ForestStore.hs view
@@ -74,7 +74,6 @@ import Foreign.ForeignPtr (ForeignPtr) import Data.GI.Base.BasicTypes (GObject(..), GObject)-import Data.GI.Base.Overloading (ParentTypes) import Data.GI.Base.ManagedPtr (withManagedPtr) import Data.GI.Gtk.ModelView.Types@@ -85,18 +84,17 @@ import GI.GObject.Objects.Object (Object(..)) import GI.Gtk.Interfaces.TreeModel (treeModelRowDeleted, treeModelRowInserted,- treeModelRowChanged, toTreeModel, TreeModel(..),+ treeModelRowChanged, toTreeModel, TreeModel(..), IsTreeModel(..), treeModelRowHasChildToggled) import GI.Gtk.Functions (treeSetRowDragData, treeGetRowDragData) import GI.Gtk.Structs.TreePath (TreePath) import GI.Gtk.Structs.TreeIter- (treeIterUserData3, treeIterUserData2, treeIterUserData,- treeIterStamp, TreeIter(..))-import Data.GI.Base (get)+ (getTreeIterUserData3, getTreeIterUserData2, getTreeIterUserData,+ getTreeIterStamp, setTreeIterUserData3, setTreeIterUserData2,+ setTreeIterUserData, setTreeIterStamp, TreeIter(..))+import Data.GI.Base (get, new) import Unsafe.Coerce (unsafeCoerce)-import Data.GI.Base.Constructible (Constructible(..))-import Data.GI.Base.Attributes (AttrOp(..)) -------------------------------------------- -- internal model data types@@ -105,18 +103,20 @@ data ForestStoreIter = ForestStoreIter Int32 Word32 Word32 Word32 fromForestStoreIter :: MonadIO m => ForestStoreIter -> m TreeIter-fromForestStoreIter (ForestStoreIter s u1 u2 u3) = new TreeIter [- treeIterStamp := s,- treeIterUserData := unsafeCoerce u1,- treeIterUserData2 := unsafeCoerce u2,- treeIterUserData3 := unsafeCoerce u3]+fromForestStoreIter (ForestStoreIter s u1 u2 u3) = do+ i <- new TreeIter []+ setTreeIterStamp i s+ setTreeIterUserData i $ unsafeCoerce u1+ setTreeIterUserData2 i $ unsafeCoerce u2+ setTreeIterUserData3 i $ unsafeCoerce u3+ return i toForestStoreIter :: MonadIO m => TreeIter -> m ForestStoreIter toForestStoreIter iter = do- stamp <- get iter treeIterStamp- u1 <- get iter treeIterUserData- u2 <- get iter treeIterUserData2- u3 <- get iter treeIterUserData3+ stamp <- getTreeIterStamp iter+ u1 <- getTreeIterUserData iter+ u2 <- getTreeIterUserData2 iter+ u3 <- getTreeIterUserData3 iter return $ ForestStoreIter stamp (unsafeCoerce u1) (unsafeCoerce u2) (unsafeCoerce u3) forestStoreIterSetStamp :: ForestStoreIter -> Int32 -> ForestStoreIter@@ -130,14 +130,13 @@ mkForestStore :: CustomStore (IORef (Store a)) a -> ForestStore a mkForestStore (CustomStore ptr) = ForestStore ptr -type instance ParentTypes (ForestStore a) = ForestStoreParentTypes-type ForestStoreParentTypes = '[TreeModel, Object]+instance IsTreeModel (ForestStore a) instance GObject (ForestStore a) where gobjectIsInitiallyUnowned _ = False gobjectType _ = gobjectType (undefined :: TreeModel) -instance TypedTreeModelK ForestStore+instance IsTypedTreeModel ForestStore -- | Maximum number of nodes on each level. --
src/Data/GI/Gtk/ModelView/SeqStore.hs view
@@ -75,45 +75,43 @@ TreeModelIface(..), customStoreNew, DragDestIface(..), DragSourceIface(..), CustomStore(..)) import Data.GI.Base.BasicTypes (GObject(..), GObject)-import Data.GI.Base.Overloading (ParentTypes) import Data.GI.Base.ManagedPtr (withManagedPtr) import GI.Gtk.Interfaces.TreeModel (treeModelRowDeleted, treeModelRowInserted,- treeModelRowChanged, toTreeModel, TreeModel(..))+ treeModelRowChanged, toTreeModel, TreeModel(..), IsTreeModel(..)) import GI.GObject.Objects.Object (Object(..)) import GI.Gtk.Functions (treeGetRowDragData, treeSetRowDragData) import GI.Gtk.Flags (TreeModelFlags(..)) import Control.Monad.IO.Class (MonadIO) import GI.Gtk.Structs.TreeIter- (treeIterUserData3, treeIterUserData2, treeIterStamp,- treeIterUserData, TreeIter(..))-import Data.GI.Base (get)+ (setTreeIterUserData3, setTreeIterUserData2, setTreeIterStamp,+ setTreeIterUserData, getTreeIterUserData, TreeIter(..))+import Data.GI.Base (get, new) import Data.Word (Word32) import Unsafe.Coerce (unsafeCoerce)-import Data.GI.Base.Constructible (Constructible(..))-import Data.GI.Base.Attributes (AttrOp(..)) import Foreign.Ptr (nullPtr) seqStoreIterNew :: MonadIO m => Int32 -> Int32 -> m TreeIter-seqStoreIterNew s u1 = new TreeIter [- treeIterStamp := s,- treeIterUserData := unsafeCoerce u1,- treeIterUserData2 := nullPtr,- treeIterUserData3 := nullPtr]+seqStoreIterNew s u1 = do+ i <- new TreeIter []+ setTreeIterStamp i s+ setTreeIterUserData i $ unsafeCoerce u1+ setTreeIterUserData2 i nullPtr+ setTreeIterUserData3 i nullPtr+ return i newtype SeqStore a = SeqStore (ForeignPtr (CustomStore (IORef (Seq a)) a)) mkSeqStore :: CustomStore (IORef (Seq a)) a -> SeqStore a mkSeqStore (CustomStore ptr) = SeqStore ptr -type instance ParentTypes (SeqStore a) = SeqStoreParentTypes-type SeqStoreParentTypes = '[TreeModel, Object]+instance IsTreeModel (SeqStore a) instance GObject (SeqStore a) where gobjectIsInitiallyUnowned _ = False gobjectType _ = gobjectType (undefined :: TreeModel) -instance TypedTreeModelK SeqStore+instance IsTypedTreeModel SeqStore -- | Create a new 'TreeModel' that contains a list of elements. seqStoreNew :: (Applicative m, MonadIO m) => [a] -> m (SeqStore a)@@ -174,7 +172,7 @@ -- | Convert a 'TreeIterRaw' to an an index into the 'SeqStore'. Note that this -- function merely extracts the second element of the 'TreeIterRaw'. seqStoreIterToIndex :: (Applicative m, MonadIO m) => TreeIter -> m Int32-seqStoreIterToIndex i = unsafeCoerce <$> get i treeIterUserData+seqStoreIterToIndex i = unsafeCoerce <$> getTreeIterUserData i -- | Default drag functions for 'Data.GI.Gtk.ModelView.SeqStore'. These -- functions allow the rows of the model to serve as drag source. Any row is
src/Data/GI/Gtk/ModelView/TreeModel.hs view
@@ -173,7 +173,7 @@ -- | Read the value of at a specific column and 'TreeIter'. ---treeModelGetValue :: TreeModelK self => self+treeModelGetValue :: IsTreeModel self => self -> TreeIter -> ColumnId row ty -- ^ @column@ - The column to lookup the value at. -> IO ty@@ -181,7 +181,7 @@ GI.treeModelGetValue self iter colId >>= getter -- | Gets the a `TreeIter` or Nothing if the path is invalid or empty-treeModelGetIter :: (MonadIO m, TreeModelK model) => model -> TreePath -> m (Maybe TreeIter)+treeModelGetIter :: (MonadIO m, IsTreeModel model) => model -> TreePath -> m (Maybe TreeIter) treeModelGetIter model path = treePathGetDepth path >>= \case 0 -> return Nothing
src/Data/GI/Gtk/ModelView/Types.hs view
@@ -37,7 +37,7 @@ -- module Data.GI.Gtk.ModelView.Types ( TypedTreeModel(..),- TypedTreeModelK,+ IsTypedTreeModel, toTypedTreeModel, unsafeTreeModelToGeneric, @@ -89,19 +89,17 @@ import Data.GI.Base.BasicTypes (ForeignPtrNewtype, UnexpectedNullPointerReturn, GObject(..)) import Data.GI.Base.ManagedPtr (withManagedPtr) import Data.GI.Base.GValue (GValue)-import Data.GI.Base.Overloading (ParentTypes) import GI.GObject.Objects.Object (Object(..))-import GI.Gtk.Interfaces.TreeModel (TreeModel)-import GI.Gtk.Objects.TreeModelSort (TreeModelSort)-import GI.Gtk.Objects.TreeSelection (TreeSelectionK, treeSelectionCountSelectedRows, treeSelectionGetSelectedRows)+import GI.Gtk.Interfaces.TreeModel (TreeModel, IsTreeModel(..))+import GI.Gtk.Objects.TreeModelSort (TreeModelSort, IsTreeModelSort(..))+import GI.Gtk.Objects.TreeSelection (IsTreeSelection, treeSelectionCountSelectedRows, treeSelectionGetSelectedRows) import GI.Gtk.Objects.TreeModelFilter (TreeModelFilter)-import GI.Gtk.Interfaces.TreeSortable (TreeSortable)+import GI.Gtk.Interfaces.TreeSortable (TreeSortable, IsTreeSortable(..)) import GI.GLib.Functions (quarkFromString) import GI.GdkPixbuf.Objects.Pixbuf (Pixbuf(..)) import GI.Gtk.Structs.TreeIter- (treeIterUserData3, treeIterUserData2, treeIterUserData,- treeIterStamp, TreeIter(..), treeIterCopy)-import GI.Gtk.Structs.TreePath (TreePath(..), treePathGetIndices, treePathNewFromIndices, treePathNew, treePathGetDepth)+ (TreeIter(..), treeIterCopy)+import GI.Gtk.Structs.TreePath (TreePath(..), treePathGetIndices, treePathAppendIndex, treePathNew, treePathGetDepth) import Data.GI.Base.Constructible (Constructible(..)) import Data.GI.Base.Attributes (AttrOp(..)) import Unsafe.Coerce (unsafeCoerce)@@ -116,24 +114,25 @@ newtype TypedTreeModel row = TypedTreeModel (ForeignPtr (TypedTreeModel row)) -class TypedTreeModelK model where+class IsTypedTreeModel model where dummy :: model a -> a dummy _ = error "not used" -- this is to get the right kind for model :: * -> * -- TODO: when haddock is fixed we can use an explicit kind annotation -toTypedTreeModel :: TypedTreeModelK model => model row -> TypedTreeModel row+toTypedTreeModel :: IsTypedTreeModel model => model row -> TypedTreeModel row toTypedTreeModel = unsafeCoerce# unsafeTreeModelToGeneric :: TreeModel -> model row unsafeTreeModelToGeneric = unsafeCoerce# -instance TypedTreeModelK TypedTreeModel+instance IsTypedTreeModel TypedTreeModel newtype TypedTreeModelSort row = TypedTreeModelSort (ForeignPtr (TypedTreeModelSort row)) -type instance ParentTypes (TypedTreeModelSort row) = TypedTreeModelSortParentTypes-type TypedTreeModelSortParentTypes = '[TreeModelSort, TreeSortable, TreeModel, Object]+instance IsTreeModelSort (TypedTreeModelSort row)+instance IsTreeSortable (TypedTreeModelSort row)+instance IsTreeModel (TypedTreeModelSort row) instance GObject (TypedTreeModelSort row) where gobjectIsInitiallyUnowned _ = False@@ -142,14 +141,14 @@ unsafeTreeModelSortToGeneric :: TreeModelSort -> TypedTreeModelSort row unsafeTreeModelSortToGeneric = unsafeCoerce# -instance TypedTreeModelK TypedTreeModelSort+instance IsTypedTreeModel TypedTreeModelSort newtype TypedTreeModelFilter row = TypedTreeModelFilter (ForeignPtr (TypedTreeModelFilter row)) unsafeTreeModelFilterToGeneric :: TreeModelFilter -> TypedTreeModelFilter row unsafeTreeModelFilterToGeneric = unsafeCoerce# -instance TypedTreeModelK TypedTreeModelFilter+instance IsTypedTreeModel TypedTreeModelFilter -- | TreePath is a list of indices to specify a subtree or node in a -- 'Graphics.UI.Gtk.ModelView.TreeModel.TreeModel'. The node that correspond@@ -163,7 +162,11 @@ -- treePathNewFromIndices' :: MonadIO m => [Int32] -> m TreePath treePathNewFromIndices' [] = treePathNew-treePathNewFromIndices' x = treePathNewFromIndices x+treePathNewFromIndices' x = do+ path <- treePathNew+ mapM_ (treePathAppendIndex path) x+ return path+ -- TODO (once every one has Gtk+ 3.12) use treePathNewFromIndices x treePathGetIndices' :: MonadIO m => TreePath -> m [Int32] treePathGetIndices' path = treePathGetDepth path >>= \case@@ -176,7 +179,7 @@ maybeWithTreePath :: MonadIO m => Maybe [Int32] -> (TreePath -> m a) -> m a maybeWithTreePath mbTp act = maybe (act (TreePath nullForeignPtr)) (`withTreePath` act) mbTp -treeSelectionGetSelectedRows' :: (MonadIO m, TreeSelectionK sel) => sel -> m [TreePath]+treeSelectionGetSelectedRows' :: (MonadIO m, IsTreeSelection sel) => sel -> m [TreePath] treeSelectionGetSelectedRows' sel = treeSelectionCountSelectedRows sel >>= \case 0 -> return [] _ -> liftIO $ (fst <$> treeSelectionGetSelectedRows sel) `catch` (\(_::UnexpectedNullPointerReturn) -> return [])