aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Config.hs2
-rw-r--r--Handlers.hs45
-rw-r--r--Screen.hs18
-rw-r--r--State.hs19
4 files changed, 70 insertions, 14 deletions
diff --git a/Config.hs b/Config.hs
index 1423d79..f5990e1 100644
--- a/Config.hs
+++ b/Config.hs
@@ -37,7 +37,7 @@ defaultConfig = LazymailConfig {
--
--customConfig = defaultConfig { initialPath = "/home/rul/mail/"}
-customConfig = defaultConfig { initialPath = "/home/rul/mail/linti"
+customConfig = defaultConfig { initialPath = "/home/rul/mail/"
, filterMaildirsHook = filterSymlinks }
filterSymlinks :: [FilePath] -> IO [FilePath]
diff --git a/Handlers.hs b/Handlers.hs
index 007933d..4605756 100644
--- a/Handlers.hs
+++ b/Handlers.hs
@@ -19,9 +19,12 @@ import System.IO(IOMode(..), hGetContents, openFile)
import Types (LazymailCurses)
previousMode :: Mode -> LazymailCurses ()
-previousMode IndexMode = (=<<) put $ get >>= \st -> return st { mode = MaildirMode }
-previousMode EmailMode = (=<<) put $ get >>= \st -> return st { mode = IndexMode }
previousMode MaildirMode = (=<<) put $ get >>= \st -> return st { exitRequested = True }
+previousMode EmailMode = (=<<) put $ get >>= \st -> return st { mode = IndexMode }
+previousMode IndexMode = do
+ st <- get
+ let ist = (indexState st) { selectedRowIn = 0, scrollRowIn = 0 }
+ put $ st { mode = MaildirMode, indexState = ist }
changeMode :: Mode -> LazymailCurses ()
changeMode EmailMode = return ()
@@ -44,6 +47,7 @@ changeMode MaildirMode = do
}
put $ st { mode = IndexMode, indexState = indexState' }
+{- Boilerplate code -}
incSelectedRow IndexMode = do
st <- get
let inSt = indexState st
@@ -60,9 +64,27 @@ incSelectedRow IndexMode = do
put st { indexState = inSt' }
else -- Move the selected row
put $ incrementSelectedRow st
+
+incSelectedRow MaildirMode = do
+ st <- get
+ let mdSt = maildirState st
+ let selRow = selectedRowMD mdSt
+ let topScrollRow = scrollRowMD mdSt
+ let startScrolling = (div (screenRows st) 4) * 3
+ let totalRows = length $ detectedMDs mdSt
+
+ if selRow > startScrolling && (topScrollRow <= (totalRows - (screenRows st)))
+ then do -- Scroll emails
+ let scrollRowMD' = topScrollRow + 1
+ let scrollBufferMD' = scrollCrop scrollRowMD' (screenRows st) $ detectedMDs mdSt
+ let mdSt' = mdSt { scrollRowMD = scrollRowMD', scrollBufferMD = scrollBufferMD' }
+ put st { maildirState = mdSt' }
+ else -- Move the selected row
+ put $ incrementSelectedRow st
incSelectedRow _ = (=<<) put $ get >>= \st -> return $ incrementSelectedRow st
+{- More boilerplate code -}
decSelectedRow IndexMode = do
st <- get
let inSt = indexState st
@@ -77,6 +99,22 @@ decSelectedRow IndexMode = do
put st { indexState = inSt' }
else
put $ decrementSelectedRow st
+
+decSelectedRow MaildirMode = do
+ st <- get
+ let mdSt = maildirState st
+ let selRow = selectedRowMD mdSt
+ let startScrolling = (div (screenRows st) 4)
+ let topScrollRow = scrollRowMD mdSt
+ if topScrollRow > 0 && selRow < startScrolling
+ then do
+ let scrollRowMD' = scrollRowMD mdSt - 1
+ let scrollBufferMD' = scrollCrop scrollRowMD' (screenRows st) $ detectedMDs mdSt
+ let mdSt' = mdSt { scrollRowMD = scrollRowMD', scrollBufferMD = scrollBufferMD' }
+ put st { maildirState = mdSt' }
+ else
+ put $ decrementSelectedRow st
+
decSelectedRow _ = (=<<) put $ get >>= \st -> return $ decrementSelectedRow st
{- Given a list, it returns the elements that will be in the next screen refresh
@@ -89,8 +127,7 @@ formatIndexModeRows st = mapM formatRow where
let email = parseEmail msg
let fs = getFields email
let str = normalizeLen (screenColumns st) . concat $
- [ show $ (currentRow st) + (scrollRowIn . indexState $ st) + 1
- , (ppSep ++) $ ppFlags . getFlags $ fp
+ [ (ppSep ++) $ ppFlags . getFlags $ fp
, (ppSep ++) $ ppIndexNameAddr . getFrom $ fs
, (ppSep ++) $ ppIndexSubject . getSubject $ fs
]
diff --git a/Screen.hs b/Screen.hs
index ce98840..98dbfa0 100644
--- a/Screen.hs
+++ b/Screen.hs
@@ -54,6 +54,8 @@ startCurses = do
return $ st { screenRows = fromIntegral $ rows - 1
, screenColumns = fromIntegral $ cols
, colorStyle = style }
+
+ resetScrollBuffer
screenLoop
{- This function will loop til the user decides to leave -}
@@ -79,7 +81,7 @@ performUpdate = do
{- Pattern match on the received mode and draw it in the screen. -}
drawMode :: Mode -> LazymailUpdate ()
-drawMode MaildirMode = get >>= \st -> drawSelectionList $ detectedMDs . maildirState $ st
+drawMode MaildirMode = get >>= \st -> drawSelectionList $ scrollBufferMD . maildirState $ st
drawMode IndexMode = get >>= \st -> drawSelectionList $ scrollBufferIn . indexState $ st
drawMode EmailMode = drawEmailHelper
@@ -170,7 +172,7 @@ drawStatus = do
drawStatusHelper MaildirMode st =
["Maildir listing - "
- , "(", show ((+ 1) . selectedRow $ st), "/"
+ , "(", show ((selectedRow st) + (scrollRowMD . maildirState $ st) + 1), "/"
, show (length $ detectedMDs . maildirState $ st), ")"]
drawStatusHelper IndexMode st =
@@ -208,5 +210,17 @@ handleEvent = loop where
resetCurrentRow = (=<<) put $ get >>= \st -> return $ st { currentRow = 0 }
incrementCurrentRow = (=<<) put $ get >>= \st -> return $ st { currentRow = (currentRow st) + 1 }
+resetScrollBuffer = do
+ st <- get
+ case (mode st) of
+ MaildirMode -> do
+ let mst = (maildirState st) {
+ scrollBufferMD = EH.scrollCrop 0 (screenRows st) $ detectedMDs . maildirState $ st }
+ put st { maildirState = mst}
+ IndexMode -> do
+ let ist = (indexState st) {
+ scrollBufferIn = EH.scrollCrop 0 (screenRows st) $ selectedEmails . indexState $ st }
+ put st { indexState = ist }
+
liftCurses = lift . lift
liftUpdate = lift . lift
diff --git a/State.hs b/State.hs
index 3a3d964..d047c06 100644
--- a/State.hs
+++ b/State.hs
@@ -34,6 +34,9 @@ data MaildirState = MaildirState {
selectedRowMD :: Int
, selectedMD :: String
, detectedMDs :: [(FilePath, String)]
+ , scrollRowMD :: Int
+ , scrollBufferMD :: [(FilePath, String)]
+
}
data IndexState = IndexState {
@@ -72,9 +75,11 @@ initialState = LazymailState {
}
initialMaildirState = MaildirState {
- selectedRowMD = 0
- , selectedMD = ""
- , detectedMDs = []
+ selectedRowMD = 0
+ , selectedMD = ""
+ , detectedMDs = []
+ , scrollRowMD = 0
+ , scrollBufferMD = []
}
initialIndexState = IndexState {
@@ -121,11 +126,11 @@ incrementSelectedRow st | (selectedRow st) < limit =
| otherwise = st
where
scrRows = screenRows st
+ curInLen = length $ selectedEmails . indexState $ st
+ curMDLen = length $ detectedMDs . maildirState $ st
limit' = case (mode st) of
- MaildirMode -> (length $ detectedMDs . maildirState $ st ) - 1
- IndexMode -> if (currentInLen . indexState $ st) < scrRows
- then (currentInLen . indexState $ st) - 1
- else scrRows
+ MaildirMode -> if curMDLen < scrRows then curMDLen - 1 else scrRows
+ IndexMode -> if curInLen < scrRows then curInLen - 1 else scrRows
limit = if (statusBar st) && (limit' == scrRows)
then fromIntegral $ limit' - 2
else fromIntegral limit'
nihil fit ex nihilo