Skip to content

Commit fb0e75d

Browse files
[JEWEL-938] Split SelectableLazyColumn into Single/Multi APIs and add initial selected keys support
- Split SelectableLazyColumn into new typed entry points `SingleSelectionLazyColumn` and `MultiSelectionLazyColumn`, each bound to the correct selection mode through dedicated state types. - Add support for initializing legacy and new states with preselected keys (`initialSelectedKeys` / `initialSelectedKey`) without triggering `onSelectedIndexesChange` on first composition. - Extend `SelectableLazyListState` with `selectionMode` and `initialSelectedKeys` metadata used for legacy compatibility paths and mismatch diagnostics. - Preserve source and binary compatibility by keeping legacy `SelectableLazyColumn` and `rememberSelectableLazyListState` overloads, with migration-focused deprecations. - Preserve legacy precedence contract where the explicit ` selectionMode ` parameter wins over `state.selectionMode` and emits warnings on mismatches instead of throwing or mutating state during composition. - Add tests for typed states, typed columns, remember overload normalization, legacy mismatch scenarios, and multi-selection keyboard edge cases. Signed-off-by: Nebojsa.Vuksic <nebojsa.vuksic@jetbrains.com>
1 parent e9210fa commit fb0e75d

9 files changed

Lines changed: 1041 additions & 28 deletions

File tree

platform/jewel/foundation/api-dump.txt

Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,34 @@ c:org.jetbrains.jewel.foundation.lazy.DefaultSelectableOnKeyEvent
233233
- getKeybindings():org.jetbrains.jewel.foundation.lazy.SelectableColumnKeybindings
234234
f:org.jetbrains.jewel.foundation.lazy.DefaultSelectableOnKeyEvent$Companion
235235
- org.jetbrains.jewel.foundation.lazy.DefaultSelectableOnKeyEvent
236+
f:org.jetbrains.jewel.foundation.lazy.MultiSelectionLazyListState
237+
- androidx.compose.foundation.gestures.ScrollableState
238+
- org.jetbrains.jewel.foundation.lazy.SelectableScope
239+
- sf:$stable:I
240+
- <init>(androidx.compose.foundation.lazy.LazyListState,java.util.Set):V
241+
- b:<init>(androidx.compose.foundation.lazy.LazyListState,java.util.Set,I,kotlin.jvm.internal.DefaultConstructorMarker):V
242+
- dispatchRawDelta(F):F
243+
- getCanScrollBackward():Z
244+
- getCanScrollForward():Z
245+
- f:getFirstVisibleItemIndex():I
246+
- f:getFirstVisibleItemScrollOffset():I
247+
- f:getInteractionSource():androidx.compose.foundation.interaction.InteractionSource
248+
- f:getLastActiveItemIndex():java.lang.Integer
249+
- getLastScrolledBackward():Z
250+
- getLastScrolledForward():Z
251+
- f:getLayoutInfo():androidx.compose.foundation.lazy.LazyListLayoutInfo
252+
- f:getLazyListState():androidx.compose.foundation.lazy.LazyListState
253+
- getScrollIndicatorState():androidx.compose.foundation.ScrollIndicatorState
254+
- getSelectedKeys():java.util.Set
255+
- f:getSelectionMode():org.jetbrains.jewel.foundation.lazy.SelectionMode
256+
- f:isKeyboardNavigating():Z
257+
- isScrollInProgress():Z
258+
- scroll(androidx.compose.foundation.MutatePriority,kotlin.jvm.functions.Function2,kotlin.coroutines.Continuation):java.lang.Object
259+
- f:scrollToItem(I,Z,I,kotlin.coroutines.Continuation):java.lang.Object
260+
- bs:scrollToItem$default(org.jetbrains.jewel.foundation.lazy.MultiSelectionLazyListState,I,Z,I,kotlin.coroutines.Continuation,I,java.lang.Object):java.lang.Object
261+
- f:setKeyboardNavigating(Z):V
262+
- f:setLastActiveItemIndex(java.lang.Integer):V
263+
- setSelectedKeys(java.util.Set):V
236264
org.jetbrains.jewel.foundation.lazy.SelectableColumnKeybindings
237265
- a:isContiguousSelectionKeyPressed-5xRPYO0(I):Z
238266
- a:isContiguousSelectionKeyPressed-ZmokQxo(java.lang.Object):Z
@@ -269,8 +297,10 @@ org.jetbrains.jewel.foundation.lazy.SelectableColumnOnKeyEvent
269297
- onSelectNextItem(java.util.List,org.jetbrains.jewel.foundation.lazy.SelectableLazyListState):V
270298
- onSelectPreviousItem(java.util.List,org.jetbrains.jewel.foundation.lazy.SelectableLazyListState):V
271299
f:org.jetbrains.jewel.foundation.lazy.SelectableLazyColumnKt
300+
- sf:MultiSelectionLazyColumn(androidx.compose.ui.Modifier,org.jetbrains.jewel.foundation.lazy.MultiSelectionLazyListState,androidx.compose.foundation.layout.PaddingValues,Z,kotlin.jvm.functions.Function1,androidx.compose.foundation.layout.Arrangement$Vertical,androidx.compose.ui.Alignment$Horizontal,androidx.compose.foundation.gestures.FlingBehavior,org.jetbrains.jewel.foundation.lazy.tree.KeyActions,org.jetbrains.jewel.foundation.lazy.tree.PointerEventActions,androidx.compose.foundation.interaction.MutableInteractionSource,kotlin.jvm.functions.Function1,androidx.compose.runtime.Composer,I,I,I):V
272301
- sf:SelectableLazyColumn(androidx.compose.ui.Modifier,org.jetbrains.jewel.foundation.lazy.SelectionMode,org.jetbrains.jewel.foundation.lazy.SelectableLazyListState,androidx.compose.foundation.layout.PaddingValues,Z,kotlin.jvm.functions.Function1,androidx.compose.foundation.layout.Arrangement$Vertical,androidx.compose.ui.Alignment$Horizontal,androidx.compose.foundation.gestures.FlingBehavior,org.jetbrains.jewel.foundation.lazy.tree.KeyActions,org.jetbrains.jewel.foundation.lazy.tree.PointerEventActions,androidx.compose.foundation.interaction.MutableInteractionSource,kotlin.jvm.functions.Function1,androidx.compose.runtime.Composer,I,I,I):V
273302
- bsf:SelectableLazyColumn(androidx.compose.ui.Modifier,org.jetbrains.jewel.foundation.lazy.SelectionMode,org.jetbrains.jewel.foundation.lazy.SelectableLazyListState,androidx.compose.foundation.layout.PaddingValues,Z,kotlin.jvm.functions.Function1,androidx.compose.foundation.layout.Arrangement$Vertical,androidx.compose.ui.Alignment$Horizontal,androidx.compose.foundation.gestures.FlingBehavior,org.jetbrains.jewel.foundation.lazy.tree.KeyActions,org.jetbrains.jewel.foundation.lazy.tree.PointerEventActions,kotlin.jvm.functions.Function1,androidx.compose.runtime.Composer,I,I,I):V
303+
- sf:SingleSelectionLazyColumn(androidx.compose.ui.Modifier,org.jetbrains.jewel.foundation.lazy.SingleSelectionLazyListState,androidx.compose.foundation.layout.PaddingValues,Z,kotlin.jvm.functions.Function1,androidx.compose.foundation.layout.Arrangement$Vertical,androidx.compose.ui.Alignment$Horizontal,androidx.compose.foundation.gestures.FlingBehavior,org.jetbrains.jewel.foundation.lazy.tree.KeyActions,org.jetbrains.jewel.foundation.lazy.tree.PointerEventActions,androidx.compose.foundation.interaction.MutableInteractionSource,kotlin.jvm.functions.Function1,androidx.compose.runtime.Composer,I,I,I):V
274304
org.jetbrains.jewel.foundation.lazy.SelectableLazyItemScope
275305
- androidx.compose.foundation.lazy.LazyItemScope
276306
- a:isActive():Z
@@ -307,7 +337,9 @@ f:org.jetbrains.jewel.foundation.lazy.SelectableLazyListState
307337
- androidx.compose.foundation.gestures.ScrollableState
308338
- org.jetbrains.jewel.foundation.lazy.SelectableScope
309339
- sf:$stable:I
310-
- <init>(androidx.compose.foundation.lazy.LazyListState):V
340+
- b:<init>(androidx.compose.foundation.lazy.LazyListState):V
341+
- <init>(androidx.compose.foundation.lazy.LazyListState,org.jetbrains.jewel.foundation.lazy.SelectionMode,java.util.Set):V
342+
- b:<init>(androidx.compose.foundation.lazy.LazyListState,org.jetbrains.jewel.foundation.lazy.SelectionMode,java.util.Set,I,kotlin.jvm.internal.DefaultConstructorMarker):V
311343
- dispatchRawDelta(F):F
312344
- getCanScrollBackward():Z
313345
- getCanScrollForward():Z
@@ -321,6 +353,7 @@ f:org.jetbrains.jewel.foundation.lazy.SelectableLazyListState
321353
- f:getLazyListState():androidx.compose.foundation.lazy.LazyListState
322354
- getScrollIndicatorState():androidx.compose.foundation.ScrollIndicatorState
323355
- getSelectedKeys():java.util.Set
356+
- f:getSelectionMode():org.jetbrains.jewel.foundation.lazy.SelectionMode
324357
- f:isKeyboardNavigating():Z
325358
- isScrollInProgress():Z
326359
- scroll(androidx.compose.foundation.MutatePriority,kotlin.jvm.functions.Function2,kotlin.coroutines.Continuation):java.lang.Object
@@ -332,7 +365,10 @@ f:org.jetbrains.jewel.foundation.lazy.SelectableLazyListState
332365
f:org.jetbrains.jewel.foundation.lazy.SelectableLazyListStateKt
333366
- sf:getVisibleItemsRange(androidx.compose.foundation.lazy.LazyListState):kotlin.ranges.IntRange
334367
- sf:getVisibleItemsRange(org.jetbrains.jewel.foundation.lazy.SelectableLazyListState):kotlin.ranges.IntRange
335-
- sf:rememberSelectableLazyListState(I,I,androidx.compose.runtime.Composer,I,I):org.jetbrains.jewel.foundation.lazy.SelectableLazyListState
368+
- sf:rememberMultiSelectionLazyListState(I,I,java.util.Set,androidx.compose.runtime.Composer,I,I):org.jetbrains.jewel.foundation.lazy.MultiSelectionLazyListState
369+
- bsf:rememberSelectableLazyListState(I,I,androidx.compose.runtime.Composer,I,I):org.jetbrains.jewel.foundation.lazy.SelectableLazyListState
370+
- sf:rememberSelectableLazyListState(I,I,org.jetbrains.jewel.foundation.lazy.SelectionMode,java.util.List,androidx.compose.runtime.Composer,I,I):org.jetbrains.jewel.foundation.lazy.SelectableLazyListState
371+
- sf:rememberSingleSelectionLazyListState(I,I,java.lang.Object,androidx.compose.runtime.Composer,I,I):org.jetbrains.jewel.foundation.lazy.SingleSelectionLazyListState
336372
org.jetbrains.jewel.foundation.lazy.SelectableScope
337373
- a:getSelectedKeys():java.util.Set
338374
- a:setSelectedKeys(java.util.Set):V
@@ -344,6 +380,34 @@ e:org.jetbrains.jewel.foundation.lazy.SelectionMode
344380
- s:getEntries():kotlin.enums.EnumEntries
345381
- s:valueOf(java.lang.String):org.jetbrains.jewel.foundation.lazy.SelectionMode
346382
- s:values():org.jetbrains.jewel.foundation.lazy.SelectionMode[]
383+
f:org.jetbrains.jewel.foundation.lazy.SingleSelectionLazyListState
384+
- androidx.compose.foundation.gestures.ScrollableState
385+
- org.jetbrains.jewel.foundation.lazy.SelectableScope
386+
- sf:$stable:I
387+
- <init>(androidx.compose.foundation.lazy.LazyListState,java.lang.Object):V
388+
- b:<init>(androidx.compose.foundation.lazy.LazyListState,java.lang.Object,I,kotlin.jvm.internal.DefaultConstructorMarker):V
389+
- dispatchRawDelta(F):F
390+
- getCanScrollBackward():Z
391+
- getCanScrollForward():Z
392+
- f:getFirstVisibleItemIndex():I
393+
- f:getFirstVisibleItemScrollOffset():I
394+
- f:getInteractionSource():androidx.compose.foundation.interaction.InteractionSource
395+
- f:getLastActiveItemIndex():java.lang.Integer
396+
- getLastScrolledBackward():Z
397+
- getLastScrolledForward():Z
398+
- f:getLayoutInfo():androidx.compose.foundation.lazy.LazyListLayoutInfo
399+
- f:getLazyListState():androidx.compose.foundation.lazy.LazyListState
400+
- getScrollIndicatorState():androidx.compose.foundation.ScrollIndicatorState
401+
- getSelectedKeys():java.util.Set
402+
- f:getSelectionMode():org.jetbrains.jewel.foundation.lazy.SelectionMode
403+
- f:isKeyboardNavigating():Z
404+
- isScrollInProgress():Z
405+
- scroll(androidx.compose.foundation.MutatePriority,kotlin.jvm.functions.Function2,kotlin.coroutines.Continuation):java.lang.Object
406+
- f:scrollToItem(I,Z,I,kotlin.coroutines.Continuation):java.lang.Object
407+
- bs:scrollToItem$default(org.jetbrains.jewel.foundation.lazy.SingleSelectionLazyListState,I,Z,I,kotlin.coroutines.Continuation,I,java.lang.Object):java.lang.Object
408+
- f:setKeyboardNavigating(Z):V
409+
- f:setLastActiveItemIndex(java.lang.Integer):V
410+
- setSelectedKeys(java.util.Set):V
347411
f:org.jetbrains.jewel.foundation.lazy.tree.BasicLazyTreeKt
348412
- sf:BasicLazyTree-X48TzrA(org.jetbrains.jewel.foundation.lazy.tree.Tree,J,J,J,F,androidx.compose.foundation.shape.CornerSize,androidx.compose.foundation.layout.PaddingValues,androidx.compose.foundation.layout.PaddingValues,F,F,kotlin.jvm.functions.Function1,kotlin.jvm.functions.Function1,kotlin.jvm.functions.Function1,kotlin.jvm.functions.Function3,androidx.compose.ui.Modifier,org.jetbrains.jewel.foundation.lazy.SelectionMode,org.jetbrains.jewel.foundation.lazy.tree.TreeState,J,org.jetbrains.jewel.foundation.lazy.tree.KeyActions,org.jetbrains.jewel.foundation.lazy.tree.PointerEventActions,androidx.compose.foundation.interaction.MutableInteractionSource,kotlin.jvm.functions.Function4,androidx.compose.runtime.Composer,I,I,I,I):V
349413
- bsf:BasicLazyTree-orM9XXQ(org.jetbrains.jewel.foundation.lazy.tree.Tree,org.jetbrains.jewel.foundation.lazy.SelectionMode,kotlin.jvm.functions.Function1,J,J,J,F,androidx.compose.foundation.shape.CornerSize,androidx.compose.foundation.layout.PaddingValues,androidx.compose.foundation.layout.PaddingValues,F,F,org.jetbrains.jewel.foundation.lazy.tree.TreeState,androidx.compose.ui.Modifier,kotlin.jvm.functions.Function1,kotlin.jvm.functions.Function1,J,org.jetbrains.jewel.foundation.lazy.tree.KeyActions,org.jetbrains.jewel.foundation.lazy.tree.PointerEventActions,kotlin.jvm.functions.Function3,kotlin.jvm.functions.Function4,androidx.compose.runtime.Composer,I,I,I,I):V
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
// Baseline format: 1.0
2+
RemovedMethod: org.jetbrains.jewel.foundation.lazy.SelectableLazyListState#SelectableLazyListState(androidx.compose.foundation.lazy.LazyListState):
3+
Binary breaking change: Removed constructor org.jetbrains.jewel.foundation.lazy.SelectableLazyListState(androidx.compose.foundation.lazy.LazyListState)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
// Baseline format: 1.0
2+
RemovedMethod: org.jetbrains.jewel.foundation.lazy.SelectableLazyListState#SelectableLazyListState(androidx.compose.foundation.lazy.LazyListState):
3+
Binary breaking change: Removed constructor org.jetbrains.jewel.foundation.lazy.SelectableLazyListState(androidx.compose.foundation.lazy.LazyListState)

0 commit comments

Comments
 (0)