diff --git a/README.md b/README.md index 4262bd6e7..762cbac58 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # pyfa +[![Join the chat at https://gitter.im/pyfa-org/Pyfa](https://badges.gitter.im/pyfa-org/Pyfa.svg)](https://gitter.im/pyfa-org/Pyfa?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + ![pyfa](https://cloud.githubusercontent.com/assets/3904767/10271512/af385ef2-6ade-11e5-8f67-52b8b1e4c797.PNG) ## What is it? @@ -12,7 +14,7 @@ The latest version along with release notes can always be found on the projects ## Installing Windows and OS X users are supplied self-contained builds of pyfa that can be run without additional software. An `.exe` installer is also available for the Windows builds. There is no self-contained package for Linux users, which are expected to run pyfa through their distributions Python interpreter. However, there are a number of third-party packages available that handle the dependencies and updates for pyfa (for example, [pyfa for Arch Linux](https://aur.archlinux.org/packages/pyfa/)). Please check your distributions repositories. -## Requirements +### Requirements If you wish to help with development or simply need to run pyfa through a Python interpreter, the following software is required: * Python 2.7 @@ -22,6 +24,14 @@ If you wish to help with development or simply need to run pyfa through a Python * `matplotlib` (for some Linux distributions, you may need to install separate wxPython bindings, such as `python-matplotlib-wx`) * `requests` +### Linux Distro-specific Packages +The following is a list of pyfa packages available for certain distros. Please note that these packages are maintained by third-parties and are not evaluated by the pyfa developers. + +* Debian/Ubuntu/derivitives: https://github.com/AdamMajer/Pyfa/releases +* Arch: https://aur.archlinux.org/packages/pyfa/ +* openSUSE: https://build.opensuse.org/package/show/home:rmk2/pyfa +* FreeBSD: http://www.freshports.org/games/pyfa/ (see #484 for instructions) + ## Bug Reporting The preferred method of reporting bugs is through the projects GitHub Issues interface. Alternatively, posting a report in the pyfa thread on the official EVE Online forums is acceptable. Guidelines for bug reporting can be found on [this wiki page](https://github.com/DarkFenX/Pyfa/wiki/Bug-Reporting). diff --git a/config.py b/config.py index b2d8fc95f..dd7d73379 100644 --- a/config.py +++ b/config.py @@ -18,10 +18,10 @@ debug = False saveInRoot = False # Version data -version = "1.18.0" +version = "1.19.1" tag = "Stable" -expansionName = "YC 118.1" -expansionVersion = "1.0" +expansionName = "February 2016" +expansionVersion = "1.1" evemonMinVersion = "4081" pyfaPath = None diff --git a/eos/effects/commandbonusecmmultiplywithcommandbonushidden.py b/eos/effects/commandbonusecmmultiplywithcommandbonushidden.py index 0f0101a66..347bc7f35 100644 --- a/eos/effects/commandbonusecmmultiplywithcommandbonushidden.py +++ b/eos/effects/commandbonusecmmultiplywithcommandbonushidden.py @@ -5,6 +5,8 @@ gangBonus = "commandBonusECM" gangBoost = "ewarStrECM" type = "active", "gang" +runTime = "late" + def handler(fit, module, context): if "gang" not in context: return for scanType in ("Magnetometric", "Radar", "Ladar", "Gravimetric"): diff --git a/eos/effects/commandbonusrsdmultiplywithcommandbonushidden.py b/eos/effects/commandbonusrsdmultiplywithcommandbonushidden.py index 9080637fd..dea9fa584 100644 --- a/eos/effects/commandbonusrsdmultiplywithcommandbonushidden.py +++ b/eos/effects/commandbonusrsdmultiplywithcommandbonushidden.py @@ -5,6 +5,8 @@ gangBonus = "commandBonusRSD" gangBoost = "ewarStrRSD" type = "active", "gang" +runTime = "late" + def handler(fit, module, context): if "gang" not in context: return fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Sensor Linking"), diff --git a/eos/effects/commandbonustdmultiplywithcommandbonushidden.py b/eos/effects/commandbonustdmultiplywithcommandbonushidden.py index 11987a66b..1561c2190 100644 --- a/eos/effects/commandbonustdmultiplywithcommandbonushidden.py +++ b/eos/effects/commandbonustdmultiplywithcommandbonushidden.py @@ -5,6 +5,8 @@ gangBonus = "commandBonusTD" gangBoost = "ewarStrTD" type = "active", "gang" +runTime = "late" + def handler(fit, module, context): if "gang" not in context: return for bonus in ( diff --git a/eos/effects/commandbonustpmultiplywithcommandbonushidden.py b/eos/effects/commandbonustpmultiplywithcommandbonushidden.py index f3ae01698..5d1615936 100644 --- a/eos/effects/commandbonustpmultiplywithcommandbonushidden.py +++ b/eos/effects/commandbonustpmultiplywithcommandbonushidden.py @@ -5,6 +5,8 @@ gangBonus = "commandBonusTP" gangBoost = "ewarStrTP" type = "active", "gang" +runTime = "late" + def handler(fit, module, context): if "gang" not in context: return fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Target Painting"), diff --git a/eos/effects/dronedmgbonus.py b/eos/effects/dronedmgbonus.py index 6b93babe7..3407e3d69 100644 --- a/eos/effects/dronedmgbonus.py +++ b/eos/effects/dronedmgbonus.py @@ -1,7 +1,7 @@ # droneDmgBonus # # Used by: -# Skills from group: Drones (8 of 21) +# Skills from group: Drones (8 of 23) # Skills named like: Drone Specialization (4 of 4) type = "passive" def handler(fit, skill, context): diff --git a/eos/effects/energydestabilizationnew.py b/eos/effects/energydestabilizationnew.py index eebab03a0..fefadab40 100644 --- a/eos/effects/energydestabilizationnew.py +++ b/eos/effects/energydestabilizationnew.py @@ -1,7 +1,7 @@ # energyDestabilizationNew # # Used by: -# Drones from group: Cap Drain Drone (3 of 3) +# Drones from group: Energy Neutralizer Drone (3 of 3) from eos.types import State type = "active", "projected" def handler(fit, container, context): diff --git a/eos/effects/gangabmwdfactorboost.py b/eos/effects/gangabmwdfactorboost.py index 898d561c2..0cc9d74bd 100644 --- a/eos/effects/gangabmwdfactorboost.py +++ b/eos/effects/gangabmwdfactorboost.py @@ -4,6 +4,8 @@ # Variations of module: Skirmish Warfare Link - Rapid Deployment I (2 of 2) type = "gang", "active" gangBoost = "speedFactor" +runTime = "late" + def handler(fit, module, context): if "gang" not in context: return fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Propulsion Module", diff --git a/eos/effects/gangarmorhardening.py b/eos/effects/gangarmorhardening.py index 25665c817..2c8feddf4 100644 --- a/eos/effects/gangarmorhardening.py +++ b/eos/effects/gangarmorhardening.py @@ -4,6 +4,8 @@ # Variations of module: Armored Warfare Link - Passive Defense I (2 of 2) type = "gang", "active" gangBoost = "armorResistance" +runTime = "late" + def handler(fit, module, context): if "gang" not in context: return for damageType in ("Em", "Thermal", "Explosive", "Kinetic"): diff --git a/eos/effects/gangarmorrepaircapreducerselfandprojected.py b/eos/effects/gangarmorrepaircapreducerselfandprojected.py index 89e451bca..3a9d33b3b 100644 --- a/eos/effects/gangarmorrepaircapreducerselfandprojected.py +++ b/eos/effects/gangarmorrepaircapreducerselfandprojected.py @@ -4,6 +4,8 @@ # Variations of module: Armored Warfare Link - Damage Control I (2 of 2) type = "gang", "active" gangBoost = "armorRepairCapacitorNeed" +runTime = "late" + def handler(fit, module, context): if "gang" not in context: return fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Repair Systems") or mod.item.requiresSkill("Remote Armor Repair Systems"), diff --git a/eos/effects/gangarmorrepairspeedamplifierselfandprojected.py b/eos/effects/gangarmorrepairspeedamplifierselfandprojected.py index 0f94f82b0..352090e76 100644 --- a/eos/effects/gangarmorrepairspeedamplifierselfandprojected.py +++ b/eos/effects/gangarmorrepairspeedamplifierselfandprojected.py @@ -4,6 +4,8 @@ # Variations of module: Armored Warfare Link - Rapid Repair I (2 of 2) type = "gang", "active" gangBoost = "armorRepairDuration" +runTime = "late" + def handler(fit, module, context): if "gang" not in context: return fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Repair Systems") or mod.item.requiresSkill("Remote Armor Repair Systems"), diff --git a/eos/effects/gangbonussignature.py b/eos/effects/gangbonussignature.py index 31db2a205..f1a53a9a6 100644 --- a/eos/effects/gangbonussignature.py +++ b/eos/effects/gangbonussignature.py @@ -4,6 +4,8 @@ # Variations of module: Skirmish Warfare Link - Evasive Maneuvers I (2 of 2) type = "gang", "active" gangBoost = "signatureRadius" +runTime = "late" + def handler(fit, module, context): if "gang" not in context: return fit.ship.boostItemAttr("signatureRadius", module.getModifiedItemAttr("commandBonus"), diff --git a/eos/effects/ganginformationwarfarerangebonuswithecmburst.py b/eos/effects/ganginformationwarfarerangebonuswithecmburst.py index bdd216824..94c6c5c1d 100644 --- a/eos/effects/ganginformationwarfarerangebonuswithecmburst.py +++ b/eos/effects/ganginformationwarfarerangebonuswithecmburst.py @@ -4,6 +4,8 @@ # Variations of module: Information Warfare Link - Recon Operation I (2 of 2) type = "gang", "active" gangBoost = "electronicMaxRange" +runTime = "late" + def handler(fit, module, context): if "gang" not in context: return groups = ("Target Painter", "Weapon Disruptor", "Remote Sensor Damper", "ECM", "ECM Burst") diff --git a/eos/effects/ganginformationwarfaresuperiorityall2.py b/eos/effects/ganginformationwarfaresuperiorityall2.py index da72b30f4..cb7f2e544 100644 --- a/eos/effects/ganginformationwarfaresuperiorityall2.py +++ b/eos/effects/ganginformationwarfaresuperiorityall2.py @@ -3,8 +3,9 @@ # Used by: # Variations of module: Information Warfare Link - Electronic Superiority I (2 of 2) type = "active" + def handler(fit, module, context): module.multiplyItemAttr("commandBonusTD", module.getModifiedItemAttr("commandBonusHidden")) module.multiplyItemAttr("commandBonusECM", module.getModifiedItemAttr("commandBonusHidden")) module.multiplyItemAttr("commandBonusRSD", module.getModifiedItemAttr("commandBonusHidden")) - module.multiplyItemAttr("commandBonusTP", module.getModifiedItemAttr("commandBonusHidden")) \ No newline at end of file + module.multiplyItemAttr("commandBonusTP", module.getModifiedItemAttr("commandBonusHidden")) diff --git a/eos/effects/gangpropulsionjammingboost.py b/eos/effects/gangpropulsionjammingboost.py index e50376c7a..3043f17e2 100644 --- a/eos/effects/gangpropulsionjammingboost.py +++ b/eos/effects/gangpropulsionjammingboost.py @@ -4,9 +4,11 @@ # Variations of module: Skirmish Warfare Link - Interdiction Maneuvers I (2 of 2) type = "gang", "active" gangBoost = "interdictionMaxRange" +runTime = "late" + def handler(fit, module, context): if "gang" not in context: return - groups = ("Stasis Web","Warp Scrambler") + groups = ("Stasis Web", "Warp Scrambler") fit.modules.filteredItemBoost(lambda mod: mod.item.group.name in groups, "maxRange", module.getModifiedItemAttr("commandBonus"), stackingPenalties = True) diff --git a/eos/effects/gangsensorintegrity.py b/eos/effects/gangsensorintegrity.py index 9e90654b5..87d291afd 100644 --- a/eos/effects/gangsensorintegrity.py +++ b/eos/effects/gangsensorintegrity.py @@ -5,6 +5,8 @@ type = "gang", "active" gangBoost = "maxTargetRange" gangBonus = "commandBonus" +runTime = "late" + def handler(fit, module, context): if "gang" not in context: return fit.ship.boostItemAttr("maxTargetRange", module.getModifiedItemAttr("commandBonus"), diff --git a/eos/effects/gangshieldboosteandtransportercapacitorneed.py b/eos/effects/gangshieldboosteandtransportercapacitorneed.py index 3f600e79c..945345b41 100644 --- a/eos/effects/gangshieldboosteandtransportercapacitorneed.py +++ b/eos/effects/gangshieldboosteandtransportercapacitorneed.py @@ -4,6 +4,8 @@ # Variations of module: Siege Warfare Link - Shield Efficiency I (2 of 2) type = "gang", "active" gangBoost = "shieldRepairCapacitorNeed" +runTime = "late" + def handler(fit, module, context): if "gang" not in context: return fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Shield Operation") or mod.item.requiresSkill("Shield Emission Systems"), diff --git a/eos/effects/gangshieldboosterandtransporterspeed.py b/eos/effects/gangshieldboosterandtransporterspeed.py index 7637d0a94..5fc79557b 100644 --- a/eos/effects/gangshieldboosterandtransporterspeed.py +++ b/eos/effects/gangshieldboosterandtransporterspeed.py @@ -4,6 +4,8 @@ # Variations of module: Siege Warfare Link - Active Shielding I (2 of 2) type = "gang", "active" gangBoost = "shieldRepairDuration" +runTime = "late" + def handler(fit, module, context): if "gang" not in context: return fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Shield Operation") or mod.item.requiresSkill("Shield Emission Systems"), diff --git a/eos/effects/gangshieldhardening.py b/eos/effects/gangshieldhardening.py index 2c438590f..0206ad559 100644 --- a/eos/effects/gangshieldhardening.py +++ b/eos/effects/gangshieldhardening.py @@ -4,6 +4,8 @@ # Variations of module: Siege Warfare Link - Shield Harmonizing I (2 of 2) type = "gang", "active" gangBoost = "shieldResistance" +runTime = "late" + def handler(fit, module, context): if "gang" not in context: return for damageType in ("Em", "Explosive", "Thermal", "Kinetic"): diff --git a/eos/effects/leadershipeffect.py b/eos/effects/leadershipeffect.py index 1fe180120..f7aaa4d12 100644 --- a/eos/effects/leadershipeffect.py +++ b/eos/effects/leadershipeffect.py @@ -6,4 +6,4 @@ type = "gang" gangBoost = "scanResolution" gangBonus = "scanResolutionBonus" def handler(fit, skill, context): - fit.ship.boostItemAttr(gangBoost, skill.getModifiedItemAttr(gangBonus) * skill.level) + fit.ship.boostItemAttr(gangBoost, skill.getModifiedItemAttr(gangBonus) * skill.level, stackingPenalties = True) diff --git a/eos/effects/reconoperationsmaxtargetrangebonuspostpercentmaxtargetrangegangships.py b/eos/effects/reconoperationsmaxtargetrangebonuspostpercentmaxtargetrangegangships.py index db12c57db..15c177712 100644 --- a/eos/effects/reconoperationsmaxtargetrangebonuspostpercentmaxtargetrangegangships.py +++ b/eos/effects/reconoperationsmaxtargetrangebonuspostpercentmaxtargetrangegangships.py @@ -7,4 +7,4 @@ gangBoost = "maxTargetRange" gangBonus = "maxTargetRangeBonus" def handler(fit, container, context): level = container.level if "skill" in context else 1 - fit.ship.boostItemAttr(gangBoost, container.getModifiedItemAttr(gangBonus) * level) + fit.ship.boostItemAttr(gangBoost, container.getModifiedItemAttr(gangBonus) * level, stackingPenalties = True ) diff --git a/eos/effects/skirmishwarfareagilitybonus.py b/eos/effects/skirmishwarfareagilitybonus.py index 39ec2c90a..9c2065482 100644 --- a/eos/effects/skirmishwarfareagilitybonus.py +++ b/eos/effects/skirmishwarfareagilitybonus.py @@ -7,4 +7,4 @@ gangBoost = "agility" gangBonus = "agilityBonus" def handler(fit, container, context): level = container.level if "skill" in context else 1 - fit.ship.boostItemAttr(gangBoost, container.getModifiedItemAttr(gangBonus) * level) + fit.ship.boostItemAttr(gangBoost, container.getModifiedItemAttr(gangBonus) * level, stackingPenalties = True) diff --git a/eos/saveddata/fit.py b/eos/saveddata/fit.py index 3478d4270..458dab987 100644 --- a/eos/saveddata/fit.py +++ b/eos/saveddata/fit.py @@ -476,9 +476,6 @@ class Fit(object): logger.debug("Fit has already been calculated and is not projected, returning: %r", self) return - # Mark fit as calculated - self.__calculated = True - for runTime in ("early", "normal", "late"): # Items that are unrestricted. These items are run on the local fit # first and then projected onto the target fit it one is designated @@ -505,9 +502,10 @@ class Fit(object): # Registering the item about to affect the fit allows us to # track "Affected By" relations correctly if item is not None: - # apply effects locally - self.register(item) - item.calculateModifiedAttributes(self, runTime, False) + if not self.__calculated: + # apply effects locally if this is first time running them on fit + self.register(item) + item.calculateModifiedAttributes(self, runTime, False) if projected is True and item not in chain.from_iterable(r): # apply effects onto target fit @@ -517,6 +515,9 @@ class Fit(object): timer.checkpoint('Done with runtime: %s'%runTime) + # Mark fit as calculated + self.__calculated = True + # Only apply projected fits if fit it not projected itself. if not projected: for fit in self.projectedFits: diff --git a/eos/saveddata/module.py b/eos/saveddata/module.py index 57501ca48..2cb9d168b 100644 --- a/eos/saveddata/module.py +++ b/eos/saveddata/module.py @@ -374,7 +374,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): if shipType is not None: fitsOnType.add(shipType) - for i in xrange(1, 6): + for i in xrange(1, 10): shipType = self.getModifiedItemAttr("canFitShipType%d" % i) if shipType is not None: fitsOnType.add(shipType) diff --git a/eve.db b/eve.db index 42767c066..560001fc7 100644 Binary files a/eve.db and b/eve.db differ diff --git a/gui/aboutData.py b/gui/aboutData.py index 1cf8cc136..354c886f0 100644 --- a/gui/aboutData.py +++ b/gui/aboutData.py @@ -25,8 +25,16 @@ licenses = ( "Silk Icons Set by famfamfam.com - Creative Commons Attribution 2.5 License", "Fat Cow Icons by fatcow.com - Creative Commons Attribution 3.0 License" ) -developers = ("blitzmann \t(Sable Blitzmann)", "cncfanatics \t(Sakari Orisi) (founder)" , "DarkPhoenix \t(Kadesh Priestess) (project lead)", "Darriele \t(Darriele)") -credits = ("Entity (Entity) \t\tCapacitor calculations / EVEAPI python lib / Reverence", "Aurora \t\t\tMaths", "Corollax (Aamrr) \tVarious EOS / pyfa improvements") +developers = ( + "blitzmann \t(Sable Blitzmann) (maintainer)", + "cncfanatics \t(Sakari Orisi)" , + "DarkPhoenix \t(Kadesh Priestess)", + "Darriele \t\t(Darriele)") +credits = ( + "Entity (Entity) \tCapacitor calculations / EVEAPI python lib / Reverence", + "Aurora \t\tMaths", + "Corollax (Aamrr) \tVarious EOS / pyfa improvements", + "Dreae (Dreae)\tPyCrest") description = ( "Pyfa (the Python Fitting Assistant) is an open-source standalone application able to " "create and simulate fittings for EVE-Online SciFi MMORPG with a very high degree of " diff --git a/gui/builtinPreferenceViews/pyfaCrestPreferences.py b/gui/builtinPreferenceViews/pyfaCrestPreferences.py index 308999953..7905745dd 100644 --- a/gui/builtinPreferenceViews/pyfaCrestPreferences.py +++ b/gui/builtinPreferenceViews/pyfaCrestPreferences.py @@ -97,8 +97,8 @@ class PFCrestPref ( PreferenceView): service.Crest.restartService() def OnBtnApply(self, event): - self.settings.set('clientID', self.inputClientID.GetValue()) - self.settings.set('clientSecret', self.inputClientSecret.GetValue()) + self.settings.set('clientID', self.inputClientID.GetValue().strip()) + self.settings.set('clientSecret', self.inputClientSecret.GetValue().strip()) sCrest = service.Crest.getInstance() sCrest.delAllCharacters() diff --git a/gui/builtinPreferenceViews/pyfaGeneralPreferences.py b/gui/builtinPreferenceViews/pyfaGeneralPreferences.py index b6f9011cd..a1f43696f 100644 --- a/gui/builtinPreferenceViews/pyfaGeneralPreferences.py +++ b/gui/builtinPreferenceViews/pyfaGeneralPreferences.py @@ -62,6 +62,8 @@ class PFGeneralPref ( PreferenceView): self.cbGaugeAnimation = wx.CheckBox( panel, wx.ID_ANY, u"Animate gauges", wx.DefaultPosition, wx.DefaultSize, 0 ) mainSizer.Add( self.cbGaugeAnimation, 0, wx.ALL|wx.EXPAND, 5 ) + self.cbExportCharges = wx.CheckBox( panel, wx.ID_ANY, u"Export loaded charges", wx.DefaultPosition, wx.DefaultSize, 0 ) + mainSizer.Add( self.cbExportCharges, 0, wx.ALL|wx.EXPAND, 5 ) defCharSizer = wx.BoxSizer( wx.HORIZONTAL ) @@ -78,6 +80,7 @@ class PFGeneralPref ( PreferenceView): self.cbShowTooltip.SetValue(self.sFit.serviceFittingOptions["showTooltip"] or False) self.cbMarketShortcuts.SetValue(self.sFit.serviceFittingOptions["showMarketShortcuts"] or False) self.cbGaugeAnimation.SetValue(self.sFit.serviceFittingOptions["enableGaugeAnimation"]) + self.cbExportCharges.SetValue(self.sFit.serviceFittingOptions["exportCharges"]) self.cbGlobalChar.Bind(wx.EVT_CHECKBOX, self.OnCBGlobalCharStateChange) self.cbGlobalDmgPattern.Bind(wx.EVT_CHECKBOX, self.OnCBGlobalDmgPatternStateChange) @@ -90,6 +93,7 @@ class PFGeneralPref ( PreferenceView): self.cbShowTooltip.Bind(wx.EVT_CHECKBOX, self.onCBShowTooltip) self.cbMarketShortcuts.Bind(wx.EVT_CHECKBOX, self.onCBShowShortcuts) self.cbGaugeAnimation.Bind(wx.EVT_CHECKBOX, self.onCBGaugeAnimation) + self.cbExportCharges.Bind(wx.EVT_CHECKBOX, self.onCBExportCharges) self.cbRackLabels.Enable(self.sFit.serviceFittingOptions["rackSlots"] or False) @@ -152,6 +156,9 @@ class PFGeneralPref ( PreferenceView): def onCBGaugeAnimation(self, event): self.sFit.serviceFittingOptions["enableGaugeAnimation"] = self.cbGaugeAnimation.GetValue() + def onCBExportCharges(self, event): + self.sFit.serviceFittingOptions["exportCharges"] = self.cbExportCharges.GetValue() + def getImage(self): return BitmapLoader.getBitmap("prefs_settings", "gui") diff --git a/gui/builtinPreferenceViews/pyfaUpdatePreferences.py b/gui/builtinPreferenceViews/pyfaUpdatePreferences.py index 260987287..c49bd0c94 100644 --- a/gui/builtinPreferenceViews/pyfaUpdatePreferences.py +++ b/gui/builtinPreferenceViews/pyfaUpdatePreferences.py @@ -96,7 +96,7 @@ class PFUpdatePref (PreferenceView): self.resetButton.Hide() def OnDownload(self, event): - wx.LaunchDefaultBrowser('https://github.com/DarkFenX/Pyfa/releases/tag/'+self.UpdateSettings.get('version')) + wx.LaunchDefaultBrowser('https://github.com/pyfa-org/Pyfa/releases/tag/'+self.UpdateSettings.get('version')) def getImage(self): return BitmapLoader.getBitmap("prefs_update", "gui") diff --git a/gui/builtinViewColumns/misc.py b/gui/builtinViewColumns/misc.py index e70a88527..1a2118ba8 100644 --- a/gui/builtinViewColumns/misc.py +++ b/gui/builtinViewColumns/misc.py @@ -426,7 +426,7 @@ class Miscellanea(ViewColumn): ttEntries.append("shield") tooltip = "{0} repaired per second".format(formatList(ttEntries)).capitalize() return text, tooltip - elif itemGroup == "Cap Drain Drone": + elif itemGroup == "Energy Neutralizer Drone": neutAmount = stuff.getModifiedItemAttr("energyDestabilizationAmount") cycleTime = stuff.getModifiedItemAttr("duration") if not neutAmount or not cycleTime: diff --git a/gui/characterEditor.py b/gui/characterEditor.py index 05824e80a..7d45dae3d 100644 --- a/gui/characterEditor.py +++ b/gui/characterEditor.py @@ -32,7 +32,7 @@ import gui.globalEvents as GE class CharacterEditor(wx.Frame): def __init__(self, parent): wx.Frame.__init__ (self, parent, id=wx.ID_ANY, title=u"pyfa: Character Editor", pos=wx.DefaultPosition, - size=wx.Size(641, 600), style=wx.DEFAULT_FRAME_STYLE|wx.FRAME_FLOAT_ON_PARENT|wx.TAB_TRAVERSAL) + size=wx.Size(640, 600), style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER) i = wx.IconFromBitmap(BitmapLoader.getBitmap("character_small", "gui")) self.SetIcon(i) @@ -40,7 +40,6 @@ class CharacterEditor(wx.Frame): self.mainFrame = parent #self.disableWin = wx.WindowDisabler(self) - self.SetSizeHintsSz(wx.Size(640, 600), wx.DefaultSize) self.SetBackgroundColour( wx.SystemSettings.GetColour( wx.SYS_COLOUR_BTNFACE ) ) mainSizer = wx.BoxSizer(wx.VERTICAL) @@ -801,4 +800,4 @@ class SaveCharacterAs(wx.Dialog): event.Skip() self.Close() - + \ No newline at end of file diff --git a/gui/mainFrame.py b/gui/mainFrame.py index 6d56f7918..4c0d39ba7 100644 --- a/gui/mainFrame.py +++ b/gui/mainFrame.py @@ -326,6 +326,7 @@ class MainFrame(wx.Frame): def ShowAboutBox(self, evt): import eos.config + v = sys.version_info info = wx.AboutDialogInfo() info.Name = "pyfa" info.Version = gui.aboutData.versionString @@ -336,14 +337,14 @@ class MainFrame(wx.Frame): "\n\nLicenses:\n\t" + "\n\t".join(gui.aboutData.licenses) + "\n\nEVE Data: \t" + eos.config.gamedata_version + - "\nPython: \t" + sys.version + + "\nPython: \t\t" + '{}.{}.{}'.format(v.major, v.minor, v.micro) + "\nwxPython: \t" + wx.__version__ + "\nSQLAlchemy: \t" + sqlalchemy.__version__, - 700, wx.ClientDC(self)) + 500, wx.ClientDC(self)) if "__WXGTK__" in wx.PlatformInfo: - forumUrl = "http://forums.eveonline.com/default.aspx?g=posts&t=247609" + forumUrl = "http://forums.eveonline.com/default.aspx?g=posts&t=466425" else: - forumUrl = "http://forums.eveonline.com/default.aspx?g=posts&t=247609" + forumUrl = "http://forums.eveonline.com/default.aspx?g=posts&t=466425" info.WebSite = (forumUrl, "pyfa thread at EVE Online forum") wx.AboutBox(info) @@ -397,10 +398,10 @@ class MainFrame(wx.Frame): dlg.ShowModal() def goWiki(self, event): - webbrowser.open('https://github.com/DarkFenX/Pyfa/wiki') + webbrowser.open('https://github.com/pyfa-org/Pyfa/wiki') def goForums(self, event): - webbrowser.open('https://forums.eveonline.com/default.aspx?g=posts&t=247609') + webbrowser.open('https://forums.eveonline.com/default.aspx?g=posts&t=466425') def registerMenu(self): menuBar = self.GetMenuBar() diff --git a/gui/mainMenuBar.py b/gui/mainMenuBar.py index 96fee22c9..78376fde7 100644 --- a/gui/mainMenuBar.py +++ b/gui/mainMenuBar.py @@ -108,7 +108,8 @@ class MainMenuBar(wx.MenuBar): graphFrameItem.SetBitmap(BitmapLoader.getBitmap("graphs_small", "gui")) windowMenu.AppendItem(graphFrameItem) - preferencesItem = wx.MenuItem(windowMenu, wx.ID_PREFERENCES, "Preferences\tCTRL+P") + preferencesShortCut = "CTRL+," if 'wxMac' in wx.PlatformInfo else "CTRL+P" + preferencesItem = wx.MenuItem(windowMenu, wx.ID_PREFERENCES, "Preferences\t"+preferencesShortCut) preferencesItem.SetBitmap(BitmapLoader.getBitmap("preferences_small", "gui")) windowMenu.AppendItem(preferencesItem) diff --git a/gui/pyfatogglepanel.py b/gui/pyfatogglepanel.py index 14bd9e2f3..765a07727 100644 --- a/gui/pyfatogglepanel.py +++ b/gui/pyfatogglepanel.py @@ -5,7 +5,7 @@ ## ## Author: Darriele - HomeWorld ## -## Project home: http://github.com/DarkFenX/Pyfa - pyfa project +## Project home: https://github.com/pyfa-org/Pyfa - pyfa project ## Some portions of code are based on ## AGW:pycollapsiblepane generic implementation of wx.CollapsiblePane ## AGW:pycollapsiblepane credits ( from the original source file used ): diff --git a/gui/updateDialog.py b/gui/updateDialog.py index 7dfe73790..0febdf3f8 100644 --- a/gui/updateDialog.py +++ b/gui/updateDialog.py @@ -116,5 +116,5 @@ class UpdateDialog(wx.Dialog): self.UpdateSettings.set('version', None) def OnDownload(self, e): - wx.LaunchDefaultBrowser('https://github.com/DarkFenX/Pyfa/releases/tag/'+self.releaseInfo['tag_name']) + wx.LaunchDefaultBrowser('https://github.com/pyfa-org/Pyfa/releases/tag/'+self.releaseInfo['tag_name']) self.OnClose(e) diff --git a/scripts/pyfa-setup.iss b/scripts/pyfa-setup.iss index 235ed06f1..4980c6b65 100644 --- a/scripts/pyfa-setup.iss +++ b/scripts/pyfa-setup.iss @@ -15,7 +15,7 @@ #define MyAppName "pyfa" #define MyAppPublisher "pyfa" -#define MyAppURL "https://forums.eveonline.com/default.aspx?g=posts&t=247609&p=1" +#define MyAppURL "https://forums.eveonline.com/default.aspx?g=posts&t=466425&p=1" #define MyAppExeName "pyfa.exe" ; What version starts with the new structure (1.x.0). This is used to determine if we run directory structure cleanup @@ -53,7 +53,7 @@ SetupIconFile={#MyAppDir}\pyfa.ico Compression=lzma SolidCompression=yes CloseApplications=yes -AppReadmeFile=https://github.com/DarkFenX/Pyfa/blob/v{#MyAppVersion}/readme.txt +AppReadmeFile=https://github.com/pyfa-org/Pyfa/blob/v{#MyAppVersion}/readme.txt [Languages] Name: "english"; MessagesFile: "compiler:Default.isl" diff --git a/service/conversions/releaseFeb2016.py b/service/conversions/releaseFeb2016.py new file mode 100644 index 000000000..4314ef173 --- /dev/null +++ b/service/conversions/releaseFeb2016.py @@ -0,0 +1,10 @@ +""" +Conversion pack for January 2016 (YC118.1) release +""" + +CONVERSIONS = { + # Renamed items + "Capital Coaxial Remote Armor Repairer Blueprint": "CONCORD Capital Remote Armor Repairer Blueprint", + "Capital Murky Remote Shield Booster Blueprint": "CONCORD Capital Remote Shield Booster Blueprint", +} + diff --git a/service/fit.py b/service/fit.py index 9397cd15e..085748e85 100644 --- a/service/fit.py +++ b/service/fit.py @@ -104,7 +104,8 @@ class Fit(object): "compactSkills": True, "showTooltip": True, "showMarketShortcuts": False, - "enableGaugeAnimation": True} + "enableGaugeAnimation": True, + "exportCharges": True} self.serviceFittingOptions = SettingsProvider.getInstance().getSettings( "pyfaServiceFittingOptions", serviceFittingDefaultOptions) diff --git a/service/port.py b/service/port.py index 7f1ff11e2..9f98b8383 100644 --- a/service/port.py +++ b/service/port.py @@ -551,12 +551,13 @@ class Port(object): offineSuffix = " /OFFLINE" export = "[%s, %s]\n" % (fit.ship.item.name, fit.name) stuff = {} + sFit = service.Fit.getInstance() for module in fit.modules: slot = module.slot if not slot in stuff: stuff[slot] = [] curr = module.item.name if module.item else ("[Empty %s slot]" % Slot.getName(slot).capitalize() if slot is not None else "") - if module.charge: + if module.charge and sFit.serviceFittingOptions["exportCharges"]: curr += ", %s" % module.charge.name if module.state == State.OFFLINE: curr += offineSuffix @@ -664,6 +665,8 @@ class Port(object): doc = xml.dom.minidom.Document() fittings = doc.createElement("fittings") doc.appendChild(fittings) + sFit = service.Fit.getInstance() + for i, fit in enumerate(fits): try: fitting = doc.createElement("fitting") @@ -701,7 +704,7 @@ class Port(object): hardware.setAttribute("slot", "%s slot %d" % (slotName, slotId)) fitting.appendChild(hardware) - if module.charge: + if module.charge and sFit.serviceFittingOptions["exportCharges"]: if not module.charge.name in charges: charges[module.charge.name] = 0 # `or 1` because some charges (ie scripts) are without qty diff --git a/service/update.py b/service/update.py index cb37a129a..47a3e35b0 100644 --- a/service/update.py +++ b/service/update.py @@ -37,7 +37,7 @@ class CheckUpdateThread(threading.Thread): network = service.Network.getInstance() try: - response = network.request('https://api.github.com/repos/DarkFenX/Pyfa/releases', network.UPDATE) + response = network.request('https://api.github.com/repos/pyfa-org/Pyfa/releases', network.UPDATE) jsonResponse = json.loads(response.read()) jsonResponse.sort(key=lambda x: calendar.timegm(dateutil.parser.parse(x['published_at']).utctimetuple()), reverse=True)