Initialize graph with ideal target profile, and plug it into UI's columns

This commit is contained in:
DarkPhoenix
2019-07-25 19:45:20 +03:00
parent 365a3798c2
commit 6f1321aa13
7 changed files with 105 additions and 15 deletions

View File

@@ -39,4 +39,8 @@ targetProfiles_table = Table("targetResists", saveddata_meta,
Column("modified", DateTime, nullable=True, onupdate=datetime.datetime.now)
)
mapper(TargetProfile, targetProfiles_table)
mapper(TargetProfile, targetProfiles_table,
properties={
"_maxVelocity": targetProfiles_table.c.maxVelocity,
"_signatureRadius": targetProfiles_table.c.signatureRadius,
"_radius": targetProfiles_table.c.radius})

View File

@@ -17,10 +17,14 @@
# along with eos. If not, see <http://www.gnu.org/licenses/>.
# ===============================================================================
import math
import re
from logbook import Logger
import eos.db
pyfalog = Logger(__name__)
@@ -36,9 +40,51 @@ class TargetProfile:
self.thermalAmount = thermalAmount
self.kineticAmount = kineticAmount
self.explosiveAmount = explosiveAmount
self.maxVelocity = maxVelocity
self.signatureRadius = signatureRadius
self.radius = radius
self._maxVelocity = maxVelocity
self._signatureRadius = signatureRadius
self._radius = radius
_idealTarget = None
@classmethod
def getIdeal(cls):
if cls._idealTarget is None:
cls._idealTarget = cls(
emAmount=0,
thermalAmount=0,
kineticAmount=0,
explosiveAmount=0,
maxVelocity=0,
signatureRadius=None,
radius=0)
cls._idealTarget.name = 'Ideal Target'
return cls._idealTarget
@property
def maxVelocity(self):
return self._maxVelocity or 0
@maxVelocity.setter
def maxVelocity(self, val):
self._maxVelocity = val
@property
def signatureRadius(self):
if self._signatureRadius is None or self._signatureRadius == -1:
return math.inf
return self._signatureRadius
@signatureRadius.setter
def signatureRadius(self, val):
self._signatureRadius = val
@property
def radius(self):
return self._radius or 0
@radius.setter
def radius(self, val):
self._radius = val
@classmethod
def importPatterns(cls, text):
@@ -116,6 +162,6 @@ class TargetProfile:
def __deepcopy__(self, memo):
p = TargetProfile(
self.emAmount, self.thermalAmount, self.kineticAmount, self.explosiveAmount,
self.maxVelocity, self.signatureRadius, self.radius)
self._maxVelocity, self._signatureRadius, self._radius)
p.name = "%s copy" % self.name
return p

View File

@@ -17,7 +17,6 @@
# along with pyfa. If not, see <http://www.gnu.org/licenses/>.
# =============================================================================
from abc import ABCMeta, abstractmethod
# noinspection PyPackageRequirements
@@ -26,6 +25,7 @@ import wx
import eos.config
import gui.mainFrame
from eos.saveddata.fit import Fit
from eos.saveddata.targetProfile import TargetProfile
from eos.utils.spoolSupport import SpoolOptions, SpoolType
from gui.bitmap_loader import BitmapLoader
from gui.viewColumn import ViewColumn
@@ -47,7 +47,7 @@ class GraphColumn(ViewColumn, metaclass=ABCMeta):
raise NotImplementedError
def getText(self, stuff):
if isinstance(stuff, Fit):
if isinstance(stuff, (Fit, TargetProfile)):
val, unit = self._getValue(stuff)
if val is None:
return ''
@@ -107,8 +107,14 @@ class SpeedColumn(GraphColumn):
def __init__(self, fittingView, params):
super().__init__(fittingView, 1389)
def _getValue(self, fit):
return fit.ship.getModifiedItemAttr('maxVelocity'), 'm/s'
def _getValue(self, stuff):
if isinstance(stuff, Fit):
speed = stuff.ship.getModifiedItemAttr('maxVelocity')
elif isinstance(stuff, TargetProfile):
speed = stuff.maxVelocity
else:
speed = 0
return speed, 'm/s'
def _getFitTooltip(self):
return 'Maximum speed'
@@ -141,8 +147,14 @@ class RadiusColumn(GraphColumn):
def __init__(self, fittingView, params):
super().__init__(fittingView, 3266)
def _getValue(self, fit):
return fit.ship.getModifiedItemAttr('radius'), 'm'
def _getValue(self, stuff):
if isinstance(stuff, Fit):
radius = stuff.ship.getModifiedItemAttr('radius')
elif isinstance(stuff, TargetProfile):
radius = stuff.radius
else:
radius = 0
return radius, 'm'
def _getFitTooltip(self):
return 'Radius'
@@ -158,8 +170,14 @@ class SignatureRadiusColumn(GraphColumn):
def __init__(self, fittingView, params):
super().__init__(fittingView, 1390)
def _getValue(self, fit):
return fit.ship.getModifiedItemAttr('signatureRadius'), 'm'
def _getValue(self, stuff):
if isinstance(stuff, Fit):
sigRadius = stuff.ship.getModifiedItemAttr('signatureRadius')
elif isinstance(stuff, TargetProfile):
sigRadius = stuff.signatureRadius
else:
sigRadius = 0
return sigRadius, 'm'
def _getFitTooltip(self):
return 'Signature radius'

View File

@@ -4,6 +4,7 @@ from eos.saveddata.implant import Implant
from eos.saveddata.drone import Drone
from eos.saveddata.module import Module, Rack
from eos.saveddata.fit import Fit
from eos.saveddata.targetProfile import TargetProfile
from eos.const import FittingSlot
from gui.viewColumn import ViewColumn
@@ -37,6 +38,8 @@ class BaseIcon(ViewColumn):
"gui")
else:
return self.loadIconFile(stuff.item.iconID or "")
elif isinstance(stuff, TargetProfile):
return self.fittingView.imageList.GetImageIndex("target_small", "gui")
item = getattr(stuff, "item", stuff)
return self.loadIconFile(item.iconID)

View File

@@ -27,6 +27,7 @@ from eos.saveddata.drone import Drone
from eos.saveddata.fighter import Fighter
from eos.saveddata.module import Module, Rack
from eos.saveddata.fit import Fit
from eos.saveddata.targetProfile import TargetProfile
from eos.const import FittingSlot
from service.fit import Fit as FitSvc
from service.market import Market
@@ -94,6 +95,8 @@ class BaseName(ViewColumn):
return stuff.item.name
elif isinstance(stuff, Implant):
return stuff.item.name
elif isinstance(stuff, TargetProfile):
return stuff.name
else:
item = getattr(stuff, "item", stuff)

View File

@@ -23,6 +23,7 @@ import wx
import gui.display
import gui.globalEvents as GE
from eos.saveddata.targetProfile import TargetProfile
from gui.builtinShipBrowser.events import EVT_FIT_RENAMED
from service.const import GraphCacheCleanupReason
from service.fit import Fit
@@ -107,7 +108,10 @@ class BaseList(gui.display.Display):
self.removeColumn(col)
for colSpec in extraColSpecs:
self.appendColumnBySpec(colSpec)
self.refresh(self.fits)
self.refreshView()
def refreshView(self):
raise NotImplementedError
def OnFitRenamed(self, event):
event.Skip()
@@ -191,9 +195,19 @@ class FitList(BaseList):
self.fits.append(fit)
self.update(self.fits)
def refreshView(self):
self.refresh(self.fits)
class TargetList(BaseList):
def __init__(self, graphFrame, parent):
super().__init__(graphFrame, parent)
self.update(self.fits)
self.profiles = []
self.profiles.append(TargetProfile.getIdeal())
stuff = self.fits + self.profiles
self.update(stuff)
def refreshView(self):
stuff = self.fits + self.profiles
self.refresh(stuff)

View File

@@ -16,6 +16,8 @@ def formatAmount(val, prec=3, lowest=0, highest=0, currency=False, forceSign=Fal
"""
if val is None:
return ""
if val == math.inf:
return "\u221e" if unitName is None else "\u221e {}".format(unitName)
# Define suffix maps
posSuffixMap = {3: "k", 6: "M", 9: "B" if currency is True else "G"}
negSuffixMap = {-6: '\u03bc', -3: "m"}