Engine.RecycledScrollItem = class { constructor(data /*TData*/, width /*int*/, height /*int*/, getDrawableFunc /*DrawableSource*/, returnDrawableFunc /*ReturnDrawable*/) { this.height = height; this.width = width; this.getDrawableFunc = getDrawableFunc; this.returnDrawableFunc = returnDrawableFunc; this.data = data; this._y; this._x; this.currentDrawable = null; } getDrawable() { if (this.currentDrawable != null) { return this.currentDrawable; } else { this.currentDrawable = this.getDrawableFunc(this.data); return this.currentDrawable; } } get y() { return this._y; } set y(value) { this._y = value; if (this.currentDrawable != null) this.currentDrawable.y = this._y; } get x() { return this._x; } set x(value) { this._x = value; if (this.currentDrawable != null) this.currentDrawable.x = this._x; } get hasClip() { return this.currentDrawable != null; } get clip() { return this.currentDrawable; } addTo(parentScrollPane /*Drawable*/) { this.parentScrollPane = parentScrollPane; this.currentDrawable = this.getDrawable(); if (this.currentDrawable != null) { this.currentDrawable.y = this.y; this.currentDrawable.x = this.x; this.parentScrollPane.addChild(this.currentDrawable); } } remove() { if (this.currentDrawable != null) { this.currentDrawable.removeFromParent(); this.returnDrawableFunc(this.currentDrawable); this.currentDrawable = null; } } setData(data /*TData*/) { this.data = data; } } Engine.ScrollPaneVHRecycling = class extends Engine.Drawable { get items() { return this.scrollItems; } getScrollHeight() { if (this.scrollItems.length == 0) return 0; var lastItem = this.scrollItems[this.scrollItems.length - 1]; if (this.horz) return Math.max(0, Math.trunc(lastItem.x + lastItem.width - this.visibleHeight)); return Math.max(0, Math.trunc(lastItem.y + lastItem.height - this.visibleHeight)); } throwOnScroll() { this.onScroll.call(this); } setScrollPercentFromScrollAmount() { this.scrollPercent = this.currentScrollAmount / this.getScrollHeight(); } constructor(visibleHeight /*int*/, numColumns /*int*/, horz /*bool*/) { super(); if (visibleHeight === undefined) visibleHeight = 0; if (numColumns === undefined) numColumns = 1; if (horz === undefined) horz = false; this.numColumns = 1; this.itemClip = new Engine.Drawable(); this.scrollItems = []; this.scrollPositionsByIndex = []; this.currentScrollAmount = 0; this.destinationScrollAmount = 0; this.horzPadding = 0; this.vertPadding = 0; this.isScrollToPercent = false; this.scrollAmount = 0; this.needsUpdate = false; this.baseDecelleration = 800; this.decelleration = 800; this.max_velocity = 2000; this.vel = 0; this.velocityScrolledPastEnd = false; this.horz = horz; this.numColumns = numColumns; this.visibleHeight = visibleHeight; this.scrollAreaHeight = visibleHeight; this.scrollPercent = 0; this.onScroll = new Action(); this.addChild(this.itemClip); Engine.EnterFrameManagerInstance.add(this, this.update, true); } init(visibleHeight /*int*/, numColumns /*int*/, horz /*bool*/) { if (visibleHeight === undefined) visibleHeight = 0; if (numColumns === undefined) numColumns = 1; if (horz === undefined) horz = false; this.horz = horz; this.numColumns = numColumns; this.visibleHeight = visibleHeight; this.scrollAreaHeight = visibleHeight; this.updateVisible(); } clearPane() { for (var i = this.scrollItems.length - 1; i >= 0; i--) { this.scrollItems[i].remove(); } this.scrollItems.length = 0;// = []; } calculateNextAvailablePosition(force /*bool*/) { if (this.scrollPositionsByIndex.length + 1 == this.scrollItems.length && force == false) { return this.scrollPositionsByIndex[this.scrollPositionsByIndex.length - 1]; } this.scrollPositionsByIndex = []; var height = 0; var xPos = 0; this.scrollPositionsByIndex.push(new PIXI.Point(0, 0)); if (this.horz) { for (var i = 0; i < this.scrollItems.length; i++) { height += Math.trunc(this.scrollItems[i].height) + this.vertPadding; if ((i + 1) % this.numColumns == 0) { xPos += Math.trunc(this.scrollItems[i].width) + this.horzPadding; height = 0; } this.scrollPositionsByIndex.push(new PIXI.Point(xPos, height)); } } else { for (var i = 0; i < this.scrollItems.length; i++) { xPos += Math.trunc(this.scrollItems[i].width) + this.horzPadding; if ((i + 1) % this.numColumns == 0) { height += Math.trunc(this.scrollItems[i].height) + this.vertPadding; xPos = 0; } this.scrollPositionsByIndex.push(new PIXI.Point(xPos, height)); } } return this.scrollPositionsByIndex[this.scrollPositionsByIndex.length - 1]; } addItem(item /*RecycledScrollItem<TData,TClip>*/) { var itemPos = this.calculateNextAvailablePosition(); item.y = itemPos.y; item.x = itemPos.x; this.scrollItems.push(item); this.updateVisible(); } scrollUp() { this.addScrollVelocity(-100); } scrollDown() { this.addScrollVelocity(100); } scrollLeft() { this.addScrollVelocity(-500); } scrollRight() { this.addScrollVelocity(500); } updateItemPositions(horzPadding /*int*/, vertPadding /*int*/, headers /*HashSet<int>*/) { if (horzPadding === undefined) horzPadding = 0; if (vertPadding === undefined) vertPadding = 0; if (headers === undefined) headers = null; this.horzPadding = horzPadding; this.vertPadding = vertPadding; var height = 0; var xPos = 0; if (this.horz) { for (var i = 0; i < this.scrollItems.length; i++) { this.scrollItems[i].y = height; this.scrollItems[i].x = xPos; height += Math.trunc(this.scrollItems[i].height) + vertPadding; if ((i + 1) % this.numColumns == 0 || this.numColumns == 0) { xPos += Math.trunc(this.scrollItems[i].width) + horzPadding; height = 0; } } } else { var rowCount = 0; for (i = 0; i < this.scrollItems.length; i++) { rowCount++; var isHeader = (headers != null) && (headers.indexOf(i) != -1); if (isHeader) { if (xPos != 0) //This can only happen when an item came before us, so i-1 a safe assumption i think { if (i > 0) height += Math.trunc(this.scrollItems[i-1].height) + vertPadding; else height += Math.trunc(this.scrollItems[i - 1].height) * 2 + vertPadding; } xPos = 0; } this.scrollItems[i].y = height; this.scrollItems[i].x = xPos; xPos += Math.trunc(this.scrollItems[i].width) + horzPadding; if (rowCount % this.numColumns == 0 || this.numColumns == 0 || isHeader) { height += Math.trunc(this.scrollItems[i].height) + vertPadding; xPos = 0; rowCount = 0; } } } this.updateVisible(); this.needsUpdate = true; } updateVisible() { for (var i = 0; i < this.scrollItems.length; i++) { var itemHeight = Math.trunc(this.scrollItems[i].height); var itemTop = Math.trunc(this.scrollItems[i].y); var itemBottom = itemTop + itemHeight; var visiblePadding = 0; var bottomCutoff = Math.trunc(this.currentScrollAmount + this.visibleHeight + visiblePadding); var topCutoff = Math.trunc(this.currentScrollAmount - visiblePadding); var itemWidth = Math.trunc(this.scrollItems[i].width); var itemLeft = Math.trunc(this.scrollItems[i].x); var itemRight = itemLeft + itemWidth; if (this.horz && (itemRight > topCutoff && itemLeft < bottomCutoff)) { if (this.scrollItems[i].getDrawable().parent != this.itemClip) this.scrollItems[i].addTo(this.itemClip); } else if (!this.horz && (itemBottom > topCutoff && itemTop < bottomCutoff)) { if (this.scrollItems[i].getDrawable().parent != this.itemClip) this.scrollItems[i].addTo(this.itemClip); } else { this.scrollItems[i].remove(); } } } scrollDownOneItem() { if (this.items.length == 0) return; var visibleItems = this.numColumns * Math.ceil(this.visibleHeight / (this.horz ? this.items[0].width : this.items[0].height)); if (this.items.length == visibleItems) this.scrollToPercent(1); else this.scrollToPercent(this.scrollPercent + (1 / (this.items.length - visibleItems))); } scrollUpOneItem() { if (this.items.length == 0) return; var visibleItems = this.numColumns * Math.ceil(this.visibleHeight / (this.horz ? this.items[0].width : this.items[0].height)); if (this.items.length == visibleItems) this.scrollToPercent(0); else this.scrollToPercent(this.scrollPercent - (1 / (this.items.length - visibleItems))); } scrollDownOneColumn() { if (this.items.length == 0) return; var scrollAmount = this.horz ? this.items[0].width + this.horzPadding : this.items[0].height + this.vertPadding; var scrollHeight = this.getScrollHeight(); var newPercent = 0; if (scrollHeight > 0) { newPercent = this.scrollPercent + scrollAmount / scrollHeight; } this.scrollToPercent(newPercent); } scrollUpOneColumn() { if (this.items.length == 0) return; var scrollAmount = this.horz ? this.items[0].width + this.horzPadding : this.items[0].height + this.vertPadding; var scrollHeight = this.getScrollHeight(); var newPercent = 0; if (scrollHeight > 0) { newPercent = this.scrollPercent - scrollAmount / scrollHeight; } this.scrollToPercent(newPercent); } scrollToIndex(index, instant) { if (instant === undefined) instant = false; index = Math.max(0, Math.min(this.items.length - 1, index)); var positionY = this.horz ? this.scrollPositionsByIndex[index].x : this.scrollPositionsByIndex[index].y; this.scrollToPercent(positionY / this.getScrollHeight(), instant); } scrollToPercent(p /*float*/, instant /*bool*/) { if (instant === undefined) instant = false; var maxScrollHeight = this.getScrollHeight(); this.destinationScrollAmount = Math.trunc(maxScrollHeight * p); if (Engine.Utils.isNumberInvalid(this.destinationScrollAmount)) { Debug.Log("Attempt to scroll to undefined!"); } if (this.destinationScrollAmount > maxScrollHeight) this.destinationScrollAmount = Math.trunc(maxScrollHeight); if (this.destinationScrollAmount < 0) this.destinationScrollAmount = 0; if (instant) { this.currentScrollAmount = this.destinationScrollAmount; this.scrollPercent = 0; if (maxScrollHeight > 0) { this.scrollPercent = this.currentScrollAmount / maxScrollHeight; } if (this.horz) { this.itemClip.x = -Math.trunc(this.currentScrollAmount); } else { this.itemClip.y = -Math.trunc(this.currentScrollAmount); } this.updateVisible(); this.throwOnScroll(); this.needsUpdate = false; } else { this.isScrollToPercent = true; this.scrollAmount = Math.abs(this.destinationScrollAmount - this.currentScrollAmount) * 5; this.needsUpdate = true; this.scrollPercent = p; } } scrollToItemIndex(index /*int*/) { index = Math.max(0,Math.min(this.items.length - 1, index)); var leftSide = this.horz ? this.items[index].x : this.items[index].y; var rightSide = this.horz ? (this.items[index].x + this.items[index].width) : (this.items[index].y + this.items[index].height); var scrollableHeight = this.getScrollHeight(); var maxScroll = Math.min(scrollableHeight, leftSide) / scrollableHeight; var minScroll = Math.max(0, rightSide - this.visibleHeight) / scrollableHeight; if (this.scrollPercent > maxScroll) { this.scrollToPercent(maxScroll, true); } else if (this.scrollPercent < minScroll) { this.scrollToPercent(minScroll, true); } } scrollToRangeVisible(leftSide, rightSide) { var scrollableHeight = this.getScrollHeight(); var maxScroll = Math.min(scrollableHeight, leftSide) / scrollableHeight; var minScroll = Math.max(0, rightSide - this.visibleHeight) / scrollableHeight; if (this.scrollPercent > maxScroll) { this.scrollToPercent(maxScroll, true); } else if (this.scrollPercent < minScroll) { this.scrollToPercent(minScroll, true); } } setScrollPercent(p /*float*/) { var maxScrollHeight = this.getScrollHeight(); this.destinationScrollAmount = Math.trunc(maxScrollHeight * p); if (Engine.Utils.isNumberInvalid(this.destinationScrollAmount)) { Debug.Log("Attempt to scroll to undefined!"); } this.currentScrollAmount = this.destinationScrollAmount; this.needsUpdate = true; this.scrollPercent = p; this.throwOnScroll(); } ensureScrollPositionValid() { if (this.vel != 0) return; var maxScrollHeight = this.getScrollHeight(); var newScrollAmount = Math.max(0, Math.min(maxScrollHeight, this.destinationScrollAmount)); this.destinationScrollAmount = Math.trunc(newScrollAmount); this.currentScrollAmount = this.destinationScrollAmount; this.needsUpdate = true; this.scrollPercent = 0; if (maxScrollHeight > 0) { this.scrollPercent = newScrollAmount / maxScrollHeight; } } setScrollVelocity(vel /*float*/) { this.vel = vel; } //px/s addScrollVelocity(vel /*float*/) { this.vel += vel; if (this.vel < -this.max_velocity) this.vel = -this.max_velocity; if (this.vel > this.max_velocity) this.vel = this.max_velocity; if (vel > 0) this.decelleration = Math.abs(this.baseDecelleration); if (vel < 0) this.decelleration = -Math.abs(this.baseDecelleration); //Debug.Log(this.vel); } update(timeElapsed /*float*/) { var maxScrollHeight = this.getScrollHeight(); var noChange = (this.currentScrollAmount == this.destinationScrollAmount); //Destination based scroll update if ((this.vel == 0 && this.currentScrollAmount != this.destinationScrollAmount) || this.needsUpdate) { if (this.currentScrollAmount > this.destinationScrollAmount) { this.currentScrollAmount -= (timeElapsed * ((this.isScrollToPercent) ? this.scrollAmount : 200)); if (this.currentScrollAmount < this.destinationScrollAmount) { this.isScrollToPercent = false; this.currentScrollAmount = this.destinationScrollAmount; } } if (this.currentScrollAmount < this.destinationScrollAmount) { this.currentScrollAmount += (timeElapsed * ((this.isScrollToPercent) ? this.scrollAmount : 200)); if (this.currentScrollAmount > this.destinationScrollAmount) { this.isScrollToPercent = false; this.currentScrollAmount = this.destinationScrollAmount; } } this.scrollPercent = 0; if (maxScrollHeight > 0) this.scrollPercent = this.currentScrollAmount / maxScrollHeight; if (this.horz) { this.itemClip.x = -Math.trunc(this.currentScrollAmount); } else { this.itemClip.y = -Math.trunc(this.currentScrollAmount); } this.updateVisible(); this.throwOnScroll(); this.needsUpdate = false; } //Velocity based scroll update else if (this.vel != 0) { if (this.decelleration > 0 && this.vel > 0) { this.vel -= this.decelleration * timeElapsed; if (this.vel < 0) this.vel = 0; } else if (this.decelleration < 0 && this.vel < 0) { this.vel -= this.decelleration * timeElapsed; if (this.vel > 0) this.vel = 0; } this.currentScrollAmount += this.vel * timeElapsed; if (this.currentScrollAmount <= 0 || this.currentScrollAmount > maxScrollHeight) { this.decelleration *= Math.abs(this.decelleration); this.velocityScrolledPastEnd = true; } if (this.vel == 0) this.currentScrollAmount = Math.trunc(this.currentScrollAmount); this.destinationScrollAmount = Math.trunc(this.currentScrollAmount); this.scrollPercent = 0; if (maxScrollHeight > 0) this.scrollPercent = this.currentScrollAmount / maxScrollHeight; if (this.horz) { this.itemClip.x = -Math.trunc(this.currentScrollAmount); } else { this.itemClip.y = -Math.trunc(this.currentScrollAmount); } this.updateVisible(); this.throwOnScroll(); } else if (this.velocityScrolledPastEnd) { this.velocityScrolledPastEnd = false; if (this.currentScrollAmount < 0) this.scrollToPercent(0); if (this.currentScrollAmount > this.maxScrollHeight) this.scrollToPercent(1); } } } Engine.ScrollBar = class extends Engine.Drawable { constructor() { super(); this.allowScroll = true; this.pane = null; this.minScrollPos = 0; this.maxScrollPos = 400; this.scrollWidthScale = 1.0; this.arrowHeight = 18; this.arrowWidth = 18; this.downArrowRotated = false; this.showWhenStill = true; this.showingScroller = true; this.fadeTween = new Engine.SimpleTween(); this.fadeTimer = new Engine.SimpleTimer(); this._scrollerMouseFlickEnabled = true; this.dragging = false; this._stopDragging = false; this.dragFactor = 1; this.dragStartY = 0; this.dragStartMouseY = 0; this.dragStartX = 0; this.dragStartMouseX = 0; this.touchDragging = false; this.scrolledPassedEnds = false; this.upArrow = new Engine.DrawableButton(); this.downArrow = new Engine.DrawableButton(); this.scrollBar = new Engine.Drawable(); this.scroller = new Engine.Drawable(); this.scrollerIcon = new Engine.Drawable(); this.scrollBar.setNineRect(); this.scroller.setNineRect(); this.upArrow.onClick = () => { this.scrollUp(); }; this.downArrow.onClick = () => { this.scrollDown(); }; //this.scroller.interactive = true; this.scrollBar.mouseEnabled = true; this.scroller.mouseEnabled = true; this.scroller.events.onMouseDown.addListener(this, (event) => { this.beginDragScroll(event); });//('pointerdown', (event) => { this.beginDragScroll(event); } ); //this.scroller.Events.MouseFlick = () => { this.flicked() }; } setScrollPane(pane /*ScrollPaneBase*/) { this.pane = pane; pane.onScroll.addListener(this, this.scrollPaneScrolled); } init(arrowGraphic /*String*/, scrollbarGraphic /*String*/, scrollerGraphic /*String*/, scrollerOnly /*bool*/, height /*int*/, iconOnScroller /*string*/, showWhenStill /*bool*/) { if (arrowGraphic === undefined) arrowGraphic = "Chat_ScrollButton";//"ScrollButtonUp"; if (scrollbarGraphic === undefined) scrollbarGraphic = "ScrollBG"; if (scrollerGraphic === undefined) scrollerGraphic = "InventoryScroller";//"Button_TinyDarkGray"; if (scrollerOnly === undefined) scrollerOnly = false; if (height === undefined) height = 450; if (iconOnScroller === undefined) iconOnScroller = null; if (showWhenStill === undefined) showWhenStill = true; this.upArrow.init(arrowGraphic, ""); this.arrowHeight = Math.trunc(this.upArrow.height); this.arrowWidth = Math.trunc(this.upArrow.width); this.downArrow.init(arrowGraphic,""); // downArrow.y = height - (2 * arrowHeight); // rotate the arrow so its facing down and adjust the coordinates. // Y position will be adjusted in the setHeight function this.downArrowRotated = true; this.downArrow.scale.y = -1; this.scrollBar.loadFromGraphicName(scrollbarGraphic); this.scroller.loadFromGraphicName(scrollerGraphic); this.setScrollerIcon(iconOnScroller); this.setScrollerOnly(scrollerOnly); this.addChild(this.scroller); this.setHeight(height); this.showWhenStill = showWhenStill; if (!this.showWhenStill) { this.showingScroller = false; this.scroller.alpha = 0; } } setScrollerOnly(scrollerOnly /*bool*/) { if(!scrollerOnly) { this.addChild(this.scrollBar); this.addChild(this.downArrow); this.addChild(this.upArrow); this.arrowHeight = Math.trunc(this.upArrow.height); } else { this.removeChild(this.scrollBar); this.removeChild(this.downArrow); this.removeChild(this.upArrow); this.arrowHeight = 0; } } removeScrollBackground() { this.scrollBar.removeFromParent(); } setScrollerIcon(name /*string*/) { if(name != null) { this.scroller.addChild(this.scrollerIcon); this.scrollerIcon.loadFromGraphicName(name); this.scrollerIcon.x = (this.scroller.width - this.scrollerIcon.width) / 2; this.scrollerIcon.y = (this.scroller.height - this.scrollerIcon.height) / 2; } else { this.scrollerIcon.removeFromParent(); } } setScrollWidthScale(scale /*float*/) { this.scrollWidthScale = scale; } setHeight(height /*int*/, scrollBarWidth /*int*/, buttonYSpacing /*int*/, scrollerHeight /*int*/) { if (scrollBarWidth === undefined) scrollBarWidth = 0; if (buttonYSpacing === undefined) buttonYSpacing = 0; if (scrollerHeight === undefined) scrollerHeight = 0; if (this.downArrowRotated) { this.downArrow.y = height; } else { this.downArrow.y = height - this.arrowHeight; } this.scrollBar.y = this.arrowHeight + buttonYSpacing; this.scrollBar.height = height - (2 * (this.arrowHeight + buttonYSpacing)); this.scrollBar.width = scrollBarWidth == 0 ? this.arrowWidth * this.scrollWidthScale : scrollBarWidth; this.scrollBar.x = (this.upArrow.width / 2) - (this.scrollBar.width / 2); var minScrollbarSize = 22; this.scroller.height = scrollerHeight == 0 ? Math.max(this.scrollBar.height * 0.1, minScrollbarSize) : scrollerHeight; this.scroller.width = scrollBarWidth == 0 ? this.arrowWidth * this.scrollWidthScale : scrollBarWidth; this.scroller.x = this.upArrow.parent != null ? (this.upArrow.width / 2) - (this.scroller.width / 2) : 0; this.minScrollPos = Math.trunc(this.scrollBar.y); this.maxScrollPos = Math.trunc((this.scrollBar.height + this.scrollBar.y) - (this.scroller.height)); this.scroller.y = this.minScrollPos + Math.trunc((this.maxScrollPos - this.minScrollPos) * this.pane.scrollPercent); this.scrollerIcon.x = (this.scroller.width - this.scrollerIcon.width) / 2; this.scrollerIcon.y = (this.scroller.height - this.scrollerIcon.height) / 2; } scrollerMouseFlickEnabled(enabled) { return; // no flicking on webGL if (this._scrollerMouseFlickEnabled == enabled) return; if (enabled) scroller.events.mouseFlick.addListener(this, this.flicked); if (!enabled) scroller.events.mouseFlick.removeListener(this); this._scrollerMouseFlickEnabled = enabled; } flicked(d /*Drawable*/, v /*Vector2*/) { if (!this.allowScroll) return; if (this.scrolledPassedEnds) return; if (this.pane.horz) { this.pane.addScrollVelocity(v.x * this.dragFactor * 100); } else { this.pane.addScrollVelocity(-v.y * this.dragFactor * 100); } } mouseWheel(velocity /*float*/) { if (!this.allowScroll) return; var scrollHeight = this.pane.getScrollHeight(); var pixelsPerPercent = scrollHeight / 100; var scrollPixelsPerClick = 66; var percentPerClick = 0; if (scrollHeight > 0) { var percentPerClick = scrollPixelsPerClick / pixelsPerPercent / 100; } var currentScrollPercent = this.pane.scrollPercent; var newPercent = currentScrollPercent + (velocity * percentPerClick * 10); newPercent = Math.max(0, Math.min(1, newPercent)); this.pane.setScrollPercent(newPercent); } scrollLeft() { this.pane.scrollLeft(); } scrollRight() { this.pane.scrollRight(); } scrollUp() { this.pane.scrollUp(); } scrollDown() { this.pane.scrollDown(); } get stopDragging() { return this._stopDragging; } set stopDragging(value) { this._stopDragging = value; } beginDragScroll(d /*Drawable*/) { if (!this.allowScroll) return; var mousePos = Engine.Mouse.position; this.dragStartMouseY = Math.trunc(mousePos.y); this.dragStartY = Math.trunc(this.scroller.y); this.dragStartMouseX = Math.trunc(mousePos.x); this.dragStartX = Math.trunc(this.scroller.x); this.dragging = true; Engine.EnterFrameManagerInstance.remove(this); Engine.EnterFrameManagerInstance.add(this, this.update); this.pane.setScrollVelocity(0); this.dragFactor = 1; this.touchDragging = false; } beginTouchScroll(d /*Drawable*/) { if (!this.allowScroll) return; this.beginDragScroll(d); this.dragFactor = -1; this.touchDragging = true; } beginDragScrollReverse(d /*Drawable*/) { if (!this.allowScroll) return; this.beginDragScroll(d); this.dragFactor = -1; } update(timeElapsed /*float*/) { if (!this.allowScroll) return; if (this.dragging) { var mousePos = Engine.Mouse.position; //var activeInteraction = Engine.Pixi.renderer.plugins.interaction.activeInteraction; if (Engine.Mouse.mouseButtonDown[0] && !this.stopDragging) { var dragDif = Math.trunc((mousePos.y - this.dragStartMouseY) * this.dragFactor); if(this.pane.horz) dragDif = Math.trunc((mousePos.x - this.dragStartMouseX) * this.dragFactor); var range = (this.maxScrollPos - this.minScrollPos); if(range == 0) { this.dragging = false; this.stopDragging = false; this.pane.ensureScrollPositionValid(); Engine.EnterFrameManagerInstance.remove(this); return; } if (this.touchDragging) { //convert the motion so it is a 1:1 mapping with finger movement on the scroll area. var totalHeight = this.pane.getScrollHeight(); if (totalHeight <= 0) { dragDif = 0; } else { dragDif = dragDif * (range / totalHeight); } } this.scroller.y = this.dragStartY + dragDif; if (this.scroller.y < this.minScrollPos) this.scroller.y = this.minScrollPos; if (this.scroller.y > this.maxScrollPos) this.scroller.y = this.maxScrollPos; this.scrollerIcon.x = (this.scroller.width - this.scrollerIcon.width) / 2; this.scrollerIcon.y = (this.scroller.height - this.scrollerIcon.height) / 2; //var percent = (this.scroller.y - this.minScrollPos) / range; var realScrollAmount = (this.dragStartY + dragDif - this.minScrollPos); this.scrolledPassedEnds = false; if (realScrollAmount < 0 || realScrollAmount > range) { this.scrolledPassedEnds = true; var easedDistance = realScrollAmount > range ? realScrollAmount - range : Math.abs(realScrollAmount); var preeased = easedDistance; if (this.pane.horz) { easedDistance = (1 + Math.log10((5 + easedDistance) / 50)) * 20; } else { easedDistance = (1 + Math.log10((5 + easedDistance) / 50)) * 3; } realScrollAmount = realScrollAmount > range ? range + easedDistance : -easedDistance; } var realScrollPercent = realScrollAmount / range; if (dragDif != 0) this.pane.setScrollPercent(realScrollPercent); if (!this.showWhenStill) this.showScroller(); } else { this.dragging = false; // TODO return the scroll to the 0 postion if it is offkilter if (this.scrolledPassedEnds) { if (this.pane.scrollPercent < 0) this.pane.scrollToPercent(0); if (this.pane.scrollPercent > 1) this.pane.scrollToPercent(1); } else { this.pane.ensureScrollPositionValid(); } this.stopDragging = false; Engine.EnterFrameManagerInstance.remove(this); } } } scrollPaneScrolled(s /*ScrollPaneBase*/) { if (!this.dragging) { this.updateScrollPos(); } } updateScrollPos() { var percent = Math.max(0, Math.min(this.pane.scrollPercent, 1)); this.scroller.y = this.minScrollPos + ((this.maxScrollPos - this.minScrollPos) * percent); this.scrollerIcon.x = (this.scroller.width - this.scrollerIcon.width) / 2; this.scrollerIcon.y = (this.scroller.height - this.scrollerIcon.height) / 2; if (!this.showWhenStill) this.showScroller(); } showScroller() { if (!this.showingScroller) { this.fadeTween.init((a) => this.scroller.alpha = a, Engine.SimpleTween.easeLinear, this.scroller.alpha, 1, 0.15); this.showingScroller = true; } this.fadeTimer.start(1, () => { this.fadeTween.Init((a) => this.scroller.alpha = a, Engine.SimpleTween.easeLinear, this.scroller.alpha, 0, 0.5); this.showingScroller = false; } ); } }