packages feed

Gifcurry-0.1.0.6: gui_src/Main.hs

-- David Lettier (C) 2016. http://www.lettier.com/

import System.Environment
import System.Directory
import System.Process
import System.Info
import Data.Char
import Data.List
import Control.Concurrent
import Graphics.UI.Gtk
import Graphics.UI.Gtk.Builder

import Paths_Gifcurry
import Gifcurry (gif)

main = do
  initGUI

  builder <- build_builder

  window                  <- load_window builder "gifcurry_window"
  start_time_entry        <- load_entry builder "start_time_text_entry"
  duration_entry          <- load_entry builder "duration_text_entry"
  width_entry             <- load_entry builder "width_text_entry"
  quality_entry           <- load_entry builder "quality_text_entry"
  top_text_entry          <- load_entry builder "top_text_text_entry"
  bottom_text_entry       <- load_entry builder "bottom_text_text_entry"
  output_file_name_entry  <- load_entry builder "output_file_name_text_entry"
  status_entry            <- load_entry builder "status_text_entry"
  input_file_button       <- load_fc_button builder "input_file_button"
  output_file_path_button <- load_fc_button builder "output_file_path_button"
  create_button           <- load_button builder "create_button"
  open_button             <- load_button builder "open_button"
  giphy_button            <- load_button builder "giphy_link_button"
  imgur_button            <- load_button builder "imgur_link_button"

  -- Bug in Glade does not allow setting the link button label.
  buttonSetLabel giphy_button "Giphy"
  buttonSetLabel imgur_button "Imgur"

  entrySetText start_time_entry "0"
  entrySetText duration_entry "10"
  entrySetText quality_entry "100"
  entrySetText width_entry "500"

  create_button `on` buttonActivated $ do
    input_file_text <- fileChooserGetFilename input_file_button
    input_file_path_name <- case input_file_text of
      Nothing -> return ""
      Just file_path_name -> return file_path_name

    start_time <- entryGetText start_time_entry
    duration <- entryGetText duration_entry

    width <- entryGetText width_entry
    quality <- entryGetText quality_entry

    top_text <- entryGetText top_text_entry
    bottom_text <- entryGetText bottom_text_entry

    (output_gif_file_name, output_file_path_name) <- assemble_output_file_path_name output_file_path_button output_file_name_entry

    if ((length input_file_path_name) > 0 && (length output_file_path_name) > 5 && (length output_gif_file_name) > 4)
      then do
        forkIO $ do
          entrySetText status_entry "One GIF coming up!"
          result <- gif [
            input_file_path_name,
            output_file_path_name,
            start_time,
            duration,
            width,
            quality,
            top_text,
            bottom_text ]
          if result == 1
            then entrySetText status_entry "Did not work. Check your settings."
            else entrySetText status_entry "Ready."
          forkIO $ do
            open_gif output_file_path_name
            return ()
          return ()
        return ()
      else entrySetText status_entry "File paths are wrong. Check your settings."

    return ()

  open_button `on` buttonActivated $ do
    (_, output_file_path_name) <- assemble_output_file_path_name output_file_path_button output_file_name_entry

    fileExists <- doesFileExist output_file_path_name
    if fileExists
      then do
        forkIO $ do
          open_gif output_file_path_name
          return ()
        return ()
      else entrySetText status_entry "GIF does not exist. Check your settings."

    return ()

  on window objectDestroy mainQuit
  widgetShowAll window
  mainGUI

load_window b = builderGetObject b castToWindow

load_entry b = builderGetObject b castToEntry

load_fc_button b = builderGetObject b castToFileChooserButton

load_button b = builderGetObject b castToButton

build_builder = do
  builder <- builderNew
  glade_file <- getDataFileName "data/gui.glade"
  builderAddFromFile builder glade_file

  return builder

assemble_output_file_path_name output_file_path_button output_file_name_entry = do
  output_file_path_text <- fileChooserGetFilename output_file_path_button
  output_file_path <- case output_file_path_text of
    Nothing -> return ""
    Just dir -> return dir

  output_file_name <- entryGetText output_file_name_entry
  let output_gif_file_name = output_file_name ++ ".gif"
  let output_file_path_name = output_file_path ++ "/" ++ output_gif_file_name

  return (output_gif_file_name, output_file_path_name)

open_gif output_file_path_name = spawnCommand $ command ++ output_file_path_name
  where command = if "linux" `isInfixOf` (fmap toLower System.Info.os) then "xdg-open " else "open "