Start working on header for match screen

This commit is contained in:
drdev
2014-03-16 21:58:15 +00:00
parent 33edd69fa4
commit 3a40132ba3
16 changed files with 345 additions and 70 deletions

6
.gitattributes vendored
View File

@@ -16119,14 +16119,18 @@ forge-m-base/src/forge/screens/match/input/InputSyncronizedBase.java -text
forge-m-base/src/forge/screens/match/views/VAssignDamage.java -text
forge-m-base/src/forge/screens/match/views/VAvatar.java -text
forge-m-base/src/forge/screens/match/views/VCardDisplayArea.java -text
forge-m-base/src/forge/screens/match/views/VCombat.java -text
forge-m-base/src/forge/screens/match/views/VDev.java -text
forge-m-base/src/forge/screens/match/views/VDisplayArea.java -text
forge-m-base/src/forge/screens/match/views/VField.java -text
forge-m-base/src/forge/screens/match/views/VFlashbackZone.java -text
forge-m-base/src/forge/screens/match/views/VGameDetails.java -text
forge-m-base/src/forge/screens/match/views/VHeader.java -text
forge-m-base/src/forge/screens/match/views/VLog.java -text
forge-m-base/src/forge/screens/match/views/VManaPool.java -text
forge-m-base/src/forge/screens/match/views/VMenu.java -text
forge-m-base/src/forge/screens/match/views/VPhaseIndicator.java -text
forge-m-base/src/forge/screens/match/views/VPlayerPanel.java -text
forge-m-base/src/forge/screens/match/views/VPlayers.java -text
forge-m-base/src/forge/screens/match/views/VPrompt.java -text
forge-m-base/src/forge/screens/match/views/VStack.java -text
forge-m-base/src/forge/screens/match/views/VZoneDisplay.java -text

View File

@@ -14,18 +14,18 @@ import forge.toolbox.FLabel;
import forge.utils.Utils;
public abstract class FScreen extends FContainer {
public static final float HEADER_HEIGHT = Math.round(Utils.AVG_FINGER_HEIGHT * 0.8f);
public static final FSkinColor TEXTURE_OVERLAY_COLOR = FSkinColor.get(Colors.CLR_THEME);
public static final FSkinColor HEADER_BTN_PRESSED_COLOR = TEXTURE_OVERLAY_COLOR.stepColor(0);
public static final FSkinColor HEADER_LINE_COLOR = HEADER_BTN_PRESSED_COLOR.stepColor(-40);
public static final FSkinColor HEADER_BACK_COLOR = HEADER_BTN_PRESSED_COLOR.stepColor(-80);
private static final FSkinColor clrTheme = FSkinColor.get(Colors.CLR_THEME);
private static final FSkinColor clr = clrTheme.stepColor(0);
private static final FSkinColor d40 = clr.stepColor(-40);
private static final FSkinColor d80 = clr.stepColor(-80);
public static final float HEADER_HEIGHT = Math.round(Utils.AVG_FINGER_HEIGHT * 0.8f);
private final FLabel btnBack, lblHeader, btnMenu;
protected FScreen(boolean showBackButton, String headerCaption, boolean showMenuButton) {
if (showBackButton) {
btnBack = add(new FLabel.Builder().icon(new BackIcon()).pressedColor(clr).align(HAlignment.CENTER).command(new Runnable() {
btnBack = add(new FLabel.Builder().icon(new BackIcon()).pressedColor(HEADER_BTN_PRESSED_COLOR).align(HAlignment.CENTER).command(new Runnable() {
@Override
public void run() {
Forge.back();
@@ -42,7 +42,7 @@ public abstract class FScreen extends FContainer {
lblHeader = null;
}
if (showMenuButton) {
btnMenu = add(new FLabel.Builder().icon(FSkinImage.FAVICON).pressedColor(clr).align(HAlignment.CENTER).command(new Runnable() {
btnMenu = add(new FLabel.Builder().icon(FSkinImage.FAVICON).pressedColor(HEADER_BTN_PRESSED_COLOR).align(HAlignment.CENTER).command(new Runnable() {
@Override
public void run() {
showMenu();
@@ -102,11 +102,11 @@ public abstract class FScreen extends FContainer {
float w = getWidth();
float h = getHeight();
g.drawImage(FSkinTexture.BG_TEXTURE, 0, 0, w, h);
g.fillRect(clrTheme, 0, 0, w, h);
g.fillRect(TEXTURE_OVERLAY_COLOR, 0, 0, w, h);
if (lblHeader != null) { //draw custom background behind header label
g.fillRect(d80, 0, 0, w, HEADER_HEIGHT);
g.drawLine(1, d40, 0, HEADER_HEIGHT, w, HEADER_HEIGHT);
g.fillRect(HEADER_BACK_COLOR, 0, 0, w, HEADER_HEIGHT);
g.drawLine(1, HEADER_LINE_COLOR, 0, HEADER_HEIGHT, w, HEADER_HEIGHT);
}
}

View File

@@ -172,8 +172,6 @@ public class FControl {
super.onActivate();
}
};
view.getGameDetails().init(players);
}
private static List<Player> shiftPlayersPlaceLocalFirst(final List<Player> players, LobbyPlayer localPlayer) {
@@ -230,6 +228,10 @@ public class FControl {
}
}
public static Iterable<Player> getSortedPlayers() {
return sortedPlayers;
}
public static Player getCurrentPlayer() {
// try current priority
Player currentPriority = game.getPhaseHandler().getPriorityPlayer();

View File

@@ -148,7 +148,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
@Override
public void run() {
stackUpdPlanned.set(false);
FControl.getView().getStack().update();
FControl.getView().updateStack();
}
};

View File

@@ -7,11 +7,9 @@ import java.util.Map;
import forge.model.FModel;
import forge.screens.FScreen;
import forge.screens.match.views.VAvatar;
import forge.screens.match.views.VGameDetails;
import forge.screens.match.views.VLog;
import forge.screens.match.views.VHeader;
import forge.screens.match.views.VPlayerPanel;
import forge.screens.match.views.VPrompt;
import forge.screens.match.views.VStack;
import forge.toolbox.VCardZoom;
import forge.Forge.Graphics;
import forge.assets.FSkinColor;
@@ -24,16 +22,14 @@ public class MatchScreen extends FScreen {
public static FSkinColor BORDER_COLOR = FSkinColor.get(Colors.CLR_BORDERS);
private final Map<Player, VPlayerPanel> playerPanels = new HashMap<Player, VPlayerPanel>();
private final VLog log;
private final VStack stack;
private final VHeader header;
private final VPrompt prompt;
private final VGameDetails gameDetails;
private final VCardZoom cardZoom;
private VPlayerPanel bottomPlayerPanel, topPlayerPanel;
public MatchScreen(List<VPlayerPanel> playerPanels0) {
super(true, "Game", true);
super(false, null, false); //match screen has custom header
for (VPlayerPanel playerPanel : playerPanels0) {
playerPanels.put(playerPanel.getPlayer(), add(playerPanel));
@@ -43,6 +39,8 @@ public class MatchScreen extends FScreen {
topPlayerPanel.setFlipped(true);
bottomPlayerPanel.setSelectedZone(ZoneType.Hand);
header = add(new VHeader());
prompt = add(new VPrompt("", "",
new Runnable() {
@Override
@@ -57,13 +55,22 @@ public class MatchScreen extends FScreen {
}
}));
cardZoom = add(new VCardZoom());
}
log = add(new VLog());
stack = add(new VStack());
gameDetails = add(new VGameDetails());
log.setVisible(false);
stack.setVisible(false);
gameDetails.setVisible(false);
public void updatePlayers() {
header.getTabPlayers().update();
}
public void updateLog() {
header.getTabLog().update();
}
public void updateCombat() {
header.getTabCombat().update();
}
public void updateStack() {
header.getTabStack().update();
}
public VPrompt getPrompt() {
@@ -74,18 +81,6 @@ public class MatchScreen extends FScreen {
return cardZoom;
}
public VStack getStack() {
return stack;
}
public VLog getLog() {
return log;
}
public VGameDetails getGameDetails() {
return gameDetails;
}
public VPlayerPanel getTopPlayerPanel() {
return topPlayerPanel;
}
@@ -127,6 +122,9 @@ public class MatchScreen extends FScreen {
@Override
protected void doLayout(float startY, float width, float height) {
header.setBounds(0, 0, width, VHeader.HEIGHT);
startY = FScreen.HEADER_HEIGHT;
//determine player panel heights based on visibility of zone displays
float topPlayerPanelHeight, bottomPlayerPanelHeight;
float cardRowsHeight = height - startY - VPrompt.HEIGHT - 2 * VAvatar.HEIGHT;
@@ -151,9 +149,7 @@ public class MatchScreen extends FScreen {
topPlayerPanelHeight += VAvatar.HEIGHT;
bottomPlayerPanelHeight += VAvatar.HEIGHT;
//log.setBounds(0, startY, width - FScreen.HEADER_HEIGHT, VLog.HEIGHT);
topPlayerPanel.setBounds(0, startY, width, topPlayerPanelHeight);
stack.setBounds(0, startY + topPlayerPanelHeight - VStack.HEIGHT / 2, VStack.WIDTH, VStack.HEIGHT);
bottomPlayerPanel.setBounds(0, height - VPrompt.HEIGHT - bottomPlayerPanelHeight, width, bottomPlayerPanelHeight);
prompt.setBounds(0, height - VPrompt.HEIGHT, width, VPrompt.HEIGHT);
cardZoom.setBounds(0, 0, width, height);

View File

@@ -0,0 +1,20 @@
package forge.screens.match.views;
public class VCombat extends VDisplayArea {
@Override
protected void doLayout(float width, float height) {
// TODO Auto-generated method stub
}
@Override
public int getCount() {
return -1;
}
@Override
public void update() {
// TODO Auto-generated method stub
}
}

View File

@@ -0,0 +1,20 @@
package forge.screens.match.views;
public class VDev extends VDisplayArea {
@Override
protected void doLayout(float width, float height) {
// TODO Auto-generated method stub
}
@Override
public int getCount() {
return -1;
}
@Override
public void update() {
// TODO Auto-generated method stub
}
}

View File

@@ -3,6 +3,9 @@ package forge.screens.match.views;
import forge.toolbox.FScrollPane;
public abstract class VDisplayArea extends FScrollPane {
public VDisplayArea() {
setVisible(false); //hide by default
}
public abstract int getCount();
public abstract void update();
}

View File

@@ -13,6 +13,7 @@ public class VField extends VZoneDisplay {
public VField(Player player0) {
super(player0, ZoneType.Battlefield);
setVisible(true); //unlike other display areas, show by default
}
public boolean isFlipped() {

View File

@@ -0,0 +1,197 @@
package forge.screens.match.views;
import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment;
import forge.Forge.Graphics;
import forge.assets.FSkinColor;
import forge.assets.FSkinFont;
import forge.assets.FSkinImage;
import forge.assets.FSkinColor.Colors;
import forge.model.FModel;
import forge.screens.FScreen;
import forge.screens.match.FControl;
import forge.toolbox.FContainer;
import forge.toolbox.FDisplayObject;
import forge.toolbox.FLabel;
import forge.utils.ForgePreferences.FPref;
public class VHeader extends FContainer {
public static final float HEIGHT = VAvatar.HEIGHT - VPhaseIndicator.HEIGHT;
private static final FSkinFont TAB_FONT = FSkinFont.get(12);
private static final FSkinColor TAB_FORE_COLOR = FSkinColor.get(Colors.CLR_TEXT);
private static final FSkinColor DISPLAY_AREA_BACK_COLOR = FSkinColor.get(Colors.CLR_INACTIVE).alphaColor(0.5f);
private static final float TAB_PADDING_X = 6f;
private final HeaderTab tabPlayers;
private final HeaderTab tabLog;
private final HeaderTab tabCombat;
private final HeaderTab tabDev;
private final HeaderTab tabStack;
private final FLabel btnMenu;
private HeaderTab selectedTab;
public VHeader() {
tabPlayers = add(new HeaderTab("Players", new VPlayers()));
tabLog = add(new HeaderTab("Log", new VLog()));
tabCombat = add(new HeaderTab("Combat", new VCombat()));
tabDev = add(new HeaderTab("Dev", new VDev()));
tabStack = add(new HeaderTab("Stack", new VStack()));
btnMenu = add(new FLabel.Builder().icon(FSkinImage.FAVICON).pressedColor(FScreen.HEADER_BTN_PRESSED_COLOR).align(HAlignment.CENTER).command(new Runnable() {
@Override
public void run() {
FControl.getView().showMenu();
}
}).build());
}
public HeaderTab getTabPlayers() {
return tabPlayers;
}
public HeaderTab getTabLog() {
return tabLog;
}
public HeaderTab getTabCombat() {
return tabCombat;
}
public HeaderTab getTabDev() {
return tabDev;
}
public HeaderTab getTabStack() {
return tabStack;
}
public HeaderTab getSelectedTab() {
return selectedTab;
}
private void setSelectedTab(HeaderTab selectedTab0) {
if (selectedTab == selectedTab0) {
return;
}
if (selectedTab != null) {
selectedTab.displayArea.setVisible(false);
}
selectedTab = selectedTab0;
if (selectedTab != null) {
selectedTab.displayArea.setVisible(true);
}
}
@Override
protected void doLayout(float width, float height) {
float x = 0;
x = tabPlayers.layout(x);
x = tabLog.layout(x);
x = tabCombat.layout(x);
if (FModel.getPreferences().getPrefBoolean(FPref.DEV_MODE_ENABLED)) {
x = tabDev.layout(x);
tabDev.setVisible(true);
}
else {
tabDev.setVisible(false);
}
x = tabStack.layout(x);
btnMenu.setBounds(width - height, 0, height, height);
}
@Override
public void drawBackground(Graphics g) {
float w = getWidth();
float h = getHeight();
g.fillRect(FScreen.HEADER_BACK_COLOR, 0, 0, w, h);
if (selectedTab == null) {
g.drawLine(1, FScreen.HEADER_LINE_COLOR, 0, h, w, h);
}
else { //draw background and border for selected zone if needed
VDisplayArea selectedDisplayArea = selectedTab.displayArea;
g.fillRect(DISPLAY_AREA_BACK_COLOR, 0, selectedDisplayArea.getTop(), w, selectedDisplayArea.getHeight());
//leave gap at selected zone tab
g.drawLine(1, FScreen.HEADER_LINE_COLOR, 0, h, selectedTab.getLeft(), h);
g.drawLine(1, FScreen.HEADER_LINE_COLOR, selectedTab.getRight(), h, w, h);
}
}
public class HeaderTab extends FDisplayObject {
private String text;
private String caption;
private final VDisplayArea displayArea;
private HeaderTab(String text0, VDisplayArea displayArea0) {
text = text0;
displayArea = displayArea0;
setHeight(HEIGHT);
update();
}
private float layout(float x) {
setLeft(x);
return x + getWidth();
}
@Override
public boolean tap(float x, float y, int count) {
if (selectedTab == this) {
setSelectedTab(null);
}
else {
setSelectedTab(this);
}
return true;
}
public void update() {
displayArea.update();
int count = displayArea.getCount();
if (count >= 0) {
caption = text + " (" + String.valueOf(count) + ")";
}
else { //if getCount() returns -1, don't include count in caption
caption = text;
}
setWidth(TAB_FONT.getFont().getBounds(caption).width + TAB_PADDING_X);
VHeader.this.revalidate();
}
@Override
public void draw(Graphics g) {
float x, y, w, h;
float paddingX = 2;
float paddingY = 2;
if (selectedTab == this) {
y = 0;
w = getWidth();
h = getHeight();
float yAcross;
y += paddingY;
yAcross = y;
y--;
h++;
g.fillRect(DISPLAY_AREA_BACK_COLOR, 0, paddingY, w, getHeight() - paddingY);
g.startClip(-1, y, w + 2, h); //use clip to ensure all corners connect
g.drawLine(1, FScreen.HEADER_LINE_COLOR, 0, yAcross, w, yAcross);
g.drawLine(1, FScreen.HEADER_LINE_COLOR, 0, y, 0, h);
g.drawLine(1, FScreen.HEADER_LINE_COLOR, w, y, w, h);
g.endClip();
}
x = paddingX;
y = paddingY;
w = getWidth() - 2 * paddingX;
h = getHeight() - 2 * paddingY;
g.drawText(caption, TAB_FONT, TAB_FORE_COLOR, x, y, w, h, false, HAlignment.CENTER, true);
}
}
}

View File

@@ -1,11 +1,20 @@
package forge.screens.match.views;
import forge.toolbox.FContainer;
public class VLog extends FContainer {
public class VLog extends VDisplayArea {
@Override
protected void doLayout(float width, float height) {
// TODO Auto-generated method stub
}
@Override
public int getCount() {
return -1;
}
@Override
public void update() {
// TODO Auto-generated method stub
}
}

View File

@@ -0,0 +1,21 @@
package forge.screens.match.views;
public class VMenu extends VDisplayArea {
@Override
protected void doLayout(float width, float height) {
// TODO Auto-generated method stub
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void update() {
// TODO Auto-generated method stub
}
}

View File

@@ -23,7 +23,7 @@ public class VPlayerPanel extends FContainer {
private static final FSkinFont LIFE_FONT = FSkinFont.get(18);
private static final FSkinFont INFO_FONT = FSkinFont.get(12);
private static final FSkinColor INFO_FORE_COLOR = FSkinColor.get(Colors.CLR_TEXT);
private static final FSkinColor ZONE_BACK_COLOR = FSkinColor.get(Colors.CLR_INACTIVE).alphaColor(0.5f);
private static final FSkinColor DISPLAY_AREA_BACK_COLOR = FSkinColor.get(Colors.CLR_INACTIVE).alphaColor(0.5f);
private final Player player;
private final VPhaseIndicator phaseIndicator;
@@ -47,12 +47,10 @@ public class VPlayerPanel extends FContainer {
addZoneDisplay(ZoneType.Library, FSkinImage.LIBRARY);
VFlashbackZone flashbackZone = add(new VFlashbackZone(player0));
flashbackZone.setVisible(false);
tabFlashbackZone = add(new InfoTab(FSkinImage.FLASHBACK, flashbackZone));
tabs.add(tabFlashbackZone);
VManaPool manaPool = add(new VManaPool(player));
manaPool.setVisible(false);
tabManaPool = add(new InfoTab(FSkinImage.MANA_X, manaPool));
tabs.add(tabManaPool);
@@ -66,7 +64,6 @@ public class VPlayerPanel extends FContainer {
public void addZoneDisplay(ZoneType zoneType, FSkinImage tabIcon) {
VZoneDisplay zoneDisplay = add(new VZoneDisplay(player, zoneType));
zoneDisplay.setVisible(false);
InfoTab zoneTab = add(new InfoTab(tabIcon, zoneDisplay));
zoneTabs.put(zoneType, zoneTab);
tabs.add(zoneTab);
@@ -180,7 +177,7 @@ public class VPlayerPanel extends FContainer {
if (selectedTab != null) { //draw background and border for selected zone if needed
float w = getWidth();
VDisplayArea selectedDisplayArea = selectedTab.displayArea;
g.fillRect(ZONE_BACK_COLOR, 0, selectedDisplayArea.getTop(), w, selectedDisplayArea.getHeight());
g.fillRect(DISPLAY_AREA_BACK_COLOR, 0, selectedDisplayArea.getTop(), w, selectedDisplayArea.getHeight());
float y = isFlipped() ? selectedDisplayArea.getTop() + 1 : selectedDisplayArea.getBottom();
//leave gap at selected zone tab
@@ -254,7 +251,7 @@ public class VPlayerPanel extends FContainer {
y--;
h += 2;
}
g.fillRect(ZONE_BACK_COLOR, 0, isFlipped() ? paddingY : 0, w, getHeight() - paddingY);
g.fillRect(DISPLAY_AREA_BACK_COLOR, 0, isFlipped() ? paddingY : 0, w, getHeight() - paddingY);
g.startClip(-1, y, w + 2, h); //use clip to ensure all corners connect
g.drawLine(1, MatchScreen.BORDER_COLOR, 0, yAcross, w, yAcross);
g.drawLine(1, MatchScreen.BORDER_COLOR, 0, y, 0, h);

View File

@@ -5,25 +5,23 @@ import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import forge.game.Game;
import forge.game.GameType;
import forge.game.card.Card;
import forge.game.card.CardFactoryUtil;
import forge.game.player.Player;
import forge.game.zone.ZoneType;
import forge.model.FModel;
import forge.toolbox.FContainer;
import forge.screens.match.FControl;
import forge.toolbox.FLabel;
import forge.utils.ForgePreferences.FPref;
public class VGameDetails extends FContainer {
public class VPlayers extends VDisplayArea {
private Map<Player, InfoLabel[]> infoLabels;
private InfoLabel stormLabel;
public void init(final Iterable<Player> players) {
clear();
public VPlayers() {
infoLabels = new HashMap<Player, InfoLabel[]>();
for (final Player p : players) {
for (final Player p : FControl.getSortedPlayers()) {
// Create and store labels detailing various non-critical player info.
final InfoLabel name = add(new InfoLabel());
final InfoLabel life = add(new InfoLabel());
@@ -41,9 +39,8 @@ public class VGameDetails extends FContainer {
stormLabel = add(new InfoLabel());
}
@Override
public void update() {
if (!isVisible()) { return; } //No need to update if this panel isn't showing
for (Entry<Player, InfoLabel[]> rr : infoLabels.entrySet()) {
Player p0 = rr.getKey();
final InfoLabel[] temp = rr.getValue();
@@ -74,14 +71,7 @@ public class VGameDetails extends FContainer {
temp[7].setText(CardFactoryUtil.getCommanderInfo(p0));
}
}
}
/**
* @param game */
public void updateStormLabel(Game game) {
if (!isVisible()) { return; } //No need to update if this panel isn't showing
stormLabel.setText("Storm count: " + game.getStack().getCardsCastThisTurn().size());
stormLabel.setText("Storm count: " + FControl.getGame().getStack().getCardsCastThisTurn().size());
}
@Override
@@ -95,4 +85,9 @@ public class VGameDetails extends FContainer {
super(new FLabel.Builder());
}
}
@Override
public int getCount() {
return infoLabels.size();
}
}

View File

@@ -2,10 +2,9 @@ package forge.screens.match.views;
import forge.Forge.Graphics;
import forge.toolbox.FCardPanel;
import forge.toolbox.FContainer;
import forge.utils.Utils;
public class VStack extends FContainer {
public class VStack extends VDisplayArea {
public static final float WIDTH = Utils.AVG_FINGER_WIDTH;
public static final float HEIGHT = WIDTH * FCardPanel.ASPECT_RATIO;
@@ -13,8 +12,16 @@ public class VStack extends FContainer {
setSize(WIDTH, HEIGHT);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void update() {
//TODO
// TODO Auto-generated method stub
}
@Override

View File

@@ -59,7 +59,10 @@ public abstract class FContainer extends FDisplayObject {
}
public void revalidate() {
doLayout(getWidth(), getHeight());
float w = getWidth();
float h = getHeight();
if (w == 0 || h == 0) { return; } //don't revalidate if size not set yet
doLayout(w, h);
}
protected abstract void doLayout(float width, float height);