monomer-hagrid 0.2.0.0 → 0.2.0.1
raw patch · 3 files changed
+32/−31 lines, 3 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- ChangeLog.md +4/−0
- monomer-hagrid.cabal +1/−1
- src/Monomer/Hagrid.hs +27/−30
ChangeLog.md view
@@ -1,3 +1,7 @@+## 0.2.0.1+### Fixed+- Fix a bug where the grid did not update when the model went from empty to non-empty.+ ## 0.2.0.0 ### Added - Speed up large grids by only creating widgets that are visible.
monomer-hagrid.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.0 name: monomer-hagrid-version: 0.2.0.0+version: 0.2.0.1 license: MIT license-file: LICENSE maintainer: garethdanielsmith@gmail.com
src/Monomer/Hagrid.hs view
@@ -230,6 +230,8 @@ itemsBeforeInflated :: Int, -- | The items that have been inflated into actual widgets. inflatedItems :: Seq (ItemWithIndex a),+ -- | How many items there are after the inflated items.+ itemsAfterInflated :: Int, phase :: ContentPanePhase } deriving (Eq, Show)@@ -637,22 +639,24 @@ fixedRowViewportOffset = 0, itemsBeforeInflated = 0, inflatedItems = mempty,+ itemsAfterInflated = 0, phase = ContentPaneIdle } - mergeModel :: MergeModelHandler (ContentPaneModel a) (ContentPaneEvent e) s- mergeModel _wenv _parentModel oldModel newModel =- oldModel {columnWidths, fixedRowIndex, itemsBeforeInflated, inflatedItems}+ mergeModel :: MergeModelHandler (ContentPaneModel a) (ContentPaneEvent e) (HagridModel a)+ mergeModel _wenv parentModel oldModel newModel =+ oldModel {columnWidths, fixedRowIndex, itemsBeforeInflated, inflatedItems, itemsAfterInflated} where columnWidths = newModel.columnWidths- fixedRowIndex = min (max 0 (length model.sortedItems - 1)) oldModel.fixedRowIndex- itemsBeforeInflated = min (length model.sortedItems) oldModel.itemsBeforeInflated- inflatedItems = takeAt itemsBeforeInflated (length oldModel.inflatedItems) model.sortedItems+ fixedRowIndex = min (max 0 (length parentModel.sortedItems - 1)) oldModel.fixedRowIndex+ itemsBeforeInflated = min (length parentModel.sortedItems) oldModel.itemsBeforeInflated+ itemsAfterInflated = length parentModel.sortedItems - itemsBeforeInflated - length inflatedItems+ inflatedItems = takeAt itemsBeforeInflated (length oldModel.inflatedItems) parentModel.sortedItems buildUI _wenv cpModel =- contentPaneInner (S.fromList columnDefs) model cpModel `nodeKey` contentPaneInnerKey+ contentPaneInner (S.fromList columnDefs) model cpModel - handleEvent wenv node cpModel = \case+ handleEvent _wenv node cpModel = \case SetVisibleArea visibleArea -> result where result = case cpModel.phase of@@ -665,17 +669,16 @@ fixedRowViewportOffset, itemsBeforeInflated = fixedRowIndex, inflatedItems = mempty,+ itemsAfterInflated = length model.sortedItems - fixedRowIndex, phase = ContentPaneReinflating }- in [Model newModel, resizeInnerRequest wenv]- | visibleAreaMoved ->- let newModel = cpModel {visibleArea, fixedRowIndex, fixedRowViewportOffset} in [Model newModel]+ | visibleAreaMoved ->+ [Model cpModel {visibleArea, fixedRowIndex, fixedRowViewportOffset}] | otherwise -> [] ContentPaneReinflating | visibleAreaMoved ->- let newModel = (cpModel :: ContentPaneModel a) {visibleArea}- in [Model newModel]+ [Model (cpModel :: ContentPaneModel a) {visibleArea}] | otherwise -> [] (fixedRowIndex, fixedRowViewportOffset) = fixedRow minVisibleY rowHeights model cpModel@@ -686,7 +689,7 @@ maxVisibleY = visibleArea._rY + visibleArea._rH startItemsMissing = cpModel.itemsBeforeInflated > 0 && minVisibleY < rowsStartY- endItemsMissing = itemsAfterInflated model cpModel > 0 && maxVisibleY > rowsEndY+ endItemsMissing = cpModel.itemsAfterInflated > 0 && maxVisibleY > rowsEndY ContentPaneScrollToRow callback -> result where result@@ -702,7 +705,7 @@ inflatedItems = mempty, phase = ContentPaneReinflating }- in [Model newModel, resizeInnerRequest wenv]+ in [Model newModel] | otherwise = [] @@ -725,7 +728,8 @@ (itemsToPrepend + length cpModel.inflatedItems + itemsToAppend) model.sortedItems itemsBeforeInflated = cpModel.itemsBeforeInflated - itemsToPrepend- in [Model cpModel {inflatedItems, itemsBeforeInflated}, resizeInnerRequest wenv]+ itemsAfterInflated = length model.sortedItems - length inflatedItems - itemsBeforeInflated+ in [Model cpModel {itemsBeforeInflated, inflatedItems, itemsAfterInflated}] | otherwise = -- Once we have finished adding items then, if the added items are not the same size as estimated, -- the row we want to scroll to might no longer be at the correct position in the viewport, so we@@ -736,7 +740,7 @@ in [Model cpModel {phase = ContentPaneIdle}] <> adjustScrollEvt itemsToPrepend = itemsToAdd (fixedRowY - rowsStartY) 1 cpModel.itemsBeforeInflated- itemsToAppend = itemsToAdd (rowsEndY - fixedRowY) 2 (itemsAfterInflated model cpModel)+ itemsToAppend = itemsToAdd (rowsEndY - fixedRowY) 2 cpModel.itemsAfterInflated itemsToAdd existingItemsHeight f availableItems | not (null model.sortedItems) && existingItemsHeight < visibleHeight * f =@@ -777,7 +781,11 @@ merge _wenv newNode _oldNode oldState = resultReqs newNode reqs where reqs = [ResizeWidgets (newNode ^. L.info . L.widgetId) | needResize]- needResize = oldState.columnWidths /= cpModel.columnWidths+ needResize =+ oldState.columnWidths /= cpModel.columnWidths+ || oldState.itemsBeforeInflated /= cpModel.itemsBeforeInflated+ || length oldState.inflatedItems /= length cpModel.inflatedItems+ || oldState.itemsAfterInflated /= cpModel.itemsAfterInflated getSizeReq _wenv _node children = (w, h) where@@ -785,7 +793,7 @@ h = fixedSize (uninflatedHeights + inflatedHeights) uninflatedHeights = fromIntegral uninflatedItems * model.mdlEstimatedItemHeight- uninflatedItems = cpModel.itemsBeforeInflated + itemsAfterInflated model cpModel+ uninflatedItems = cpModel.itemsBeforeInflated + cpModel.itemsAfterInflated inflatedHeights = sum (_szrFixed . _wniSizeReqH . _wnInfo <$> children) @@ -942,14 +950,6 @@ offset = (y + fromIntegral indexInSection * model.mdlEstimatedItemHeight) - minVisibleY in (row, offset) -resizeInnerRequest :: WidgetEnv s e -> EventResponse s e sp ep-resizeInnerRequest wenv =- Request (ResizeWidgets (fromJust (widgetIdFromKey wenv (WidgetKey contentPaneInnerKey))))--itemsAfterInflated :: HagridModel a -> ContentPaneModel a -> Int-itemsAfterInflated model cpModel =- length model.sortedItems - (cpModel.itemsBeforeInflated + length cpModel.inflatedItems)- dragHandleWidth :: Int dragHandleWidth = 4 @@ -964,9 +964,6 @@ contentPaneOuterKey :: Text contentPaneOuterKey = "Hagrid.contentPaneOuter"--contentPaneInnerKey :: Text-contentPaneInnerKey = "Hagrid.contentPaneInner" footerPaneKey :: Text footerPaneKey = "Hagrid.footerPane"