Commit Graph

224 Commits

Author SHA1 Message Date
e808e7316b Mark delegate value unused and add comment to avoid future regression 2023-05-02 13:29:30 +09:00
2e3daf0a54 Fix leak of ModSettingChangeTracker instances
The `SelectedMods.BindValueChanged()` callback in `ModSelectOverlay` can
in some instances run recursively. This is most heavily leaned on in
scenarios where `SelectedMods` is updated by an external component. In
such cases, the mod select overlay needs to replace the mod instances
received externally with mod instances which it owns, so that the changes
made on the overlay can propagate outwards.

This in particular means that prior to this commit, it was possible to
encounter the following scenario:

	modSettingChangeTracker?.Dispose();
	updateFromExternalSelection(); // mutates SelectedMods to perform the replacement
	                               // therefore causing a recursive call

		modSettingChangeTracker?.Dispose();
		// inner call continues
		modSettingChangeTracker = new ModSettingChangeTracker(SelectedMods.Value);

	// outer call continues
	modSettingChangeTracker = new ModSettingChangeTracker(SelectedMods.Value);

This leaks one `modSettingChangeTracker` instance from the inner call,
which is never disposed.

To avoid this, move the disposal to the same side of the recursion that
the creation happens on, changing the call pattern to:

	updateFromExternalSelection(); // mutates SelectedMods to perform the replacement
	                               // therefore causing a recursive call

		modSettingChangeTracker?.Dispose();
		// inner call continues
		modSettingChangeTracker = new ModSettingChangeTracker(SelectedMods.Value);

	modSettingChangeTracker?.Dispose();
	// outer call continues
	modSettingChangeTracker = new ModSettingChangeTracker(SelectedMods.Value);

which, while slightly wasteful, does not cause any leaks.

The solution is definitely suboptimal, but addressing this properly
would entail a major rewrite of the mod instance management in the mods
overlay, which is probably not the wisest move to make right now.
2023-04-30 17:31:41 +02:00
56ab029a58 fix issue where multipler does not update when adjusting speed for preset mod 2023-04-22 13:30:08 -04:00
7bc8908ca9 Partial everything 2022-11-27 00:00:27 +09:00
b056cac10a Remove generic and add default implementation for CalculateEffect 2022-09-10 08:34:29 +03:00
545e0bbcef Adjust inheritors and test 2022-08-29 22:49:25 +03:00
039f009562 Inherit difficulty multiplier display from ModsEffectDiplay 2022-08-27 20:26:05 +03:00
3109066e34 Rename {Requires -> Pending}Configuration 2022-08-16 22:45:24 +02:00
10daac6752 Only open mod customisation panel on explicit selection of single mod 2022-08-15 20:38:23 +02:00
f860bc11ee Fix several schedule-related issues arising from new column addition 2022-08-15 20:38:16 +02:00
5ff2e41a55 Add preset column to mod select test scene 2022-08-15 18:38:37 +02:00
839409d7ac Add preset column to solo mod select overlay 2022-08-07 16:20:31 +02:00
b318bbd5e6 Allow non-homogenous column types in mod select overlay 2022-08-07 16:20:31 +02:00
89653b74c7 Only add setting tracker when customisation is permitted 2022-07-19 19:21:16 +03:00
eddae7b143 Fix mod overlay and footer not updating multiplayer on settings change 2022-07-18 07:38:56 +03:00
a03abc747b Tidy up comments and simplify bounding box centre logic 2022-07-02 12:58:34 +09:00
9d28d5f8ee Update SFX for mod overlay show/hide 2022-07-01 20:43:12 +09:00
31a447fda0 Update parameter discards 2022-06-24 21:26:19 +09:00
73124d2b1f Encapsulate mod hotkey selection logic in strategy pattern 2022-06-21 12:49:01 +02:00
f8830c6850 Automated #nullable processing 2022-06-17 16:37:17 +09:00
071e158a29 Expose available mod state outwardly as a bindable 2022-05-25 23:06:12 +02:00
f0303d76e8 Split off "select all mods" button to separate class 2022-05-25 22:18:30 +02:00
a4bd399b0c Split off "deselect all mods" button to separate class 2022-05-25 22:14:45 +02:00
062ffe64ac Remove delay on pop in 2022-05-17 18:21:19 +09:00
170df01b46 Adjust difficulty multiplier scale transition on mod overlay
The previous transition was supposed to be a center-anchored elastic
scale-in, but this didn't work as intended - because the multiplier
ended up inside of an auto-sized right-aligned container, the animation
itself would end up being anchored right.

Attempts to remove the scale transition resulted in a rather
jarring-looking result, so swap out the elastic scale-in for a sweep-in
effect from the top, to match the header and avoid introducing too many
directions of movement.

Delay values tweaked "to taste" - can be adjusted further if there is an
alternative set of values that feels better.
2022-05-15 20:44:50 +02:00
8a01050168 Refactor mod select button initialisation to allow shared usage of deselect button 2022-05-15 03:16:43 +09:00
a759cf2dab Add key binding to deselect all mods
Defaults to `Backspace`.
2022-05-15 02:51:58 +09:00
981ead68bf Ensure local mods are constructed in time for Pop{In,Out}() 2022-05-11 22:31:27 +02:00
93539160ad Remove no-longer-necessary guard 2022-05-11 22:31:26 +02:00
fc24a56478 Add protection from recursive updates from external selection 2022-05-11 22:31:25 +02:00
83ba06e7af Extract helper property for accessing all mods 2022-05-11 22:31:25 +02:00
11ae1da65a Hoist reference replacement logic to overlay level 2022-05-11 22:26:47 +02:00
05a21fbbe0 Hoist ModState to overlay level 2022-05-11 22:26:21 +02:00
ddb2d4eef5 Rename FreeModSelect{Screen -> Overlay} reference in inline comment 2022-05-11 18:06:09 +02:00
a104277e7f Rename ModSelect{Screen -> Overlay}Strings 2022-05-11 18:01:33 +02:00
76c63f1d0a Rename ModSelect{Screen -> Overlay} in place of removed old design 2022-05-10 22:56:50 +02:00
128468e13d Remove old base mod select overlay 2022-05-10 21:52:30 +02:00
3eead5a6a3 Rename FlushAnimation to FlushPendingSelections to better match purpose 2022-05-04 19:40:08 +09:00
5e5c8e78a6 Use existing web localisation for most hardcoded strings 2022-04-20 16:31:11 -07:00
f9d5abff8a Update with keybinding changes 2021-09-16 18:26:12 +09:00
bf0a1167ec Improve update flow and ensure selected mods is read from local context 2021-08-24 13:35:39 +09:00
9b9dacf3fe Update usages of Drawable.Click() 2021-08-04 17:30:33 +09:00
3c028ce05c Add IDeepCloneable interface and update existing CreateCopy methods to use it 2021-07-19 12:54:17 +09:00
af270cccc4 Fix cross talk between ModSelectOverlays 2021-07-08 17:59:04 +09:00
e1c646b9b2 Remove redundant arguments 2021-07-05 23:52:39 +08:00
5883922177 Remove mod multiplier completely 2021-06-25 16:36:31 +09:00
62566f2a4a Remove "Score Multiplier" text 2021-06-24 14:29:47 -07:00
abc96057b2 Remove relative height specification and use constant height 2021-05-21 17:55:46 +09:00
7fc450c620 Fix mod settings blocking input outside its visible area
Closes #12502.
2021-04-20 23:42:56 +09:00
ccb83ef3a3 Fix checkbox not being updated 2021-02-22 15:47:47 +09:00