Skip to content

Commit 202ee35

Browse files
committed
ff-qtah: Hide QTreeWidgetItem on "Done"
1 parent f619d5e commit 202ee35

3 files changed

Lines changed: 49 additions & 18 deletions

File tree

ff-qtah/FF/Qt/MainWindow.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ new progName storage = do
7878
taskWidget <-
7979
TaskWidget.new
8080
storage
81-
(TaskListWidget.upsertTask agendaTasks) -- on task updated
81+
(TaskListWidget.syncTask agendaTasks) -- on task updated
8282
QWidget.hide taskWidget.parent
8383
QSplitter.addWidget agendaSplitter taskWidget.parent
8484

@@ -115,7 +115,7 @@ new progName storage = do
115115

116116
-- | Only task notes are supported. TODO support wiki notes too
117117
upsertNote :: MainWindow -> EntityView Note -> IO ()
118-
upsertNote MainWindow{agendaTasks} = TaskListWidget.upsertTask agendaTasks True
118+
upsertNote MainWindow{agendaTasks} = TaskListWidget.syncTask agendaTasks True
119119

120120
-- https://wiki.qt.io/Saving_Window_Size_State
121121
saveGeometryAndState :: (QMainWindowPtr window) => window -> IO Bool

ff-qtah/FF/Qt/TaskListWidget.hs

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ module FF.Qt.TaskListWidget (
1212
getTitle,
1313
new,
1414
setDebugInfoVisible,
15-
upsertTask,
15+
syncTask,
1616
) where
1717

1818
import Control.Monad (when)
@@ -37,19 +37,23 @@ import Text.Printf (printf)
3737

3838
import FF (fromRgaM)
3939
import FF.Types (
40-
Entity (..),
40+
Entity (Entity),
4141
EntityView,
42-
Note (..),
42+
Note,
43+
NoteId,
44+
NoteStatus (TaskStatus),
45+
Status (Active, Archived),
4346
TaskMode (..),
4447
View (NoteView, note),
4548
taskMode,
4649
)
50+
import FF.Types qualified
4751
import FF.UI (sampleLabel)
4852

4953
data TaskListWidget = TaskListWidget
5054
{ parent :: QTreeWidget
5155
, modeItems :: IORef (Map TaskMode QTreeWidgetItem)
52-
, taskItems :: IORef (Map String (TaskMode, QTreeWidgetItem))
56+
, taskItems :: IORef (Map NoteId (TaskMode, QTreeWidgetItem))
5357
}
5458

5559
{- | Value order in this enumeration defines the field order in the tree widget.
@@ -115,6 +119,15 @@ setDebugInfoVisible this v = do
115119
QTreeView.setColumnHidden this.parent (fromEnum SortKeyField) $ not v
116120
QTreeView.setHeaderHidden this.parent $ not v
117121

122+
syncTask :: TaskListWidget -> Bool -> EntityView Note -> IO ()
123+
syncTask this keepTaskOpen entity = do
124+
case note.note_status of
125+
Just (TaskStatus Active) -> upsertTask this keepTaskOpen entity
126+
Just (TaskStatus Archived) -> deleteTaskFromUi this noteId
127+
_ -> undefined
128+
where
129+
Entity noteId NoteView{note} = entity
130+
118131
upsertTask :: TaskListWidget -> Bool -> EntityView Note -> IO ()
119132
upsertTask this keepTaskOpen entity = do
120133
today <- utctDay <$> getCurrentTime -- TODO get local day
@@ -142,7 +155,17 @@ upsertTask this keepTaskOpen entity = do
142155
this.parent
143156
(nullptr :: QTreeWidgetItem)
144157
where
145-
Entity{entityId = DocId noteId, entityVal = NoteView{note}} = entity
158+
Entity noteId NoteView{note} = entity
159+
160+
deleteTaskFromUi :: TaskListWidget -> NoteId -> IO ()
161+
deleteTaskFromUi this noteId = do
162+
mExisting <- Map.lookup noteId <$> readIORef this.taskItems
163+
for_ mExisting \(oldMode, item) -> do
164+
oldModeItem <- (! oldMode) <$> readIORef this.modeItems
165+
idx <- QTreeWidgetItem.indexOfChild oldModeItem item
166+
_ <- QTreeWidgetItem.takeChild oldModeItem idx
167+
modifyIORef this.taskItems $ Map.delete noteId
168+
QTreeWidget.setCurrentItem this.parent (nullptr :: QTreeWidgetItem)
146169

147170
getOrCreateModeItem :: TaskListWidget -> TaskMode -> IO QTreeWidgetItem
148171
getOrCreateModeItem this mode = do
@@ -195,7 +218,7 @@ taskItemField entity = \case
195218
SortKeyField -> sortKey
196219
TitleField -> title
197220
where
198-
Entity{entityId = DocId noteId, entityVal = NoteView{note}} = entity
221+
Entity (DocId noteId) NoteView{note} = entity
199222
title = concat $ take 1 $ lines $ fromRgaM note.note_text
200223
sortKey = printf "End=%04d%02d%02d,Start=%04d%02d%02d" ey em ed sy sm sd
201224
(ey, em, ed) = maybe (9999, 99, 99) toGregorian note.note_end

ff-qtah/FF/Qt/TaskWidget.hs

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ module FF.Qt.TaskWidget (
1010
reload,
1111
) where
1212

13+
import Data.Foldable (for_)
1314
import Data.IORef (IORef, atomicWriteIORef, newIORef, readIORef)
1415
import Graphics.UI.Qtah.Core.Types qualified as Qt
1516
import Graphics.UI.Qtah.Signal (connect_)
@@ -22,7 +23,7 @@ import Named (defaults, (!))
2223
import RON.Storage.FS (runStorage)
2324
import RON.Storage.FS qualified as Storage
2425

25-
import FF (cmdPostpone, fromRgaM, viewNote)
26+
import FF (cmdDone, cmdPostpone, fromRgaM, viewNote)
2627
import FF.Types (
2728
Entity (..),
2829
EntityDoc,
@@ -76,30 +77,37 @@ new storage onTaskUpdated = do
7677
! #wordWrap True
7778
! defaults
7879
postpone <- QPushButton.newWithText "Postpone"
80+
done <- QPushButton.newWithText "Done"
7981
parent <-
8082
qFrame . QFormLayout $
8183
[ RowWidget $ qScrollArea textContent
8284
, StringLayout "Start:" start.parent
8385
, StringLayout "Deadline:" end.parent
84-
, RowLayout $ qHBoxLayout [Widget $< postpone, Stretch]
86+
, RowLayout . qHBoxLayout $
87+
[Widget $< postpone, Widget $< done, Stretch]
8588
]
8689
-- end setup UI
8790

8891
noteId <- newIORef Nothing
8992
let this = TaskWidget{..}
90-
connect_ postpone QAbstractButton.clickedSignal $ postponeSlot this
93+
connect_ postpone QAbstractButton.clickedSignal $ onPostponeClicked this
94+
connect_ done QAbstractButton.clickedSignal $ onDoneClicked this
9195
pure this
9296

93-
($<) :: Applicative f => (f a -> b) -> a -> b
97+
($<) :: (Applicative f) => (f a -> b) -> a -> b
9498
f $< x = f $ pure x
9599

96-
postponeSlot :: TaskWidget -> Bool -> IO ()
97-
postponeSlot this _checked = do
100+
onPostponeClicked :: TaskWidget -> Bool -> IO ()
101+
onPostponeClicked this _checked = do
98102
mNoteId <- readIORef this.noteId
99-
case mNoteId of
100-
Just noteId ->
101-
runStorage this.storage (cmdPostpone noteId) >>= update False this
102-
Nothing -> pure ()
103+
for_ mNoteId \noteId ->
104+
runStorage this.storage (cmdPostpone noteId) >>= update False this
105+
106+
onDoneClicked :: TaskWidget -> Bool -> IO ()
107+
onDoneClicked this _checked = do
108+
mNoteId <- readIORef this.noteId
109+
for_ mNoteId \noteId ->
110+
runStorage this.storage (cmdDone noteId) >>= update False this
103111

104112
reload :: TaskWidget -> NoteId -> IO ()
105113
reload this noteId = do

0 commit comments

Comments
 (0)