changing type through multi-selection works but needs a reload #817

Open
opened 2026-02-20 10:20:48 -05:00 by deekerman · 1 comment
Owner

Originally created by @ArnoldSmith86 on GitHub (Aug 27, 2024).

Originally created by @ArnoldSmith86 on GitHub (Aug 27, 2024).
Author
Owner

@bjalder26 commented on GitHub (Oct 26, 2024):

This seems to have to do with these functions:

In serverstate.js

function receiveDelta(delta) {
  addDeltaEntryToUndoProtocol(delta);

  // the order of widget changes is not necessarily correct and in order to avoid cyclic children, this first moves affected widgets to the top level
  for(const widgetID in delta.s) {
    if(delta.s[widgetID] && delta.s[widgetID].parent !== undefined && delta.s[widgetID].id === undefined) {
      const domElement = widgets.get(widgetID).domElement;
      const topTransform = getElementTransformRelativeTo(domElement, $('#topSurface')) || 'none';
      $('#topSurface').appendChild(domElement);
      domElement.style.transform = topTransform;
    }
  }

  for(const widgetID in delta.s)
    if(delta.s[widgetID] !== null && !widgets.has(widgetID))
      addWidget(delta.s[widgetID]);

  for(const widgetID in delta.s) {
    if(delta.s[widgetID] !== null && widgets.has(widgetID)) { // check widgets.has because addWidget above MIGHT have failed
      if(delta.s[widgetID].type !== undefined && delta.s[widgetID].type !== widgets.get(widgetID).get('type')) {
        const currentState = widgets.get(widgetID).state;
        removeWidget(widgetID);
        addWidget(Object.assign(currentState, delta.s[widgetID]));
        for(const child of widgetFilter(w=>w.get('parent')===widgetID))
          child.applyDelta({ parent: widgetID });
      } else {
        widgets.get(widgetID).applyDelta(delta.s[widgetID]);
      }
    }
  }

In statesmanaged.js

applyDelta(delta) {
    const deltaForDOM = {};
    for(const i in delta) {
      if(delta[i] === null) {
        delete this.unalteredState[i];
        delete this.state[i];
        deltaForDOM[i] = this.get(i);
      } else {
        deltaForDOM[i] = this.unalteredState[i] = this.state[i] = delta[i];
      }
    }

    this.applyDeltaToDOM(deltaForDOM);

    if(delta.z)
      updateMaxZ(this.get('layer'), delta.z);
  }

Specifically it looks like this if statement is evaluated differently if you change the type in multiselect vs just selecting one widget.
if(delta.s[widgetID].type !== undefined && delta.s[widgetID].type !== widgets.get(widgetID).get('type'))

@bjalder26 commented on GitHub (Oct 26, 2024): This seems to have to do with these functions: In serverstate.js ```js function receiveDelta(delta) { addDeltaEntryToUndoProtocol(delta); // the order of widget changes is not necessarily correct and in order to avoid cyclic children, this first moves affected widgets to the top level for(const widgetID in delta.s) { if(delta.s[widgetID] && delta.s[widgetID].parent !== undefined && delta.s[widgetID].id === undefined) { const domElement = widgets.get(widgetID).domElement; const topTransform = getElementTransformRelativeTo(domElement, $('#topSurface')) || 'none'; $('#topSurface').appendChild(domElement); domElement.style.transform = topTransform; } } for(const widgetID in delta.s) if(delta.s[widgetID] !== null && !widgets.has(widgetID)) addWidget(delta.s[widgetID]); for(const widgetID in delta.s) { if(delta.s[widgetID] !== null && widgets.has(widgetID)) { // check widgets.has because addWidget above MIGHT have failed if(delta.s[widgetID].type !== undefined && delta.s[widgetID].type !== widgets.get(widgetID).get('type')) { const currentState = widgets.get(widgetID).state; removeWidget(widgetID); addWidget(Object.assign(currentState, delta.s[widgetID])); for(const child of widgetFilter(w=>w.get('parent')===widgetID)) child.applyDelta({ parent: widgetID }); } else { widgets.get(widgetID).applyDelta(delta.s[widgetID]); } } } ``` In statesmanaged.js ```js applyDelta(delta) { const deltaForDOM = {}; for(const i in delta) { if(delta[i] === null) { delete this.unalteredState[i]; delete this.state[i]; deltaForDOM[i] = this.get(i); } else { deltaForDOM[i] = this.unalteredState[i] = this.state[i] = delta[i]; } } this.applyDeltaToDOM(deltaForDOM); if(delta.z) updateMaxZ(this.get('layer'), delta.z); } ``` Specifically it looks like this if statement is evaluated differently if you change the type in multiselect vs just selecting one widget. ```if(delta.s[widgetID].type !== undefined && delta.s[widgetID].type !== widgets.get(widgetID).get('type'))```
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/virtualtabletop#817
No description provided.