packages feed

keera-posture-0.2.2: src/Controller/Conditions/MenuEnabledClick.hs

-- | Toggles notification status when the user interacts with the status icon
module Controller.Conditions.MenuEnabledClick where

import Control.Monad
import Data.ReactiveValue
import Graphics.UI.Gtk
import Graphics.UI.Gtk.Reactive

import CombinedEnvironment
import Model.Model (Status(..), isEnabled, isCalibrating)
import Hails.MVC.Model.ProtectedModel.Reactive

-- Detects interaction with the main window and the tray icon
installHandlers :: CEnv -> IO()
installHandlers cenv = void $ do
  -- View points
  menu <- mainMenuEnableItem $ mainWindowBuilder $ view cenv
  icon <- trayIcon $ mainWindowBuilder $ view cenv
  let anyInteraction = lMerge (menuItemActivateField menu)
                              (statusIconActivateField icon)

  -- Model points
  let stField = mkFieldAccessor statusField (model cenv)

  -- Reactive Rules

  -- Hide menu (whatever happens)
  anyInteraction =:> wrapDo_ (popDownMenu cenv)

  -- Advance state if it was calibrating

  let statusIfMustCalibrate  = anyInteraction `governingR` statusIfNotCalibrating
      -- statusIfMustCalibrate  = liftR2 (\_ s -> s) anyInteraction statusIfNotCalibrating
      statusIfNotCalibrating = stField `guardRO'` (not.isCalibrating)

  statusIfMustCalibrate =:> (nextState `liftW` stField)

  -- let updateStatusRV = modRW (\x _ -> if not (isCalibrating x) then nextState x else x) stField
  -- anyInteraction =:> updateStatusRV

  -- Disable notification if it was calibrating
  let notifEnabled = mkFieldAccessor notificationEnabledField (model cenv)

  statusIfMustCalibrate =:> (isEnabled `liftW` notifEnabled)

nextState :: Status -> Status
nextState StatusDisabled = StatusIdle
nextState _              = StatusDisabled

popDownMenu cenv = onViewAsync $ do
  -- Close the menu if the option is selected
  menu <- mainMenu $ mainWindowBuilder $ view cenv
  menuPopdown menu

-- -- | Closes the menu and toggles notification status
-- condition :: CEnv -> IO()
-- condition cenv = onViewAsync $ do
--   -- Close the menu if the option is selected
--   menu <- mainMenu $ mainWindowBuilder $ view cenv
--   menuPopdown menu
--
--   -- status <- getStatus pm
--   -- notifyEnabled <- getter notificationEnabledField pm
--
  -- case status of
  --  StatusDisabled     -> do setStatus pm StatusIdle
  --                           setter notificationEnabledField pm True
  --  StatusCallibrating -> return ()
  --  _                  -> do setStatus pm StatusDisabled
  --                           setter notificationEnabledField pm False