diff --git a/eos b/eos index 5479be126..42cb0b618 160000 --- a/eos +++ b/eos @@ -1 +1 @@ -Subproject commit 5479be126cd611e55dbf8b77df72ce78cbfd6f11 +Subproject commit 42cb0b6180ba196c66ebc065d178a444310f6e82 diff --git a/gui/builtinContextMenus/moduleAmmoPicker.py b/gui/builtinContextMenus/moduleAmmoPicker.py index 5fad938c3..afd2fa247 100644 --- a/gui/builtinContextMenus/moduleAmmoPicker.py +++ b/gui/builtinContextMenus/moduleAmmoPicker.py @@ -4,6 +4,7 @@ import service import gui.fittingView import wx from gui import bitmapLoader +from eos.types import Hardpoint class ModuleAmmoPicker(ContextMenu): def __init__(self): @@ -22,8 +23,9 @@ class ModuleAmmoPicker(ContextMenu): validCharges = currCharges - self.charges = validCharges - return True + self.charges = list(validCharges) + self.hardpoint = mod.hardpoint + return len(self.charges) > 0 def getText(self, context, selection): return "Ammo" @@ -31,33 +33,123 @@ class ModuleAmmoPicker(ContextMenu): def activate(self, context, selection, i): pass + def turretSorter(self, charge): + range = charge.getAttribute("weaponRangeMultiplier") + damage = 0 + for type in ("em", "explosive", "kinetic", "thermal"): + damage += charge.getAttribute("%sDamage" % type) + + return (-range, damage) + + MISSILE_ORDER = ["em", "explosive", "kinetic", "thermal"] + def missileSorter(self, charge): + for i, type in enumerate(self.MISSILE_ORDER): + damage = charge.getAttribute("%sDamage" % type) + if damage > 0: + return (type, damage) + + def nameSorter(self, charge): + n = charge.name + return (len(n), n) + + def addCharge(self, menu, charge): + id = wx.NewId() + name = charge.name if charge is not None else "Empty" + self.chargeIds[id] = charge + item = wx.MenuItem(menu, id, name) + item.charge = charge + if charge is not None and charge.icon is not None: + bitmap = bitmapLoader.getBitmap(charge.icon.iconFile, "pack") + if bitmap is not None: + item.SetBitmap(bitmap) + + return item + def getSubMenu(self, context, selection, menu, i): menu.Bind(wx.EVT_MENU, self.handleAmmoSwitch) m = wx.Menu() self.chargeIds = {} - for charge in self.charges: - id = wx.NewId() - self.chargeIds[id] = charge - item = wx.MenuItem(m, id, charge.name) - item.charge = charge - if charge.icon is not None: - bitmap = bitmapLoader.getBitmap(charge.icon.iconFile, "pack") - if bitmap is not None: - item.SetBitmap(bitmap) - m.AppendItem(item) + previousRangeMod = None + if self.hardpoint == Hardpoint.TURRET: + idRange = wx.NewId() + m.Append(idRange, "--- Range ---") + m.Enable(idRange, False) + items = [] + self.charges.sort(key=self.turretSorter) + for charge in self.charges: + currRangeMod = charge.getAttribute("weaponRangeMultiplier") + if previousRangeMod is None or previousRangeMod != currRangeMod: + sub = None + base = charge + previousRangeMod = currRangeMod + item = self.addCharge(m, charge) + items.append(item) + else: + if sub is None: + sub = wx.Menu() + item.SetSubMenu(sub) + sub.AppendItem(self.addCharge(sub, base)) + sub.AppendItem(self.addCharge(sub, charge)) + for item in items: + m.AppendItem(item) + idDamage = wx.NewId() + m.Append(idDamage, "--- Damage ---") + m.Enable(idDamage, False) + elif self.hardpoint == Hardpoint.MISSILE: + self.charges.sort(key=self.missileSorter) + type = None + sub = None + for charge in self.charges: + currType = None + for t in ("em", "explosive", "kinetic", "thermal"): + if charge.getAttribute("%sDamage" % t) > 0: + currType = t + break + + if currType != type or type is None: + if sub is not None: + id = wx.NewId() + sub.Append(id, "--- More Damage ---") + sub.Enable(id, False) + type = currType + item = wx.MenuItem(m, wx.ID_ANY, type.capitalize()) + bitmap = bitmapLoader.getBitmap("%s_small" % type, "icons") + if bitmap is not None: + item.SetBitmap(bitmap) + + sub = wx.Menu() + id = wx.NewId() + sub.Append(id, "--- Less Damage ---") + sub.Enable(id, False) + item.SetSubMenu(sub) + m.AppendItem(item) + + if charge.name != "Defender I": + sub.AppendItem(self.addCharge(sub, charge)) + else: + defender = charge + + if defender is not None: + m.AppendItem(self.addCharge(sub, defender)) + else: + self.charges.sort(key=self.nameSorter) + for charge in self.charges: + m.AppendItem(self.addCharge(m, charge)) + + m.AppendItem(self.addCharge(m, None)) return m def handleAmmoSwitch(self, event): - charge = self.chargeIds.get(event.Id) - if charge is None: + charge = self.chargeIds.get(event.Id, False) + if charge is False: event.Skip() return sFit = service.Fit.getInstance() fitID = self.mainFrame.getActiveFit() modules = map(lambda mod: mod.position, self.mainFrame.getFittingView().getSelectedMods()) - sFit.setAmmo(fitID, charge.ID, modules) + sFit.setAmmo(fitID, charge.ID if charge is not None else None, modules) wx.PostEvent(self.mainFrame, gui.fittingView.FitChanged(fitID=fitID)) ModuleAmmoPicker.register() diff --git a/gui/fittingView.py b/gui/fittingView.py index db1fb2bac..642d45823 100644 --- a/gui/fittingView.py +++ b/gui/fittingView.py @@ -171,6 +171,7 @@ class FittingView(d.Display): self.PopupMenu(menu) def click(self, event): + event.Skip() row, _ = self.HitTest(event.Position) if row != -1: col = self.getColumn(event.Position) diff --git a/gui/itemStats.py b/gui/itemStats.py index 79afb62a0..98f5f7d4b 100644 --- a/gui/itemStats.py +++ b/gui/itemStats.py @@ -314,10 +314,10 @@ class ItemParams (wx.Panel): return "%s (%d)" % (attribute.name.capitalize(), value) trans = {"Inverse Absolute Percent": (lambda: (1-value)*100, unitName), - "Absolute Percent": (lambda: (value * 100) , unitName), - "Milliseconds": (lambda: value / 1000.0, unitName), "Volume": (lambda: value, u"m\u00B3"), "Sizeclass": (lambda: value, ""), + "Absolute Percent": (lambda: (value * 100) , unitName), + "Milliseconds": (lambda: value / 1000.0, unitName), "typeID": (itemIDCallback, ""), "groupID": (groupIDCallback,""), "attributeID": (attributeIDCallback, "")} diff --git a/icons/em_small.png b/icons/em_small.png new file mode 100755 index 000000000..bb82f8db1 Binary files /dev/null and b/icons/em_small.png differ diff --git a/icons/explosive_small.png b/icons/explosive_small.png new file mode 100755 index 000000000..526e5f75b Binary files /dev/null and b/icons/explosive_small.png differ diff --git a/icons/kinetic_small.png b/icons/kinetic_small.png new file mode 100755 index 000000000..567397dfa Binary files /dev/null and b/icons/kinetic_small.png differ diff --git a/icons/thermal_small.png b/icons/thermal_small.png new file mode 100755 index 000000000..3f6ae3ded Binary files /dev/null and b/icons/thermal_small.png differ