packages feed

movie-monad-0.0.5.0: src/VideoSizeSelector.hs

{-
  Movie Monad
  (C) 2017 David Lettier
  lettier.com
-}

module VideoSizeSelector where

import Control.Monad
import Data.Text
import Data.IORef
import qualified GI.GLib
import qualified GI.Gtk

import qualified Records as R
import Reset
import Window
import Utils

addVideoSizeSelectorHandlers :: R.Application -> IO ()
addVideoSizeSelectorHandlers
  application@R.Application
    { R.guiObjects =
        guiObjects@R.GuiObjects
          { R.windowWidthSelectionComboBoxText = windowWidthSelectionComboBoxText
          }
    }
  = do
  void $
    GI.Gtk.onComboBoxChanged
      windowWidthSelectionComboBoxText $
        videoSizeSelectionHandler application
  void $
    GI.GLib.timeoutAddSeconds
      GI.GLib.PRIORITY_DEFAULT
      1 $
        setToCustomIfNeeded guiObjects

videoSizeSelectionHandler :: R.Application -> IO ()
videoSizeSelectionHandler
  application@R.Application
    { R.guiObjects =
        guiObjects@R.GuiObjects
          { R.window                           = window
          , R.windowWidthSelectionComboBoxText = windowWidthSelectionComboBoxText
          }
    , R.ioRefs =
        R.IORefs
          { R.videoInfoRef = videoInfoRef
          }
    }
  = do
  videoInfo         <- readIORef videoInfoRef
  desiredWindowWidth <- getDesiredWindowWidth windowWidthSelectionComboBoxText window
  maybeWindowSize   <- calculateWindowSize guiObjects desiredWindowWidth videoInfo
  case maybeWindowSize of
    Nothing              -> resetApplication application
    Just (width, height) -> setWindowSize guiObjects width height

setToCustomIfNeeded :: R.GuiObjects -> IO Bool
setToCustomIfNeeded
  R.GuiObjects
    { R.window                      = window
    , R.windowWidthSelectionComboBoxText = windowWidthSelectionComboBoxText
    }
  = do
  (windowWidth', _)  <- GI.Gtk.windowGetSize window
  maybeSelectedWidth <- getSelectedWindowWidth windowWidthSelectionComboBoxText
  let windowWidth    = fromIntegral windowWidth' :: Int
  case maybeSelectedWidth of
    Just selectedWidth ->
      when (windowWidth /= selectedWidth) $
        GI.Gtk.comboBoxSetActive windowWidthSelectionComboBoxText (-1)
    Nothing -> do
      let windowWidthText = Data.Text.pack $ show windowWidth
      present <-
        GI.Gtk.comboBoxSetActiveId
          windowWidthSelectionComboBoxText $
            Just windowWidthText
      if present
        then return ()
        else GI.Gtk.comboBoxSetActive windowWidthSelectionComboBoxText (-1)
  return True