Overview

PropInputSetting of "persistent"/"persistant" prop arg only applies on Insert Animation

The "persistent"/"persistant"=true prop arg in PropInputSetting was meant to be a quick implementation of setting the same value of a prop as the previous inserting same class Snapper.

Example:

  1. Press worksurface inserting button.
  2. Inserting 1st worksurface, default width is 60cm.
  3. Change width to 120cm.
  4. Click to actually place the worksurface.
  5. 2nd worksurface now inserting with 120cm width.

The "persistent"/"persistant" logic is also happening while stretching Snappers which makes no sense according to the original intent. Therefore "persistent"/"persistant" will now be executed only in insert animation (Previously happening to all animation properties).

Split-view Resource Label

The single label previously used for split views has been replaced with separate labels for horizontal and vertical layouts. This allows each split-view option to be clearly identified in the user interface.

Removal of Legacy 2D and 3D Contextual View-Switch Toolbar Models

The legacy contextual view-switch toolbar models have been removed as part of the split-view toolbar update.

Split-View Orientation and Divider Interface Changes

Split views now support both horizontal and vertical layouts. The split-view API has been updated so that horizontal consistently means views stacked top/bottom and vertical means views arranged left/right.

Preserving Part Adjustments When Resetting Item Tags

Resetting item tags on a TaggableSnapper now handles each part's user-modified Ind. Tag explicitly. If resetting those tags would change the keys of existing part adjustments, CET identifies the affected article codes and asks whether the adjustments should be preserved.

Compile Time Changes

Split-view Resource Label

The $twoViewsMenuLabel resource has been removed. Use $horizontalViewsMenuLabel or $verticalViewsMenuLabel according to the layout.

Removal of Legacy Contextual View-Switch Toolbar Models

Legacy 2D and 3D toolbar model classes were removed, and split-view switching now requires an explicit layout orientation.

cm.core.contextual2DViewToolbarModel

The following class has been removed as part of Removal of Legacy 2D and 3D Contextual View-Switch Toolbar Models effort:

Removed: public class ContextualMultiViewSettingsModel extends ViewSettingsToolbarModel
Removed: public class ContextualMultiPopupViewSettingsModel extends ViewSettingsToolbarModel
Removed: public class Contextual2DViewSettingsModel extends ViewSettingsToolbarModel

actualSwitchToSplitView() now requires the desired orientation:

Old: actualSwitchToSplitView()
New: actualSwitchToSplitView(multiViewState.horizontal); // 2D above 3D
New: actualSwitchToSplitView(multiViewState.vertical);   // 2D left of 3D

cm.core.contextual3DViewToolbarModel

The following class has been removed as part of Removal of Legacy 2D and 3D Contextual View-Switch Toolbar Models effort:

Removed: Contextual3DViewSettingsModel

View changes should instead be initiated through MultiViewArea.switchState(..) or actualSwitchToSplitView(..) as appropriate.

Split-View Orientation and Divider Interface Changes

Split-view enum values and divider fields were updated to support distinct horizontal and vertical layouts, while deprecated view states were removed.

cm.core.multiViewArea

Previously, the existing top/bottom layout was represented by multiViewState.vertical, which caused confusion about whether the name described the divider or the arrangement of the views. The naming has now been standardized and any code using multiViewState.vertical for the original top/bottom layout must be updated to multiViewState.horizontal. If the desired view state is left/right, then multiViewState.vertical should be used.

The existing split-view enum and divider field were renamed to identify them explicitly as horizontal-layout interfaces:

Old: drawingViewType.viewSplit
New: drawingViewType.viewHorizontalSplit

Old: MultiViewArea.dragDivider
New: MultiViewArea.horizontalDragDivider

Use the new drawingViewType.viewVerticalSplit value and MultiViewArea.verticalDragDivider field when working with the left/right layout.

The following deprecated multiViewState enum values have been removed and have no direct replacement:

Removed: multiViewState.verticalPaper2D
Removed: multiViewState.verticalPaper3D
Removed: multiViewState.vertical3D
Removed: multiViewState.horizontal3D

cm.core.spaceVolume

Combined functions of the name spaceVolumeUpdateObjects. Use the function spaceVolumeUpdateObjects(Snapper z, vector u, SnapperFilter filter=null, bool undoable=true, Snapper{} visited=new Snapper{}, bool force=false) that has an additional SnapperFilter filter=null argument.

Old:
public void spaceVolumeUpdateObjects(Snapper z, vector u, bool undoable=true,
				     Snapper{} visited=new Snapper{}, bool force=false) {
    spaceVolumeUpdateObjects(z, u, filter=null, undoable=undoable, visited=visited, force=force);

Old:
public void spaceVolumeUpdateObjects(Snapper z, vector u, SnapperFilter filter, bool undoable=true,
				     Snapper{} visited=new Snapper{}, bool force=false) {

New:
public void spaceVolumeUpdateObjects(Snapper z, vector u, SnapperFilter filter=null, bool undoable=true,
				     Snapper{} visited=new Snapper{}, bool force=false) {
}

Preserving Part Adjustments When Resetting Item Tags

The following public interfaces have been added:

Added: extend public Part[] Snapper.rawParts()
Added: extend public bool Snapper.resetPartItemTagInfos()
Added: public bool TaggableSnapper.resetPartItemTagInfos()
Added: public int askUserAdjustedPartMigration(Part[] adjustedParts)

Snapper.resetPartItemTagInfos() returns true by default. Custom snappers can override it to perform their own part-tag reset preparation or return false to cancel the surrounding item-tag reset.

Runtime/Behavior Changes

Handling quarantine of root parents when child snappers crash

Crash isolation has been improved for parent-child snapper hierarchies.

Previously, when a child snapper crashed, only that child was converted into an ExceptionProxySnapper. During restoration, the child snapper could be restored independently and attempt to enter the space without its parent, causing CET to crash because child snappers cannot exist directly in a space.snappers.

To prevent this, the runtime now quarantines the root parent whenever any snapper in the hierarchy crashes. This ensures the entire parent-child hierarchy is isolated and later restored together.

As a result:

  • The root parent and all of its descendants become ExceptionProxySnapper.
  • The entire hierarchy is restored as a single unit (could be seen from the drawing).
  • Parent-child relationships are preserved throughout isolation and restoration.
  • Child snappers are never restored directly into a space without their parent.

Implementation

Before calling isolateCrashingSnapper(..), the runtime now resolves the crashing snapper's root parent, ensuring parent-child hierarchies are quarantined first before restoring them as one ExceptionProxySnapper.

Files affected

  • cm/core/ExceptionProxySnapper.cm
  • cm/core/stream/load.cm
  • cm/core/space.cm
  • cm/core/view2D.cm
  • cm/core/view3D.cm
  • cm/core/snapAlternative.cm

For more implementation details, refer to this merge request !44030.

Split-view Resource Label

The single split-view resource label has been replaced with separate labels for horizontal and vertical split layouts:

Old: $twoViewsMenuLabel
New: $horizontalViewsMenuLabel
New: $verticalViewsMenuLabel

Split-View Orientation and Divider Interface Changes

The meanings of the remaining split multiViewState values are now orientation-based:

  • multiViewState.horizontal displays the 2D view above the 3D view.
  • multiViewState.vertical displays the 2D view to the left of the 3D view.

Review conditionals that use these values even if they still compile. Also review any code that persists or exchanges their integer representations: horizontal is now 3, while vertical remains 2 but represents the left/right layout.

Preserving Part Adjustments When Resetting Item Tags

TaggableSnapper.resetItemTags() now calls resetPartItemTagInfos() before removing displayed item tags. The reset is canceled if that hook returns false.

For adjusted parts with user-modified Ind. Tags, the default implementation asks the user whether to preserve adjustments. Choosing Yes migrates each adjustment to the key produced by the default tag; choosing No resets the tags without migrating adjustments; closing the prompt cancels the entire reset. User tag information unrelated to the snapper's raw parts is no longer cleared as a side effect.

PsLayoutEditLabelDialog is now fixed size

Changed PsLayoutEditLabelDialog to be a fixed size now.

Miscellaneous

class Space

Space now exposes the overridable method isElevationSpace(), which returns false by default. Custom elevation-space implementations should override it to return true. Dimension view-visibility editing uses this method to distinguish elevation spaces from ordinary spaces.