mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 19:28:01 +00:00
Support tabs for Bazaar screen
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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; }
|
||||
|
||||
Reference in New Issue
Block a user