Allow imports of mutated drone groups via ctrl-v and additions panel context menus

This commit is contained in:
DarkPhoenix
2021-10-26 11:29:25 +03:00
parent 85f63e237d
commit 1be0d306bb
7 changed files with 55 additions and 37 deletions

View File

@@ -5,7 +5,7 @@ from gui import fitCommands as cmd
from gui.contextMenu import ContextMenuUnconditional
from gui.utils.clipboard import fromClipboard
from service.fit import Fit
from service.port.eft import parseAdditions
from service.port.eft import parseAdditions, importGetMutationData, lineIter
_t = wx.GetTranslation
@@ -41,9 +41,12 @@ class AdditionsImport(ContextMenuUnconditional):
def activate(self, callingWindow, fullContext, i):
text = fromClipboard()
items = parseAdditions(text)
lines = list(lineIter(text))
mutaData = importGetMutationData(lines)
text = '\n'.join(lines)
items = parseAdditions(text, mutaData=mutaData)
filterFunc = self.viewSpecMap[self.srcContext][1]
items = [(i.ID, a) for i, a in items if filterFunc(i)]
items = [(i.ID, a, m) for i, a, m in items if filterFunc(i)]
if not items:
return
command = self.viewSpecMap[self.srcContext][2]

View File

@@ -14,7 +14,7 @@ class GuiImportCargosCommand(wx.Command):
self.internalHistory = InternalCommandHistory()
self.fitID = fitID
self.cargos = {}
for itemID, amount in cargos:
for itemID, amount, mutation in cargos:
if itemID not in self.cargos:
self.cargos[itemID] = 0
self.cargos[itemID] += amount

View File

@@ -18,11 +18,19 @@ class GuiImportLocalDronesCommand(wx.Command):
def Do(self):
results = []
for itemID, amount in self.drones:
cmd = CalcAddLocalDroneCommand(
fitID=self.fitID,
droneInfo=DroneInfo(itemID=itemID, amount=amount, amountActive=0),
forceNewStack=True)
for itemID, amount, mutation in self.drones:
if mutation:
mutaplasmid, attrs = mutation
info = DroneInfo(
itemID=mutaplasmid.resultingItem.ID,
amount=amount,
amountActive=0,
baseItemID=itemID,
mutaplasmidID=mutaplasmid.ID,
mutations=attrs)
else:
info = DroneInfo(itemID=itemID, amount=amount, amountActive=0)
cmd = CalcAddLocalDroneCommand(fitID=self.fitID, droneInfo=info, forceNewStack=True)
results.append(self.internalHistory.submit(cmd))
success = any(results)
eos.db.flush()

View File

@@ -18,7 +18,7 @@ class GuiImportLocalFightersCommand(wx.Command):
def Do(self):
results = []
for itemID, amount in self.fighters:
for itemID, amount, mutation in self.fighters:
cmd = CalcAddLocalFighterCommand(fitID=self.fitID, fighterInfo=FighterInfo(itemID=itemID, amount=amount, state=False))
results.append(self.internalHistory.submit(cmd))
success = any(results)

View File

@@ -772,23 +772,23 @@ class MainFrame(wx.Frame):
self.command.Submit(cmd.GuiAddLocalModuleCommand(activeFit, baseItem.ID))
return
if importType == "AdditionsDrones":
if self.command.Submit(cmd.GuiImportLocalDronesCommand(activeFit, [(i.ID, a) for i, a in importData[0]])):
if self.command.Submit(cmd.GuiImportLocalDronesCommand(activeFit, [(i.ID, a, m) for i, a, m in importData[0]])):
self.additionsPane.select("Drones")
return
if importType == "AdditionsFighters":
if self.command.Submit(cmd.GuiImportLocalFightersCommand(activeFit, [(i.ID, a) for i, a in importData[0]])):
if self.command.Submit(cmd.GuiImportLocalFightersCommand(activeFit, [(i.ID, a, m) for i, a, m in importData[0]])):
self.additionsPane.select("Fighters")
return
if importType == "AdditionsImplants":
if self.command.Submit(cmd.GuiImportImplantsCommand(activeFit, [(i.ID, a) for i, a in importData[0]])):
if self.command.Submit(cmd.GuiImportImplantsCommand(activeFit, [(i.ID, a, m) for i, a, m in importData[0]])):
self.additionsPane.select("Implants")
return
if importType == "AdditionsBoosters":
if self.command.Submit(cmd.GuiImportBoostersCommand(activeFit, [(i.ID, a) for i, a in importData[0]])):
if self.command.Submit(cmd.GuiImportBoostersCommand(activeFit, [(i.ID, a, m) for i, a, m in importData[0]])):
self.additionsPane.select("Boosters")
return
if importType == "AdditionsCargo":
if self.command.Submit(cmd.GuiImportCargosCommand(activeFit, [(i.ID, a) for i, a in importData[0]])):
if self.command.Submit(cmd.GuiImportCargosCommand(activeFit, [(i.ID, a, m) for i, a, m in importData[0]])):
self.additionsPane.select("Cargo")
return
except (KeyboardInterrupt, SystemExit):

View File

@@ -225,7 +225,7 @@ def importEft(lines):
return
aFit = AbstractFit()
aFit.mutations = _importGetMutationData(lines)
aFit.mutations = importGetMutationData(lines)
stubPattern = '^\[.+?\]$'
modulePattern = '^(?P<typeName>{0}+?)(,\s*(?P<chargeName>{0}+?))?(?P<offline>\s*{1})?(\s*\[(?P<mutation>\d+?)\])?$'.format(NAME_CHARS, OFFLINE_SUFFIX)
@@ -572,8 +572,7 @@ def _importPrepare(lines):
mutantHeaderPattern = re.compile('^\[(?P<ref>\d+)\](?P<tail>.*)')
def _importGetMutationData(lines):
data = {}
def importGetMutationData(lines):
# Format: {ref: [lines]}
mutaLinesMap = {}
currentMutaRef = None
@@ -943,7 +942,7 @@ class AbstractFit:
self.cargo[itemSpec.item].amount += itemSpec.amount
def _lineIter(text):
def lineIter(text):
"""Iterate over non-blank lines."""
for line in text.splitlines():
line = line.strip()
@@ -951,11 +950,11 @@ def _lineIter(text):
yield line
def parseAdditions(text):
def parseAdditions(text, mutaData=None):
items = []
sMkt = Market.getInstance()
pattern = '^(?P<typeName>{}+?)( x(?P<amount>\d+?))?$'.format(NAME_CHARS)
for line in _lineIter(text):
pattern = '^(?P<typeName>{}+?)( x(?P<amount>\d+?))?(\s*\[(?P<mutaref>\d+?)\])?$'.format(NAME_CHARS)
for line in lineIter(text):
m = re.match(pattern, line)
if not m:
continue
@@ -964,19 +963,27 @@ def parseAdditions(text):
continue
amount = m.group('amount')
amount = 1 if amount is None else int(amount)
items.append((item, amount))
mutaRef = int(m.group('mutaref')) if m.group('mutaref') else None
if mutaRef and mutaData and mutaRef in mutaData:
mutation = mutaData[mutaRef]
else:
mutation = None
items.append((item, amount, mutation))
return items
def isValidDroneImport(text):
pattern = 'x\d+$'
for line in _lineIter(text):
lines = list(lineIter(text))
mutaData = importGetMutationData(lines)
text = '\n'.join(lines)
pattern = 'x\d+(\s*\[\d+\])?$'
for line in lineIter(text):
if not re.search(pattern, line):
return False, ()
itemData = parseAdditions(text)
itemData = parseAdditions(text, mutaData=mutaData)
if not itemData:
return False, ()
for item, amount in itemData:
for item, amount, mutation in itemData:
if not item.isDrone:
return False, ()
return True, itemData
@@ -984,13 +991,13 @@ def isValidDroneImport(text):
def isValidFighterImport(text):
pattern = 'x\d+$'
for line in _lineIter(text):
for line in lineIter(text):
if not re.search(pattern, line):
return False, ()
itemData = parseAdditions(text)
if not itemData:
return False, ()
for item, amount in itemData:
for item, amount, mutation in itemData:
if not item.isFighter:
return False, ()
return True, itemData
@@ -998,13 +1005,13 @@ def isValidFighterImport(text):
def isValidCargoImport(text):
pattern = 'x\d+$'
for line in _lineIter(text):
for line in lineIter(text):
if not re.search(pattern, line):
return False, ()
itemData = parseAdditions(text)
if not itemData:
return False, ()
for item, amount in itemData:
for item, amount, mutation in itemData:
if item.isAbyssal:
return False, ()
return True, itemData
@@ -1012,13 +1019,13 @@ def isValidCargoImport(text):
def isValidImplantImport(text):
pattern = 'x\d+$'
for line in _lineIter(text):
for line in lineIter(text):
if re.search(pattern, line):
return False, ()
itemData = parseAdditions(text)
if not itemData:
return False, ()
for item, amount in itemData:
for item, amount, mutation in itemData:
if not item.isImplant:
return False, ()
return True, itemData
@@ -1026,13 +1033,13 @@ def isValidImplantImport(text):
def isValidBoosterImport(text):
pattern = 'x\d+$'
for line in _lineIter(text):
for line in lineIter(text):
if re.search(pattern, line):
return False, ()
itemData = parseAdditions(text)
if not itemData:
return False, ()
for item, amount in itemData:
for item, amount, mutation in itemData:
if not item.isBooster:
return False, ()
return True, itemData

View File

@@ -232,14 +232,14 @@ class Port:
# If we've got source file name which is used to describe ship name
# and first line contains something like [setup name], detect as eft config file
if re.match("\[.*\]", firstLine) and path is not None:
if re.match("^\s*\[.*\]", firstLine) and path is not None:
filename = os.path.split(path)[1]
shipName = filename.rsplit('.')[0]
return "EFT Config", True, cls.importEftCfg(shipName, lines, iportuser)
# If no file is specified and there's comma between brackets,
# consider that we have [ship, setup name] and detect like eft export format
if re.match("\[.*,.*\]", firstLine):
if re.match("^\s*\[.*,.*\]", firstLine):
return "EFT", True, (cls.importEft(lines),)
# Check if string is in DNA format