Skip to content

Commit

Permalink
Add config file on ~/.config/rsi-break/settings.ini
Browse files Browse the repository at this point in the history
Also update logic.
  • Loading branch information
RubenAstudillo committed Oct 3, 2023
1 parent 2a77d7f commit 402bab3
Show file tree
Hide file tree
Showing 7 changed files with 95 additions and 25 deletions.
8 changes: 4 additions & 4 deletions default.nix
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{ mkDerivation, async, base, config-ini, lens, lib, monomer
, process, text, text-show, time, xdg-basedir
{ mkDerivation, async, base, config-ini, directory, filepath, lens
, lib, monomer, process, text, text-show, time
}:
mkDerivation {
pname = "rsi-break";
Expand All @@ -9,8 +9,8 @@ mkDerivation {
isExecutable = true;
enableSeparateDataOutput = true;
libraryHaskellDepends = [
async base config-ini lens monomer process text text-show time
xdg-basedir
async base config-ini directory filepath lens monomer process text
text-show time
];
executableHaskellDepends = [ base monomer process ];
testHaskellDepends = [ base ];
Expand Down
6 changes: 5 additions & 1 deletion rsi-break.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,12 @@ library
RsiBreak.Widget.Timer
RsiBreak.Widget.Clockdown
RsiBreak.Model.Minutes
RsiBreak.Model.Settings
RsiBreak.Actions
other-modules: Paths_rsi_break
default-extensions: StrictData
OverloadedStrings
ImportQualifiedPost
-- other-extensions:
build-depends: base >= 4.16.4.0 && < 4.18,
monomer,
Expand All @@ -48,7 +51,8 @@ library
time,
process,
config-ini,
xdg-basedir
directory,
filepath
hs-source-dirs: src
default-language: Haskell2010

Expand Down
41 changes: 41 additions & 0 deletions src/RsiBreak/Actions.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
module RsiBreak.Actions (getOrCreateConfigFile, storeSettingsOnConfigFile) where

import Control.Monad (unless)
import Data.Ini.Config.Bidir
import Data.Text.IO qualified as TIO (readFile, writeFile)
import RsiBreak.Model.Settings
import System.Directory
import System.FilePath ((</>))

getOrCreateConfigFile :: IO TimerSetting
getOrCreateConfigFile = do
dir <- getXdgDirectory XdgConfig "rsi-break"
let file = dir </> "settings.ini"
settingsFileExist <- doesFileExist file
unless settingsFileExist $
createNewInitialSettings dir file
settingFileContent <- TIO.readFile file
let eIniSettings = parseIni settingFileContent defaultIni
case eIniSettings of
Left _err -> do
removeDirectoryRecursive dir
createNewInitialSettings dir file
pure defSetting
Right ini' -> pure (getIniValue ini')
where
createNewInitialSettings dir file = do
createDirectory dir
TIO.writeFile file (serializeIni defaultIni)

defaultIni :: Ini TimerSetting
defaultIni =
setIniUpdatePolicy
(defaultUpdatePolicy{updateGeneratedCommentPolicy = CommentPolicyAddFieldComment})
(ini defSetting timerSettingSpec)

storeSettingsOnConfigFile :: TimerSetting -> IO ()
storeSettingsOnConfigFile updatedSettings = do
let updatedIni = updateIni updatedSettings defaultIni
dir <- getXdgDirectory XdgConfig "rsi-break"
let file = dir </> "settings.ini"
TIO.writeFile file (serializeIni updatedIni)
28 changes: 28 additions & 0 deletions src/RsiBreak/Model/Settings.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{-# LANGUAGE TemplateHaskell #-}

module RsiBreak.Model.Settings where

import Control.Lens (makeLenses)
import Data.Ini.Config.Bidir
import RsiBreak.Model.Minutes (Minutes)

data TimerSetting = TimerSetting
{ _workInterval :: Minutes
, _restInterval :: Minutes
}
deriving (Eq, Show)

$(makeLenses 'TimerSetting)

defSetting :: TimerSetting
defSetting = TimerSetting 20 10

timerSettingSpec :: IniSpec TimerSetting ()
timerSettingSpec =
section "TimerSetting" $ do
workInterval
.= field "workInterval" number
& comment ["The desired work interval in minutes"]
restInterval
.= field "restInterval" number
& comment ["The desired rest interval in minutes"]
9 changes: 5 additions & 4 deletions src/RsiBreak/RealMain.hs
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,14 @@ module RsiBreak.RealMain (realMain) where
import Data.String (IsString (..))
import Monomer
import Paths_rsi_break
import qualified RsiBreak.Widget.Clockdown as Clockdown
import qualified RsiBreak.Widget.Settings as Settings
import qualified RsiBreak.Widget.Timer as Timer
import RsiBreak.Actions (getOrCreateConfigFile)
import RsiBreak.Widget.Clockdown qualified as Clockdown
import RsiBreak.Widget.Timer qualified as Timer

realMain :: IO ()
realMain = do
timerSettings <- getOrCreateConfigFile
let model = Clockdown.ClockModel "0:00" Timer.TimerNoWait timerSettings
windowIconPath <- fromString <$> getDataFileName "assets/images/icon.png"
robotoRegularFont <- fromString <$> getDataFileName "assets/fonts/Roboto-Regular.ttf"
let cfg = config windowIconPath robotoRegularFont
Expand All @@ -22,4 +24,3 @@ realMain = do
, appTheme darkTheme
, appFontDef "Regular" roboto
]
model = Clockdown.ClockModel "0:00" Timer.TimerNoWait (Settings.TimerSetting 20 10)
26 changes: 11 additions & 15 deletions src/RsiBreak/Widget/Settings.hs
Original file line number Diff line number Diff line change
@@ -1,32 +1,28 @@
{-# LANGUAGE TemplateHaskell #-}

module RsiBreak.Widget.Settings (
TimerSetting (..),
handleEvent,
buildUI,
) where

import Control.Lens (makeLenses, set)
import Control.Applicative (Alternative (empty))
import Control.Lens (set)
import Monomer
import RsiBreak.Actions (storeSettingsOnConfigFile)
import RsiBreak.Model.Minutes (Minutes)

data TimerSetting = TimerSetting
{ _workInterval :: Minutes
, _restInterval :: Minutes
}
deriving (Eq, Show)

$(makeLenses 'TimerSetting)
import RsiBreak.Model.Settings

data TimerSettingEvent = TSENewWorkTime Minutes | TSENewRestTime Minutes
deriving (Eq, Show)

handleEvent :: ep -> EventHandler TimerSetting TimerSettingEvent sp ep
handleEvent onChangeEvent _wenv _node model evt =
let changeModel = case evt of
TSENewWorkTime newm -> Model (set workInterval newm model)
TSENewRestTime newm -> Model (set restInterval newm model)
in [changeModel, Report onChangeEvent]
let newModel = case evt of
TSENewWorkTime newm -> set workInterval newm model
TSENewRestTime newm -> set restInterval newm model
in [ Model newModel
, Report onChangeEvent
, Task (storeSettingsOnConfigFile newModel *> empty)
]

buildUI :: UIBuilder TimerSetting TimerSettingEvent
buildUI _wenv _model =
Expand Down
2 changes: 1 addition & 1 deletion src/RsiBreak/Widget/Timer.hs
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ waitTime totalTime handle = getCurrentTime >>= go
let timeDiff = diffUTCTime currentTime startTime
if timeDiff <= totalTime
then do
handle (TimerReport (totalTime - timeDiff))
handle $! (TimerReport (totalTime - timeDiff))
threadDelay 500_000
go startTime
else handle (TimerReport 0)
Expand Down

0 comments on commit 402bab3

Please sign in to comment.