Commit 8f9462891658063103e837091165cd86cabcbce5

Authored by Mumfrey
1 parent 99fe86cb

refactoring ModList to separate class

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 }
... ...