mirror of
https://github.com/barsdeveloper/ueblueprint.git
synced 2026-03-14 04:13:25 +08:00
Simple serialization entities fixes and tests
This commit is contained in:
@@ -10,6 +10,7 @@ import Union from "./Union.js"
|
||||
/** @abstract */
|
||||
export default class IEntity extends Serializable {
|
||||
|
||||
/** @type {{ [attribute: String]: AttributeInfo }} */
|
||||
static attributes = {
|
||||
attributes: new AttributeInfo({
|
||||
ignored: true,
|
||||
@@ -147,21 +148,6 @@ export default class IEntity extends Serializable {
|
||||
return value != null && (value instanceof type || value.constructor === type)
|
||||
}
|
||||
|
||||
static expectsAllKeys() {
|
||||
return !Object.values(this.attributes)
|
||||
.filter(/** @param {AttributeInformation} attribute */attribute => !attribute.ignored)
|
||||
.some(/** @param {AttributeInformation} attribute */attribute => !attribute.expected)
|
||||
}
|
||||
|
||||
static getAttribute(object, attribute) {
|
||||
return this.getAttributes(object)[attribute]
|
||||
}
|
||||
|
||||
/** @returns {AttributeDeclarations} */
|
||||
static getAttributes(object) {
|
||||
return object.attributes ?? object.constructor?.attributes ?? {}
|
||||
}
|
||||
|
||||
static defineAttributes(object, attributes) {
|
||||
Object.defineProperty(object, "attributes", {
|
||||
writable: true,
|
||||
|
||||
@@ -17,16 +17,18 @@ export default class Integer64Entity extends IEntity {
|
||||
return Parsernostrum.numberBigInteger.map(v => new this(v))
|
||||
}
|
||||
|
||||
/** @param {BigInt | Number} value */
|
||||
constructor(value = 0) {
|
||||
if (value.constructor !== Object) {
|
||||
value = {
|
||||
// @ts-expect-error
|
||||
value: value,
|
||||
/** @param {BigInt | Number | Object} values */
|
||||
constructor(values = 0) {
|
||||
if (values.constructor !== Object) {
|
||||
values = {
|
||||
value: values,
|
||||
}
|
||||
}
|
||||
super(value)
|
||||
/** @type {BigInt | Number} */ this.value
|
||||
if (values.value === -0) {
|
||||
values.value = 0n
|
||||
}
|
||||
super(values)
|
||||
/** @type {BigInt} */ this.value
|
||||
}
|
||||
|
||||
valueOf() {
|
||||
|
||||
@@ -17,17 +17,18 @@ export default class IntegerEntity extends IEntity {
|
||||
return Parsernostrum.numberInteger.map(v => new this(v))
|
||||
}
|
||||
|
||||
/** @param {Number | AttributeInfo<IntegerEntity>} value */
|
||||
constructor(value = 0) {
|
||||
if (value === -0) {
|
||||
value = 0
|
||||
}
|
||||
super(value.constructor === Object
|
||||
? value
|
||||
: {
|
||||
value: value,
|
||||
/** @param {Number | Object} values */
|
||||
constructor(values = 0) {
|
||||
if (values.constructor !== Object) {
|
||||
values = {
|
||||
value: values,
|
||||
}
|
||||
)
|
||||
}
|
||||
values.value = Math.floor(values.value)
|
||||
if (values.value === -0) {
|
||||
values.value = 0
|
||||
}
|
||||
super(values)
|
||||
/** @type {Number} */ this.value
|
||||
}
|
||||
|
||||
|
||||
@@ -8,13 +8,13 @@ export default class SimpleSerializationRotatorEntity extends RotatorEntity {
|
||||
static createGrammar() {
|
||||
const number = Parsernostrum.number.getParser().parser.regexp.source
|
||||
return Parsernostrum.alt(
|
||||
Parsernostrum.reg(new RegExp(
|
||||
Parsernostrum.regArray(new RegExp(
|
||||
"(" + number + ")"
|
||||
+ "\\s*,\\s"
|
||||
+ "\\s*,\\s*"
|
||||
+ "(" + number + ")"
|
||||
+ "\\s*,\\s"
|
||||
+ "\\s*,\\s*"
|
||||
+ "(" + number + ")"
|
||||
)).map(([p, y, r]) => new this({
|
||||
)).map(([_, p, y, r]) => new this({
|
||||
R: Number(r),
|
||||
P: Number(p),
|
||||
Y: Number(y),
|
||||
|
||||
@@ -8,11 +8,11 @@ export default class SimpleSerializationVector2DEntity extends Vector2DEntity {
|
||||
static createGrammar() {
|
||||
const number = Parsernostrum.number.getParser().parser.regexp.source
|
||||
return Parsernostrum.alt(
|
||||
Parsernostrum.reg(new RegExp(
|
||||
Parsernostrum.regArray(new RegExp(
|
||||
"(" + number + ")"
|
||||
+ "\\s*,\\s"
|
||||
+ "\\s*,\\s*"
|
||||
+ "(" + number + ")"
|
||||
)).map(([x, y]) => new this({
|
||||
)).map(([_, x, y]) => new this({
|
||||
X: Number(x),
|
||||
Y: Number(y),
|
||||
})),
|
||||
|
||||
@@ -140,6 +140,9 @@ export default class IMouseClickDrag extends IPointing {
|
||||
#trackingMouse = false
|
||||
#movementListenedElement
|
||||
#draggableElement
|
||||
get draggableElement() {
|
||||
return this.#draggableElement
|
||||
}
|
||||
|
||||
clickedOffset = /** @type {Coordinates} */([0, 0])
|
||||
clickedPosition = /** @type {Coordinates} */([0, 0])
|
||||
|
||||
@@ -1,8 +1,20 @@
|
||||
import MouseMoveDraggable from "./MouseMoveDraggable.js"
|
||||
|
||||
/** @typedef {import("./IMouseClickDrag.js").Options} Options */
|
||||
|
||||
/** @extends {MouseMoveDraggable<NodeElement>} */
|
||||
export default class MouseMoveNodes extends MouseMoveDraggable {
|
||||
|
||||
/**
|
||||
* @param {NodeElement} target
|
||||
* @param {Blueprint} blueprint
|
||||
* @param {Options} options
|
||||
*/
|
||||
constructor(target, blueprint, options = {}) {
|
||||
super(target, blueprint, options)
|
||||
this.draggableElement.classList.add("ueb-draggable")
|
||||
}
|
||||
|
||||
startDrag() {
|
||||
if (!this.target.selected) {
|
||||
this.blueprint.unselectAll()
|
||||
|
||||
@@ -80,14 +80,13 @@ export default class Serializer {
|
||||
attributeKeyPrinter = this.attributeKeyPrinter
|
||||
) {
|
||||
let result = ""
|
||||
const attributes = IEntity.getAttributes(entity)
|
||||
const keys = Object.keys(entity)
|
||||
let first = true
|
||||
for (const key of keys) {
|
||||
const value = entity[key]
|
||||
if (value !== undefined && this.showProperty(entity, key)) {
|
||||
let keyValue = entity instanceof Array ? `(${key})` : key
|
||||
if (attributes[key]?.quoted) {
|
||||
if (AttributeInfo.getAttribute(entity, key, "quoted")) {
|
||||
keyValue = `"${keyValue}"`
|
||||
}
|
||||
const isSerialized = AttributeInfo.getAttribute(entity, key, "serialized")
|
||||
|
||||
@@ -15,9 +15,8 @@ export default class IDraggableTemplate extends ITemplate {
|
||||
}
|
||||
|
||||
createDraggableObject() {
|
||||
return new MouseMoveDraggable(this.element, this.blueprint, {
|
||||
draggableElement: this.getDraggableElement(),
|
||||
})
|
||||
const draggableElement = this.getDraggableElement()
|
||||
return new MouseMoveDraggable(this.element, this.blueprint, { draggableElement })
|
||||
}
|
||||
|
||||
createInputObjects() {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { html } from "lit"
|
||||
import Configuration from "../../Configuration.js"
|
||||
import IResizeableTemplate from "../IResizeableTemplate.js"
|
||||
import Utility from "../../Utility.js"
|
||||
import IResizeableTemplate from "../IResizeableTemplate.js"
|
||||
|
||||
export default class CommentNodeTemplate extends IResizeableTemplate {
|
||||
|
||||
|
||||
@@ -34,5 +34,6 @@ export default class INumericPinTemplate extends IInputPinTemplate {
|
||||
*/
|
||||
setDefaultValue(values = [], rawValues) {
|
||||
this.element.setDefaultValue(/** @type {T} */(values[0]))
|
||||
this.element.requestUpdate()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,19 +1,25 @@
|
||||
import IntPinTemplate from "./IntPinTemplate.js"
|
||||
import { html } from "lit"
|
||||
import Integer64Entity from "../../entity/Integer64Entity.js"
|
||||
import INumericPinTemplate from "./INumericPinTemplate.js"
|
||||
|
||||
export default class Int64PinTemplate extends IntPinTemplate {
|
||||
/** @extends INumericPinTemplate<Integer64Entity> */
|
||||
export default class Int64PinTemplate extends INumericPinTemplate {
|
||||
|
||||
/** @param {String[]} values */
|
||||
setInputs(values = [], updateDefaultValue = false) {
|
||||
if (!values || values.length == 0) {
|
||||
values = [this.getInput()]
|
||||
}
|
||||
super.setInputs(values, false)
|
||||
if (updateDefaultValue) {
|
||||
if (!values[0].match(/[\-\+]?[0-9]+/)) {
|
||||
return
|
||||
}
|
||||
const parsedValues = [BigInt(values[0])]
|
||||
this.setDefaultValue(parsedValues, values)
|
||||
}
|
||||
/**
|
||||
* @param {Number[]} values
|
||||
* @param {String[]} rawValues
|
||||
*/
|
||||
setDefaultValue(values = [], rawValues) {
|
||||
this.element.setDefaultValue(new Integer64Entity(values[0]))
|
||||
this.element.requestUpdate()
|
||||
}
|
||||
|
||||
renderInput() {
|
||||
return html`
|
||||
<div class="ueb-pin-input-wrapper ueb-pin-input">
|
||||
<ueb-input .singleLine="${true}" .innerText="${this.element.getDefaultValue()?.toString() ?? "0"}">
|
||||
</ueb-input>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,16 @@
|
||||
import { html } from "lit"
|
||||
import INumericPinTemplate from "./INumericPinTemplate.js"
|
||||
import IntegerEntity from "../../entity/IntegerEntity.js"
|
||||
|
||||
/** @extends INumericPinTemplate<IntegerEntity> */
|
||||
export default class IntPinTemplate extends INumericPinTemplate {
|
||||
|
||||
setDefaultValue(values = [], rawValues = values) {
|
||||
const integer = this.element.getDefaultValue(true)
|
||||
integer.value = values[0]
|
||||
/**
|
||||
* @param {Number[]} values
|
||||
* @param {String[]} rawValues
|
||||
*/
|
||||
setDefaultValue(values = [], rawValues) {
|
||||
this.element.setDefaultValue(new IntegerEntity(values[0]))
|
||||
this.element.requestUpdate()
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user