Et2Split: Fix incorrect / frozen sizing of split in Firefox

If user dragged very quickly & released the mouse button before the resize was complete, we would wind up with incorrect size
This commit is contained in:
nathan 2023-01-06 11:07:50 -07:00
parent f0c3d819b8
commit ba608fddc7

View File

@ -89,7 +89,7 @@ export class Et2Split extends Et2Widget(SlotMixin(SlSplitPanel))
public static PREF_PREFIX = "splitter-size-"; public static PREF_PREFIX = "splitter-size-";
protected static PANEL_NAMES = ["start", "end"]; protected static PANEL_NAMES = ["start", "end"];
private _resize_timeout : NodeJS.Timeout = null; private _resize_timeout : ReturnType<typeof setTimeout> = null;
private _undock_position : number = undefined; private _undock_position : number = undefined;
// To hold troublesome elements we need to hide while resizing // To hold troublesome elements we need to hide while resizing
@ -309,7 +309,7 @@ export class Et2Split extends Et2Widget(SlotMixin(SlSplitPanel))
* *
* @param e * @param e
*/ */
_handleResize(e) _handleResize(e, timeout = 100)
{ {
// Update where we would undock to // Update where we would undock to
if(this.position != 0 && this.position != 100) if(this.position != 0 && this.position != 100)
@ -330,12 +330,12 @@ export class Et2Split extends Et2Widget(SlotMixin(SlSplitPanel))
// Tell widgets that manually resize about it // Tell widgets that manually resize about it
this.iterateOver(function(_widget) this.iterateOver(function(_widget)
{ {
if (typeof _widget.resize === 'function') if(typeof _widget.resize === 'function')
{ {
_widget.resize(); _widget.resize();
} }
}, self, et2_IResizeable); }, self, et2_IResizeable);
}.bind(this), 100); }.bind(this), timeout);
} }
/** /**
@ -360,9 +360,18 @@ export class Et2Split extends Et2Widget(SlotMixin(SlSplitPanel))
for(let h of hide) for(let h of hide)
{ {
h.style.visibility = "hidden"; h.style.visibility = "hidden";
egw.loading_prompt(this.id,true,egw.lang('Recalculating frame size...'), h.parentElement) this.egw().loading_prompt(this.id, true, this.egw().lang('Recalculating frame size...'), h.parentElement)
} }
} }
// If they move quickly, the mouse can leave the divider and we won't get the mouseup
// On firefox, this causes incorrect sizes
const listener = (e) =>
{
this._handleMouseUp(e);
this.getRootNode().removeEventListener("mouseup", listener);
}
this.getRootNode().addEventListener("mouseup", listener);
} }
/** /**
@ -373,8 +382,10 @@ export class Et2Split extends Et2Widget(SlotMixin(SlSplitPanel))
for(let h of this._hidden) for(let h of this._hidden)
{ {
h.style.visibility = "initial"; h.style.visibility = "initial";
egw.loading_prompt(this.id, false); this.egw().loading_prompt(this.id, false);
} }
// Do resize a little later for fast draggers using firefox
this._handleResize(e, 500);
} }
/** /**