{-# LANGUAGE MonoLocalBinds #-}
module Data.GI.Gtk.ComboBox (
module GI.Gtk.Objects.ComboBox,
comboBoxNewText,
comboBoxSetModelText,
comboBoxGetModelText,
comboBoxAppendText,
comboBoxInsertText,
comboBoxPrependText,
comboBoxRemoveText,
comboBoxGetActiveText,
) where
import Prelude ()
import Prelude.Compat
import Control.Monad (liftM)
import Control.Monad.IO.Class (MonadIO(..))
import Foreign.Ptr (FunPtr, Ptr, nullPtr)
import Foreign.StablePtr (newStablePtr, castStablePtrToPtr, deRefStablePtr, castPtrToStablePtr)
import Data.Text (Text)
import Data.Word (Word32)
import Data.Int (Int32)
import Data.GI.Base.BasicTypes (GObject)
import Data.GI.Base.ManagedPtr (unsafeManagedPtrCastPtr, touchManagedPtr, unsafeCastTo)
import Data.GI.Gtk.ModelView.Types (comboQuark)
import Data.GI.Gtk.ModelView.TreeModel (makeColumnIdString)
import Data.GI.Gtk.ModelView.CustomStore (customStoreSetColumn, customStoreGetRow)
import Data.GI.Gtk.ModelView.SeqStore ( SeqStore(..), seqStoreNew,
seqStoreInsert, seqStorePrepend, seqStoreAppend, seqStoreRemove,
seqStoreSafeGetValue )
import GI.Gtk.Objects.ComboBox
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, toObject)
type GQuark = Word32
foreign import ccall unsafe "&hs_free_stable_ptr" destroyStablePtr :: FunPtr(Ptr () -> IO ())
foreign import ccall "g_object_set_qdata" g_object_set_qdata ::
Ptr Object -> GQuark -> Ptr () -> IO ()
foreign import ccall "g_object_set_qdata_full" g_object_set_qdata_full ::
Ptr Object -> GQuark -> Ptr () -> FunPtr(Ptr () -> IO ()) -> IO ()
objectSetAttribute :: (MonadIO m, GObject o) => o -> GQuark -> Maybe a -> m ()
objectSetAttribute :: forall (m :: * -> *) o a.
(MonadIO m, GObject o) =>
o -> GQuark -> Maybe a -> m ()
objectSetAttribute o
obj GQuark
attr Maybe a
Nothing = IO () -> m ()
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ do
obj' <- o -> IO (Ptr Object)
forall a b. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr b)
unsafeManagedPtrCastPtr o
obj
g_object_set_qdata obj' (fromIntegral attr) nullPtr
touchManagedPtr obj
objectSetAttribute o
obj GQuark
attr (Just a
val) = IO () -> m ()
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ do
sPtr <- a -> IO (StablePtr a)
forall a. a -> IO (StablePtr a)
newStablePtr a
val
obj' <- unsafeManagedPtrCastPtr obj
g_object_set_qdata_full obj' attr (castStablePtrToPtr sPtr) destroyStablePtr
touchManagedPtr obj
foreign import ccall "g_object_get_qdata" g_object_get_qdata ::
Ptr Object -> GQuark -> IO (Ptr ())
objectGetAttributeUnsafe :: (MonadIO m, GObject o) => o -> GQuark -> m (Maybe a)
objectGetAttributeUnsafe :: forall (m :: * -> *) o a.
(MonadIO m, GObject o) =>
o -> GQuark -> m (Maybe a)
objectGetAttributeUnsafe o
obj GQuark
attr = IO (Maybe a) -> m (Maybe a)
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Maybe a) -> m (Maybe a)) -> IO (Maybe a) -> m (Maybe a)
forall a b. (a -> b) -> a -> b
$ do
obj' <- o -> IO (Ptr Object)
forall a b. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr b)
unsafeManagedPtrCastPtr o
obj
sPtr <- g_object_get_qdata obj' attr
touchManagedPtr obj
if sPtr==nullPtr then return Nothing else
liftM Just $! deRefStablePtr (castPtrToStablePtr sPtr)
comboBoxNewText :: MonadIO m => m ComboBox
comboBoxNewText :: forall (m :: * -> *). MonadIO m => m ComboBox
comboBoxNewText = do
combo <- m ComboBox
forall (m :: * -> *). (HasCallStack, MonadIO m) => m ComboBox
comboBoxNew
comboBoxSetModelText combo
return combo
comboBoxSetModelText :: (MonadIO m, IsComboBox self) => self -> m (SeqStore Text)
comboBoxSetModelText :: forall (m :: * -> *) self.
(MonadIO m, IsComboBox self) =>
self -> m (SeqStore Text)
comboBoxSetModelText self
combo = IO (SeqStore Text) -> m (SeqStore Text)
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (SeqStore Text) -> m (SeqStore Text))
-> IO (SeqStore Text) -> m (SeqStore Text)
forall a b. (a -> b) -> a -> b
$ do
layout <- (ManagedPtr CellLayout -> CellLayout) -> self -> IO CellLayout
forall o o'.
(HasCallStack, ManagedPtrNewtype o, TypedObject o,
ManagedPtrNewtype o', TypedObject o') =>
(ManagedPtr o' -> o') -> o -> IO o'
unsafeCastTo ManagedPtr CellLayout -> CellLayout
CellLayout self
combo
cellLayoutClear layout
store <- seqStoreNew ([] :: [Text])
comboBoxSetModel combo (Just store)
let colId = Int32 -> ColumnId row Text
forall row. Int32 -> ColumnId row Text
makeColumnIdString Int32
0
customStoreSetColumn store colId id
comboBoxSetEntryTextColumn combo 0
ren <- cellRendererTextNew
cellLayoutPackStart layout ren True
cellLayoutSetDataFunction layout ren store (setCellRendererTextText ren)
objectSetAttribute combo comboQuark (Just store)
return store
comboBoxGetModelText :: (MonadIO m, IsComboBox self) => self -> m (SeqStore Text)
comboBoxGetModelText :: forall (m :: * -> *) self.
(MonadIO m, IsComboBox self) =>
self -> m (SeqStore Text)
comboBoxGetModelText self
self = do
maybeStore <- self -> GQuark -> m (Maybe (SeqStore Text))
forall (m :: * -> *) o a.
(MonadIO m, GObject o) =>
o -> GQuark -> m (Maybe a)
objectGetAttributeUnsafe self
self GQuark
comboQuark
case maybeStore of
Just SeqStore Text
store -> SeqStore Text -> m (SeqStore Text)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return SeqStore Text
store
Maybe (SeqStore Text)
Nothing -> [Char] -> m (SeqStore Text)
forall a. HasCallStack => [Char] -> a
error [Char]
"Could not get required attribute"
comboBoxAppendText :: (MonadIO m, IsComboBox self) => self -> Text -> m Int32
comboBoxAppendText :: forall (m :: * -> *) self.
(MonadIO m, IsComboBox self) =>
self -> Text -> m Int32
comboBoxAppendText self
self Text
text = do
store <- self -> m (SeqStore Text)
forall (m :: * -> *) self.
(MonadIO m, IsComboBox self) =>
self -> m (SeqStore Text)
comboBoxGetModelText self
self
seqStoreAppend store text
comboBoxInsertText :: (MonadIO m, IsComboBox self) => self
-> Int32
-> Text
-> m ()
comboBoxInsertText :: forall (m :: * -> *) self.
(MonadIO m, IsComboBox self) =>
self -> Int32 -> Text -> m ()
comboBoxInsertText self
self Int32
position Text
text = do
store <- self -> m (SeqStore Text)
forall (m :: * -> *) self.
(MonadIO m, IsComboBox self) =>
self -> m (SeqStore Text)
comboBoxGetModelText self
self
seqStoreInsert store position text
comboBoxPrependText :: (Applicative m, MonadIO m, IsComboBox self) => self -> Text -> m ()
comboBoxPrependText :: forall (m :: * -> *) self.
(Applicative m, MonadIO m, IsComboBox self) =>
self -> Text -> m ()
comboBoxPrependText self
self Text
text = do
store <- self -> m (SeqStore Text)
forall (m :: * -> *) self.
(MonadIO m, IsComboBox self) =>
self -> m (SeqStore Text)
comboBoxGetModelText self
self
seqStorePrepend store text
comboBoxRemoveText :: (MonadIO m, IsComboBox self) => self
-> Int32
-> m ()
comboBoxRemoveText :: forall (m :: * -> *) self.
(MonadIO m, IsComboBox self) =>
self -> Int32 -> m ()
comboBoxRemoveText self
self Int32
position = do
store <- self -> m (SeqStore Text)
forall (m :: * -> *) self.
(MonadIO m, IsComboBox self) =>
self -> m (SeqStore Text)
comboBoxGetModelText self
self
seqStoreRemove store position
comboBoxGetActiveText :: (MonadIO m, IsComboBox self) => self -> m (Maybe Text)
comboBoxGetActiveText :: forall (m :: * -> *) self.
(MonadIO m, IsComboBox self) =>
self -> m (Maybe Text)
comboBoxGetActiveText self
self = do
activeId <- self -> m Int32
forall (m :: * -> *) a.
(HasCallStack, MonadIO m, IsComboBox a) =>
a -> m Int32
comboBoxGetActive self
self
if activeId < 0
then return Nothing
else do
seqStore <- comboBoxGetModelText self
seqStoreSafeGetValue seqStore (fromIntegral activeId)