1
0
mirror of https://github.com/ppy/osu.git synced 2025-02-25 05:42:55 +08:00
Commit Graph

49 Commits

Author SHA1 Message Date
Bartłomiej Dach
ae179c8feb
Merge pull request #31824 from peppy/carousel-v2-group-click-transfer-keyboard
Always transfer keyboard selection on activation
2025-02-07 10:12:10 +01:00
Dean Herbert
c935c3154b
Always transfer keyboard selection on activation 2025-02-07 17:02:53 +09:00
Dean Herbert
1cf375e329
Merge branch 'master' into carousel-v2-spacing 2025-02-07 14:34:59 +09:00
Bartłomiej Dach
91bc23e39e
Merge pull request #31801 from peppy/carousel-v2-artist-grouping
Add support for grouping by artist to beatmap carousel v2
2025-02-06 13:13:35 +01:00
Dean Herbert
cb42ef95c5
Add invalidation on draw size change in beatmap carousel v2
Matching old implementation.
2025-02-06 17:48:42 +09:00
Dean Herbert
33035f0206
Merge branch 'master' into carousel-v2-spacing 2025-02-06 17:30:49 +09:00
Dean Herbert
f4bb3bc422
Merge pull request #31802 from frenzibyte/carousel-v2-depth-ordering
Allow ordering certain carousel panels behind others
2025-02-06 17:29:56 +09:00
Dean Herbert
024fbde0fd
Refactor selection and activation handling
I had a bit of a struggle getting header traversal logic to work well.
The constraints I had in place were a bit weird:

- Group panels should toggle or potentially fall into the prev/next
  group
- Set panels should just traverse around them

The current method of using `CheckValidForGroupSelection` return type
for traversal did not mesh with the above two cases. Just trust me on
this one since it's quite hard to explain in words.

After some re-thinking, I've gone with a simpler approach with one
important change to UX: Now when group traversing with a beatmap set
header currently keyboard focused, the first operation will be to reset
keyboard selection to the selected beatmap, rather than traverse.

I find this non-offensive – at most it means a user will need to press
their group traversal key one extra time.

I've also changed group headers to always toggle expansion when doing
group traversal with them selected.

To make all this work, the meaning of `Activation` has changed somewhat.
It is now the primary path for carousel implementations to change
selection of an item. It is what the `Drawable` panels call when they
are clicked.

Selection changes are not performed implicitly by `Carousel` – an
implementation should decide when it actually wants to change the
selection, usually in `HandleItemActivated`.

Having less things mutating `CurrentSelection` is better in my eyes, as
we see this variable as only being mutated internally when utmost
required (ie the user has requested the change). With this change,
`CurrentSelection` can no longer become of a non-`T` type (in the
beatmap carousel implementation at least).

This might pave a path forward for making `CurrentSelection` typed, but
that comes with a few other concerns so I'll look at that as a
follow-up.
2025-02-06 17:02:44 +09:00
Dean Herbert
342a66b9e2
Fix keyboard traversal on a collapsed group not working as intended 2025-02-06 14:49:58 +09:00
Dean Herbert
9cc90a51df
Adjust xmldoc and avoid LINQ overheads 2025-02-06 13:32:11 +09:00
Salman Alshamrani
c370c75fe2 Allow ordering certain carousel panels behind others 2025-02-05 05:47:55 -05:00
Salman Alshamrani
fc5832ce67 Support variable spacing between carousel items 2025-02-05 05:20:26 -05:00
Bartłomiej Dach
e5943e460d
Unify ConfigureAwait() calls across method 2025-02-05 10:28:42 +01:00
Bartłomiej Dach
c5deb9f36b
Use alternative lockless solution for atomic cancellation token recreation 2025-02-05 10:28:25 +01:00
Dean Herbert
5c9e84caf0
Add lock object 2025-02-05 17:31:54 +09:00
Dean Herbert
14273824dc
Fix Carousel.FilterAsync not working when called from a non-update thread
I was trying to be smart about things and make use of our
`SynchronisationContext` setup, but it turns out to not work in all
cases due to the context being missing depending on where you are
calling the method from.

For now let's prefer the "works everywhere" method of scheduling the
final work back to update.
2025-02-05 16:40:11 +09:00
Dean Herbert
599b59cb14
Add expanded state to sample drawable representations 2025-02-04 18:06:16 +09:00
Bartłomiej Dach
6e59cab928
Merge pull request #31764 from peppy/beatmap-carousel-v2-grouping
Add group support to beatmap carousel v2
2025-02-04 08:13:54 +01:00
Dean Herbert
e454fa558c
Adjust group traversal logic to handle cases where keyboard selection redirects 2025-02-04 02:55:59 +09:00
Salman Alshamrani
c587958f38 Apply depth ordering relative to selected item 2025-02-03 02:34:29 -05:00
Dean Herbert
9c34819ff4
Add test coverage for grouped selection 2025-02-03 02:39:45 +09:00
Dean Herbert
645c26ca19
Simplify keyboard traversal logic 2025-02-03 02:24:27 +09:00
Dean Herbert
d74939e6e9
Fix backwards traversal of groupings and allow toggling groups without updating selection 2025-02-03 02:24:27 +09:00
Dean Herbert
764f799dcb
Improve selection flow using early exit and invalidation 2025-02-03 02:24:27 +09:00
Dean Herbert
3cde11ab77
Re-enable masking by default 2025-02-03 02:24:26 +09:00
Dean Herbert
0164a2e4dc
Move pool item preparation / cleanup duties to Carousel 2025-01-24 20:10:41 +09:00
Dean Herbert
9366bfbf0d
Move activation drawable flow portion to ICarouselPanel 2025-01-24 18:40:48 +09:00
Dean Herbert
0716b73d2a
ActivateSelection -> TryActivateSelection 2025-01-23 22:44:39 +09:00
Dean Herbert
2feab31426
Adjust inline commentary based on review feedback 2025-01-23 22:41:20 +09:00
Dean Herbert
2f94456a06
Add selection and activation flow 2025-01-23 18:51:24 +09:00
Dean Herbert
ded1d9f019
displayedCarouselItems -> carouselItems 2025-01-23 15:58:35 +09:00
Dean Herbert
6ac2dbc818
Reorder carousel methods into logical regions 2025-01-23 15:50:57 +09:00
Dean Herbert
6c27e87714
Add back explicit right click handling of carousel absolute scrolling 2025-01-21 17:24:42 +09:00
Dean Herbert
43b54623d9
Add required padding on either side of panels so selection can remain centered 2025-01-17 18:08:20 +09:00
Dean Herbert
54f9cb7f68
Add overlapping spacing support 2025-01-17 18:07:54 +09:00
Dean Herbert
a1c5fad6d4
Add curvature to new carousel implementation 2025-01-17 18:07:54 +09:00
Dean Herbert
a6057a9f54
Move absolute scroll support local to carousel and allow custom bindings 2025-01-16 20:47:59 +09:00
Dean Herbert
1c2621d88e
Add support to CarouselV2 for right mouse button scrolling 2025-01-16 20:27:38 +09:00
Dean Herbert
6027947657
Move animation handling to Carousel implementation to better handle add/removes
With the animation logic being external, it was going to make it very
hard to apply the scroll offset when a new panel is added or removed
before the current selection.

There's no real reason for the animations to be local to beatmap
carousel. If there's a usage in the future where the animation is to
change, we can add more customisation to `Carousel` itself.
2025-01-15 17:01:07 +09:00
Dean Herbert
0b764e6372
Fix substring of GetHashCode potentially failing 2025-01-15 16:18:34 +09:00
Dean Herbert
e871f02350
Fix inspections that don't show in rider 2025-01-14 20:43:03 +09:00
Dean Herbert
900237c1ed
Add loading overlay and refine filter flow 2025-01-14 20:23:53 +09:00
Dean Herbert
cc8941a94a
Add animation and depth control 2025-01-14 20:12:09 +09:00
Dean Herbert
7e8a80a0e5
Add difficulty, artist and title sort examples
Also:

- Adds hinting at grouping and header status of items
- Passes through criteria and prepare for grouping tests.
- Makes `Filters` list `protected` because naming clash with `Filter()`
  on `BeatmapCarousel`.
2025-01-14 19:52:48 +09:00
Dean Herbert
cf55fe16ab
Generic type instead of raw object? 2025-01-11 01:43:47 +09:00
Dean Herbert
6fbab1bbce
Stop exposing CarouselItem externally 2025-01-11 01:43:47 +09:00
Dean Herbert
ad04681b28
Add scroll position maintaining 2025-01-11 01:43:47 +09:00
Dean Herbert
288be46b17
Add basic selection support 2025-01-11 01:43:47 +09:00
Dean Herbert
5e9a7532d3
Add basic implementation of new beatmap carousel 2025-01-11 01:43:47 +09:00