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,12 +1062,12 @@ public final class LiteLoader | ||
1062 | */ | 1062 | */ |
1063 | void postRender(int mouseX, int mouseY, float partialTicks) | 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 | // If we're at the main menu, prepare the overlay | 1067 | // If we're at the main menu, prepare the overlay |
1068 | if (this.modInfoScreen == null || this.modInfoScreen.getMenu() != this.minecraft.currentScreen) | 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 | this.modInfoScreen.drawScreen(mouseX, mouseY, partialTicks); | 1073 | this.modInfoScreen.drawScreen(mouseX, mouseY, partialTicks); |
@@ -1221,7 +1221,8 @@ public final class LiteLoader | @@ -1221,7 +1221,8 @@ public final class LiteLoader | ||
1221 | */ | 1221 | */ |
1222 | public void displayModInfoScreen(GuiMainMenu parentScreen) | 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 | private static void logInfo(String string, Object... args) | 1228 | private static void logInfo(String string, Object... args) |
java/com/mumfrey/liteloader/gui/GuiModListEntry.java
@@ -163,6 +163,11 @@ public class GuiModListEntry extends Gui | @@ -163,6 +163,11 @@ public class GuiModListEntry extends Gui | ||
163 | return PANEL_HEIGHT + PANEL_SPACING; | 163 | return PANEL_HEIGHT + PANEL_SPACING; |
164 | } | 164 | } |
165 | 165 | ||
166 | + public int getHeight() | ||
167 | + { | ||
168 | + return PANEL_HEIGHT + PANEL_SPACING; | ||
169 | + } | ||
170 | + | ||
166 | /** | 171 | /** |
167 | * Draw this entry as the info page | 172 | * Draw this entry as the info page |
168 | * | 173 | * |
java/com/mumfrey/liteloader/gui/GuiScreenModInfo.java
@@ -96,6 +96,8 @@ public class GuiScreenModInfo extends GuiScreen | @@ -96,6 +96,8 @@ public class GuiScreenModInfo extends GuiScreen | ||
96 | */ | 96 | */ |
97 | private float tabOpacity = 0.0F; | 97 | private float tabOpacity = 0.0F; |
98 | 98 | ||
99 | + private boolean hideTab = true; | ||
100 | + | ||
99 | /** | 101 | /** |
100 | * List of enumerated mods | 102 | * List of enumerated mods |
101 | */ | 103 | */ |
@@ -149,11 +151,13 @@ public class GuiScreenModInfo extends GuiScreen | @@ -149,11 +151,13 @@ public class GuiScreenModInfo extends GuiScreen | ||
149 | * @param loader | 151 | * @param loader |
150 | * @param enabledModsList | 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 | this.mc = minecraft; | 156 | this.mc = minecraft; |
157 | + this.fontRenderer = minecraft.fontRenderer; | ||
155 | this.mainMenu = mainMenu; | 158 | this.mainMenu = mainMenu; |
156 | this.configManager = configManager; | 159 | this.configManager = configManager; |
160 | + this.hideTab = hideTab; | ||
157 | 161 | ||
158 | // Spawn the texture resource if we haven't already | 162 | // Spawn the texture resource if we haven't already |
159 | if (aboutTexture == null) | 163 | if (aboutTexture == null) |
@@ -220,7 +224,15 @@ public class GuiScreenModInfo extends GuiScreen | @@ -220,7 +224,15 @@ public class GuiScreenModInfo extends GuiScreen | ||
220 | { | 224 | { |
221 | return this.mainMenu; | 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 | /* (non-Javadoc) | 236 | /* (non-Javadoc) |
225 | * @see net.minecraft.src.GuiScreen#initGui() | 237 | * @see net.minecraft.src.GuiScreen#initGui() |
226 | */ | 238 | */ |
@@ -233,14 +245,25 @@ public class GuiScreenModInfo extends GuiScreen | @@ -233,14 +245,25 @@ public class GuiScreenModInfo extends GuiScreen | ||
233 | this.configPanel.setSize(this.width - LEFT_EDGE, this.height); | 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 | this.buttonList.clear(); | 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 | this.selectMod(this.selectedMod); | 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 | /* (non-Javadoc) | 269 | /* (non-Javadoc) |
@@ -273,8 +296,10 @@ public class GuiScreenModInfo extends GuiScreen | @@ -273,8 +296,10 @@ public class GuiScreenModInfo extends GuiScreen | ||
273 | 296 | ||
274 | if (this.mc.currentScreen == this) | 297 | if (this.mc.currentScreen == this) |
275 | { | 298 | { |
299 | + this.mc.currentScreen = this.mainMenu; | ||
276 | this.mainMenu.updateScreen(); | 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 | if (this.toggled) | 305 | if (this.toggled) |
@@ -310,17 +335,22 @@ public class GuiScreenModInfo extends GuiScreen | @@ -310,17 +335,22 @@ public class GuiScreenModInfo extends GuiScreen | ||
310 | 335 | ||
311 | // Calculate the current tween position | 336 | // Calculate the current tween position |
312 | float xOffset = (this.width - LEFT_EDGE) * this.calcTween(partialTicks, active) + 16.0F + (this.tabOpacity * -32.0F); | 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 | // Handle mouse stuff here since we won't get mouse events when not the active GUI | 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 | // Calculate the tab opacity, not framerate adjusted because we don't really care | 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 | // Draw the panel contents | 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,15 +367,23 @@ public class GuiScreenModInfo extends GuiScreen | ||
337 | 367 | ||
338 | // Draw the background and left edge | 368 | // Draw the background and left edge |
339 | drawRect(LEFT_EDGE, 0, this.width, this.height, 0xB0000000); | 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 | // Only draw the panel contents if we are actually open | 385 | // Only draw the panel contents if we are actually open |
348 | - if (this.tweenAmount > 0.0) | 386 | + if (this.isTweeningOrOpen()) |
349 | { | 387 | { |
350 | if (this.configPanel != null) | 388 | if (this.configPanel != null) |
351 | { | 389 | { |
@@ -487,6 +525,18 @@ public class GuiScreenModInfo extends GuiScreen | @@ -487,6 +525,18 @@ public class GuiScreenModInfo extends GuiScreen | ||
487 | this.btnConfig.drawButton = this.configManager.hasPanel(this.selectedMod.getModClass()); | 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 | /* (non-Javadoc) | 541 | /* (non-Javadoc) |
492 | * @see net.minecraft.src.GuiScreen#actionPerformed(net.minecraft.src.GuiButton) | 542 | * @see net.minecraft.src.GuiScreen#actionPerformed(net.minecraft.src.GuiButton) |
@@ -494,10 +544,9 @@ public class GuiScreenModInfo extends GuiScreen | @@ -494,10 +544,9 @@ public class GuiScreenModInfo extends GuiScreen | ||
494 | @Override | 544 | @Override |
495 | protected void actionPerformed(GuiButton button) | 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 | if (button.id == 1) | 552 | if (button.id == 1) |
@@ -505,7 +554,7 @@ public class GuiScreenModInfo extends GuiScreen | @@ -505,7 +554,7 @@ public class GuiScreenModInfo extends GuiScreen | ||
505 | this.openConfigPanel(); | 554 | this.openConfigPanel(); |
506 | } | 555 | } |
507 | 556 | ||
508 | - if (button.id == 2) | 557 | + if (button.id == 2 && this.chkEnabled != null) |
509 | { | 558 | { |
510 | this.chkEnabled.checked = !this.chkEnabled.checked; | 559 | this.chkEnabled.checked = !this.chkEnabled.checked; |
511 | LiteLoader.getInstance().setDisplayModInfoScreenTab(this.chkEnabled.checked); | 560 | LiteLoader.getInstance().setDisplayModInfoScreenTab(this.chkEnabled.checked); |
@@ -534,8 +583,52 @@ public class GuiScreenModInfo extends GuiScreen | @@ -534,8 +583,52 @@ public class GuiScreenModInfo extends GuiScreen | ||
534 | this.onToggled(); | 583 | this.onToggled(); |
535 | return; | 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 | /* (non-Javadoc) | 632 | /* (non-Javadoc) |
540 | * @see net.minecraft.src.GuiScreen#mouseClicked(int, int, int) | 633 | * @see net.minecraft.src.GuiScreen#mouseClicked(int, int, int) |
541 | */ | 634 | */ |
@@ -630,7 +723,7 @@ public class GuiScreenModInfo extends GuiScreen | @@ -630,7 +723,7 @@ public class GuiScreenModInfo extends GuiScreen | ||
630 | public void handleMouseClick(int mouseX, int mouseY, float partialTicks, boolean active, boolean mouseOverTab) | 723 | public void handleMouseClick(int mouseX, int mouseY, float partialTicks, boolean active, boolean mouseOverTab) |
631 | { | 724 | { |
632 | boolean mouseDown = Mouse.isButtonDown(0); | 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 | this.mouseDown = true; | 728 | this.mouseDown = true; |
636 | this.toggled = true; | 729 | this.toggled = true; |
@@ -654,7 +747,7 @@ public class GuiScreenModInfo extends GuiScreen | @@ -654,7 +747,7 @@ public class GuiScreenModInfo extends GuiScreen | ||
654 | { | 747 | { |
655 | this.tweenAmount = Math.min(1.0, this.tweenAmount + ((tickValue - this.lastTick) * TWEEN_RATE)); | 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 | this.tweenAmount = Math.max(0.0, this.tweenAmount - ((tickValue - this.lastTick) * TWEEN_RATE)); | 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,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 | * @param x | 826 | * @param x |
711 | * @param y | 827 | * @param y |
712 | * @param width | 828 | * @param width |