@@ -15,9 +15,10 @@ module FF.Qt.TaskListWidget (
1515 upsertTask ,
1616) where
1717
18- import Control.Monad (void )
18+ import Control.Monad (void , when )
19+ import Data.Foldable (for_ )
1920import Data.IORef (IORef , modifyIORef , newIORef , readIORef )
20- import Data.Map.Strict (Map )
21+ import Data.Map.Strict (Map , (!) )
2122import Data.Map.Strict qualified as Map
2223import Data.Text qualified as Text
2324import Data.Time (getCurrentTime , toGregorian , utctDay )
@@ -46,7 +47,10 @@ import FF.Types (
4647import FF.UI (sampleLabel )
4748
4849data TaskListWidget = TaskListWidget
49- { parent :: QTreeWidget , modeItems :: IORef (Map TaskMode QTreeWidgetItem )}
50+ { parent :: QTreeWidget
51+ , modeItems :: IORef (Map TaskMode QTreeWidgetItem )
52+ , taskItems :: IORef (Map String (TaskMode , QTreeWidgetItem ))
53+ }
5054
5155{- | Value order in this enumeration defines the field order in the tree widget.
52560th column mustn't be hideable, because when 0th column is hidden,
@@ -60,9 +64,6 @@ data Field
6064 SortKeyField
6165 deriving (Bounded , Enum )
6266
63- fieldCount :: Int
64- fieldCount = fromEnum (maxBound :: Field ) + 1
65-
6667fieldsToStrings :: (Field -> String ) -> [String ]
6768fieldsToStrings f = map f [minBound .. maxBound ]
6869
@@ -99,8 +100,9 @@ new = do
99100 QTreeWidget. sortItems parent (fromEnum SortKeyField ) Qt. AscendingOrder
100101
101102 modeItems <- newIORef mempty
103+ taskItems <- newIORef mempty
102104
103- let this = TaskListWidget {parent, modeItems}
105+ let this = TaskListWidget {parent, modeItems, taskItems }
104106
105107 setDebugInfoVisible this False
106108
@@ -112,18 +114,34 @@ setDebugInfoVisible this v = do
112114 QTreeView. setColumnHidden this. parent (fromEnum SortKeyField ) $ not v
113115 QTreeView. setHeaderHidden this. parent $ not v
114116
115- -- Only insertion is implemeted. TODO implement update.
116117upsertTask :: TaskListWidget -> EntityView Note -> IO ()
117118upsertTask this entity = do
118119 today <- utctDay <$> getCurrentTime
119120 let mode = taskMode today note
121+ mExisting <- Map. lookup noteId <$> readIORef this. taskItems
122+ case mExisting of
123+ Nothing -> do
124+ modeItem <- getOrCreateModeItem this mode
125+ item <- createTaskItem modeItem entity
126+ modifyIORef this. taskItems $ Map. insert noteId (mode, item)
127+ Just (oldMode, item) -> do
128+ updateTaskItem item entity
129+ when (oldMode /= mode) do
130+ oldModeItem <- (! oldMode) <$> readIORef this. modeItems
131+ idx <- QTreeWidgetItem. indexOfChild oldModeItem item
132+ void $ QTreeWidgetItem. takeChild oldModeItem idx
133+ newModeItem <- getOrCreateModeItem this mode
134+ QTreeWidgetItem. addChild newModeItem item
135+ modifyIORef this. taskItems $ Map. insert noteId (mode, item)
136+ where
137+ Entity {entityId = DocId noteId, entityVal = NoteView {note}} = entity
138+
139+ getOrCreateModeItem :: TaskListWidget -> TaskMode -> IO QTreeWidgetItem
140+ getOrCreateModeItem this mode = do
120141 mModeItem <- Map. lookup mode <$> readIORef this. modeItems
121- modeItem <- case mModeItem of
142+ case mModeItem of
122143 Just item -> pure item
123144 Nothing -> createModeItem this mode
124- createTaskItem modeItem entity
125- where
126- Entity {entityVal = NoteView {note}} = entity
127145
128146createModeItem :: TaskListWidget -> TaskMode -> IO QTreeWidgetItem
129147createModeItem this mode = do
@@ -148,17 +166,26 @@ createModeItem this mode = do
148166 modifyIORef this. modeItems $ Map. insert mode item
149167 pure item
150168
151- createTaskItem :: QTreeWidgetItem -> EntityView Note -> IO ()
169+ createTaskItem :: QTreeWidgetItem -> EntityView Note -> IO QTreeWidgetItem
152170createTaskItem modeItem entity =
153- void $
154- QTreeWidgetItem. newWithParentItemAndStringsAndType
155- modeItem
156- ( fieldsToStrings \ case
157- IdField -> noteId
158- SortKeyField -> sortKey
159- TitleField -> title
160- )
161- (itemTypeToInt Task )
171+ QTreeWidgetItem. newWithParentItemAndStringsAndType
172+ modeItem
173+ (fieldsToStrings $ taskItemField entity)
174+ (itemTypeToInt Task )
175+
176+ updateTaskItem :: QTreeWidgetItem -> EntityView Note -> IO ()
177+ updateTaskItem item entity =
178+ for_ [minBound .. maxBound ] \ field ->
179+ QTreeWidgetItem. setText
180+ item
181+ (fromEnum field)
182+ (taskItemField entity field)
183+
184+ taskItemField :: EntityView Note -> Field -> String
185+ taskItemField entity = \ case
186+ IdField -> noteId
187+ SortKeyField -> sortKey
188+ TitleField -> title
162189 where
163190 Entity {entityId = DocId noteId, entityVal = NoteView {note}} = entity
164191 title = concat $ take 1 $ lines $ fromRgaM note. note_text
0 commit comments