Merge branch 'master' into development

Conflicts:
	gui/builtinViewColumns/baseName.py
This commit is contained in:
Ryan Holmes
2017-02-08 13:58:37 -05:00
16 changed files with 216 additions and 47 deletions

View File

@@ -24,7 +24,8 @@ from eos.saveddata.implant import Implant
from eos.saveddata.drone import Drone
from eos.saveddata.fighter import Fighter
from eos.saveddata.module import Module, Slot, Rack
from service.fit import Fit
from eos.saveddata.fit import Fit
from service.fit import Fit as FitSvc
from gui.viewColumn import ViewColumn
import gui.mainFrame
@@ -57,7 +58,7 @@ class BaseName(ViewColumn):
else:
return "%s (%s)" % (stuff.name, stuff.ship.item.name)
elif isinstance(stuff, Rack):
if Fit.getInstance().serviceFittingOptions["rackLabels"]:
if FitSvc.getInstance().serviceFittingOptions["rackLabels"]:
if stuff.slot == Slot.MODE:
return u'─ Tactical Mode ─'
else:
@@ -74,7 +75,7 @@ class BaseName(ViewColumn):
else:
item = getattr(stuff, "item", stuff)
if Fit.getInstance().serviceFittingOptions["showMarketShortcuts"]:
if FitSvc.getInstance().serviceFittingOptions["showMarketShortcuts"]:
marketShortcut = getattr(item, "marketShortcut", None)
if marketShortcut:

View File

@@ -450,30 +450,69 @@ class Miscellanea(ViewColumn):
return text, item.name
else:
return "", None
elif itemGroup in ("Ancillary Armor Repairer", "Ancillary Shield Booster"):
hp = stuff.hpBeforeReload
cycles = stuff.numShots
cycleTime = stuff.rawCycleTime
elif itemGroup in (
"Ancillary Armor Repairer",
"Ancillary Shield Booster",
"Capacitor Booster",
"Ancillary Remote Armor Repairer",
"Ancillary Remote Shield Booster",
):
if "Armor" in itemGroup or "Shield" in itemGroup:
boosted_attribute = "HP"
reload_time = item.getAttribute("reloadTime", 0) / 1000
elif "Capacitor" in itemGroup:
boosted_attribute = "Cap"
reload_time = 10
else:
boosted_attribute = ""
reload_time = 0
cycles = max(stuff.numShots, 0)
cycleTime = max(stuff.rawCycleTime, 0)
# Get HP or boosted amount
stuff_hp = max(stuff.hpBeforeReload, 0)
armor_hp = stuff.getModifiedItemAttr("armorDamageAmount", 0)
capacitor_hp = stuff.getModifiedChargeAttr("capacitorBonus", 0)
shield_hp = stuff.getModifiedItemAttr("shieldBonus", 0)
hp = max(stuff_hp, armor_hp * cycles, capacitor_hp * cycles, shield_hp * cycles, 0)
if not hp or not cycleTime or not cycles:
return "", None
fit = Fit.getInstance().getFit(self.mainFrame.getActiveFit())
ehpTotal = fit.ehp
hpTotal = fit.hp
useEhp = self.mainFrame.statsPane.nameViewMap["resistancesViewFull"].showEffective
tooltip = "HP restored over duration using charges"
if useEhp:
if itemGroup == "Ancillary Armor Repairer":
tooltip = "{0} restored over duration using charges (plus reload)".format(boosted_attribute)
if useEhp and boosted_attribute == "HP" and "Remote" not in itemGroup:
if "Ancillary Armor Repairer" in itemGroup:
hpRatio = ehpTotal["armor"] / hpTotal["armor"]
else:
hpRatio = ehpTotal["shield"] / hpTotal["shield"]
tooltip = "E{0}".format(tooltip)
else:
hpRatio = 1
if itemGroup == "Ancillary Armor Repairer":
hpRatio *= 3
if "Ancillary" in itemGroup and "Armor" in itemGroup:
hpRatio *= stuff.getModifiedItemAttr("chargedArmorDamageMultiplier", 1)
ehp = hp * hpRatio
duration = cycles * cycleTime / 1000
text = "{0} / {1}s".format(formatAmount(ehp, 3, 0, 9), formatAmount(duration, 3, 0, 3))
for number_of_cycles in {5, 10, 25}:
tooltip = "{0}\n{1} charges lasts {2} seconds ({3} cycles)".format(
tooltip,
formatAmount(number_of_cycles*cycles, 3, 0, 3),
formatAmount((duration+reload_time)*number_of_cycles, 3, 0, 3),
formatAmount(number_of_cycles, 3, 0, 3)
)
text = "{0} / {1}s (+{2}s)".format(
formatAmount(ehp, 3, 0, 9),
formatAmount(duration, 3, 0, 3),
formatAmount(reload_time, 3, 0, 3)
)
return text, tooltip
elif itemGroup == "Armor Resistance Shift Hardener":

View File

@@ -26,6 +26,7 @@ import wx
import time
from codecs import open
from wx._core import PyDeadObjectError
from wx.lib.wordwrap import wordwrap
@@ -70,6 +71,9 @@ from service.port import Port
from service.settings import HTMLExportSettings
from time import gmtime, strftime
import logging
logger = logging.getLogger(__name__)
import threading
import webbrowser
@@ -349,6 +353,13 @@ class MainFrame(wx.Frame):
info = wx.AboutDialogInfo()
info.Name = "pyfa"
info.Version = gui.aboutData.versionString
try:
import matplotlib
matplotlib_version = matplotlib.__version__
except:
matplotlib_version = None
info.Description = wordwrap(gui.aboutData.description + "\n\nDevelopers:\n\t" +
"\n\t".join(gui.aboutData.developers) +
"\n\nAdditional credits:\n\t" +
@@ -358,7 +369,8 @@ class MainFrame(wx.Frame):
"\n\nEVE Data: \t" + gamedata_version +
"\nPython: \t\t" + '{}.{}.{}'.format(v.major, v.minor, v.micro) +
"\nwxPython: \t" + wx.__version__ +
"\nSQLAlchemy: \t" + sqlalchemy.__version__,
"\nSQLAlchemy: \t" + sqlalchemy.__version__ +
"\nmatplotlib: \t {}".format(matplotlib_version if matplotlib_version else "Not Installed"),
500, wx.ClientDC(self))
if "__WXGTK__" in wx.PlatformInfo:
forumUrl = "http://forums.eveonline.com/default.aspx?g=posts&t=466425"
@@ -381,7 +393,10 @@ class MainFrame(wx.Frame):
def showDamagePatternEditor(self, event):
dlg = DmgPatternEditorDlg(self)
dlg.ShowModal()
dlg.Destroy()
try:
dlg.Destroy()
except PyDeadObjectError:
logger.error("Tried to destroy an object that doesn't exist in <showDamagePatternEditor>.")
def showImplantSetEditor(self, event):
ImplantSetEditorDlg(self)
@@ -406,14 +421,20 @@ class MainFrame(wx.Frame):
path += ".xml"
else:
print("oops, invalid fit format %d" % format_)
dlg.Destroy()
try:
dlg.Destroy()
except PyDeadObjectError:
logger.error("Tried to destroy an object that doesn't exist in <showExportDialog>.")
return
with open(path, "w", encoding="utf-8") as openfile:
openfile.write(output)
openfile.close()
dlg.Destroy()
try:
dlg.Destroy()
except PyDeadObjectError:
logger.error("Tried to destroy an object that doesn't exist in <showExportDialog>.")
def showPreferenceDialog(self, event):
dlg = PreferenceDialog(self)
@@ -724,7 +745,10 @@ class MainFrame(wx.Frame):
CopySelectDict[selected]()
dlg.Destroy()
try:
dlg.Destroy()
except PyDeadObjectError:
logger.error("Tried to destroy an object that doesn't exist in <exportToClipboard>.")
def exportSkillsNeeded(self, event):
""" Exports skills needed for active fit and active character """
@@ -778,7 +802,10 @@ class MainFrame(wx.Frame):
self.progressDialog.message = None
sPort.importFitsThreaded(dlg.GetPaths(), self.fileImportCallback)
self.progressDialog.ShowModal()
dlg.Destroy()
try:
dlg.Destroy()
except PyDeadObjectError:
logger.error("Tried to destroy an object that doesn't exist in <fileImportDialog>.")
def backupToXml(self, event):
""" Back up all fits to EVE XML file """

View File

@@ -230,7 +230,7 @@ class exportHtmlThread(threading.Thread):
HTML += (
' <li data-role="collapsible" data-iconpos="right" data-shadow="false" data-corners="false">\n'
' <h2>' + group.groupName + ' <span class="ui-li-count">' + str(groupFits) + '</span></h2>\n'
' <ul data-role="listview" data-shadow="false" data-inset="true" data-corners="false">\n' + HTMLgroup +
' <ul data-role="listview" data-shadow="false" data-inset="true" data-corners="false">\n' + HTMLgroup +
' </ul>\n'
' </li>'
)