Fixes #4495 - Adds SuperViewChanging event to View following Cancellable Work Pattern (#4503)

* Initial plan

* Add SuperViewChanging event infrastructure and tests

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Refactor SuperViewChanging to follow Cancellable Work Pattern with cancellation support

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Remove SuperViewChangingEventArgs class and use CancelEventArgs<View?> directly

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Simplified SuperViewChanged

* Refactor SuperView change to use CWP and event args

Refactored the handling of SuperView changes in the View hierarchy to use the Cancellable Work Pattern (CWP) and standardized event argument types. The SuperView property is now settable only via an internal SetSuperView method, which leverages CWP for property changes and cancellation.

- Updated OnSuperViewChanging to accept ValueChangingEventArgs<View?>.
- SuperViewChanging event now uses EventHandler<ValueChangingEventArgs<View?>>; cancellation is via e.Handled = true.
- OnSuperViewChanged and SuperViewChanged now use ValueChangedEventArgs<View?>.
- All SuperView assignments in Add, Remove, and RemoveAll now use SetSuperView, which returns a bool for cancellation.
- CWPPropertyHelper.ChangeProperty now accepts a sender parameter, passed to event handlers.
- All property changes in View now pass this as sender to ChangeProperty.
- Updated event handler signatures and overrides in MenuBar, StatusBar, TextField, and TextView.
- Updated unit tests to use new event args and cancellation pattern.
- Minor code cleanups and improved comments.

These changes modernize and standardize property change handling, improving API consistency, extensibility, and testability.

* Refactor subview removal and event arg types

Removed redundant index check when removing subviews in View.cs, simplifying the cleanup loop. Updated TextField.OnSuperViewChanged to use a non-nullable ValueChangedEventArgs<View> parameter, enforcing stricter type safety.

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
Co-authored-by: Tig <tig@users.noreply.github.com>
This commit is contained in:
Copilot
2025-12-18 06:32:01 -07:00
committed by GitHub
parent 993487d0a1
commit f4b10511c0
10 changed files with 433 additions and 61 deletions

View File

@@ -158,14 +158,23 @@ public abstract class EditorBase : View
}
/// <inheritdoc />
protected override void Dispose (bool disposing)
protected override bool OnSuperViewChanging (ValueChangingEventArgs<View?> args)
{
if (disposing && App is {})
// Clean up event handlers before SuperView is set to null
// This ensures App is still accessible for proper cleanup
if (App is {})
{
App.Navigation!.FocusedChanged -= NavigationOnFocusedChanged;
App.Mouse.MouseEvent -= ApplicationOnMouseEvent;
}
return base.OnSuperViewChanging (args);
}
/// <inheritdoc />
protected override void Dispose (bool disposing)
{
// Event handlers are now cleaned up in OnSuperViewChanging
base.Dispose (disposing);
}
}