Support tabs for Bazaar screen

This commit is contained in:
drdev
2014-07-17 05:00:58 +00:00
parent 135617ff9d
commit b04c5365ef
4 changed files with 86 additions and 37 deletions

View File

@@ -13,15 +13,18 @@ import forge.toolbox.FDisplayObject;
import forge.toolbox.FEvent;
import forge.toolbox.FLabel;
import forge.toolbox.FEvent.FEventHandler;
import forge.toolbox.FScrollPane;
import forge.util.Utils;
public class TabPageScreen<T extends TabPageScreen<T>> extends FScreen {
protected final TabPage<T>[] tabPages;
private TabPage<T> selectedPage;
private final TabHeader<T> tabHeader;
@SuppressWarnings("unchecked")
public TabPageScreen(TabPage<T>... tabPages0) {
super(new TabHeader<T>(tabPages0));
tabHeader = (TabHeader<T>)getHeader(); //cache reference to tab header with proper type
int index = 0;
tabPages = tabPages0;
@@ -46,6 +49,9 @@ public class TabPageScreen<T extends TabPageScreen<T>> extends FScreen {
selectedPage = tabPage0;
if (selectedPage != null) {
selectedPage.setVisible(true);
if (tabHeader.isScrollable) { //scroll tab into view if needed
tabHeader.scroller.scrollIntoView(selectedPage.tab, TabHeader.BACK_BUTTON_WIDTH);
}
}
}
@@ -63,9 +69,41 @@ public class TabPageScreen<T extends TabPageScreen<T>> extends FScreen {
private static final FSkinColor SEPARATOR_COLOR = BACK_COLOR.stepColor(-40);
private final FLabel btnBack;
private boolean isScrollable;
private final FScrollPane scroller = add(new FScrollPane() {
@Override
protected ScrollBounds layoutAndGetScrollBounds(float visibleWidth, float visibleHeight) {
int tabCount = -1; //start at -1 so back button not counted
for (FDisplayObject child : getChildren()) {
if (child.isVisible()) {
tabCount++;
}
}
float x = 0;
float tabWidth;
isScrollable = (tabCount > 3); //support up to 3 tabs without scrolling
if (isScrollable) {
tabWidth = visibleWidth / 2 - BACK_BUTTON_WIDTH; //support showing an amount of the third tab equal to the width of the back button
}
else {
tabWidth = (visibleWidth - BACK_BUTTON_WIDTH) / tabCount;
}
for (FDisplayObject child : getChildren()) {
if (x == 0) { //skip back button
x += BACK_BUTTON_WIDTH;
}
else if (child.isVisible()) {
child.setBounds(x, 0, tabWidth, visibleHeight);
x += tabWidth;
}
}
return new ScrollBounds(isScrollable ? x : visibleWidth, visibleHeight);
}
});
public TabHeader(TabPage<T>[] tabPages) {
btnBack = add(new FLabel.Builder().iconScaleAuto(false).icon(new BackIcon(BACK_BUTTON_WIDTH, BACK_BUTTON_WIDTH)).pressedColor(BTN_PRESSED_COLOR).align(HAlignment.CENTER).command(new FEventHandler() {
btnBack = scroller.add(new FLabel.Builder().iconScaleAuto(false).icon(new BackIcon(BACK_BUTTON_WIDTH, BACK_BUTTON_WIDTH)).pressedColor(BTN_PRESSED_COLOR).align(HAlignment.CENTER).command(new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
Forge.back();
@@ -74,7 +112,7 @@ public class TabPageScreen<T extends TabPageScreen<T>> extends FScreen {
btnBack.setSize(BACK_BUTTON_WIDTH, HEIGHT);
for (TabPage<T> tabPage : tabPages) {
add(tabPage.tab);
scroller.add(tabPage.tab);
}
}
@@ -91,8 +129,10 @@ public class TabPageScreen<T extends TabPageScreen<T>> extends FScreen {
@Override
public void drawOverlay(Graphics g) {
//draw right border for back button
float x = btnBack.getWidth() - LINE_THICKNESS / 2;
g.drawLine(LINE_THICKNESS, SEPARATOR_COLOR, x, 0, x, getHeight());
float x = btnBack.getWidth() - LINE_THICKNESS / 2 - scroller.getScrollLeft();
if (x >= 0) {
g.drawLine(LINE_THICKNESS, SEPARATOR_COLOR, x, 0, x, getHeight());
}
//draw bottom border for header
float y = HEIGHT - LINE_THICKNESS / 2;
@@ -101,23 +141,7 @@ public class TabPageScreen<T extends TabPageScreen<T>> extends FScreen {
@Override
protected void doLayout(float width, float height) {
int tabCount = -1; //start at -1 so back button not counted
for (FDisplayObject child : getChildren()) {
if (child.isVisible()) {
tabCount++;
}
}
float x = 0;
float tabWidth = (width - BACK_BUTTON_WIDTH) / tabCount;
for (FDisplayObject child : getChildren()) {
if (x == 0) { //skip back button
x += BACK_BUTTON_WIDTH;
}
else if (child.isVisible()) {
child.setBounds(x, 0, tabWidth, height);
x += tabWidth;
}
}
scroller.setBounds(0, 0, width, height);
}
}

View File

@@ -1,15 +1,36 @@
package forge.screens.quest;
import forge.screens.FScreen;
import java.util.Set;
public class QuestBazaarScreen extends FScreen {
import forge.assets.FImage;
import forge.model.FModel;
import forge.quest.bazaar.QuestBazaarManager;
import forge.screens.TabPageScreen;
public class QuestBazaarScreen extends TabPageScreen<QuestBazaarScreen> {
public QuestBazaarScreen() {
super("Bazaar", QuestMenu.getMenu());
super(getPages());
}
@Override
protected void doLayout(float startY, float width, float height) {
// TODO Auto-generated method stub
private static BazaarPage[] getPages() {
int pageNum = 0;
QuestBazaarManager bazaar = FModel.getQuest().getBazaar();
Set<String> stallNames = bazaar.getStallNames();
BazaarPage[] pages = new BazaarPage[stallNames.size()];
for (final String s : stallNames) {
pages[pageNum++] = new BazaarPage(s, (FImage)bazaar.getStall(s).getIcon());
}
return pages;
}
private static class BazaarPage extends TabPage<QuestBazaarScreen> {
private BazaarPage(String caption0, FImage icon0) {
super(caption0, icon0);
}
@Override
protected void doLayout(float width, float height) {
}
}
}

View File

@@ -197,7 +197,7 @@ public class QuestMenu extends FPopupMenu implements IVQuestStats {
//addItem(tournamentsItem); tournamentsItem.setSelected(currentScreen == tournamentsScreen);
addItem(decksItem); decksItem.setSelected(currentScreen == decksScreen);
addItem(spellShopItem); spellShopItem.setSelected(currentScreen == spellShopScreen);
//addItem(bazaarItem); bazaarItem.setSelected(currentScreen == bazaarScreen);
addItem(bazaarItem); bazaarItem.setSelected(currentScreen == bazaarScreen);
addItem(statsItem); statsItem.setSelected(currentScreen == statsScreen);
addItem(unlockSetsItem);
addItem(travelItem);

View File

@@ -68,6 +68,10 @@ public abstract class FScrollPane extends FContainer {
}
public void scrollIntoView(FDisplayObject child) {
scrollIntoView(child, 0);
}
public void scrollIntoView(FDisplayObject child, float margin) {
Vector2 childPos = getChildRelativePosition(child);
if (childPos == null) { return; } //do nothing if not a valid child
@@ -77,18 +81,18 @@ public abstract class FScrollPane extends FContainer {
float childBottom = childTop + child.getHeight();
float dx = 0;
if (childLeft < 0) {
dx = childLeft;
if (childLeft < margin) {
dx = childLeft - margin;
}
else if (childRight > getWidth()) {
dx = childRight - getWidth();
else if (childRight > getWidth() - margin) {
dx = childRight - getWidth() + margin;
}
float dy = 0;
if (childTop < 0) {
dy = childTop;
if (childTop < margin) {
dy = childTop - margin;
}
else if (childBottom > getHeight()) {
dy = childBottom - getHeight();
else if (childBottom > getHeight() - margin) {
dy = childBottom - getHeight() + margin;
}
if (dx == 0 && dy == 0) { return; }