Commit 8f9462891658063103e837091165cd86cabcbce5
1 parent
99fe86cb
refactoring ModList to separate class
Showing
6 changed files
with
430 additions
and
226 deletions
java/client/com/mumfrey/liteloader/client/gui/GuiModListPanel.java
... | ... | @@ -38,7 +38,7 @@ public class GuiModListPanel extends Gui |
38 | 38 | static final int HANGER_COLOUR_MOUSEOVER = GuiModListPanel.WHITE; |
39 | 39 | |
40 | 40 | static final int PANEL_HEIGHT = 32; |
41 | - static final int PANEL_SPACING = 4; | |
41 | + static final int PANEL_SPACING = 3; | |
42 | 42 | |
43 | 43 | private ModListEntry owner; |
44 | 44 | |
... | ... | @@ -75,6 +75,18 @@ public class GuiModListPanel extends Gui |
75 | 75 | decorator.addIcons(modInfo, this.modIcons); |
76 | 76 | } |
77 | 77 | } |
78 | + | |
79 | + public void draw(int mouseX, int mouseY, float partialTicks, int xPosition, int yPosition, int width, boolean selected, int pass) | |
80 | + { | |
81 | + if (pass == 0) | |
82 | + { | |
83 | + this.render(mouseX, mouseY, partialTicks, xPosition, yPosition, width, selected); | |
84 | + } | |
85 | + else if (pass == 1) | |
86 | + { | |
87 | + this.postRender(mouseX, mouseY, partialTicks, xPosition, yPosition, width, selected); | |
88 | + } | |
89 | + } | |
78 | 90 | |
79 | 91 | /** |
80 | 92 | * Draw this list entry as a list item |
... | ... | @@ -86,9 +98,8 @@ public class GuiModListPanel extends Gui |
86 | 98 | * @param yPosition |
87 | 99 | * @param width |
88 | 100 | * @param selected |
89 | - * @return calculated height of this panel, used by the list view to calculate spacing | |
90 | 101 | */ |
91 | - public int draw(int mouseX, int mouseY, float partialTicks, int xPosition, int yPosition, int width, boolean selected) | |
102 | + protected void render(int mouseX, int mouseY, float partialTicks, int xPosition, int yPosition, int width, boolean selected) | |
92 | 103 | { |
93 | 104 | int gradientColour = this.getGradientColour(selected); |
94 | 105 | int titleColour = this.getTitleColour(selected); |
... | ... | @@ -118,11 +129,9 @@ public class GuiModListPanel extends Gui |
118 | 129 | { |
119 | 130 | decorator.onDrawListEntry(mouseX, mouseY, partialTicks, xPosition, yPosition, width, GuiModListPanel.PANEL_HEIGHT, selected, this.modInfo, gradientColour, titleColour, statusColour); |
120 | 131 | } |
121 | - | |
122 | - return GuiModListPanel.PANEL_HEIGHT + GuiModListPanel.PANEL_SPACING; | |
123 | 132 | } |
124 | - | |
125 | - public int postRender(int mouseX, int mouseY, float partialTicks, int xPosition, int yPosition, int width, boolean selected) | |
133 | + | |
134 | + protected void postRender(int mouseX, int mouseY, float partialTicks, int xPosition, int yPosition, int width, boolean selected) | |
126 | 135 | { |
127 | 136 | xPosition += (width - 14); |
128 | 137 | yPosition += (GuiModListPanel.PANEL_HEIGHT - 14); |
... | ... | @@ -133,8 +142,6 @@ public class GuiModListPanel extends Gui |
133 | 142 | { |
134 | 143 | xPosition = this.drawPropertyIcon(xPosition, yPosition, icon, mouseX, mouseY); |
135 | 144 | } |
136 | - | |
137 | - return GuiModListPanel.PANEL_HEIGHT + GuiModListPanel.PANEL_SPACING; | |
138 | 145 | } |
139 | 146 | |
140 | 147 | protected int drawPropertyIcon(int xPosition, int yPosition, IconTextured icon, int mouseX, int mouseY) |
... | ... | @@ -190,8 +197,23 @@ public class GuiModListPanel extends Gui |
190 | 197 | return this.owner.isExternal() ? GuiModListPanel.EXTERNAL_ENTRY_COLOUR : this.brandColour; |
191 | 198 | } |
192 | 199 | |
200 | + public boolean isVisible() | |
201 | + { | |
202 | + return true; | |
203 | + } | |
204 | + | |
205 | + public int getSpacing() | |
206 | + { | |
207 | + return GuiModListPanel.PANEL_SPACING; | |
208 | + } | |
209 | + | |
193 | 210 | public int getHeight() |
194 | 211 | { |
212 | + return GuiModListPanel.PANEL_HEIGHT; | |
213 | + } | |
214 | + | |
215 | + public int getTotalHeight() | |
216 | + { | |
195 | 217 | return GuiModListPanel.PANEL_HEIGHT + GuiModListPanel.PANEL_SPACING; |
196 | 218 | } |
197 | 219 | ... | ... |
java/client/com/mumfrey/liteloader/client/gui/GuiPanelMods.java
... | ... | @@ -3,10 +3,7 @@ package com.mumfrey.liteloader.client.gui; |
3 | 3 | import static com.mumfrey.liteloader.gl.GL.*; |
4 | 4 | import static com.mumfrey.liteloader.gl.GLClippingPlanes.*; |
5 | 5 | |
6 | -import java.util.ArrayList; | |
7 | 6 | import java.util.List; |
8 | -import java.util.Map; | |
9 | -import java.util.TreeMap; | |
10 | 7 | |
11 | 8 | import net.minecraft.client.Minecraft; |
12 | 9 | import net.minecraft.client.gui.GuiButton; |
... | ... | @@ -17,9 +14,6 @@ import org.lwjgl.input.Keyboard; |
17 | 14 | import com.mumfrey.liteloader.LiteMod; |
18 | 15 | import com.mumfrey.liteloader.api.ModInfoDecorator; |
19 | 16 | import com.mumfrey.liteloader.core.LiteLoaderMods; |
20 | -import com.mumfrey.liteloader.core.ModInfo; | |
21 | -import com.mumfrey.liteloader.interfaces.Loadable; | |
22 | -import com.mumfrey.liteloader.interfaces.LoadableMod; | |
23 | 17 | import com.mumfrey.liteloader.launch.LoaderEnvironment; |
24 | 18 | import com.mumfrey.liteloader.modconfig.ConfigManager; |
25 | 19 | import com.mumfrey.liteloader.modconfig.ConfigPanel; |
... | ... | @@ -29,7 +23,7 @@ import com.mumfrey.liteloader.modconfig.ConfigPanel; |
29 | 23 | * |
30 | 24 | * @author Adam Mummery-Smith |
31 | 25 | */ |
32 | -public class GuiPanelMods extends GuiPanel | |
26 | +public class GuiPanelMods extends GuiPanel implements ModListContainer | |
33 | 27 | { |
34 | 28 | private static final int SCROLLBAR_WIDTH = 5; |
35 | 29 | |
... | ... | @@ -40,17 +34,7 @@ public class GuiPanelMods extends GuiPanel |
40 | 34 | /** |
41 | 35 | * List of enumerated mods |
42 | 36 | */ |
43 | - private List<ModListEntry> mods = new ArrayList<ModListEntry>(); | |
44 | - | |
45 | - /** | |
46 | - * Currently selected mod | |
47 | - */ | |
48 | - private ModListEntry selectedMod = null; | |
49 | - | |
50 | - /** | |
51 | - * Timer used to handle double-clicking on a mod | |
52 | - */ | |
53 | - private int doubleClickTime = 0; | |
37 | + private ModList modList; | |
54 | 38 | |
55 | 39 | /** |
56 | 40 | * Enable / disable button |
... | ... | @@ -72,57 +56,38 @@ public class GuiPanelMods extends GuiPanel |
72 | 56 | */ |
73 | 57 | private GuiSimpleScrollBar scrollBar = new GuiSimpleScrollBar(); |
74 | 58 | |
75 | - private int brandColour; | |
76 | - | |
77 | 59 | public GuiPanelMods(GuiLiteLoaderPanel parentScreen, Minecraft minecraft, LiteLoaderMods mods, LoaderEnvironment environment, ConfigManager configManager, int brandColour, List<ModInfoDecorator> decorators) |
78 | 60 | { |
79 | 61 | super(minecraft); |
80 | 62 | |
81 | 63 | this.parentScreen = parentScreen; |
82 | 64 | this.configManager = configManager; |
83 | - this.brandColour = brandColour; | |
84 | 65 | |
85 | - this.populateModList(mods, environment, decorators); | |
66 | + this.modList = new ModList(this, minecraft, mods, environment, configManager, brandColour, decorators); | |
86 | 67 | } |
87 | 68 | |
88 | - /** | |
89 | - * Populate the mods list | |
90 | - * | |
91 | - * @param mods | |
92 | - * @param environment | |
93 | - */ | |
94 | - private void populateModList(LiteLoaderMods mods, LoaderEnvironment environment, List<ModInfoDecorator> decorators) | |
69 | + @Override | |
70 | + public GuiLiteLoaderPanel getParentScreen() | |
95 | 71 | { |
96 | - // Add mods to this treeset first, in order to sort them | |
97 | - Map<String, ModListEntry> sortedMods = new TreeMap<String, ModListEntry>(); | |
98 | - | |
99 | - // Active mods | |
100 | - for (ModInfo<LoadableMod<?>> mod : mods.getLoadedMods()) | |
101 | - { | |
102 | - ModListEntry modListEntry = new ModListEntry(mods, environment, this.mc.fontRendererObj, this.brandColour, decorators, mod); | |
103 | - sortedMods.put(modListEntry.getKey(), modListEntry); | |
104 | - } | |
105 | - | |
106 | - // Disabled mods | |
107 | - for (ModInfo<?> disabledMod : mods.getDisabledMods()) | |
108 | - { | |
109 | - ModListEntry modListEntry = new ModListEntry(mods, environment, this.mc.fontRendererObj, this.brandColour, decorators, disabledMod); | |
110 | - sortedMods.put(modListEntry.getKey(), modListEntry); | |
111 | - } | |
112 | - | |
113 | - // Injected tweaks | |
114 | - for (ModInfo<Loadable<?>> injectedTweak : mods.getInjectedTweaks()) | |
115 | - { | |
116 | - ModListEntry modListEntry = new ModListEntry(mods, environment, this.mc.fontRendererObj, this.brandColour, decorators, injectedTweak); | |
117 | - sortedMods.put(modListEntry.getKey(), modListEntry); | |
118 | - } | |
119 | - | |
120 | - // Add the sorted mods to the mods list | |
121 | - this.mods.addAll(sortedMods.values()); | |
122 | - | |
123 | - // Select the first mod in the list | |
124 | - if (this.mods.size() > 0) | |
125 | - this.selectedMod = this.mods.get(0); | |
72 | + return this.parentScreen; | |
73 | + } | |
74 | + | |
75 | + @Override | |
76 | + public void setConfigButtonVisible(boolean visible) | |
77 | + { | |
78 | + this.btnConfig.visible = visible; | |
79 | + } | |
80 | + | |
81 | + @Override | |
82 | + public void setEnableButtonVisible(boolean visible) | |
83 | + { | |
84 | + this.btnToggle.visible = visible; | |
85 | + } | |
86 | + | |
87 | + @Override | |
88 | + public void setEnableButtonText(String displayString) | |
89 | + { | |
90 | + this.btnToggle.displayString = displayString; | |
126 | 91 | } |
127 | 92 | |
128 | 93 | @Override |
... | ... | @@ -141,15 +106,14 @@ public class GuiPanelMods extends GuiPanel |
141 | 106 | this.controls.clear(); |
142 | 107 | this.controls.add(this.btnToggle = new GuiButton(0, rightPanelLeftEdge, this.height - GuiLiteLoaderPanel.PANEL_BOTTOM - 24, 90, 20, I18n.format("gui.enablemod"))); |
143 | 108 | this.controls.add(this.btnConfig = new GuiButton(1, rightPanelLeftEdge + 92, this.height - GuiLiteLoaderPanel.PANEL_BOTTOM - 24, 69, 20, I18n.format("gui.modsettings"))); |
144 | - | |
145 | - this.selectMod(this.selectedMod); | |
109 | + | |
110 | + this.modList.setSize(width, height); | |
146 | 111 | } |
147 | 112 | |
148 | 113 | @Override |
149 | 114 | void onTick() |
150 | 115 | { |
151 | - if (this.doubleClickTime > 0) | |
152 | - this.doubleClickTime--; | |
116 | + this.modList.onTick(); | |
153 | 117 | } |
154 | 118 | |
155 | 119 | @Override |
... | ... | @@ -174,35 +138,7 @@ public class GuiPanelMods extends GuiPanel |
174 | 138 | |
175 | 139 | if (mouseY > GuiLiteLoaderPanel.PANEL_TOP && mouseY < this.height - GuiLiteLoaderPanel.PANEL_BOTTOM) |
176 | 140 | { |
177 | - ModListEntry lastSelectedMod = this.selectedMod; | |
178 | - | |
179 | - for (ModListEntry mod : this.mods) | |
180 | - { | |
181 | - if (mod.getListPanel().isMouseOver()) | |
182 | - { | |
183 | - this.selectMod(mod); | |
184 | - | |
185 | - if (mod.getListPanel().isMouseOverIcon()) | |
186 | - { | |
187 | - mod.getListPanel().iconClick(this.parentScreen); | |
188 | - } | |
189 | - else | |
190 | - { | |
191 | - // handle double-click | |
192 | - if (mod == lastSelectedMod && this.doubleClickTime > 0 && this.btnConfig.visible) | |
193 | - { | |
194 | - this.actionPerformed(this.btnConfig); | |
195 | - } | |
196 | - } | |
197 | - | |
198 | - this.doubleClickTime = 5; | |
199 | - } | |
200 | - } | |
201 | - | |
202 | - if (this.selectedMod != null && this.selectedMod == lastSelectedMod) | |
203 | - { | |
204 | - this.selectedMod.getInfoPanel().mousePressed(); | |
205 | - } | |
141 | + this.modList.mousePressed(mouseX, mouseY, mouseButton); | |
206 | 142 | } |
207 | 143 | } |
208 | 144 | |
... | ... | @@ -217,21 +153,9 @@ public class GuiPanelMods extends GuiPanel |
217 | 153 | this.parentScreen.onToggled(); |
218 | 154 | return; |
219 | 155 | } |
220 | - else if (keyCode == Keyboard.KEY_UP) | |
221 | - { | |
222 | - int selectedIndex = this.mods.indexOf(this.selectedMod) - 1; | |
223 | - if (selectedIndex > -1) this.selectMod(this.mods.get(selectedIndex)); | |
224 | - this.scrollSelectedModIntoView(); | |
225 | - } | |
226 | - else if (keyCode == Keyboard.KEY_DOWN) | |
227 | - { | |
228 | - int selectedIndex = this.mods.indexOf(this.selectedMod); | |
229 | - if (selectedIndex > -1 && selectedIndex < this.mods.size() - 1) this.selectMod(this.mods.get(selectedIndex + 1)); | |
230 | - this.scrollSelectedModIntoView(); | |
231 | - } | |
232 | - else if (keyCode == Keyboard.KEY_SPACE || keyCode == Keyboard.KEY_RETURN || keyCode == Keyboard.KEY_NUMPADENTER || keyCode == Keyboard.KEY_RIGHT) | |
156 | + else if (this.modList.keyPressed(keyChar, keyCode)) | |
233 | 157 | { |
234 | - this.toggleSelectedMod(); | |
158 | + // Suppress further handling | |
235 | 159 | } |
236 | 160 | else if (keyCode == Keyboard.KEY_F3) |
237 | 161 | { |
... | ... | @@ -254,37 +178,41 @@ public class GuiPanelMods extends GuiPanel |
254 | 178 | if (mouseButton == 0) |
255 | 179 | { |
256 | 180 | this.scrollBar.setDragging(false); |
257 | - | |
258 | - if (this.selectedMod != null) | |
259 | - { | |
260 | - this.selectedMod.getInfoPanel().mouseReleased(); | |
261 | - } | |
181 | + this.modList.mouseReleased(mouseX, mouseY, mouseButton); | |
262 | 182 | } |
263 | 183 | } |
264 | 184 | |
265 | 185 | @Override |
266 | 186 | void mouseWheelScrolled(int mouseWheelDelta) |
267 | 187 | { |
268 | - if (this.selectedMod == null || !this.selectedMod.getInfoPanel().mouseWheelScrolled(mouseWheelDelta)) | |
188 | + if (!this.modList.mouseWheelScrolled(mouseWheelDelta)) | |
269 | 189 | { |
270 | 190 | this.scrollBar.offsetValue(-mouseWheelDelta / 8); |
271 | 191 | } |
272 | 192 | } |
273 | 193 | |
274 | 194 | @Override |
195 | + public void showConfig() | |
196 | + { | |
197 | + this.actionPerformed(this.btnConfig); | |
198 | + } | |
199 | + | |
200 | + @Override | |
275 | 201 | void actionPerformed(GuiButton control) |
276 | 202 | { |
277 | 203 | if (control.id == 0) |
278 | 204 | { |
279 | - this.toggleSelectedMod(); | |
205 | + this.modList.toggleSelectedMod(); | |
280 | 206 | } |
281 | 207 | |
282 | 208 | if (control.id == 1) |
283 | 209 | { |
284 | - if (this.selectedMod != null && this.selectedMod.getModClass() != null) | |
210 | + Class<? extends LiteMod> modClass = this.modList.getSelectedModClass(); | |
211 | + | |
212 | + if (modClass != null) | |
285 | 213 | { |
286 | - ConfigPanel panel = this.configManager.getPanel(this.selectedMod.getModClass()); | |
287 | - LiteMod mod = this.selectedMod.getModInstance(); | |
214 | + ConfigPanel panel = this.configManager.getPanel(modClass); | |
215 | + LiteMod mod = this.modList.getSelectedModInstance(); | |
288 | 216 | this.parentScreen.openConfigPanel(panel, mod); |
289 | 217 | } |
290 | 218 | } |
... | ... | @@ -298,9 +226,17 @@ public class GuiPanelMods extends GuiPanel |
298 | 226 | int innerWidth = this.width - MARGIN - MARGIN - 4; |
299 | 227 | int panelWidth = innerWidth / 2; |
300 | 228 | int panelHeight = this.height - GuiLiteLoaderPanel.PANEL_BOTTOM - GuiLiteLoaderPanel.PANEL_TOP; |
301 | - | |
229 | + | |
302 | 230 | this.drawModsList(mouseX, mouseY, partialTicks, panelWidth, panelHeight); |
303 | - this.drawSelectedMod(mouseX, mouseY, partialTicks, panelWidth, panelHeight); | |
231 | + | |
232 | + int left = MARGIN + panelWidth; | |
233 | + int top = GuiLiteLoaderPanel.PANEL_TOP; | |
234 | + int spaceForButtons = (this.btnConfig.visible || this.btnToggle.visible ? 28 : 0); | |
235 | + int bottom = this.height - GuiLiteLoaderPanel.PANEL_BOTTOM - spaceForButtons; | |
236 | + | |
237 | + glEnableClipping(left, this.width - MARGIN, top, bottom); | |
238 | + this.modList.drawModPanel(mouseX, mouseY, partialTicks, left, top, this.width - MARGIN - left, panelHeight - spaceForButtons); | |
239 | + glDisableClipping(); | |
304 | 240 | |
305 | 241 | super.draw(mouseX, mouseY, partialTicks); |
306 | 242 | } |
... | ... | @@ -324,108 +260,30 @@ public class GuiPanelMods extends GuiPanel |
324 | 260 | glTranslatef(0.0F, GuiLiteLoaderPanel.PANEL_TOP - this.scrollBar.getValue(), 0.0F); |
325 | 261 | |
326 | 262 | mouseY -= (GuiLiteLoaderPanel.PANEL_TOP - this.scrollBar.getValue()); |
327 | - | |
328 | - int yPos = 0; | |
329 | - for (ModListEntry mod : this.mods) | |
330 | - { | |
331 | - // drawListEntry returns a value indicating the height of the item drawn | |
332 | - yPos += mod.getListPanel().draw(mouseX, mouseY, partialTicks, MARGIN, yPos, width - 6, mod == this.selectedMod); | |
333 | - } | |
334 | - | |
335 | - yPos = 0; | |
336 | - for (ModListEntry mod : this.mods) | |
337 | - { | |
338 | - yPos += mod.getListPanel().postRender(mouseX, mouseY, partialTicks, MARGIN, yPos, width - 6, mod == this.selectedMod); | |
339 | - } | |
263 | + | |
264 | + this.listHeight = this.modList.drawModList(mouseX, mouseY, partialTicks, MARGIN, 0, width - SCROLLBAR_WIDTH - 1, height); | |
265 | + this.scrollBar.setMaxValue(this.listHeight - height); | |
340 | 266 | |
341 | 267 | glPopMatrix(); |
342 | 268 | glDisableClipping(); |
343 | - | |
344 | - this.listHeight = yPos; | |
345 | - this.scrollBar.setMaxValue(this.listHeight - height); | |
346 | - } | |
347 | - | |
348 | - /** | |
349 | - * @param mouseX | |
350 | - * @param mouseY | |
351 | - * @param partialTicks | |
352 | - * @param width | |
353 | - * @param height | |
354 | - */ | |
355 | - private void drawSelectedMod(int mouseX, int mouseY, float partialTicks, int width, int height) | |
356 | - { | |
357 | - if (this.selectedMod != null) | |
358 | - { | |
359 | - int left = MARGIN + width; | |
360 | - int right = this.width - MARGIN; | |
361 | - | |
362 | - int spaceForButtons = this.btnConfig.visible || this.btnToggle.visible ? 28 : 0; | |
363 | - glEnableClipping(left, right, GuiLiteLoaderPanel.PANEL_TOP, this.height - GuiLiteLoaderPanel.PANEL_BOTTOM - spaceForButtons); | |
364 | - this.selectedMod.getInfoPanel().draw(mouseX, mouseY, partialTicks, left, GuiLiteLoaderPanel.PANEL_TOP, right - left, height - spaceForButtons); | |
365 | - glDisableClipping(); | |
366 | - } | |
367 | - } | |
368 | - | |
369 | - /** | |
370 | - * @param mod Mod list entry to select | |
371 | - */ | |
372 | - private void selectMod(ModListEntry mod) | |
373 | - { | |
374 | - if (this.selectedMod != null) | |
375 | - { | |
376 | - this.selectedMod.getInfoPanel().mouseReleased(); | |
377 | - } | |
378 | - | |
379 | - this.selectedMod = mod; | |
380 | - this.btnToggle.visible = false; | |
381 | - this.btnConfig.visible = false; | |
382 | - | |
383 | - if (this.selectedMod != null && this.selectedMod.canBeToggled()) | |
384 | - { | |
385 | - this.btnToggle.visible = true; | |
386 | - this.btnToggle.displayString = this.selectedMod.willBeEnabled() ? I18n.format("gui.disablemod") : I18n.format("gui.enablemod"); | |
387 | - | |
388 | - this.btnConfig.visible = this.configManager.hasPanel(this.selectedMod.getModClass()); | |
389 | - } | |
390 | 269 | } |
391 | - | |
392 | - /** | |
393 | - * Toggle the selected mod's enabled status | |
394 | - */ | |
395 | - private void toggleSelectedMod() | |
396 | - { | |
397 | - if (this.selectedMod != null) | |
398 | - { | |
399 | - this.selectedMod.toggleEnabled(); | |
400 | - this.selectMod(this.selectedMod); | |
401 | - } | |
402 | - } | |
403 | - | |
404 | - private void scrollSelectedModIntoView() | |
270 | + | |
271 | + @Override | |
272 | + public void scrollTo(int yPosTop, int yPosBottom) | |
405 | 273 | { |
406 | - if (this.selectedMod == null) return; | |
407 | - | |
408 | - int yPos = 0; | |
409 | - for (ModListEntry mod : this.mods) | |
410 | - { | |
411 | - if (mod == this.selectedMod) break; | |
412 | - yPos += mod.getListPanel().getHeight(); | |
413 | - } | |
414 | - | |
415 | 274 | // Mod is above the top of the visible window |
416 | - if (yPos < this.scrollBar.getValue()) | |
275 | + if (yPosTop < this.scrollBar.getValue()) | |
417 | 276 | { |
418 | - this.scrollBar.setValue(yPos); | |
277 | + this.scrollBar.setValue(yPosTop); | |
419 | 278 | return; |
420 | 279 | } |
421 | 280 | |
422 | 281 | int panelHeight = this.height - GuiLiteLoaderPanel.PANEL_BOTTOM - GuiLiteLoaderPanel.PANEL_TOP; |
423 | - int modHeight = this.selectedMod.getListPanel().getHeight(); | |
424 | 282 | |
425 | 283 | // Mod is below the bottom of the visible window |
426 | - if (yPos - this.scrollBar.getValue() + modHeight > panelHeight) | |
284 | + if (yPosBottom - this.scrollBar.getValue() > panelHeight) | |
427 | 285 | { |
428 | - this.scrollBar.setValue(yPos - panelHeight + modHeight); | |
286 | + this.scrollBar.setValue(yPosBottom - panelHeight); | |
429 | 287 | } |
430 | 288 | } |
431 | 289 | } | ... | ... |
java/client/com/mumfrey/liteloader/client/gui/ModList.java
0 โ 100644
1 | +package com.mumfrey.liteloader.client.gui; | |
2 | + | |
3 | +import java.util.ArrayList; | |
4 | +import java.util.List; | |
5 | +import java.util.Map; | |
6 | +import java.util.TreeMap; | |
7 | + | |
8 | +import net.minecraft.client.Minecraft; | |
9 | +import net.minecraft.client.resources.I18n; | |
10 | + | |
11 | +import org.lwjgl.input.Keyboard; | |
12 | + | |
13 | +import com.mumfrey.liteloader.LiteMod; | |
14 | +import com.mumfrey.liteloader.api.ModInfoDecorator; | |
15 | +import com.mumfrey.liteloader.core.LiteLoaderMods; | |
16 | +import com.mumfrey.liteloader.core.ModInfo; | |
17 | +import com.mumfrey.liteloader.interfaces.Loadable; | |
18 | +import com.mumfrey.liteloader.interfaces.LoadableMod; | |
19 | +import com.mumfrey.liteloader.launch.LoaderEnvironment; | |
20 | +import com.mumfrey.liteloader.modconfig.ConfigManager; | |
21 | + | |
22 | +public class ModList | |
23 | +{ | |
24 | + private final ModListContainer container; | |
25 | + | |
26 | + private final ConfigManager configManager; | |
27 | + | |
28 | + /** | |
29 | + * List of enumerated mods | |
30 | + */ | |
31 | + private final List<ModListEntry> mods = new ArrayList<ModListEntry>(); | |
32 | + | |
33 | + /** | |
34 | + * Currently selected mod | |
35 | + */ | |
36 | + private ModListEntry selectedMod = null; | |
37 | + | |
38 | + private boolean hasConfig = false; | |
39 | + | |
40 | + public ModList(ModListContainer container, Minecraft minecraft, LiteLoaderMods mods, LoaderEnvironment environment, ConfigManager configManager, int brandColour, List<ModInfoDecorator> decorators) | |
41 | + { | |
42 | + this.container = container; | |
43 | + this.configManager = configManager; | |
44 | + | |
45 | + this.populate(minecraft, mods, environment, brandColour, decorators); | |
46 | + } | |
47 | + | |
48 | + /** | |
49 | + * @param minecraft | |
50 | + * @param mods | |
51 | + * @param environment | |
52 | + * @param brandColour | |
53 | + * @param decorators | |
54 | + */ | |
55 | + protected void populate(Minecraft minecraft, LiteLoaderMods mods, LoaderEnvironment environment, int brandColour, List<ModInfoDecorator> decorators) | |
56 | + { | |
57 | + // Add mods to this treeset first, in order to sort them | |
58 | + Map<String, ModListEntry> sortedMods = new TreeMap<String, ModListEntry>(); | |
59 | + | |
60 | + // Active mods | |
61 | + for (ModInfo<LoadableMod<?>> mod : mods.getLoadedMods()) | |
62 | + { | |
63 | + ModListEntry modListEntry = new ModListEntry(this, mods, environment, minecraft.fontRendererObj, brandColour, decorators, mod); | |
64 | + sortedMods.put(modListEntry.getKey(), modListEntry); | |
65 | + } | |
66 | + | |
67 | + // Disabled mods | |
68 | + for (ModInfo<?> disabledMod : mods.getDisabledMods()) | |
69 | + { | |
70 | + ModListEntry modListEntry = new ModListEntry(this, mods, environment, minecraft.fontRendererObj, brandColour, decorators, disabledMod); | |
71 | + sortedMods.put(modListEntry.getKey(), modListEntry); | |
72 | + } | |
73 | + | |
74 | + // Injected tweaks | |
75 | + for (ModInfo<Loadable<?>> injectedTweak : mods.getInjectedTweaks()) | |
76 | + { | |
77 | + ModListEntry modListEntry = new ModListEntry(this, mods, environment, minecraft.fontRendererObj, brandColour, decorators, injectedTweak); | |
78 | + sortedMods.put(modListEntry.getKey(), modListEntry); | |
79 | + } | |
80 | + | |
81 | + // Add the sorted mods to the mods list | |
82 | + this.mods.addAll(sortedMods.values()); | |
83 | + | |
84 | + // Select the first mod in the list | |
85 | + if (this.mods.size() > 0) | |
86 | + this.selectedMod = this.mods.get(0); | |
87 | + } | |
88 | + | |
89 | + public GuiLiteLoaderPanel getParentScreen() | |
90 | + { | |
91 | + return this.container.getParentScreen(); | |
92 | + } | |
93 | + | |
94 | + public LiteMod getSelectedModInstance() | |
95 | + { | |
96 | + return this.selectedMod != null ? this.selectedMod.getModInstance() : null; | |
97 | + } | |
98 | + | |
99 | + public Class<? extends LiteMod> getSelectedModClass() | |
100 | + { | |
101 | + return this.selectedMod != null ? this.selectedMod.getModClass() : null; | |
102 | + } | |
103 | + | |
104 | + public void setSize(int width, int height) | |
105 | + { | |
106 | + this.selectMod(this.selectedMod); | |
107 | + } | |
108 | + | |
109 | + public void onTick() | |
110 | + { | |
111 | + for (ModListEntry mod : this.mods) | |
112 | + { | |
113 | + mod.onTick(); | |
114 | + } | |
115 | + } | |
116 | + | |
117 | + public void mousePressed(int mouseX, int mouseY, int mouseButton) | |
118 | + { | |
119 | + ModListEntry lastSelectedMod = this.selectedMod; | |
120 | + | |
121 | + for (ModListEntry mod : this.mods) | |
122 | + { | |
123 | + mod.mousePressed(mouseX, mouseY, mouseButton); | |
124 | + } | |
125 | + | |
126 | + if (this.selectedMod != null && this.selectedMod == lastSelectedMod) | |
127 | + { | |
128 | + this.selectedMod.getInfoPanel().mousePressed(); | |
129 | + } | |
130 | + } | |
131 | + | |
132 | + public boolean keyPressed(char keyChar, int keyCode) | |
133 | + { | |
134 | + if (keyCode == Keyboard.KEY_UP) | |
135 | + { | |
136 | + int selectedIndex = this.mods.indexOf(this.selectedMod) - 1; | |
137 | + if (selectedIndex > -1) this.selectMod(this.mods.get(selectedIndex)); | |
138 | + this.scrollSelectedModIntoView(); | |
139 | + return true; | |
140 | + } | |
141 | + else if (keyCode == Keyboard.KEY_DOWN) | |
142 | + { | |
143 | + int selectedIndex = this.mods.indexOf(this.selectedMod); | |
144 | + if (selectedIndex > -1 && selectedIndex < this.mods.size() - 1) this.selectMod(this.mods.get(selectedIndex + 1)); | |
145 | + this.scrollSelectedModIntoView(); | |
146 | + return true; | |
147 | + } | |
148 | + else if (keyCode == Keyboard.KEY_SPACE || keyCode == Keyboard.KEY_RETURN || keyCode == Keyboard.KEY_NUMPADENTER || keyCode == Keyboard.KEY_RIGHT) | |
149 | + { | |
150 | + this.toggleSelectedMod(); | |
151 | + return true; | |
152 | + } | |
153 | + | |
154 | + return false; | |
155 | + } | |
156 | + | |
157 | + public void mouseReleased(int mouseX, int mouseY, int mouseButton) | |
158 | + { | |
159 | + if (this.selectedMod != null) | |
160 | + { | |
161 | + this.selectedMod.getInfoPanel().mouseReleased(); | |
162 | + } | |
163 | + } | |
164 | + | |
165 | + public boolean mouseWheelScrolled(int mouseWheelDelta) | |
166 | + { | |
167 | + return this.selectedMod != null && this.selectedMod.getInfoPanel().mouseWheelScrolled(mouseWheelDelta); | |
168 | + } | |
169 | + | |
170 | + public int drawModList(int mouseX, int mouseY, float partialTicks, int left, int top, int width, int height) | |
171 | + { | |
172 | + this.drawModListPass(mouseX, mouseY, partialTicks, left, top, width, 0); | |
173 | + return this.drawModListPass(mouseX, mouseY, partialTicks, left, top, width, 1); | |
174 | + } | |
175 | + | |
176 | + protected int drawModListPass(int mouseX, int mouseY, float partialTicks, int left, int top, int width, int pass) | |
177 | + { | |
178 | + int yPos = top; | |
179 | + for (ModListEntry mod : this.mods) | |
180 | + { | |
181 | + GuiModListPanel panel = mod.getListPanel(); | |
182 | + if (panel.isVisible()) | |
183 | + { | |
184 | + if (yPos > 0) yPos += panel.getSpacing(); | |
185 | + panel.draw(mouseX, mouseY, partialTicks, left, yPos, width, mod == this.selectedMod, pass); | |
186 | + yPos += panel.getHeight(); | |
187 | + } | |
188 | + } | |
189 | + return yPos; | |
190 | + } | |
191 | + | |
192 | + public void drawModPanel(int mouseX, int mouseY, float partialTicks, int left, int top, int width, int height) | |
193 | + { | |
194 | + if (this.selectedMod != null) | |
195 | + { | |
196 | + this.selectedMod.getInfoPanel().draw(mouseX, mouseY, partialTicks, left, top, width, height); | |
197 | + } | |
198 | + } | |
199 | + | |
200 | + /** | |
201 | + * @param mod Mod list entry to select | |
202 | + */ | |
203 | + void selectMod(ModListEntry mod) | |
204 | + { | |
205 | + if (this.selectedMod != null) | |
206 | + { | |
207 | + this.selectedMod.getInfoPanel().mouseReleased(); | |
208 | + } | |
209 | + | |
210 | + this.selectedMod = mod; | |
211 | + this.hasConfig = false; | |
212 | + this.container.setEnableButtonVisible(false); | |
213 | + this.container.setConfigButtonVisible(false); | |
214 | + | |
215 | + if (this.selectedMod != null && this.selectedMod.canBeToggled()) | |
216 | + { | |
217 | + this.container.setEnableButtonVisible(true); | |
218 | + this.container.setEnableButtonText(this.selectedMod.willBeEnabled() ? I18n.format("gui.disablemod") : I18n.format("gui.enablemod")); | |
219 | + this.hasConfig = this.configManager.hasPanel(this.selectedMod.getModClass()); | |
220 | + this.container.setConfigButtonVisible(this.hasConfig); | |
221 | + } | |
222 | + } | |
223 | + | |
224 | + /** | |
225 | + * Toggle the selected mod's enabled status | |
226 | + */ | |
227 | + public void toggleSelectedMod() | |
228 | + { | |
229 | + if (this.selectedMod != null) | |
230 | + { | |
231 | + this.selectedMod.toggleEnabled(); | |
232 | + this.selectMod(this.selectedMod); | |
233 | + } | |
234 | + } | |
235 | + | |
236 | + private void scrollSelectedModIntoView() | |
237 | + { | |
238 | + if (this.selectedMod == null) return; | |
239 | + | |
240 | + int yPos = 0; | |
241 | + for (ModListEntry mod : this.mods) | |
242 | + { | |
243 | + if (mod == this.selectedMod) break; | |
244 | + yPos += mod.getListPanel().getTotalHeight(); | |
245 | + } | |
246 | + | |
247 | + int modHeight = this.selectedMod.getListPanel().getTotalHeight(); | |
248 | + this.container.scrollTo(yPos, yPos + modHeight); | |
249 | + } | |
250 | + | |
251 | + public void showConfig(ModListEntry modListEntry) | |
252 | + { | |
253 | + this.container.showConfig(); | |
254 | + } | |
255 | +} | ... | ... |
java/client/com/mumfrey/liteloader/client/gui/ModListContainer.java
0 โ 100644
1 | +package com.mumfrey.liteloader.client.gui; | |
2 | + | |
3 | +public interface ModListContainer | |
4 | +{ | |
5 | + public abstract GuiLiteLoaderPanel getParentScreen(); | |
6 | + | |
7 | + public abstract void setEnableButtonVisible(boolean visible); | |
8 | + | |
9 | + public abstract void setConfigButtonVisible(boolean visible); | |
10 | + | |
11 | + public abstract void setEnableButtonText(String displayString); | |
12 | + | |
13 | + public abstract void showConfig(); | |
14 | + | |
15 | + public abstract void scrollTo(int yPos, int modHeight); | |
16 | +} | ... | ... |
java/client/com/mumfrey/liteloader/client/gui/ModListEntry.java
... | ... | @@ -22,13 +22,15 @@ import com.mumfrey.liteloader.launch.LoaderEnvironment; |
22 | 22 | */ |
23 | 23 | public class ModListEntry |
24 | 24 | { |
25 | + private final ModList modList; | |
26 | + | |
25 | 27 | private final LiteLoaderMods mods; |
26 | 28 | |
27 | 29 | private final ModInfo<?> modInfo; |
28 | 30 | |
29 | - private final GuiModListPanel listPanel; | |
31 | + private GuiModListPanel listPanel; | |
30 | 32 | |
31 | - private final GuiModInfoPanel infoPanel; | |
33 | + private GuiModInfoPanel infoPanel; | |
32 | 34 | |
33 | 35 | /** |
34 | 36 | * Whether the mod is currently active |
... | ... | @@ -68,8 +70,12 @@ public class ModListEntry |
68 | 70 | private boolean isExternal; |
69 | 71 | |
70 | 72 | /** |
71 | - * Mod list entry for an ACTIVE mod | |
72 | - * | |
73 | + * Timer used to handle double-clicking on a mod | |
74 | + */ | |
75 | + private int doubleClickTime = 0; | |
76 | + | |
77 | + /** | |
78 | + * @param modList | |
73 | 79 | * @param mods |
74 | 80 | * @param environment |
75 | 81 | * @param fontRenderer |
... | ... | @@ -77,8 +83,9 @@ public class ModListEntry |
77 | 83 | * @param decorators |
78 | 84 | * @param modInfo |
79 | 85 | */ |
80 | - ModListEntry(LiteLoaderMods mods, LoaderEnvironment environment, FontRenderer fontRenderer, int brandColour, List<ModInfoDecorator> decorators, ModInfo<?> modInfo) | |
86 | + ModListEntry(ModList modList, LiteLoaderMods mods, LoaderEnvironment environment, FontRenderer fontRenderer, int brandColour, List<ModInfoDecorator> decorators, ModInfo<?> modInfo) | |
81 | 87 | { |
88 | + this.modList = modList; | |
82 | 89 | this.mods = mods; |
83 | 90 | this.modInfo = modInfo; |
84 | 91 | |
... | ... | @@ -104,10 +111,55 @@ public class ModListEntry |
104 | 111 | } |
105 | 112 | } |
106 | 113 | |
114 | + this.initPanels(fontRenderer, brandColour, decorators, modInfo); | |
115 | + } | |
116 | + | |
117 | + /** | |
118 | + * @param fontRenderer | |
119 | + * @param brandColour | |
120 | + * @param decorators | |
121 | + * @param modInfo | |
122 | + */ | |
123 | + protected void initPanels(FontRenderer fontRenderer, int brandColour, List<ModInfoDecorator> decorators, ModInfo<?> modInfo) | |
124 | + { | |
107 | 125 | this.infoPanel = new GuiModInfoPanel(this, fontRenderer, brandColour, modInfo); |
108 | 126 | this.listPanel = new GuiModListPanel(this, fontRenderer, brandColour, modInfo, decorators); |
109 | 127 | } |
110 | - | |
128 | + | |
129 | + public void onTick() | |
130 | + { | |
131 | + if (this.doubleClickTime > 0) | |
132 | + this.doubleClickTime--; | |
133 | + } | |
134 | + | |
135 | + public void mousePressed(int mouseX, int mouseY, int mouseButton) | |
136 | + { | |
137 | + if (this.getListPanel().isMouseOver()) | |
138 | + { | |
139 | + this.modList.selectMod(this); | |
140 | + | |
141 | + if (this.getListPanel().isMouseOverIcon()) | |
142 | + { | |
143 | + this.getListPanel().iconClick(this.modList.getParentScreen()); | |
144 | + } | |
145 | + else | |
146 | + { | |
147 | + // handle double-click | |
148 | + if (this.doubleClickTime > 0) | |
149 | + { | |
150 | + this.onDoubleClicked(); | |
151 | + } | |
152 | + } | |
153 | + | |
154 | + this.doubleClickTime = 5; | |
155 | + } | |
156 | + } | |
157 | + | |
158 | + protected void onDoubleClicked() | |
159 | + { | |
160 | + this.modList.showConfig(this); | |
161 | + } | |
162 | + | |
111 | 163 | protected String getTitleText() |
112 | 164 | { |
113 | 165 | return this.modInfo.getDisplayName(); |
... | ... | @@ -163,6 +215,11 @@ public class ModListEntry |
163 | 215 | return (this.isErrored ? "0000" : "") + this.modInfo.getIdentifier() + Integer.toHexString(this.hashCode()); |
164 | 216 | } |
165 | 217 | |
218 | + public ModInfo<?> getModInfo() | |
219 | + { | |
220 | + return this.modInfo; | |
221 | + } | |
222 | + | |
166 | 223 | public LiteMod getModInstance() |
167 | 224 | { |
168 | 225 | return this.modInfo.getMod(); | ... | ... |
java/common/com/mumfrey/liteloader/core/LiteLoaderMods.java
... | ... | @@ -8,8 +8,6 @@ import java.util.List; |
8 | 8 | import java.util.Map; |
9 | 9 | import java.util.Set; |
10 | 10 | |
11 | -import javax.activity.InvalidActivityException; | |
12 | - | |
13 | 11 | import net.minecraft.client.resources.IResourcePack; |
14 | 12 | |
15 | 13 | import com.mumfrey.liteloader.LiteMod; |
... | ... | @@ -268,10 +266,8 @@ public class LiteLoaderMods |
268 | 266 | * @param modNameOrId |
269 | 267 | * @param metaDataKey |
270 | 268 | * @param defaultValue |
271 | - * @throws InvalidActivityException Thrown by getMod if init is not complete | |
272 | - * @throws IllegalArgumentException Thrown by getMod if argument is null | |
273 | 269 | */ |
274 | - public String getModMetaData(String modNameOrId, String metaDataKey, String defaultValue) throws InvalidActivityException, IllegalArgumentException | |
270 | + public String getModMetaData(String modNameOrId, String metaDataKey, String defaultValue) throws IllegalArgumentException | |
275 | 271 | { |
276 | 272 | return this.getModMetaData(this.getMod(modNameOrId), metaDataKey, defaultValue); |
277 | 273 | } | ... | ... |