From 46428ca0d8ee126c6458f68795728f11528ecfa0 Mon Sep 17 00:00:00 2001 From: cncfanatics Date: Wed, 20 Oct 2010 09:18:21 +0200 Subject: [PATCH] Finish up ammo menus --- eos | 2 +- gui/builtinContextMenus/moduleAmmoPicker.py | 122 +++++++++++++++++--- gui/fittingView.py | 1 + gui/itemStats.py | 4 +- icons/em_small.png | Bin 0 -> 775 bytes icons/explosive_small.png | Bin 0 -> 814 bytes icons/kinetic_small.png | Bin 0 -> 593 bytes icons/thermal_small.png | Bin 0 -> 766 bytes 8 files changed, 111 insertions(+), 18 deletions(-) create mode 100755 icons/em_small.png create mode 100755 icons/explosive_small.png create mode 100755 icons/kinetic_small.png create mode 100755 icons/thermal_small.png 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 0000000000000000000000000000000000000000..bb82f8db1e400e44deba22eb3f3e433a01584214 GIT binary patch literal 775 zcmV+i1Ni)jP)RJBYQ^ih=|~f)X|2%8fD6g~Y_fxNzadl`h=)*!UmZ8}$dM zn1~pO8W!@54}@xK!b`L~`k)F zgepKN{n3MxshTd!PDyg^{2f3DB}~zYs(Y!b*Au4dKnXGYeoOcJLiu!Z*jdedMnqW| zQMP6Y1x52P!y9I1Lksf;TA1z$dO|@f*15Y~6tW9%=jNt?sY@WrB|yYq06>{Wbu*;+ zoAzm;9X)D8WUmkz+Xx?OZWCi`*?Df@A;ygff*H-iQ`x?y67hIT~$`HD5n> zRO#Iog~jy()EXLXYqj*m?(LyZ>4lZTY-&V0b{0?yTDb%PLUg~cF&J-(Ts+yWbcBMS z5ehwlCb)8VKb+{=MW>SUx%I`xG;-lq{7?V@0TEGh2f4dmOR@Am{k48(epT5Xs3WI4 zT4A}g0XOdq7RHB0#*1GTKANNAWfWz*#-kf&&YtLf_;T{w@S~^w+37b=+~v73kjZ!R0R#jBP;vkF_zqJGS+Z8@{lNeL002ovPDHLk FV1oZ)T4?|P literal 0 HcmV?d00001 diff --git a/icons/explosive_small.png b/icons/explosive_small.png new file mode 100755 index 0000000000000000000000000000000000000000..526e5f75b510c0a8eee9718fbffab64970f1dad1 GIT binary patch literal 814 zcmV+}1JV46P)0=-JM-`amLuQnFc^9 zYDy(0Bm{{61T4LO?s9#nm83X(XGB-+V=1j%Noglj3LhI!>oZO)`yhZAiviFJfa%HH zd+(l`zHYR8A9~%)@OBYM2 zg$YBQJYOxG^$D|cwl%-u!aio(7e4>w%$2qES|g0&I)La9z!>B6#mt4hewfuV#??g_33E71`cyc2IM##nx_qh28iu?zBYkq~m&=$dHUN6#xpk)XcSy-~3`)#HaHWv!Is7 z7}84sbO3;H{3;f&{)VTKFRcj@%k^z@hro!4a{y2iqHk84;!(>T_4bEKzv~lda3t+6 zm@`CcvyIea8fP;W0x_J8`d{%zXSqdA3T27Z!kc*w6fl-}t_`}Muv zmxkvqx4hu45F&U%reT=u0vMJ@viAK(Z>1T?hTy8I5TSG6-wu8MyQe|CE`*E@?R(y? sBU&l|RIVs_4k{9uBZTM@kvzKhH%zp34r_%W(*OVf07*qoM6N<$g3&vRNB{r; literal 0 HcmV?d00001 diff --git a/icons/kinetic_small.png b/icons/kinetic_small.png new file mode 100755 index 0000000000000000000000000000000000000000..567397dfaa27fc2939c4c0c169c0cd3a117b6632 GIT binary patch literal 593 zcmV-X0@kc562b@SnhhirgDi(y=Ne3cS zd?eMTk0dAep6wv_YP33W;D$XphxM&}&R*~zN|JW|bm{(8C6bDKAP^DH5fMbD!N&lS zXdMyB6bgl=F(w0&L+}7c1Oc&t{T+}xx3dg+)4jH08dqe;b8FX>zD4Uop#F(zVGrd17$qw`mH`KlAPCCYY_{6(_m7g5 z#RvnGLqtZX>W?@k=}RG^s@C`YFp46ps$;+x#42h)Vwi}3=Gk>Uz_Hdw$+-gP#6_lz fEdN;3kYDOM%)inL|IF#w00000NkvXXu0mjf&uS3V literal 0 HcmV?d00001 diff --git a/icons/thermal_small.png b/icons/thermal_small.png new file mode 100755 index 0000000000000000000000000000000000000000..3f6ae3ded0cc0913d6ce3d0726a9116b0a52e989 GIT binary patch literal 766 zcmV#JD4bG>m+qTNeXI#kRnROBC0AORdh*Nv0=lWkHVK=gTyC* z1yT{BRaL~lLK{L$L+zN@uHSoiSTwdGs)||7W`1+doFR@C0TLhpD4+@`{-?~i5mGEs znKDxMz!N2`5itsQ0!c{B6u{wg0Tzfho%ygV(&zz?>*Q9$@WsCif6%t(ng<61)d&Ao zC6h)V=d5}4p=!58E}aQv>uz3r7YR?j7TTQ=@x%$899ud89QpQpiu?11XH&ygO{AWR zR1%S>M9eg-Y?g$TfDB0T84Cd!WTbm9aUXSof+E8;Yu?x^{Es3$bs@Cx?kav6s_tc~ znF4;SfI><{#w9CeWCYhr;Z6^FuN9irx|L=JxKXxJJMZlESXdQMaFmt+&;aUcR_0GS zvr%_u`fTEA6=TYwHQ`DaY$QTA7X_iQEDI3x_zeg!5{c&nbEX{zSFTpmm2XD*-JO~E z^7d@9+K2WpRpKje*V4J~hxv_6wO2qrj?xeTOe&nN7nrwEc|BL{6zg<7~`TpU} z5_$6Djpl{V9`tTys<(z-yB;hi3JhUVVQnpT+v|%n(fwTejVNehHsw@c*VoI@R@9u9 z`PeO%M5>lB<8Pf<2*{{56_)*S9nD5sDLlf%G{OfLTg_Cp+D{{Va`mO=TeHdaIcr)0 z;KmT~3ZJX?|2!D(`-LiAxwsk`s`}7j;mu|9db^(P{@yA4QUjk}Zl6El?8^Z;0ay+Zqh?qI(=Wo4z)JM0*uIR4FingZh& ztXVo82ivXCoVY#6zbzZtSP10wqrCW`@AXk4Tlus#SM8q+f w7{GW!9qA0