+ {value.map((color, index) => {
+ const hex = colorValueHex(color)
+ return
+ { const [red, green, blue] = colorHexChannels(event.target.value); replace(index, [red, green, blue, color[3]]) }} />
+ { const alpha = Number(event.target.value); if (!Number.isFinite(alpha) || !replace(index, [color[0], color[1], color[2], alpha])) event.target.value = String(color[3]) }} onKeyDown={(event) => { if (event.key === 'Enter') event.currentTarget.blur() }} />
+ commit(value.filter((_, entryIndex) => entryIndex !== index).map((entry) => [...entry] as ColorValue))} />
+
+ })}
+
commit([...value.map((entry) => [...entry] as ColorValue), [0, 0, 0, 1]])} />
+
+}
+
+export function PropertyEditor({ facade, objectId, property, showNotice }: { facade: BitBybitWebCadFacade; objectId: string; property: ObjectPropertySnapshot; showNotice: (message: string) => void }) {
const commit = (value: PropertyValue) => {
try {
facade.app.document.setProperty({ objectId, propertyName: property.name, value })
@@ -985,9 +1004,11 @@ function PropertyEditor({ facade, objectId, property, showNotice }: { facade: Bi
return false
}
}
- const formatted = `${String(property.value ?? '')}${property.unit ? ` ${property.unit}` : ''}`
+ const includedFile = property.type === 'App::PropertyFileIncluded' && property.value && typeof property.value === 'object' && !Array.isArray(property.value) ? property.value as IncludedFileValue : null
+ const formatted = `${property.type === 'App::PropertyFileIncluded' ? includedFile?.archiveName ?? 'Empty' : String(property.value ?? '')}${property.unit ? ` ${property.unit}` : ''}`
let editor: ReactNode
if (property.readOnly || isFreecadPropertyReadOnly(property.nativeStatus)) editor = {placement.position.x}, {placement.position.y}, {placement.position.z}
Position{(['x', 'y', 'z'] as const).map((key) => updatePlacement('position', key, Number(event.target.value))} />)}Axis{(['x', 'y', 'z'] as const).map((key) => updatePlacement('axis', key, Number(event.target.value))} />)}Angle updatePlacement('angle', null, Number(event.target.value))} />
- } else if (property.type === 'App::PropertyVector') {
+ } else if (property.type === 'App::PropertyVector' || property.type === 'App::PropertyDirection') {
const vector = property.value as { x: number; y: number; z: number }
editor =