Integrate price optimization with undo/redo

This commit is contained in:
DarkPhoenix
2019-03-09 15:44:50 +03:00
parent 41711706c0
commit 22fc6cb13c
9 changed files with 115 additions and 83 deletions

View File

@@ -549,9 +549,26 @@ class Fit(FitDeprecated):
changed = True
return changed
# If any state was changed, recalculate attributes again
# if changed:
# self.recalc(fit)
@classmethod
def fitObjectIter(cls, fit):
yield fit.ship
for mod in fit.modules:
if not mod.isEmpty:
yield mod
for container in (fit.drones, fit.fighters, fit.implants, fit.boosters, fit.cargo):
for obj in container:
yield obj
@classmethod
def fitItemIter(cls, fit):
for fitobj in cls.fitObjectIter(fit):
yield fitobj.item
charge = getattr(fitobj, 'charge', None)
if charge:
yield charge
def refreshFit(self, fitID):
pyfalog.debug("Refresh fit for fit ID: {0}", fitID)

View File

@@ -28,6 +28,7 @@ from logbook import Logger
from eos import db
from eos.saveddata.price import PriceStatus
from gui.fitCommands.guiRebaseItems import GuiRebaseItemsCommand
from service.fit import Fit
from service.market import Market
from service.network import TimeoutError
@@ -144,30 +145,6 @@ class Price:
for typeID in priceMap.keys():
priceMap[typeID].update(PriceStatus.fetchFail)
@classmethod
def fitItemsList(cls, fit):
return list(set(cls.fitItemIter(fit)))
@classmethod
def fitObjectIter(cls, fit):
yield fit.ship
for mod in fit.modules:
if not mod.isEmpty:
yield mod
for container in (fit.drones, fit.fighters, fit.implants, fit.boosters, fit.cargo):
for obj in container:
yield obj
@classmethod
def fitItemIter(cls, fit):
for fitobj in cls.fitObjectIter(fit):
yield fitobj.item
charge = getattr(fitobj, 'charge', None)
if charge:
yield charge
def getPriceNow(self, objitem):
"""Get price for provided typeID"""
sMkt = Market.getInstance()
@@ -230,32 +207,7 @@ class Price:
validityOverride = 2 * 60 * 60
self.getPrices(itemsToFetch, makeCheapMapCb, fetchTimeout=fetchTimeout, validityOverride=validityOverride)
def optimizeFitPrice(self, fit, callback, fetchTimeout=10):
def updateFitCb(replacementsCheaper):
changes = False
for mod in fit.modules:
if mod.item in replacementsCheaper:
mod.rebase(replacementsCheaper[mod.item])
changes = True
if mod.charge in replacementsCheaper:
mod.charge = replacementsCheaper[mod.charge]
changes = True
for container in (fit.drones, fit.fighters, fit.implants, fit.boosters, fit.cargo):
for obj in container:
if obj.item in replacementsCheaper:
obj.rebase(replacementsCheaper[obj.item])
changes = True
if changes:
Fit.getInstance().refreshFit(fit.ID)
try:
callback(changes)
except Exception as e:
pyfalog.critical("Execution of callback from optimizeFitPrice failed.")
pyfalog.critical(e)
fitItems = {i for i in self.fitItemIter(fit) if i is not fit.ship.item}
self.findCheaperReplacements(fitItems, updateFitCb, fetchTimeout=fetchTimeout)
class PriceWorkerThread(threading.Thread):