package net.blay09.mods.eirairc.client.gui.screenshot; import com.google.common.collect.Lists; import net.blay09.mods.eirairc.api.event.ScreenshotUploadEvent; import net.blay09.mods.eirairc.client.gui.EiraGui; import net.blay09.mods.eirairc.client.gui.EiraGuiScreen; import net.blay09.mods.eirairc.client.gui.base.GuiAdvancedTextField; import net.blay09.mods.eirairc.client.gui.base.GuiImageButton; import net.blay09.mods.eirairc.client.gui.base.image.GuiFileImage; import net.blay09.mods.eirairc.client.gui.base.image.GuiImage; import net.blay09.mods.eirairc.client.gui.overlay.OverlayYesNo; import net.blay09.mods.eirairc.client.screenshot.Screenshot; import net.blay09.mods.eirairc.client.screenshot.ScreenshotManager; import net.blay09.mods.eirairc.config.ScreenshotAction; import net.blay09.mods.eirairc.util.Globals; import net.blay09.mods.eirairc.util.I19n; import net.blay09.mods.eirairc.util.Utils; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.GuiYesNoCallback; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import java.io.File; import java.util.List; public class GuiScreenshots extends EiraGuiScreen implements GuiYesNoCallback { private static final float TOOLTIP_TIME = 30; private GuiAdvancedTextField txtSearch; private GuiButton btnOpenFolder; private GuiAdvancedTextField txtName; private GuiImageButton btnGoToFirst; private GuiImageButton btnGoToPrevious; private GuiImageButton btnGoToNext; private GuiImageButton btnGoToLast; private GuiImageButton btnZoom; private GuiImageButton btnUpload; private GuiImageButton btnClipboard; private GuiImageButton btnReupload; private GuiImageButton btnFavorite; private GuiImageButton btnDelete; private List<Screenshot> screenshotList; private List<Screenshot> screenshotGroup; private GuiScreenshotPage activePageButton; private int currentIdx; private String lastSearchText = ""; private final List<Screenshot> searchResults = Lists.newArrayList(); private Screenshot currentScreenshot; private GuiImage imgPreview; private int imgX; private int imgY; private boolean isUploading; private boolean buttonsVisible; private float hoverTime; private GuiImageButton hoverObject; public GuiScreenshots(GuiScreen parentScreen) { super(parentScreen); screenshotGroup = ScreenshotManager.getInstance().getScreenshots(); screenshotList = screenshotGroup; } private void setScreenshotGroup(GuiScreenshotPage pageButton, List<Screenshot> screenshotGroup) { if(activePageButton != null) { activePageButton.setActive(false); } pageButton.setActive(true); activePageButton = pageButton; this.screenshotGroup = screenshotGroup; setScreenshotList(screenshotGroup); resetSearch(); } public void setScreenshotList(List<Screenshot> screenshotList) { this.screenshotList = screenshotList; currentIdx = 0; updateScreenshot(); } public void updateScreenshot() { if(screenshotList.isEmpty()) { currentScreenshot = null; if(imgPreview != null) { imgPreview.dispose(); } imgPreview = null; } else if(currentIdx >= 0 && currentIdx < screenshotList.size()) { Screenshot screenshot = screenshotList.get(currentIdx); if(currentScreenshot != screenshot) { if(imgPreview != null) { imgPreview.dispose(); } imgPreview = new GuiFileImage(screenshot.getFile()); imgPreview.loadTexture(); currentScreenshot = screenshot; } txtName.setDefaultText(screenshot.getOriginalName(), false); txtName.setText(screenshot.getName()); if(screenshot.isUploaded()) { btnUpload.visible = false; btnClipboard.visible = true; btnReupload.visible = true; } else { btnUpload.visible = true; btnClipboard.visible = false; btnReupload.visible = false; } setFavoriteButtonState(screenshot.isFavorited()); } } @Override public void initGui() { super.initGui(); MinecraftForge.EVENT_BUS.register(this); final int leftX = width / 2 - 145; final int rightX = width / 2 + 145; final int topY = height / 2 - 80; txtSearch = new GuiAdvancedTextField(0, fontRendererObj, leftX + 2, topY - 10, 200, 16); txtSearch.setEmptyOnRightClick(true); txtSearch.setDefaultText(I19n.format("eirairc:gui.screenshots.search"), true); textFieldList.add(txtSearch); btnOpenFolder = new GuiButton(0, rightX - 85, topY - 12, 85, 20, I19n.format("eirairc:gui.screenshots.openFolder")); buttonList.add(btnOpenFolder); txtName = new GuiAdvancedTextField(1, fontRendererObj, width / 2 - 100, topY + 152, 200, 15); textFieldList.add(txtName); btnGoToFirst = new GuiImageButton(1, width / 2 - 39, topY + 12, EiraGui.atlas.findRegion("button_first")); buttonList.add(btnGoToFirst); btnGoToPrevious = new GuiImageButton(2, width / 2 - 13, topY + 12, EiraGui.atlas.findRegion("button_prev")); buttonList.add(btnGoToPrevious); btnGoToNext = new GuiImageButton(3, width / 2 + 5, topY + 12, EiraGui.atlas.findRegion("button_next")); buttonList.add(btnGoToNext); btnGoToLast = new GuiImageButton(4, width / 2 + 23, topY + 12, EiraGui.atlas.findRegion("button_last")); buttonList.add(btnGoToLast); btnFavorite = new GuiImageButton(5, rightX - 37, topY + 12, EiraGui.atlas.findRegion("button_favorite")); btnFavorite.setTooltipText(I19n.format("eirairc:gui.screenshots.favorite")); buttonList.add(btnFavorite); btnUpload = new GuiImageButton(6, rightX - 37, topY + 50, EiraGui.atlas.findRegion("button_upload")); btnUpload.setTooltipText(I19n.format("eirairc:gui.screenshots.upload")); buttonList.add(btnUpload); btnClipboard = new GuiImageButton(7, rightX - 37, topY + 50, EiraGui.atlas.findRegion("button_clipboard")); btnClipboard.visible = false; btnClipboard.setTooltipText(I19n.format("eirairc:gui.screenshots.toClipboard")); buttonList.add(btnClipboard); btnZoom = new GuiImageButton(8, rightX - 37, topY + 135, EiraGui.atlas.findRegion("button_zoom")); btnZoom.setTooltipText(I19n.format("eirairc:gui.screenshots.fullscreen")); buttonList.add(btnZoom); btnDelete = new GuiImageButton(9, leftX + 5, topY + 12, EiraGui.atlas.findRegion("button_delete")); btnDelete.setTooltipText(I19n.format("eirairc:gui.delete")); buttonList.add(btnDelete); btnReupload = new GuiImageButton(10, leftX + 5, topY + 50, EiraGui.atlas.findRegion("button_upload")); btnReupload.visible = false; btnReupload.setTooltipText(I19n.format("eirairc:gui.screenshots.reupload")); buttonList.add(btnReupload); int pageLeft = rightX - 3; int pageTop = topY + 10; GuiScreenshotPage pageAll = new GuiScreenshotPage(11, pageLeft, pageTop, I19n.format("eirairc:gui.screenshots.all")) { @Override public void onClick() { setScreenshotGroup(this, ScreenshotManager.getInstance().getScreenshots()); } }; pageAll.setActive(true); activePageButton = pageAll; buttonList.add(pageAll); pageTop += pageAll.height; GuiScreenshotPage pageFavorited = new GuiScreenshotPage(11, pageLeft, pageTop, I19n.format("eirairc:gui.screenshots.favorited")) { @Override public void onClick() { List<Screenshot> groupList = Lists.newArrayList(); for(Screenshot screenshot : ScreenshotManager.getInstance().getScreenshots()) { if(screenshot.isFavorited()) { groupList.add(screenshot); } } setScreenshotGroup(this, groupList); } }; buttonList.add(pageFavorited); pageTop += pageFavorited.height + 3; GuiScreenshotPage pageTimestamp = new GuiScreenshotPage(11, pageLeft, pageTop, I19n.format("eirairc:gui.screenshots.today")) { @Override public void onClick() { List<Screenshot> groupList = Lists.newArrayList(); long now = System.currentTimeMillis(); for(Screenshot screenshot : ScreenshotManager.getInstance().getScreenshots()) { long diff = now - screenshot.getTimeStamp(); if(diff <= 86400000L) { groupList.add(screenshot); } } setScreenshotGroup(this, groupList); } }; buttonList.add(pageTimestamp); pageTop += pageTimestamp.height; pageTimestamp = new GuiScreenshotPage(11, pageLeft, pageTop, I19n.format("eirairc:gui.screenshots.thisWeek")) { @Override public void onClick() { List<Screenshot> groupList = Lists.newArrayList(); long now = System.currentTimeMillis(); for(Screenshot screenshot : ScreenshotManager.getInstance().getScreenshots()) { long diff = now - screenshot.getTimeStamp(); if(diff > 86400000L && diff <= 86400000L * 7) { groupList.add(screenshot); } } setScreenshotGroup(this, groupList); } }; buttonList.add(pageTimestamp); pageTop += pageTimestamp.height; pageTimestamp = new GuiScreenshotPage(11, pageLeft, pageTop, I19n.format("eirairc:gui.screenshots.thisMonth")) { @Override public void onClick() { List<Screenshot> groupList = Lists.newArrayList(); long now = System.currentTimeMillis(); for(Screenshot screenshot : ScreenshotManager.getInstance().getScreenshots()) { long diff = now - screenshot.getTimeStamp(); if(diff > 86400000L * 7 && diff <= 86400000L * 7 * 4) { groupList.add(screenshot); } } setScreenshotGroup(this, groupList); } }; buttonList.add(pageTimestamp); pageTop += pageTimestamp.height; pageTimestamp = new GuiScreenshotPage(11, pageLeft, pageTop, I19n.format("eirairc:gui.screenshots.thisYear")) { @Override public void onClick() { List<Screenshot> groupList = Lists.newArrayList(); long now = System.currentTimeMillis(); for(Screenshot screenshot : ScreenshotManager.getInstance().getScreenshots()) { long diff = now - screenshot.getTimeStamp(); if(diff > 86400000L * 7 * 4 && diff <= 86400000L * 7 * 4 * 12) { groupList.add(screenshot); } } setScreenshotGroup(this, groupList); } }; buttonList.add(pageTimestamp); pageTop += pageTimestamp.height; pageTimestamp = new GuiScreenshotPage(11, pageLeft, pageTop, I19n.format("eirairc:gui.screenshots.older")) { @Override public void onClick() { List<Screenshot> groupList = Lists.newArrayList(); long now = System.currentTimeMillis(); for(Screenshot screenshot : ScreenshotManager.getInstance().getScreenshots()) { long diff = now - screenshot.getTimeStamp(); if(diff > 86400000L * 7 * 4 * 12) { groupList.add(screenshot); } } setScreenshotGroup(this, groupList); } }; buttonList.add(pageTimestamp); updateScreenshot(); imgX = leftX + 2; imgY = topY + 10; } @Override public void onGuiClosed() { super.onGuiClosed(); if(imgPreview != null) { imgPreview.dispose(); } MinecraftForge.EVENT_BUS.unregister(this); ScreenshotManager.getInstance().save(); } @Override public boolean isClickClosePosition(int mouseX, int mouseY) { return (mouseX < menuX); } private void resetSearch() { lastSearchText = ""; txtSearch.setText(""); searchResults.clear(); } @Override public void actionPerformed(GuiButton button) { if(button == btnGoToFirst) { if(!isUploading) { currentIdx = 0; updateScreenshot(); } } else if(button == btnGoToPrevious) { if(currentIdx > 0 && !isUploading) { currentIdx--; updateScreenshot(); } } else if(button == btnGoToNext) { if(currentIdx < screenshotList.size() - 1 && !isUploading) { currentIdx++; updateScreenshot(); } } else if(button == btnGoToLast) { if(!isUploading) { currentIdx = screenshotList.size() - 1; updateScreenshot(); } } else if(button == btnOpenFolder) { Utils.openDirectory(new File(mc.mcDataDir, "screenshots")); } else if(button == btnDelete) { if(currentScreenshot != null && !isUploading) { setOverlay(new OverlayYesNo(this, I19n.format("eirairc:gui.screenshots.deleteConfirm"), I19n.format("eirairc:gui.screenshots.deleteNoUndo"), currentIdx)); } } else if(button == btnClipboard) { if(currentScreenshot != null) { Utils.setClipboardString(currentScreenshot.getUploadURL()); } } else if(button == btnUpload) { if(currentScreenshot != null) { btnUpload.enabled = false; isUploading = true; ScreenshotManager.getInstance().uploadScreenshot(currentScreenshot, ScreenshotAction.None); } } else if(button == btnReupload) { if(currentScreenshot != null) { btnReupload.enabled = false; isUploading = true; ScreenshotManager.getInstance().uploadScreenshot(currentScreenshot, ScreenshotAction.None); } } else if(button == btnFavorite) { if(currentScreenshot != null) { currentScreenshot.setFavorited(!currentScreenshot.isFavorited()); setFavoriteButtonState(currentScreenshot.isFavorited()); } } else if(button == btnZoom) { if(!isUploading) { mc.displayGuiScreen(new GuiScreenshotBigPreview(this, currentScreenshot)); } } } @SubscribeEvent public void onScreenshotUploaded(ScreenshotUploadEvent event) { if(isUploading) { btnUpload.enabled = true; btnReupload.enabled = true; isUploading = false; updateScreenshot(); } } @Override public void confirmClicked(boolean result, int id) { if(result) { ScreenshotManager.getInstance().deleteScreenshot(currentScreenshot, false); searchResults.remove(currentScreenshot); if(currentIdx >= screenshotList.size()) { currentIdx = Math.max(0, currentIdx - 1); } updateScreenshot(); } } @Override public void updateScreen() { super.updateScreen(); if(currentScreenshot != null) { currentScreenshot.setName(txtName.getTextOrDefault()); } if(!lastSearchText.equals(txtSearch.getText())) { if(!txtSearch.getText().isEmpty()) { searchResults.clear(); for(Screenshot screenshot : screenshotGroup) { if(screenshot.getName().contains(txtSearch.getText()) || screenshot.getOriginalName().contains(txtSearch.getText())) { searchResults.add(screenshot); } } setScreenshotList(searchResults); } else { setScreenshotList(screenshotGroup); } lastSearchText = txtSearch.getText(); } } private static final List<String> tooltipList = Lists.newArrayList(); @Override public void drawScreen(int mouseX, int mouseY, float par3) { drawLightBackground(menuX, menuY, menuWidth, menuHeight); // Fade all image buttons in/out on hover of image int imgWidth = 285; int imgHeight = 160; if(imgPreview != null && mouseX >= imgX && mouseX < imgX + imgWidth && mouseY >= imgY && mouseY < imgY + imgHeight) { if(!buttonsVisible) { for(Object entry : buttonList) { GuiButton button = (GuiButton) entry; if (button instanceof GuiImageButton) { ((GuiImageButton) button).setFadeMode(1); } } buttonsVisible = true; } } else { if (buttonsVisible) { for (Object entry : buttonList) { GuiButton button = (GuiButton) entry; if (button instanceof GuiImageButton) { ((GuiImageButton) button).setFadeMode(-1); } } buttonsVisible = false; } } if(imgPreview != null) { // Render the screenshot preview image imgPreview.draw(imgX, imgY, imgWidth, imgHeight, zLevel); } super.drawScreen(mouseX, mouseY, par3); for (Object entry : buttonList) { GuiButton button = (GuiButton) entry; if (button instanceof GuiImageButton) { GuiImageButton imageButton = (GuiImageButton) button; if (imageButton.isInside(mouseX, mouseY) && imageButton.isAlphaVisible() && imageButton.getTooltipText() != null) { if (imageButton != hoverObject) { hoverObject = imageButton; hoverTime = 0f; } hoverTime++; if (hoverTime > TOOLTIP_TIME) { tooltipList.clear(); tooltipList.add(imageButton.getTooltipText()); drawTooltip(tooltipList, mouseX, mouseY); } break; } } } if(isUploading) { drawCenteredString(fontRendererObj, I19n.format("eirairc:gui.screenshots.uploading"), width / 2, height / 2, Globals.TEXT_COLOR); } } public void setFavoriteButtonState(boolean state) { if(state) { btnFavorite.setTextureRegion(EiraGui.atlas.findRegion("button_favorite")); } else { btnFavorite.setTextureRegion(EiraGui.atlas.findRegion("button_unfavorite")); } } }