fix(materials): синхронизация легенды и маркеров на превью и презентации
Легенда и цифры на материале масштабируются от экрана игроков и не обрезаются жёлтой рамкой. Переключение сцен без записи project.json на диск. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -46,7 +46,7 @@ void test('MaterialOverlay / NpcsSceneOverlay поддерживают embedded
|
||||
assert.ok(npcs.includes('embedded'));
|
||||
assert.ok(npcs.includes('useSceneOverlayView'));
|
||||
// В embedded-ветке не рисуем второй dim.
|
||||
assert.match(material, /if \(embedded\) \{\s*return frame;/);
|
||||
assert.match(material, /if \(embedded\) \{[\s\S]*createPortal/);
|
||||
assert.match(npcs, /if \(embedded\) \{\s*return <>\{frames\}<\/>;/);
|
||||
});
|
||||
|
||||
@@ -76,8 +76,53 @@ void test('overlays: layout IPC live через rAF coalesce, RO host coalesced'
|
||||
npcs,
|
||||
/requestAnimationFrame\(\(\) => \{[\s\S]*?onLayoutChangeRef\.current\?\.\(item\.npcId, pending\)/,
|
||||
);
|
||||
assert.match(
|
||||
npcs,
|
||||
/if \(drag\.mode === 'move'\) \{[\s\S]*?publishDraft\(\{[\s\S]*?return;\s*\}/,
|
||||
assert.match(npcs, /if \(drag\.mode === 'move'\) \{[\s\S]*?publishDraft\(\{[\s\S]*?return;\s*\}/,
|
||||
);
|
||||
});
|
||||
|
||||
void test('SceneOverlayHost: presentation and control share player-screen viewport for overlays', () => {
|
||||
const presentation = fs.readFileSync(path.join(root, 'app/renderer/shared/PresentationView.tsx'), 'utf8');
|
||||
const control = fs.readFileSync(path.join(root, 'app/renderer/control/ControlApp.tsx'), 'utf8');
|
||||
const host = fs.readFileSync(path.join(here, 'SceneOverlayHost.tsx'), 'utf8');
|
||||
assert.ok(presentation.includes('<SceneOverlayHost'));
|
||||
assert.doesNotMatch(presentation, /<SceneOverlayHost[\s\S]*?viewport=\{contentRect\}/);
|
||||
assert.ok(control.includes('overlayViewport'));
|
||||
assert.ok(control.includes('const overlayViewport = screenRect'));
|
||||
assert.ok(control.includes('legendLayer'));
|
||||
assert.ok(host.includes('legendLayer'));
|
||||
});
|
||||
|
||||
void test('MaterialLegendPanel: uniform scale, no inner scroll', () => {
|
||||
const panel = fs.readFileSync(
|
||||
path.join(root, 'app/renderer/shared/materials/MaterialLegendPanel.tsx'),
|
||||
'utf8',
|
||||
);
|
||||
const css = fs.readFileSync(
|
||||
path.join(root, 'app/renderer/shared/materials/MaterialLegendPanel.module.css'),
|
||||
'utf8',
|
||||
);
|
||||
assert.ok(panel.includes('legendPanelVisualLayout'));
|
||||
assert.match(css, /overflow:\s*visible/);
|
||||
assert.doesNotMatch(css, /overflow:\s*auto/);
|
||||
assert.doesNotMatch(css, /max-height/);
|
||||
});
|
||||
|
||||
void test('MaterialOverlay: legend markers use viewport positioning', () => {
|
||||
const material = fs.readFileSync(
|
||||
path.join(root, 'app/renderer/shared/materials/MaterialOverlay.tsx'),
|
||||
'utf8',
|
||||
);
|
||||
const css = fs.readFileSync(
|
||||
path.join(root, 'app/renderer/shared/materials/MaterialOverlay.module.css'),
|
||||
'utf8',
|
||||
);
|
||||
const host = fs.readFileSync(path.join(here, 'SceneOverlayHost.tsx'), 'utf8');
|
||||
assert.ok(material.includes('legendMarkerPositionInOverlayHost'));
|
||||
assert.ok(material.includes('legendMarkerScreenScale'));
|
||||
assert.ok(material.includes('createPortal'));
|
||||
assert.ok(material.includes('markerLayerRef'));
|
||||
assert.match(css, /object-fit:\s*contain/);
|
||||
assert.ok(host.includes('legendLayer'));
|
||||
assert.ok(host.includes('markerLayer'));
|
||||
assert.ok(host.includes('hostViewport'));
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user