Commit cc303e4eb8b60adf43a2664cc9744dd13ebc0993
1 parent
7aa49e45
LiteLoader 1.6.4_02 - dev only - added keyboard support to mod info list, better…
… behaviour when tab is "hidden"
Showing
3 changed files
with
150 additions
and
28 deletions
java/com/mumfrey/liteloader/core/LiteLoader.java
| ... | ... | @@ -1062,12 +1062,12 @@ public final class LiteLoader |
| 1062 | 1062 | */ |
| 1063 | 1063 | void postRender(int mouseX, int mouseY, float partialTicks) |
| 1064 | 1064 | { |
| 1065 | - if (this.minecraft.currentScreen instanceof GuiMainMenu && this.displayModInfoScreenTab && !this.hideModInfoScreenTab) | |
| 1065 | + if (this.minecraft.currentScreen instanceof GuiMainMenu && ((this.displayModInfoScreenTab && !this.hideModInfoScreenTab) || (this.modInfoScreen != null && this.modInfoScreen.isTweeningOrOpen()))) | |
| 1066 | 1066 | { |
| 1067 | 1067 | // If we're at the main menu, prepare the overlay |
| 1068 | 1068 | if (this.modInfoScreen == null || this.modInfoScreen.getMenu() != this.minecraft.currentScreen) |
| 1069 | 1069 | { |
| 1070 | - this.modInfoScreen = new GuiScreenModInfo(this.minecraft, (GuiMainMenu)this.minecraft.currentScreen, this, this.enabledModsList, this.configManager); | |
| 1070 | + this.modInfoScreen = new GuiScreenModInfo(this.minecraft, (GuiMainMenu)this.minecraft.currentScreen, this, this.enabledModsList, this.configManager, this.hideModInfoScreenTab); | |
| 1071 | 1071 | } |
| 1072 | 1072 | |
| 1073 | 1073 | this.modInfoScreen.drawScreen(mouseX, mouseY, partialTicks); |
| ... | ... | @@ -1221,7 +1221,8 @@ public final class LiteLoader |
| 1221 | 1221 | */ |
| 1222 | 1222 | public void displayModInfoScreen(GuiMainMenu parentScreen) |
| 1223 | 1223 | { |
| 1224 | - this.minecraft.displayGuiScreen(new GuiScreenModInfo(this.minecraft, parentScreen, this, this.enabledModsList, this.configManager)); | |
| 1224 | + this.modInfoScreen = new GuiScreenModInfo(this.minecraft, parentScreen, this, this.enabledModsList, this.configManager, this.hideModInfoScreenTab); | |
| 1225 | + this.minecraft.displayGuiScreen(this.modInfoScreen); | |
| 1225 | 1226 | } |
| 1226 | 1227 | |
| 1227 | 1228 | private static void logInfo(String string, Object... args) | ... | ... |
java/com/mumfrey/liteloader/gui/GuiModListEntry.java
java/com/mumfrey/liteloader/gui/GuiScreenModInfo.java
| ... | ... | @@ -96,6 +96,8 @@ public class GuiScreenModInfo extends GuiScreen |
| 96 | 96 | */ |
| 97 | 97 | private float tabOpacity = 0.0F; |
| 98 | 98 | |
| 99 | + private boolean hideTab = true; | |
| 100 | + | |
| 99 | 101 | /** |
| 100 | 102 | * List of enumerated mods |
| 101 | 103 | */ |
| ... | ... | @@ -149,11 +151,13 @@ public class GuiScreenModInfo extends GuiScreen |
| 149 | 151 | * @param loader |
| 150 | 152 | * @param enabledModsList |
| 151 | 153 | */ |
| 152 | - public GuiScreenModInfo(Minecraft minecraft, GuiMainMenu mainMenu, LiteLoader loader, EnabledModsList enabledModsList, ConfigManager configManager) | |
| 154 | + public GuiScreenModInfo(Minecraft minecraft, GuiMainMenu mainMenu, LiteLoader loader, EnabledModsList enabledModsList, ConfigManager configManager, boolean hideTab) | |
| 153 | 155 | { |
| 154 | 156 | this.mc = minecraft; |
| 157 | + this.fontRenderer = minecraft.fontRenderer; | |
| 155 | 158 | this.mainMenu = mainMenu; |
| 156 | 159 | this.configManager = configManager; |
| 160 | + this.hideTab = hideTab; | |
| 157 | 161 | |
| 158 | 162 | // Spawn the texture resource if we haven't already |
| 159 | 163 | if (aboutTexture == null) |
| ... | ... | @@ -220,7 +224,15 @@ public class GuiScreenModInfo extends GuiScreen |
| 220 | 224 | { |
| 221 | 225 | return this.mainMenu; |
| 222 | 226 | } |
| 223 | - | |
| 227 | + | |
| 228 | + /** | |
| 229 | + * @return | |
| 230 | + */ | |
| 231 | + public boolean isTweeningOrOpen() | |
| 232 | + { | |
| 233 | + return this.tweenAmount > 0.0; | |
| 234 | + } | |
| 235 | + | |
| 224 | 236 | /* (non-Javadoc) |
| 225 | 237 | * @see net.minecraft.src.GuiScreen#initGui() |
| 226 | 238 | */ |
| ... | ... | @@ -233,14 +245,25 @@ public class GuiScreenModInfo extends GuiScreen |
| 233 | 245 | this.configPanel.setSize(this.width - LEFT_EDGE, this.height); |
| 234 | 246 | } |
| 235 | 247 | |
| 236 | - int left = LEFT_EDGE + MARGIN + 4 + (this.width - LEFT_EDGE - MARGIN - MARGIN - 4) / 2; | |
| 248 | + int rightPanelLeftEdge = LEFT_EDGE + MARGIN + 4 + (this.width - LEFT_EDGE - MARGIN - MARGIN - 4) / 2; | |
| 237 | 249 | |
| 238 | 250 | this.buttonList.clear(); |
| 239 | - this.buttonList.add(this.btnToggle = new GuiButton(0, left, this.height - PANEL_BOTTOM - 24, 90, 20, "Enable mod")); | |
| 240 | - this.buttonList.add(this.btnConfig = new GuiButton(1, left + 92, this.height - PANEL_BOTTOM - 24, 69, 20, "Settings...")); | |
| 241 | - this.buttonList.add(this.chkEnabled = new GuiCheckbox(2, LEFT_EDGE + MARGIN, this.height - PANEL_BOTTOM + 9, "Show LiteLoader tab on main menu")); | |
| 251 | + this.buttonList.add(this.btnToggle = new GuiButton(0, rightPanelLeftEdge, this.height - PANEL_BOTTOM - 24, 90, 20, "Enable mod")); | |
| 252 | + this.buttonList.add(this.btnConfig = new GuiButton(1, rightPanelLeftEdge + 92, this.height - PANEL_BOTTOM - 24, 69, 20, "Settings...")); | |
| 253 | + if (!this.hideTab) | |
| 254 | + { | |
| 255 | + this.buttonList.add(this.chkEnabled = new GuiCheckbox(2, LEFT_EDGE + MARGIN, this.height - PANEL_BOTTOM + 9, "Show LiteLoader tab on main menu")); | |
| 256 | + } | |
| 242 | 257 | |
| 243 | 258 | this.selectMod(this.selectedMod); |
| 259 | + | |
| 260 | + Keyboard.enableRepeatEvents(true); | |
| 261 | + } | |
| 262 | + | |
| 263 | + @Override | |
| 264 | + public void onGuiClosed() | |
| 265 | + { | |
| 266 | + Keyboard.enableRepeatEvents(false); | |
| 244 | 267 | } |
| 245 | 268 | |
| 246 | 269 | /* (non-Javadoc) |
| ... | ... | @@ -273,8 +296,10 @@ public class GuiScreenModInfo extends GuiScreen |
| 273 | 296 | |
| 274 | 297 | if (this.mc.currentScreen == this) |
| 275 | 298 | { |
| 299 | + this.mc.currentScreen = this.mainMenu; | |
| 276 | 300 | this.mainMenu.updateScreen(); |
| 277 | - this.chkEnabled.checked = LiteLoader.getInstance().getDisplayModInfoScreenTab(); | |
| 301 | + this.mc.currentScreen = this; | |
| 302 | + if (this.chkEnabled != null) this.chkEnabled.checked = LiteLoader.getInstance().getDisplayModInfoScreenTab(); | |
| 278 | 303 | } |
| 279 | 304 | |
| 280 | 305 | if (this.toggled) |
| ... | ... | @@ -310,17 +335,22 @@ public class GuiScreenModInfo extends GuiScreen |
| 310 | 335 | |
| 311 | 336 | // Calculate the current tween position |
| 312 | 337 | float xOffset = (this.width - LEFT_EDGE) * this.calcTween(partialTicks, active) + 16.0F + (this.tabOpacity * -32.0F); |
| 313 | - mouseX -= (int)xOffset; | |
| 338 | + int offsetMouseX = mouseX - (int)xOffset; | |
| 314 | 339 | |
| 315 | 340 | // Handle mouse stuff here since we won't get mouse events when not the active GUI |
| 316 | - boolean mouseOverTab = mouseX > LEFT_EDGE - TAB_WIDTH && mouseX < LEFT_EDGE && mouseY > TAB_TOP && mouseY < TAB_TOP + TAB_HEIGHT; | |
| 317 | - this.handleMouseClick(mouseX, mouseY, partialTicks, active, mouseOverTab); | |
| 341 | + boolean mouseOverTab = !this.hideTab && (offsetMouseX > LEFT_EDGE - TAB_WIDTH && offsetMouseX < LEFT_EDGE && mouseY > TAB_TOP && mouseY < TAB_TOP + TAB_HEIGHT); | |
| 342 | + this.handleMouseClick(offsetMouseX, mouseY, partialTicks, active, mouseOverTab); | |
| 318 | 343 | |
| 319 | 344 | // Calculate the tab opacity, not framerate adjusted because we don't really care |
| 320 | - this.tabOpacity = mouseOverTab || this.tweenAmount > 0.0 ? 0.5F : Math.max(0.0F, this.tabOpacity - partialTicks * 0.1F); | |
| 345 | + this.tabOpacity = mouseOverTab || this.isTweeningOrOpen() ? 0.5F : Math.max(0.0F, this.tabOpacity - partialTicks * 0.1F); | |
| 321 | 346 | |
| 322 | 347 | // Draw the panel contents |
| 323 | - this.drawPanel(mouseX, mouseY, partialTicks, active, xOffset); | |
| 348 | + this.drawPanel(offsetMouseX, mouseY, partialTicks, active, xOffset); | |
| 349 | + | |
| 350 | + if (mouseOverTab && this.tweenAmount < 0.01) | |
| 351 | + { | |
| 352 | + this.drawTooltip("LiteLoader Mods", mouseX, mouseY, this.width - TAB_WIDTH - 2, this.height, 0xFFFFFF, 0xB0000000); | |
| 353 | + } | |
| 324 | 354 | } |
| 325 | 355 | |
| 326 | 356 | /** |
| ... | ... | @@ -337,15 +367,23 @@ public class GuiScreenModInfo extends GuiScreen |
| 337 | 367 | |
| 338 | 368 | // Draw the background and left edge |
| 339 | 369 | drawRect(LEFT_EDGE, 0, this.width, this.height, 0xB0000000); |
| 340 | - drawRect(LEFT_EDGE, 0, LEFT_EDGE + 1, TAB_TOP, 0xFFFFFFFF); | |
| 341 | - drawRect(LEFT_EDGE, TAB_TOP + TAB_HEIGHT, LEFT_EDGE + 1, this.height, 0xFFFFFFFF); | |
| 342 | 370 | |
| 343 | - // Draw the tab | |
| 344 | - this.mc.getTextureManager().bindTexture(aboutTextureResource); | |
| 345 | - glDrawTexturedRect(LEFT_EDGE - TAB_WIDTH, TAB_TOP, TAB_WIDTH + 1, TAB_HEIGHT, 80, 80, 122, 160, 0.5F + this.tabOpacity); | |
| 346 | - | |
| 371 | + if (!this.hideTab) | |
| 372 | + { | |
| 373 | + drawRect(LEFT_EDGE, 0, LEFT_EDGE + 1, TAB_TOP, 0xFFFFFFFF); | |
| 374 | + drawRect(LEFT_EDGE, TAB_TOP + TAB_HEIGHT, LEFT_EDGE + 1, this.height, 0xFFFFFFFF); | |
| 375 | + | |
| 376 | + this.mc.getTextureManager().bindTexture(aboutTextureResource); | |
| 377 | + glDrawTexturedRect(LEFT_EDGE - TAB_WIDTH, TAB_TOP, TAB_WIDTH + 1, TAB_HEIGHT, 80, 80, 122, 160, 0.5F + this.tabOpacity); | |
| 378 | + } | |
| 379 | + else | |
| 380 | + { | |
| 381 | + drawRect(LEFT_EDGE, 0, LEFT_EDGE + 1, this.height, 0xFFFFFFFF); | |
| 382 | + this.mc.getTextureManager().bindTexture(aboutTextureResource); | |
| 383 | + } | |
| 384 | + | |
| 347 | 385 | // Only draw the panel contents if we are actually open |
| 348 | - if (this.tweenAmount > 0.0) | |
| 386 | + if (this.isTweeningOrOpen()) | |
| 349 | 387 | { |
| 350 | 388 | if (this.configPanel != null) |
| 351 | 389 | { |
| ... | ... | @@ -487,6 +525,18 @@ public class GuiScreenModInfo extends GuiScreen |
| 487 | 525 | this.btnConfig.drawButton = this.configManager.hasPanel(this.selectedMod.getModClass()); |
| 488 | 526 | } |
| 489 | 527 | } |
| 528 | + | |
| 529 | + /** | |
| 530 | + * Toggle the selected mod's enabled status | |
| 531 | + */ | |
| 532 | + public void toggleSelectedMod() | |
| 533 | + { | |
| 534 | + if (this.selectedMod != null) | |
| 535 | + { | |
| 536 | + this.selectedMod.toggleEnabled(); | |
| 537 | + this.selectMod(this.selectedMod); | |
| 538 | + } | |
| 539 | + } | |
| 490 | 540 | |
| 491 | 541 | /* (non-Javadoc) |
| 492 | 542 | * @see net.minecraft.src.GuiScreen#actionPerformed(net.minecraft.src.GuiButton) |
| ... | ... | @@ -494,10 +544,9 @@ public class GuiScreenModInfo extends GuiScreen |
| 494 | 544 | @Override |
| 495 | 545 | protected void actionPerformed(GuiButton button) |
| 496 | 546 | { |
| 497 | - if (button.id == 0 && this.selectedMod != null) | |
| 547 | + if (button.id == 0) | |
| 498 | 548 | { |
| 499 | - this.selectedMod.toggleEnabled(); | |
| 500 | - this.selectMod(this.selectedMod); | |
| 549 | + this.toggleSelectedMod(); | |
| 501 | 550 | } |
| 502 | 551 | |
| 503 | 552 | if (button.id == 1) |
| ... | ... | @@ -505,7 +554,7 @@ public class GuiScreenModInfo extends GuiScreen |
| 505 | 554 | this.openConfigPanel(); |
| 506 | 555 | } |
| 507 | 556 | |
| 508 | - if (button.id == 2) | |
| 557 | + if (button.id == 2 && this.chkEnabled != null) | |
| 509 | 558 | { |
| 510 | 559 | this.chkEnabled.checked = !this.chkEnabled.checked; |
| 511 | 560 | LiteLoader.getInstance().setDisplayModInfoScreenTab(this.chkEnabled.checked); |
| ... | ... | @@ -534,8 +583,52 @@ public class GuiScreenModInfo extends GuiScreen |
| 534 | 583 | this.onToggled(); |
| 535 | 584 | return; |
| 536 | 585 | } |
| 586 | + else if (keyCode == Keyboard.KEY_UP) | |
| 587 | + { | |
| 588 | + int selectedIndex = this.mods.indexOf(this.selectedMod) - 1; | |
| 589 | + if (selectedIndex > -1) this.selectMod(this.mods.get(selectedIndex)); | |
| 590 | + this.scrollSelectedModIntoView(); | |
| 591 | + } | |
| 592 | + else if (keyCode == Keyboard.KEY_DOWN) | |
| 593 | + { | |
| 594 | + int selectedIndex = this.mods.indexOf(this.selectedMod); | |
| 595 | + if (selectedIndex > -1 && selectedIndex < this.mods.size() - 1) this.selectMod(this.mods.get(selectedIndex + 1)); | |
| 596 | + this.scrollSelectedModIntoView(); | |
| 597 | + } | |
| 598 | + else if (keyCode == Keyboard.KEY_SPACE || keyCode == Keyboard.KEY_RETURN || keyCode == Keyboard.KEY_NUMPADENTER || keyCode == Keyboard.KEY_RIGHT) | |
| 599 | + { | |
| 600 | + this.toggleSelectedMod(); | |
| 601 | + } | |
| 537 | 602 | } |
| 538 | 603 | |
| 604 | + private void scrollSelectedModIntoView() | |
| 605 | + { | |
| 606 | + if (this.selectedMod == null) return; | |
| 607 | + | |
| 608 | + int yPos = 0; | |
| 609 | + for (GuiModListEntry mod : this.mods) | |
| 610 | + { | |
| 611 | + if (mod == this.selectedMod) break; | |
| 612 | + yPos += mod.getHeight(); | |
| 613 | + } | |
| 614 | + | |
| 615 | + // Mod is above the top of the visible window | |
| 616 | + if (yPos < this.scrollBar.getValue()) | |
| 617 | + { | |
| 618 | + this.scrollBar.setValue(yPos); | |
| 619 | + return; | |
| 620 | + } | |
| 621 | + | |
| 622 | + int panelHeight = this.height - PANEL_BOTTOM - PANEL_TOP; | |
| 623 | + int modHeight = this.selectedMod.getHeight(); | |
| 624 | + | |
| 625 | + // Mod is below the bottom of the visible window | |
| 626 | + if (yPos - this.scrollBar.getValue() + modHeight > panelHeight) | |
| 627 | + { | |
| 628 | + this.scrollBar.setValue(yPos - panelHeight + modHeight); | |
| 629 | + } | |
| 630 | + } | |
| 631 | + | |
| 539 | 632 | /* (non-Javadoc) |
| 540 | 633 | * @see net.minecraft.src.GuiScreen#mouseClicked(int, int, int) |
| 541 | 634 | */ |
| ... | ... | @@ -630,7 +723,7 @@ public class GuiScreenModInfo extends GuiScreen |
| 630 | 723 | public void handleMouseClick(int mouseX, int mouseY, float partialTicks, boolean active, boolean mouseOverTab) |
| 631 | 724 | { |
| 632 | 725 | boolean mouseDown = Mouse.isButtonDown(0); |
| 633 | - if (((active && mouseX < LEFT_EDGE) || mouseOverTab) && !this.mouseDown && mouseDown) | |
| 726 | + if (((active && mouseX < LEFT_EDGE && this.tweenAmount > 0.75) || mouseOverTab) && !this.mouseDown && mouseDown) | |
| 634 | 727 | { |
| 635 | 728 | this.mouseDown = true; |
| 636 | 729 | this.toggled = true; |
| ... | ... | @@ -654,7 +747,7 @@ public class GuiScreenModInfo extends GuiScreen |
| 654 | 747 | { |
| 655 | 748 | this.tweenAmount = Math.min(1.0, this.tweenAmount + ((tickValue - this.lastTick) * TWEEN_RATE)); |
| 656 | 749 | } |
| 657 | - else if (!active && this.tweenAmount > 0.0) | |
| 750 | + else if (!active && this.isTweeningOrOpen()) | |
| 658 | 751 | { |
| 659 | 752 | this.tweenAmount = Math.max(0.0, this.tweenAmount - ((tickValue - this.lastTick) * TWEEN_RATE)); |
| 660 | 753 | } |
| ... | ... | @@ -707,6 +800,29 @@ public class GuiScreenModInfo extends GuiScreen |
| 707 | 800 | } |
| 708 | 801 | |
| 709 | 802 | /** |
| 803 | + * Draw a tooltip at the specified location and clip to screenWidth and screenHeight | |
| 804 | + * | |
| 805 | + * @param fontRenderer | |
| 806 | + * @param tooltipText | |
| 807 | + * @param mouseX | |
| 808 | + * @param mouseY | |
| 809 | + * @param screenWidth | |
| 810 | + * @param screenHeight | |
| 811 | + * @param colour | |
| 812 | + * @param backgroundColour | |
| 813 | + */ | |
| 814 | + protected void drawTooltip(String tooltipText, int mouseX, int mouseY, int screenWidth, int screenHeight, int colour, int backgroundColour) | |
| 815 | + { | |
| 816 | + int textSize = this.fontRenderer.getStringWidth(tooltipText); | |
| 817 | + mouseX = Math.max(0, Math.min(screenWidth - textSize - 6, mouseX - 6)); | |
| 818 | + mouseY = Math.max(0, Math.min(screenHeight - 16, mouseY - 18)); | |
| 819 | + | |
| 820 | + drawRect(mouseX, mouseY, mouseX + textSize + 6, mouseY + 16, backgroundColour); | |
| 821 | + this.fontRenderer.drawStringWithShadow(tooltipText, mouseX + 3, mouseY + 4, colour); | |
| 822 | + } | |
| 823 | + | |
| 824 | + | |
| 825 | + /** | |
| 710 | 826 | * @param x |
| 711 | 827 | * @param y |
| 712 | 828 | * @param width | ... | ... |