packages feed

Gifcurry-3.0.0.0: src/gui/GuiMisc.hs

{-
  Gifcurry
  (C) 2018 David Lettier
  lettier.com
-}

{-# LANGUAGE OverloadedStrings #-}

module GuiMisc where

import System.Directory
import Text.Read
import Data.Int
import Data.Maybe
import Data.Text
import qualified GI.Gtk

enumToInt32 :: (Enum a, Ord a) => a -> Int32
enumToInt32 enum = fromIntegral (fromEnum enum) :: Int32

floatToInt32 :: Float -> Int32
floatToInt32 f = enumToInt32 (round f :: Int)

int32ToDouble :: Int32 -> Double
int32ToDouble = fromIntegral

int32ToFloat :: Int32 -> Float
int32ToFloat = fromIntegral

entryGetMaybeFloat :: GI.Gtk.Entry -> IO (Maybe Float)
entryGetMaybeFloat entry = do
  text <- Data.Text.strip <$> GI.Gtk.entryGetText entry
  let containsPeriod = isJust $ Data.Text.find (== '.') text
  let string = Data.Text.unpack text
  let maybeFloat = readMaybe (string ++ if containsPeriod then "0" else "") :: Maybe Float
  return maybeFloat

entryGetFloat :: GI.Gtk.Entry -> Float -> IO Float
entryGetFloat entry nothing = do
  maybeFloat <- entryGetMaybeFloat entry
  return $ fromMaybe nothing maybeFloat

entryGetMaybeInt :: GI.Gtk.Entry -> IO (Maybe Int)
entryGetMaybeInt entry = do
  text <- Data.Text.strip <$> GI.Gtk.entryGetText entry
  let string = Data.Text.unpack text
  let maybeInt = readMaybe string :: Maybe Int
  return maybeInt

fileChooserButtonGetString :: GI.Gtk.FileChooserButton -> IO String
fileChooserButtonGetString =
  fmap
      (Data.Text.unpack . Data.Text.strip . Data.Text.pack . fromMaybe "")
    . GI.Gtk.fileChooserGetFilename

fileChooserButtonGetFilePath :: GI.Gtk.FileChooserButton -> IO String
fileChooserButtonGetFilePath fileChooserButton = do
  result <- fileChooserButtonGetString fileChooserButton
  fileExist <- doesFileExist result
  return $
    if fileExist
      then result
      else ""

safeDivide :: (Fractional a, Eq a) => a -> a -> Maybe a
safeDivide n d = if d == 0.0 then Nothing else Just $ n / d