Remove comments that only restate the code, keeping the section banners and the notes that carry a reason, a measured fact or an external contract. ButtonOptions.width claimed to be a fixed width but only set minWidth, so the Graph and Texture pickers grew with the name they showed. It is now what it promises, with a separate minWidth for the buttons that have two forms. Narrow buttons shrink their padding, otherwise a 24px icon button had 8px left for its glyph and truncate dropped it entirely. __gm.labelsDropped() guards that class: the overflow guard only saw text that was too wide, never a label truncated to nothing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
21 lines
872 B
TypeScript
21 lines
872 B
TypeScript
import type { BehaviorAsset } from '../model/Asset';
|
||
import type { Project } from '../model/Project';
|
||
|
||
function firstFree(taken: ReadonlySet<string>, candidate: (i: number) => string, from: number): string {
|
||
for (let i = from; ; i++) {
|
||
const name = candidate(i);
|
||
if (!taken.has(name)) return name;
|
||
}
|
||
}
|
||
|
||
/** "Sprite", "Sprite 2", "Sprite 3" … – the first name not yet used by an asset. */
|
||
export function nextAssetName(project: Project, base: string): string {
|
||
const taken = new Set(project.assets.map((a) => a.name));
|
||
return taken.has(base) ? firstFree(taken, (i) => `${base} ${i}`, 2) : base;
|
||
}
|
||
|
||
/** "var1", "var2", … – the first variable name not yet used by the behavior. */
|
||
export function nextVariableName(asset: BehaviorAsset, base = 'var'): string {
|
||
return firstFree(new Set(asset.variables.map((v) => v.key)), (i) => `${base}${i}`, 1);
|
||
}
|