// WEBGL matches: commit 6a91aa9d4f89df66e2e3fa1adb784f72af5138df, Feb 1st 2019
Engine.ScrollWindow = class extends Engine.Drawable
{
constructor(scrollButton /*string*/, scrollBarBG /*string*/, scrollBarScroller /*string*/, dotsOnBar /*bool*/)
{
super();
if (scrollButton === undefined) scrollButton = "Chat_ScrollButton";
if (scrollBarBG === undefined) scrollBarBG = "ScrollBG";
if (scrollBarScroller === undefined) scrollBarScroller = "Button_TinyDarkGray";
if (dotsOnBar === undefined) dotsOnBar = false;
this.scrollPane = new Engine.ScrollPaneVHRecycling();
this.scrollBar = new Engine.ScrollBar();
this.scrollMask = new PIXI.Graphics();
this.scrollBox = new PIXI.Graphics();
this.displayItemSource = null;
this.displayItemReturn = null;
this.layoutWidth = 0;
this.layoutHeight = 0;
this.enabled = false;
this.headerIndices = [];
this.scrollX = null;
this.scrollY = null;
this.scrollHeight = null;
this.scrollWidth = null;
this.scrollButtonSpacing = null;
this.scrollScrollerHeight = null;
this.scrollBar.setScrollPane(this.scrollPane);
this.scrollBar.init(scrollButton, scrollBarBG, scrollBarScroller);
if (scrollBarScroller == "Button_TinyDarkGray" || dotsOnBar)
{
this.scrollBar.setScrollerIcon("Icon_ScrollBar");
}
//this.mask.events.onScroll.addListener(this, this.globalMouseWheel);
this.onActivated = (active) => { this.setEvents(active); }
this.addChild(this.scrollMask);
this.addChild(this.scrollPane);
this.addChild(this.scrollBar);
this.scrollPane.mask = this.scrollMask;
this.scrollBar.scrollerMouseFlickEnabled(false);
}
//get width() { return this._width; }
//set width(value) { this._width = value; }
//get height() { return this._height; }
//set height(value) { this._height = value; }
get itemCount()
{
return this.scrollPane.items.length;
}
get horz()
{
return this.scrollPane.horz;
}
set horz(value)
{
this.scrollPane.horz = value;
}
get enabled()
{
return this._enabled;
}
set enabled(value)
{
if (this._enabled != value)
{
this._enabled = value;
if (this._enabled)
{
Engine.Mouse.addEventListener('mousedown', this, this.globalMouseDown);
Engine.Mouse.addEventListener('mousewheel', this, this.globalMouseWheel);
//Engine.Mouse.events.on('mouseflick', this, this.globalMouseFlick } );
}
else
{
Engine.Mouse.removeEventListener('mousedown', this);//, this.globalMouseDown);
Engine.Mouse.removeEventListener('mousewheel', this);//, this.globalMouseWheel);
//Engine.Mouse.removeEventListener('mouseflick', this.globalMouseFlick } );
}
}
}
globalMouseFlick(e /*Vector2*/)
{
var bounds = this.scrollBox.getBounds();
bounds.x = this.screenX;
bounds.y = this.screenY;
//bounds.width = this.scrollPane.width;//this.layoutWidth - this.scrollBar.width;
//bounds.height = this.scrollPane.height;//this.layoutHeight;
if (bounds.contains(Engine.Mouse.position.x, Engine.Mouse.position.y)) this.scrollBar.flicked(null, e);
}
globalMouseDown(e /*Vector2*/)
{
var bounds = this.scrollBox.getBounds();
bounds.x = this.screenX;
bounds.y = this.screenY;
//bounds.width = this.layoutWidth;//this.layoutWidth - this.scrollBar.width;
//bounds.height = this.layoutHeight;//this.layoutHeight;
if (bounds.contains(Engine.Mouse.position.x, Engine.Mouse.position.y))
{
this.scrollBar.beginTouchScroll(null);
}
}
globalMouseWheel(velocity)
{
var bounds = this.getBounds();
if (this.enabled && this.scrollBar.allowScroll && bounds.contains(Engine.Mouse.position.x, Engine.Mouse.position.y))
{
this.scrollBar.mouseWheel(velocity / 10);
}
}
setEvents(active)
{
this.enabled = active;
}
scrollPixelAmount(pixels /*int*/)
{
var percentChange = 0;
if (this.scrollPane.getScrollHeight() > 0)
{
percentChange = pixels / this.scrollPane.getScrollHeight();
}
this.scrollPane.scrollToPercent(this.scrollPane.scrollPercent + percentChange);
}
scrollByGamepad(velocity /*float*/)
{
if (this.enabled && this.scrollBar.allowScroll)
{
this.scrollBar.mouseWheel(velocity / 20);
}
}
init()
{
this.layout(this.layoutWidth, this.layoutHeight);
}
addHeader(data /*TData*/, itemWidth /*int*/, itemHeight /*int*/)
{
this.headerIndices.push(this.scrollPane.items.length);
var item = this.addItem(data, itemWidth, itemHeight);
return item;
}
addItem(data /*TData*/, itemWidth /*int*/, itemHeight /*int*/)
{
var item = new Engine.RecycledScrollItem(data, itemWidth, itemHeight, (data) => { return this.getItem(data); }, (item) => { this.returnItem(item); } );
this.scrollPane.addItem(item);
return item;
}
clear()
{
this.headerIndices = [];
this.scrollPane.clearPane();
}
removeItem(itemDef /*TData*/)
{
var item = null;
for (var i = 0; i < this.scrollPane.items.length; i++)
{
if (this.scrollPane.items[i].data == itemDef)
{
item = this.scrollPane.items[i];
break;
}
}
if (item != null) this.removeItemByClip(item);
}
removeItemByClip(item /*RecycledScrollItem<TData,TClip>*/)
{
var items = this.scrollPane.items.slice();
items.remove(item);
this.scrollPane.clearPane();
for (var i = 0; i < items.length; i++) this.scrollPane.addItem(items[i]);
if (item.currentDrawable)
{
this.returnItem(item);
item.currentDrawable = null;
}
}
moveItemUp(itemDef /*TData*/)
{
var items = this.scrollPane.items;
for (let i = 1; i < items.length; i++)
{
if (items[i].data == itemDef)
{
const tmp = items[i - 1];
items[i - 1] = items[i];
items[i] = tmp;
break;
}
}
this.scrollPane.updateItemPositions();
}
moveItemDown(itemDef /*TData*/)
{
var items = this.scrollPane.items;
for (let i = 0; i < items.length - 1; i++)
{
if (items[i].data == itemDef)
{
const tmp = items[i + 1];
items[i + 1] = items[i];
items[i] = tmp;
break;
}
}
this.scrollPane.updateItemPositions();
}
setItems(data /*List<TData>*/, itemWidth /*int*/, itemHeight /*int*/)
{
this.scrollPane.clearPane();
for(var i = 0; i < data.length; i++)
{
var dataItem = data[i];
this.scrollPane.addItem(new Engine.RecycledScrollItem(dataItem, itemWidth, itemHeight, (data) => { return this.getItem(data); }, (item) => { this.returnItem(item); } ));
}
this.scrollBar.visible = (this.scrollPane.getScrollHeight() > this.layoutHeight);
}
setScrollPercent(percent /*float*/)
{
this.scrollPane.setScrollPercent(percent);
}
getScrollPercent()
{
return this.scrollPane.scrollPercent;
}
getItem(data /*TData*/)
{
if (this.displayItemSource != null) return this.displayItemSource(data);
return null;
}
returnItem(returnItem /*TClip*/)
{
if (this.displayItemReturn != null) this.displayItemReturn(returnItem);
}
layout(width /*int*/, height /*int*/, numColumns /*int*/, itemSpacing /*Vector2*/, includeScrollBarInWidth)
{
if (numColumns === undefined) numColumns = 1;
if (itemSpacing === undefined) itemSpacing = new Vector2();
if (includeScrollBarInWidth === undefined) includeScrollBarInWidth = true;
this.layoutHeight = height;
this.layoutWidth = width;
this.setScrollBarRect(this.scrollX, this.scrollY, this.scrollWidth, this.scrollHeight, this.scrollButtonSpacing);
var scrollbarWidth = 0;
if (this.hasScrollBar())
{
// include scrollbar means scrollbar is within the width
this.layoutWidth = width + (includeScrollBarInWidth ? 0 : this.scrollBar.width);
scrollbarWidth = includeScrollBarInWidth ? Math.trunc(this.scrollBar.width) : 0;
this.scrollBar.x = this.layoutWidth - this.scrollBar.width;
}
this.scrollMask.x = 0;
this.scrollMask.y = 0;
this.scrollMask.clear();
this.scrollMask.beginFill(0xFFFFFF, 0.5);
this.scrollMask.drawRect(0, 0, width - scrollbarWidth, height);
this.scrollBox.x = 0;
this.scrollBox.y = 0;
this.scrollBox.clear();
this.scrollBox.beginFill(0xFFFFFF, 0);
this.scrollBox.drawRect(0, 0, this.hasScrollBar() ? this.scrollBar.x : this.layoutWidth, height);
if (!this.horz) this.scrollPane.init(height, numColumns);
else this.scrollPane.init(width, numColumns, true);
this.scrollPane.updateItemPositions(itemSpacing.x, itemSpacing.y, this.headerIndices);
this.scrollPane.y = 0;
}
setScrollBarRect(x, y, width, height, buttonSpacing, scrollerHeight)
{
if (x === undefined) x = null;
if (y === undefined) y = null;
if (width === undefined) width = null;
if (height === undefined) height = null;
if (buttonSpacing === undefined) buttonSpacing = null;
if (scrollerHeight === undefined) scrollerHeight = null;
this.scrollX = x != null ? x : this.scrollX;
this.scrollY = y != null ? y : this.scrollY;
this.scrollWidth = width != null ? width : this.scrollWidth;
this.scrollHeight = height != null ? height : this.scrollHeight;
this.scrollButtonSpacing = buttonSpacing != null ? buttonSpacing : 0;
this.scrollScrollerHeight = scrollerHeight != null ? scrollerHeight : 0;
this.scrollBar.setHeight(this.scrollHeight != null ? this.scrollHeight : this.layoutHeight, width != null ? width : 0, buttonSpacing != null ? buttonSpacing : 0, this.scrollScrollerHeight != null ? this.scrollScrollerHeight : 0);
this.scrollBar.x = this.scrollX != null ? this.scrollX : this.layoutWidth - this.scrollBar.Width;
this.scrollBar.y = this.scrollY != null ? this.scrollY : 0;
}
removeScrollBar()
{
this.removeChild(this.scrollBar);
}
addScrollBar()
{
this.addChild(this.scrollBar);
}
hasScrollBar()
{
return this.scrollBar.hasParent;
}
}