diff --git a/forge-gui-mobile/src/forge/screens/TabPageScreen.java b/forge-gui-mobile/src/forge/screens/TabPageScreen.java index 943e393b930..1eb2288f670 100644 --- a/forge-gui-mobile/src/forge/screens/TabPageScreen.java +++ b/forge-gui-mobile/src/forge/screens/TabPageScreen.java @@ -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> extends FScreen { protected final TabPage[] tabPages; private TabPage selectedPage; + private final TabHeader tabHeader; @SuppressWarnings("unchecked") public TabPageScreen(TabPage... tabPages0) { super(new TabHeader(tabPages0)); + tabHeader = (TabHeader)getHeader(); //cache reference to tab header with proper type int index = 0; tabPages = tabPages0; @@ -46,6 +49,9 @@ public class TabPageScreen> 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> 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[] 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> extends FScreen { btnBack.setSize(BACK_BUTTON_WIDTH, HEIGHT); for (TabPage tabPage : tabPages) { - add(tabPage.tab); + scroller.add(tabPage.tab); } } @@ -91,8 +129,10 @@ public class TabPageScreen> 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> 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); } } diff --git a/forge-gui-mobile/src/forge/screens/quest/QuestBazaarScreen.java b/forge-gui-mobile/src/forge/screens/quest/QuestBazaarScreen.java index a566d2118cf..e70f40e592f 100644 --- a/forge-gui-mobile/src/forge/screens/quest/QuestBazaarScreen.java +++ b/forge-gui-mobile/src/forge/screens/quest/QuestBazaarScreen.java @@ -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 { 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 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 { + private BazaarPage(String caption0, FImage icon0) { + super(caption0, icon0); + } + + @Override + protected void doLayout(float width, float height) { + } } } diff --git a/forge-gui-mobile/src/forge/screens/quest/QuestMenu.java b/forge-gui-mobile/src/forge/screens/quest/QuestMenu.java index b98aeb44c42..ccc8495da19 100644 --- a/forge-gui-mobile/src/forge/screens/quest/QuestMenu.java +++ b/forge-gui-mobile/src/forge/screens/quest/QuestMenu.java @@ -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); diff --git a/forge-gui-mobile/src/forge/toolbox/FScrollPane.java b/forge-gui-mobile/src/forge/toolbox/FScrollPane.java index e368ce7c8ec..be41b91b8ac 100644 --- a/forge-gui-mobile/src/forge/toolbox/FScrollPane.java +++ b/forge-gui-mobile/src/forge/toolbox/FScrollPane.java @@ -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; }