Open a sprite's texture or shader from the menus and inspector (#221)
A sprite's texture and shader were only reachable by hunting for them
in the asset panel. Every place that shows such a reference now leads
straight to it.
- Object menu (hierarchy and scene view): "Open texture" and "Open
shader" sit right below "Open asset" when the sprite has one. The
object's own values count, so an overridden shader opens the
override.
- Asset context menu: the same entries at the top.
- Inspector: every asset field with a value shows its label as a blue,
underlined link. One click selects the asset, a double click opens
it. An override stays gold and gets the underline too.
- The first click rebuilds the inspector, so the second one lands on a
different row. The inspector catches that second click before any
row sees it.
- New pure rule `references.ts`: the asset behind a reference field. A
frame leads to its sheet. Kinds without a tab (palette, font, sound)
get no menu entry.
- `followsPress` in `clicks.ts` keeps the double-click window and
tolerance in one place.
- `activateAsset` in `actions.ts`: opening means the same everywhere
as a double click in the asset panel, so a scene also becomes the
active one. The asset panel uses it too.
Tests:
- ./check.sh: 150 files, 2226 tests, CHECK EXIT 0 (before 148/2214).
- 12 new unit tests: 6 for the reference rule, 4 for the link in
createFieldRow, 2 for followsPress.
- 5 new e2e checks in 28l-ii: both menus, the link's look, click
selects, double click opens.
- e2e 1-16,26,28,35,39,40 on the final build: ALL PASSED, 732 checks.
- Counter-probes: no "Open ..." entries, no underline and a second
click never recognised each fail exactly at their checks.
- Check total 1341 (CI counted 1336 at fd6af84), computed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
9b62d572b4
commit
1aae97b335
16 files changed
+512
-30
No files matched your search
@@ -2,9 +2,14 @@ import { UnpackContainerCommand } from '../core/commands/containerCommands';
|
||||
import { SetParentCommand } from '../core/commands/sceneObjectCommands';
|
||||
import { findObject } from '../core/model/hierarchy';
|
||||
import { isLiveInstance, isTemplateContent } from '../core/model/instance';
|
||||
import type { PropertyBag } from '../core/model/Properties';
|
||||
import { findAsset, type ObjectHolder } from '../core/model/Project';
|
||||
import { type PropertyDef, schemaForObject } from '../core/properties/PropertySchema';
|
||||
import { referencesOf } from '../core/properties/references';
|
||||
import { resolveSceneObjectProps } from '../core/properties/resolve';
|
||||
import { Menu, type MenuItem } from '../ui';
|
||||
import {
|
||||
activateAsset,
|
||||
addCollider,
|
||||
addRigidbody,
|
||||
canAddCollider,
|
||||
@@ -51,6 +56,13 @@ export function openObjectMenu(
|
||||
disabled: !asset || !hasAssetEditor(asset.type),
|
||||
onSelect: () => object && state.openAsset(object.assetId),
|
||||
},
|
||||
...(object && asset
|
||||
? openReferenceItems(
|
||||
state,
|
||||
schemaForObject(state.project, asset, object),
|
||||
resolveSceneObjectProps(state.project, asset, object),
|
||||
)
|
||||
: []),
|
||||
{
|
||||
label: 'Add collider',
|
||||
disabled: !object || many || !canAddCollider(state.project, source, object),
|
||||
@@ -89,3 +101,24 @@ export function openObjectMenu(
|
||||
menu.open(x, y);
|
||||
return menu;
|
||||
}
|
||||
|
||||
/**
|
||||
* "Open texture", "Open shader", … – one entry per asset the values point at (#221), skipping kinds
|
||||
* that have no tab to open. The asset panel offers the same for an asset's own values.
|
||||
*/
|
||||
export function openReferenceItems(
|
||||
state: EditorState,
|
||||
schema: readonly PropertyDef[],
|
||||
values: PropertyBag,
|
||||
): MenuItem[] {
|
||||
return referencesOf(state.project, schema, values).flatMap(({ label, assetId }) => {
|
||||
const target = findAsset(state.project, assetId);
|
||||
if (!target || !hasAssetEditor(target.type)) return [];
|
||||
return [
|
||||
{
|
||||
label: `Open ${label.charAt(0).toLowerCase()}${label.slice(1)}`,
|
||||
onSelect: () => activateAsset(state, assetId),
|
||||
},
|
||||
];
|
||||
});
|
||||
}
|
||||
Reference in new issue
Block a user