package vazkii.minetunes.gui;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFileChooser;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.GL11;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiTextField;
import net.minecraft.client.gui.ScaledResolution;
import net.minecraft.client.resources.I18n;
import net.minecraft.util.text.TextFormatting;
import vazkii.minetunes.MineTunes;
import vazkii.minetunes.config.MTConfig;
import vazkii.minetunes.player.chooser.FileSelector;
import vazkii.minetunes.player.chooser.action.ActionMakePlaylist;
import vazkii.minetunes.player.chooser.filter.PlaylistFilter;
import vazkii.minetunes.playlist.MP3Metadata;
import vazkii.minetunes.playlist.Playlist;
import vazkii.minetunes.playlist.PlaylistList;
public class GuiPlaylistManager extends GuiMineTunes {
public volatile static int currentPlaylist = 0;
public volatile static int currentSong = 0;
static int selectedPlaylist = 0;
static MP3Metadata selectedSong = null;
GuiPlaylistSlot playlistSlot;
GuiMusicSlot musicSlot;
GuiButton devOptionsButton;
GuiButton showHudButton;
GuiButton moveHudButton;
GuiButton playModeButton;
GuiButton selectPlaylistButton;
GuiButton deletePlaylistButton;
GuiButton reloadPlaylistButton;
GuiTextField playlistNameField;
GuiTextField searchField;
public List<MP3Metadata> visibleSongs = new ArrayList();
@Override
public void initGui() {
buttonList.clear();
buttonList.add(new GuiButton(0, 5, 55, 100, 20, I18n.format("minetunes.gui.exit")));
buttonList.add(devOptionsButton = new GuiButton(1, 5, 30, 100, 20, I18n.format("minetunes.gui.devTools")));
buttonList.add(showHudButton = new GuiButton(2, 125, 5, 90, 20, I18n.format("minetunes.gui.showHud_true")));
buttonList.add(moveHudButton = new GuiButton(3, 225, 5, 70, 20, I18n.format("minetunes.gui.move")));
buttonList.add(playModeButton = new GuiButton(4, 125, 30, 170, 20, I18n.format("minetunes.gui.playMode0")));
buttonList.add(selectPlaylistButton = new GuiButton(5, width - 150, 55, 125, 20, I18n.format("minetunes.gui.selectPlaylist")));
buttonList.add(deletePlaylistButton = new GuiButton(6, 10, height - 25, 88, 20, I18n.format("minetunes.gui.delete")));
buttonList.add(reloadPlaylistButton = new GuiButton(7, 101, height - 25, 88, 20, I18n.format("minetunes.gui.reload")));
playlistNameField = new GuiTextField(0, fontRendererObj, width - 150, 30, 125, 20);
playlistNameField.setMaxStringLength(32);
searchField = new GuiTextField(0, fontRendererObj, 125, 55, 170, 20);
searchField.setFocused(true);
playlistSlot = new GuiPlaylistSlot(this);
musicSlot = new GuiMusicSlot(this);
updateVisibleSongs();
}
@Override
public void drawScreen(int mx, int my, float partialTicks) {
musicSlot.drawScreen(mx, my, partialTicks);
playlistSlot.drawScreen(mx, my, partialTicks);
drawRect(0, 0, width, getTopSize(), 0xFF000000);
drawRect(197, getTopSize(), 200, height, 0xFF000000);
if(PlaylistList.playlistNames.isEmpty()) {
String s = I18n.format("minetunes.gui.noPlaylists");
int sWidth = mc.fontRendererObj.getStringWidth(s);
int xp = 100 - sWidth / 2;
int yp = height / 2 - 5;
drawBox(xp - 10, yp - 10, sWidth + 20, 30);
mc.fontRendererObj.drawStringWithShadow(s, xp, yp, 0xFF4444);
}
GL11.glPushMatrix();
GL11.glScalef(3F, 3F, 3F);
boolean unicode = mc.fontRendererObj.getUnicodeFlag();
mc.fontRendererObj.setUnicodeFlag(true);
mc.fontRendererObj.drawString(I18n.format("minetunes.gui.title"), 2, 1, 0xFFFFFF);
mc.fontRendererObj.setUnicodeFlag(unicode);
GL11.glPopMatrix();
boolean hasName = !playlistNameField.getText().isEmpty();
boolean creatingPlaylist = MineTunes.playlistCreatorThread != null;
if(creatingPlaylist) {
String creating = TextFormatting.DARK_AQUA + I18n.format("minetunes.gui.creatingPlaylist");
String status = MineTunes.playlistCreatorThread.getProgressState();
fontRendererObj.drawStringWithShadow(creating, width - 10 - fontRendererObj.getStringWidth(creating), 30, 0xFFFFFF);
fontRendererObj.drawStringWithShadow(status, width - 10 - fontRendererObj.getStringWidth(status), 42, 0xFFFFFF);
} else {
mc.fontRendererObj.drawString(I18n.format("minetunes.gui.playlistCreator"), width - 149, 20, 0xFFFFFF);
if(!hasName) {
String name = I18n.format("minetunes.gui.playlistName");
drawCenteredString(fontRendererObj, name, playlistNameField.xPosition + playlistNameField.width / 2, playlistNameField.yPosition + 6, 0x444444);
}
playlistNameField.drawTextBox();
}
devOptionsButton.visible = isCtrlKeyDown() && isShiftKeyDown();
selectPlaylistButton.visible = !creatingPlaylist;
selectPlaylistButton.enabled = hasName;
showHudButton.displayString = I18n.format("minetunes.gui.showHud_" + MTConfig.hudEnabled);
moveHudButton.enabled = MTConfig.hudEnabled;
playModeButton.displayString = I18n.format("minetunes.gui.playMode" + MTConfig.playMode);
searchField.drawTextBox();
if(searchField.getText().isEmpty()) {
String s = I18n.format("minetunes.gui.search");
mc.fontRendererObj.drawString(s, searchField.xPosition + searchField.width - mc.fontRendererObj.getStringWidth(s) - 5, searchField.yPosition + 6, 0xAAAAAA);
}
boolean hasPlaylist = getSelectedPlaylist() != null;
deletePlaylistButton.visible = reloadPlaylistButton.visible = hasPlaylist;
deletePlaylistButton.enabled = reloadPlaylistButton.enabled = isShiftKeyDown();
if(hasPlaylist) {
drawBox(8, height - 40, 184, 42);
String s = I18n.format("minetunes.gui.shiftToActivate");
int sWidth = mc.fontRendererObj.getStringWidth(s);
drawCenteredString(fontRendererObj, s, 100, height - 36, isShiftKeyDown() ? 0xFFFFFF : 0x666666);
}
super.drawScreen(mx, my, partialTicks);
}
@Override
protected void keyTyped(char c, int i) throws IOException {
if(MineTunes.playlistCreatorThread == null)
playlistNameField.textboxKeyTyped(c, i);
String searchKey = searchField.getText();
searchField.textboxKeyTyped(c, i);
if(!searchField.getText().equals(searchKey))
updateVisibleSongs();
super.keyTyped(c, i);
}
@Override
protected void mouseClicked(int b, int x, int y) throws IOException {
if(MineTunes.playlistCreatorThread == null)
playlistNameField.mouseClicked(b, x, y);
searchField.mouseClicked(b, x, y);
super.mouseClicked(b, x, y);
}
@Override
public void handleMouseInput() throws IOException {
int mouseX = Mouse.getEventX() * width / mc.displayWidth;
int mouseY = height - Mouse.getEventY() * height / mc.displayHeight - 1;
super.handleMouseInput();
if(musicSlot != null)
musicSlot.handleMouseInput(mouseX, mouseY);
playlistSlot.handleMouseInput(mouseX, mouseY);
}
public void updateVisibleSongs() {
visibleSongs.clear();
Playlist playlist = getSelectedPlaylist();
String searchKey = searchField.getText().toLowerCase();
if(playlist != null)
for(MP3Metadata meta : playlist.metadataList)
if(meta.title.toLowerCase().contains(searchKey) || meta.artist.toLowerCase().contains(searchKey) || meta.album.toLowerCase().contains(searchKey))
visibleSongs.add(meta);
}
@Override
protected void actionPerformed(GuiButton button) {
boolean configChanged = false;
String playlistName = selectedPlaylist >= PlaylistList.playlistNames.size() ? "" : PlaylistList.playlistNames.get(selectedPlaylist);
File playlistFile = PlaylistList.playlists.containsKey(playlistName) ? PlaylistList.playlists.get(playlistName).file : null;
switch(button.id) {
case 0:
mc.displayGuiScreen(null);
break;
case 1:
mc.displayGuiScreen(new GuiDevTools());
break;
case 2:
MTConfig.hudEnabled = !MTConfig.hudEnabled;
configChanged = true;
break;
case 3:
mc.displayGuiScreen(new GuiMoveHUD());
break;
case 4:
MTConfig.playMode = MTConfig.playMode == 3 ? 0 : MTConfig.playMode + 1;
configChanged = true;
break;
case 5:
String name = playlistNameField.getText();
playlistNameField.setText("");
playlistSlot.resetScroll();
new FileSelector(PlaylistFilter.instance, JFileChooser.FILES_AND_DIRECTORIES, ActionMakePlaylist.instance.withName(name));
break;
case 6:
if(currentPlaylist == selectedPlaylist && MineTunes.musicPlayerThread != null)
MineTunes.musicPlayerThread.resetPlayer();
PlaylistList.playlistNames.remove(selectedPlaylist);
PlaylistList.playlists.remove(playlistName);
selectedPlaylist = 0;
PlaylistList.findCompoundAndWrite();
break;
case 7:
actionPerformed(deletePlaylistButton);
ActionMakePlaylist.instance.withName(playlistName).select(playlistFile);
break;
}
if(configChanged)
MTConfig.findCompoundAndWrite();
}
public int getTopSize() {
return 80;
}
public void selectPlaylist(int playlist) {
selectedPlaylist = playlist;
selectedSong = null;
musicSlot.resetScroll();
updateVisibleSongs();
}
public int getSelectedPlaylistIndex() {
return selectedPlaylist;
}
public void selectSong(MP3Metadata song) {
selectedSong = song;
}
public MP3Metadata getSelectedSong() {
return selectedSong;
}
public Playlist getSelectedPlaylist() {
return getPlaylist(getSelectedPlaylistIndex());
}
public static void selectCurrentPlaylist(int playlist, int song) {
currentPlaylist = playlist;
currentSong = song;
if(MineTunes.musicPlayerThread != null)
MineTunes.musicPlayerThread.onPlaylistChange();
}
public static int getCurrentPlaylistIndex() {
return currentPlaylist;
}
public static void selectCurrentSong(int song) {
currentSong = song;
}
public static int getCurrentSong() {
return currentSong;
}
public static Playlist getCurrentPlaylist() {
return getPlaylist(getCurrentPlaylistIndex());
}
public static Playlist getPlaylist(int index) {
if(index >= PlaylistList.playlistNames.size())
return null;
String name = PlaylistList.playlistNames.get(index);
return PlaylistList.playlists.get(name);
}
}