/*
* This file is part of Spoutcraft.
*
* Copyright (c) 2011 SpoutcraftDev <http://spoutcraft.org/>
* Spoutcraft is licensed under the GNU Lesser General Public License.
*
* Spoutcraft is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Spoutcraft is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.spoutcraft.client.gui.server;
import org.lwjgl.Sys;
import org.spoutcraft.api.Spoutcraft;
import org.spoutcraft.api.gui.Button;
import org.spoutcraft.api.gui.Color;
import org.spoutcraft.api.gui.GenericButton;
import org.spoutcraft.api.gui.GenericLabel;
import org.spoutcraft.api.gui.GenericListView;
import org.spoutcraft.api.gui.GenericScrollArea;
import org.spoutcraft.api.gui.Label;
import org.spoutcraft.api.gui.Orientation;
import org.spoutcraft.api.gui.Widget;
import org.spoutcraft.client.SpoutClient;
import org.spoutcraft.client.gui.database.FilterButton;
import org.spoutcraft.client.gui.database.GuiAPIDisplay;
import org.spoutcraft.client.gui.database.RandomButton;
import org.spoutcraft.client.gui.database.SearchField;
import org.spoutcraft.client.gui.database.SortButton;
public class GuiServerList extends GuiAPIDisplay {
private ServerListModel model = SpoutClient.getInstance().getServerManager().getServerList();
private Label labelTitle, filterTitle;
private GenericListView view;
private GenericScrollArea filters;
private Button buttonJoin, buttonMainMenu, buttonFavorites, buttonRefresh, buttonReset, buttonAddServer, buttonInfo;
SortButton featured, popular, byName, byFreeSlots, /* byPing, */ byPlayers, trending;
RandomButton random;
FilterButton hasPlayers, notFull;
AccessTypeFilter accessType;
CountryButton buttonCountry;
SearchField search;
boolean instancesCreated = false;
public GuiServerList() {
model.setCurrentGui(this);
}
public void createInstances() {
labelTitle = new GenericLabel("Public Server List");
filters = new GenericScrollArea();
filterTitle = new GenericLabel("Sort & Filter");
featured = new SortButton("Featured", "featured", model);
popular = new SortButton("Popular", "popular", model);
trending = new SortButton("Trending", "trending", model);
byName = new SortButton("Name", "sortBy=name", model);
byFreeSlots = new SortButton("Free Slots", "sortBy=freeslots", false, model);
byPlayers = new SortButton("Players Online", "sortBy=players", false, model);
//byPing = new SortButton("Ping", "sortBy=ping", model);
random = new RandomButton(model);
hasPlayers = new FilterButton("Has Players", "hasplayers", model);
notFull = new FilterButton("Not Full", "notfull", model);
accessType = new AccessTypeFilter(model);
search = new SearchField(model);
buttonCountry = new CountryButton();
view = new GenericListView(model);
buttonJoin = new GenericButton("Join Server");
buttonMainMenu = new GenericButton("Main Menu");
buttonFavorites = new GenericButton("Favorites");
buttonRefresh = new GenericButton("Refresh");
buttonReset = new GenericButton("Reset Filters");
buttonAddServer = new GenericButton("Add Your Server");
buttonInfo = new GenericButton("More Info...");
if (!model.getCurrentUrl().equals(model.getDefaultUrl())) {
model.clear();
model.refreshAPIData(model.getDefaultUrl(), 0, true);
}
}
public void initGui() {
model.clearUrlElements();
if (!instancesCreated) {
createInstances();
}
int top = 5;
labelTitle.setY(top + 7).setX(width / 2 - mc.fontRenderer.getStringWidth("Public Server List") / 2);
getScreen().attachWidget("Spoutcraft", labelTitle);
buttonRefresh.setX(width - 5 - 100).setY(top).setWidth(100).setHeight(20);
getScreen().attachWidget("Spoutcraft", buttonRefresh);
search.setWidth(128).setHeight(18).setX(6).setY(top+1);
getScreen().attachWidget("Spoutcraft", search);
model.addUrlElement(search);
top+=25;
filters.setWidth(130).setHeight(height - top - 55);
filters.setX(5).setY(top);
getScreen().attachWidget("Spoutcraft", filters);
// Filter init {
int ftop = 5;
filterTitle.setX(5).setY(ftop).setHeight(11).setWidth(100);
filters.attachWidget("Spoutcraft", filterTitle);
ftop += 16;
featured.setAllowSorting(false);
featured.setWidth(100).setHeight(20).setX(5).setY(ftop);
filters.attachWidget("Spoutcraft", featured);
model.addUrlElement(featured);
ftop += 25;
trending.setAllowSorting(false);
trending.setWidth(100).setHeight(20).setX(5).setY(ftop);
filters.attachWidget("Spoutcraft", trending);
model.addUrlElement(trending);
ftop += 25;
popular.setAllowSorting(false);
popular.setWidth(100).setHeight(20).setX(5).setY(ftop);
filters.attachWidget("Spoutcraft", popular);
model.addUrlElement(popular);
ftop += 25;
random.setWidth(100).setHeight(20).setX(5).setY(ftop);
filters.attachWidget("Spoutcraft", random);
model.addUrlElement(random);
ftop += 25;
byName.setWidth(100).setHeight(20).setX(5).setY(ftop);
filters.attachWidget("Spoutcraft", byName);
model.addUrlElement(byName);
ftop += 25;
byFreeSlots.setWidth(100).setHeight(20).setX(5).setY(ftop);
byFreeSlots.setTooltip("Sorts by the number of free slots\non the server (maxplayers - players)");
filters.attachWidget("Spoutcraft", byFreeSlots);
model.addUrlElement(byFreeSlots);
ftop += 25;
byPlayers.setWidth(100).setHeight(20).setX(5).setY(ftop);
byPlayers.setTooltip("Sorts by the actual number of\nonline players on the server");
filters.attachWidget("Spoutcraft", byPlayers);
model.addUrlElement(byPlayers);
ftop += 25;
/*byPing.setWidth(100).setHeight(20).setX(5).setY(ftop);
filters.attachWidget("Spoutcraft", byPing);
model.addUrlElement(byPing);
ftop += 25;*/
hasPlayers.setWidth(100).setHeight(20).setX(5).setY(ftop);
filters.attachWidget("Spoutcraft", hasPlayers);
model.addUrlElement(hasPlayers);
ftop += 25;
notFull.setWidth(100).setHeight(20).setX(5).setY(ftop);
filters.attachWidget("Spoutcraft", notFull);
model.addUrlElement(notFull);
ftop += 25;
accessType.setWidth(100).setHeight(20).setX(5).setY(ftop);
filters.attachWidget("Spoutcraft", accessType);
model.addUrlElement(accessType);
ftop += 25;
buttonCountry.setWidth(100).setHeight(20).setX(5).setY(ftop);
filters.attachWidget("Spoutcraft", buttonCountry);
model.addUrlElement(buttonCountry);
ftop += 25;
// Stretch to real width
int fw = filters.getViewportSize(Orientation.HORIZONTAL);
fw-=10;
for (Widget w:filters.getAttachedWidgets()) {
w.setWidth(fw);
}
if (!instancesCreated) {
featured.setSelected(true);
}
// Filter init }
view.setX((int) filters.getWidth() + filters.getX() + 5).setY(top).setWidth((int) (width - filters.getWidth() - 10 - filters.getX())).setHeight(height - top - 55);
getScreen().attachWidget("Spoutcraft", view);
top += view.getHeight() + 5;
int totalWidth = Math.min(width - 9, 200 * 3 + 10);
int cellWidth = (totalWidth - 10) / 3;
int left = width / 2 - totalWidth / 2;
int center = left + cellWidth + 5;
int right = center + cellWidth + 5;
buttonReset.setX(left).setY(top).setWidth(cellWidth).setHeight(20);
getScreen().attachWidget("Spoutcraft", buttonReset);
buttonInfo.setX(center).setY(top).setWidth(cellWidth).setHeight(20);
getScreen().attachWidget("Spoutcraft", buttonInfo);
buttonJoin.setHeight(20).setWidth(cellWidth).setX(right).setY(top);
getScreen().attachWidget("Spoutcraft", buttonJoin);
top+=25;
buttonAddServer.setHeight(20).setWidth(cellWidth).setX(left).setY(top);
getScreen().attachWidget("Spoutcraft", buttonAddServer);
buttonFavorites.setHeight(20).setWidth(cellWidth).setX(center).setY(top);
getScreen().attachWidget("Spoutcraft", buttonFavorites);
buttonMainMenu.setHeight(20).setWidth(cellWidth).setX(right).setY(top);
getScreen().attachWidget("Spoutcraft", buttonMainMenu);
updateButtons();
instancesCreated = true;
}
public void drawScreen(int a, int b, float c) {
drawDefaultBackground();
}
public void buttonClicked(Button btn) {
if (btn.equals(buttonMainMenu)) {
mc.displayGuiScreen(new org.spoutcraft.client.gui.mainmenu.MainMenu());
}
if (btn.equals(buttonFavorites)) {
GuiFavorites fav = new GuiFavorites(new org.spoutcraft.client.gui.mainmenu.MainMenu());
mc.displayGuiScreen(fav);
fav.refresh();
}
if (btn.equals(buttonJoin)) {
ServerItem item = (ServerItem) view.getSelectedItem();
if (item != null) {
item.onClick(-1, -1, true);
} else {
updateButtons();
}
}
if (btn.equals(buttonRefresh)) {
model.updateUrl();
}
if (btn.equals(buttonReset)) {
model.clearElementFilters();
featured.setSelected(true);
model.updateUrl();
}
if (btn.equals(buttonAddServer)) {
Sys.openURL("http://servers.spout.org/submit");
}
if (btn.equals(buttonInfo)) {
ServerItem item = (ServerItem) view.getSelectedItem();
if (item != null) {
mc.displayGuiScreen(new GuiServerInfo(item, this));
} else {
updateButtons();
}
}
}
public void updateButtons() {
boolean b = true;
if (view.getSelectedRow() == -1 || !(view.getSelectedItem() instanceof ServerItem)) {
b = false;
}
buttonJoin.setEnabled(b);
if (view.getSelectedItem() instanceof ServerItem) {
ServerItem item = (ServerItem) view.getSelectedItem();
buttonJoin.setEnabled(item.isCompatible(SpoutClient.spoutcraftVersion));
}
buttonInfo.setEnabled(b);
if (model.isLoading()) {
buttonRefresh.setEnabled(false);
buttonRefresh.setText("Loading...");
buttonRefresh.setDisabledColor(new Color(0f,1f,0f));
} else {
buttonRefresh.setEnabled(true);
buttonRefresh.setText("Refresh");
}
}
@Override
public void updateScreen() {
if (model.isLoading()) {
Color color = new Color(0, 1f, 0);
double darkness = 0;
long t = System.currentTimeMillis() % 1000;
darkness = Math.cos(t * 2 * Math.PI / 1000) * 0.2 + 0.2;
color.setGreen(1f - (float)darkness);
buttonRefresh.setDisabledColor(color);
}
super.updateScreen();
}
}