com.bladecoder.engine.ui.PagedScrollPane Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of blade-engine Show documentation
Show all versions of blade-engine Show documentation
Classic point and click adventure game engine
package com.bladecoder.engine.ui;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.ui.Cell;
import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.utils.Array;
public class PagedScrollPane extends ScrollPane {
private boolean wasPanDragFling = false;
// private float pageSpacing;
private Table content;
public PagedScrollPane () {
super(null);
setup();
}
public PagedScrollPane (Skin skin) {
super(null, skin);
setup();
}
public PagedScrollPane (Skin skin, String styleName) {
super(null, skin, styleName);
setup();
}
public PagedScrollPane (Actor widget, ScrollPaneStyle style) {
super(null, style);
setup();
}
private void setup() {
content = new Table();
content.defaults().space(50);
super.setWidget(content);
}
public void addPages (Actor... pages) {
for (Actor page : pages) {
content.add(page).expandY().fillY();
}
}
public void addPage (Actor page) {
content.add(page).expandY().fillY();
}
@Override
public void act (float delta) {
super.act(delta);
if (wasPanDragFling && !isPanning() && !isDragging() && !isFlinging()) {
wasPanDragFling = false;
scrollToPage();
} else {
if (isPanning() || isDragging() || isFlinging()) {
wasPanDragFling = true;
}
}
}
// @Override
// public void setWidget (Actor widget) {
// throw new UnsupportedOperationException("Use PagedScrollPane#addPage.");
// }
@Override
public void setWidth (float width) {
super.setWidth(width);
if (content != null) {
for (Cell> cell : content.getCells()) {
cell.width(width);
}
content.invalidate();
}
}
public void setPageSpacing (float pageSpacing) {
if (content != null) {
content.defaults().space(pageSpacing);
for (Cell> cell : content.getCells()) {
cell.space(pageSpacing);
}
content.invalidate();
}
}
private void scrollToPage () {
final float width = getWidth();
final float scrollX = getScrollX();
final float maxX = getMaxX();
if (scrollX >= maxX || scrollX <= 0) return;
Array pages = content.getChildren();
float pageX = 0;
float pageWidth = 0;
if (pages.size > 0) {
for (Actor a : pages) {
pageX = a.getX();
pageWidth = a.getWidth();
if (scrollX < (pageX + pageWidth * 0.5)) {
break;
}
}
setScrollX(MathUtils.clamp(pageX - (width - pageWidth) / 2, 0, maxX));
}
}
}