From fe063cf19a93aa2aa9cc23ad89599e374e864544 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Fri, 14 Dec 2018 16:56:51 +0300 Subject: [PATCH] Make sure that modules are put onto their proper place during EFT import, not to the end --- eos/effectHandlerHelpers.py | 56 +++++++++++++++++++++++++++---------- service/port/eft.py | 12 ++++---- 2 files changed, 48 insertions(+), 20 deletions(-) diff --git a/eos/effectHandlerHelpers.py b/eos/effectHandlerHelpers.py index 345234d38..7f51e780c 100644 --- a/eos/effectHandlerHelpers.py +++ b/eos/effectHandlerHelpers.py @@ -116,30 +116,58 @@ class HandledList(list): class HandledModuleList(HandledList): def append(self, mod): - emptyPosition = float("Inf") - for i in range(len(self)): - currMod = self[i] - if currMod.isEmpty and not mod.isEmpty and currMod.slot == mod.slot: - currPos = mod.position or i - if currPos < emptyPosition: + """ + Add module to list, replacing first seen empty slot for + its rack by passed module. + """ + + # Get first seen empty position + emptyPosition = None + for currMod in self: + if currMod.isEmpty and currMod.slot == mod.slot: + currPos = mod.position + if emptyPosition is None or currPos < emptyPosition: emptyPosition = currPos - if emptyPosition < len(self): - del self[emptyPosition] - mod.position = emptyPosition - HandledList.insert(self, emptyPosition, mod) - if mod.isInvalid: - self.remove(mod) + # Replacing empty by empty + if emptyPosition is not None and mod.isEmpty: return - self.appendIgnoreEmpty(mod) + # Replacing empty by non-empty + if emptyPosition is not None and not mod.isEmpty: + self.__replace(mod, emptyPosition) - def appendIgnoreEmpty(self, mod): + self.__appendToEnd(mod) + + def __appendToEnd(self, mod): mod.position = len(self) HandledList.append(self, mod) if mod.isInvalid: self.remove(mod) + + def __replace(self, mod, position): + if mod.isEmpty and self[position].isEmpty: return + old = self[position] + del self[position] + mod.position = position + HandledList.insert(self, position, mod) + if mod.isInvalid: + self.remove(mod) + self.insert(position, old) + + def replaceRackPosition(self, rackPosition, mod): + rackPositions = [] + for currMod in self: + if currMod.slot == mod.slot: + rackPositions.append(currMod.position) + rackPositions.sort() + try: + modPosition = rackPositions[rackPosition] + except IndexError: + self.__appendToEnd(mod) + else: + self.__replace(mod, modPosition) def insert(self, index, mod): mod.position = index diff --git a/service/port/eft.py b/service/port/eft.py index a1e99f45c..1cc262e78 100644 --- a/service/port/eft.py +++ b/service/port/eft.py @@ -251,14 +251,14 @@ def importEft(eftString): aFit.addCargo(itemSpec) # Subsystems first because they modify slot amount - for m in aFit.subsystems: + for i, m in enumerate(aFit.subsystems): if m is None: dummy = Module.buildEmpty(aFit.getSlotByContainer(aFit.subsystems)) dummy.owner = fit - fit.modules.appendIgnoreEmpty(dummy) + fit.modules.replaceRackPosition(i, dummy) elif m.fits(fit): m.owner = fit - fit.modules.appendIgnoreEmpty(m) + fit.modules.replaceRackPosition(i, m) svcFit.getInstance().recalc(fit) # Other stuff @@ -269,16 +269,16 @@ def importEft(eftString): aFit.modulesMed, aFit.modulesLow, ): - for m in modRack: + for i, m in enumerate(modRack): if m is None: dummy = Module.buildEmpty(aFit.getSlotByContainer(modRack)) dummy.owner = fit - fit.modules.appendIgnoreEmpty(dummy) + fit.modules.replaceRackPosition(i, dummy) elif m.fits(fit): m.owner = fit if not m.isValidState(m.state): pyfalog.warning('service.port.eft.importEft: module {} cannot have state {}', m, m.state) - fit.modules.appendIgnoreEmpty(m) + fit.modules.replaceRackPosition(i, m) for implant in aFit.implants: fit.implants.append(implant) for booster in aFit.boosters: