From 25e30672fe70d8796d6e1bb4279836d7ea50399f Mon Sep 17 00:00:00 2001 From: blitzmann Date: Mon, 15 Dec 2014 18:32:03 -0500 Subject: [PATCH 01/62] Start conversion of various wait dialogs to wx.ProgresDialog. Implemented new wx.ProgresDialog for fitting backup --- eos/db/__init__.py | 2 +- eos/db/saveddata/queries.py | 5 +++++ gui/mainFrame.py | 28 +++++++++++++++++++++++----- service/fit.py | 12 +++++++----- service/port.py | 8 ++++++-- 5 files changed, 42 insertions(+), 13 deletions(-) diff --git a/eos/db/__init__.py b/eos/db/__init__.py index bedb917d6..8867d63c5 100644 --- a/eos/db/__init__.py +++ b/eos/db/__init__.py @@ -75,7 +75,7 @@ from eos.db.saveddata.queries import getUser, getCharacter, getFit, getFitsWithS getFitList, getFleetList, getFleet, save, remove, commit, add, \ getCharactersForUser, getMiscData, getSquadsIDsWithFitID, getWing, \ getSquad, getBoosterFits, getProjectedFits, getTargetResistsList, getTargetResists,\ - clearPrices + clearPrices, countAllFits #If using in memory saveddata, you'll want to reflect it so the data structure is good. if config.saveddata_connectionstring == "sqlite:///:memory:": diff --git a/eos/db/saveddata/queries.py b/eos/db/saveddata/queries.py index 9fee22561..be7c078fc 100644 --- a/eos/db/saveddata/queries.py +++ b/eos/db/saveddata/queries.py @@ -267,6 +267,11 @@ def getBoosterFits(ownerID=None, where=None, eager=None): fits = saveddata_session.query(Fit).options(*eager).filter(filter).all() return fits +def countAllFits(): + with sd_lock: + count = saveddata_session.query(Fit).count() + return count + def countFitsWithShip(shipID, ownerID=None, where=None, eager=None): """ Get all the fits using a certain ship. diff --git a/gui/mainFrame.py b/gui/mainFrame.py index 2d71da48a..0c507b1ce 100644 --- a/gui/mainFrame.py +++ b/gui/mainFrame.py @@ -54,6 +54,9 @@ from gui.utils.clipboard import toClipboard, fromClipboard from gui.fleetBrowser import FleetBrowser from gui.updateDialog import UpdateDialog from gui.builtinViews import * + +from time import gmtime, strftime + import locale locale.setlocale(locale.LC_ALL, '') @@ -571,22 +574,37 @@ class MainFrame(wx.Frame): pass dlg.Destroy() + def updateProgressDialog(self,count): + if count == -1: + self.progressDialog.Destroy() + else: + self.progressDialog.Update(count) + def backupToXml(self, event): sFit = service.Fit.getInstance() + + defaultFile = "pyfa-fits-%s.xml"%strftime("%Y%m%d_%H%M%S", gmtime()) + saveDialog = wx.FileDialog( self, "Save Backup As...", wildcard = "EVE XML fitting file (*.xml)|*.xml", - style = wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT) + style = wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT, + defaultFile=defaultFile) + if (saveDialog.ShowModal() == wx.ID_OK): filePath = saveDialog.GetPath() if '.' not in os.path.basename(filePath): filePath += ".xml" - self.waitDialog = animUtils.WaitDialog(self) - sFit.backupFits(filePath, self.closeWaitDialog) - self.waitDialog.ShowModal() - saveDialog.Destroy() + max = sFit.countAllFits() + self.progressDialog = wx.ProgressDialog("Backup fits", + "Backing up %d fits to: %s"%(max, filePath), + maximum = max, parent=self, + style = wx.PD_APP_MODAL | wx.PD_ELAPSED_TIME) + + sFit.backupFits(filePath, self.updateProgressDialog) + self.progressDialog.ShowModal() def exportSkillsNeeded(self, event): sCharacter = service.Character.getInstance() diff --git a/service/fit.py b/service/fit.py index e731c3edf..a9005e5a5 100644 --- a/service/fit.py +++ b/service/fit.py @@ -47,12 +47,11 @@ class FitBackupThread(threading.Thread): path = self.path sFit = Fit.getInstance() allFits = map(lambda x: x[0], sFit.getAllFits()) - backedUpFits = sFit.exportXml(*allFits) + backedUpFits = sFit.exportXml(self.callback, *allFits) backupFile = open(path, "w", encoding="utf-8") backupFile.write(backedUpFits) backupFile.close() - wx.CallAfter(self.callback) - + wx.CallAfter(self.callback, -1) class FitImportThread(threading.Thread): def __init__(self, paths, callback): @@ -127,6 +126,9 @@ class Fit(object): return names + def countAllFits(self): + return eos.db.countAllFits() + def countFitsWithShip(self, shipID): count = eos.db.countFitsWithShip(shipID) return count @@ -758,9 +760,9 @@ class Fit(object): fit = eos.db.getFit(fitID) return Port.exportDna(fit) - def exportXml(self, *fitIDs): + def exportXml(self, callback = None, *fitIDs): fits = map(lambda fitID: eos.db.getFit(fitID), fitIDs) - return Port.exportXml(*fits) + return Port.exportXml(callback, *fits) def backupFits(self, path, callback): thread = FitBackupThread(path, callback) diff --git a/service/port.py b/service/port.py index b69a69007..535665d3d 100644 --- a/service/port.py +++ b/service/port.py @@ -23,6 +23,7 @@ import json from eos.types import State, Slot, Module, Cargo, Fit, Ship, Drone, Implant, Booster import service +import wx try: from collections import OrderedDict @@ -503,11 +504,11 @@ class Port(object): return dna + "::" @classmethod - def exportXml(cls, *fits): + def exportXml(cls, callback=None, *fits): doc = xml.dom.minidom.Document() fittings = doc.createElement("fittings") doc.appendChild(fittings) - for fit in fits: + for i, fit in enumerate(fits): try: fitting = doc.createElement("fitting") fitting.setAttribute("name", fit.name) @@ -571,5 +572,8 @@ class Port(object): except: print "Failed on fitID: %d"%fit.ID continue + finally: + if callback: + wx.CallAfter(callback, i) return doc.toprettyxml() From 26e50f2e8a85caa88ba6512f399566d16dd738be Mon Sep 17 00:00:00 2001 From: blitzmann Date: Wed, 17 Dec 2014 21:34:43 -0500 Subject: [PATCH 02/62] Implement ProgressDialog for fit file imports (EVE XML / EFT cfg). To make it simpler, changed the way fits are imported and saved from a per-file basis (process file->save fits->process file->save fits) to a per-batch basis (process file->process file -> save all fits). --- gui/mainFrame.py | 33 ++++++++++++++++++++----------- service/fit.py | 51 +++++++++++++++++++++++++++--------------------- service/port.py | 20 ++++++++++++------- 3 files changed, 64 insertions(+), 40 deletions(-) diff --git a/gui/mainFrame.py b/gui/mainFrame.py index 0c507b1ce..053fe08f7 100644 --- a/gui/mainFrame.py +++ b/gui/mainFrame.py @@ -336,21 +336,32 @@ class MainFrame(wx.Frame): dlg=wx.FileDialog( self, "Open One Or More Fitting Files", - wildcard = "EFT text fitting files (*.cfg)|*.cfg|" \ - "EVE XML fitting files (*.xml)|*.xml|" \ + wildcard = "EVE XML fitting files (*.xml)|*.xml|" \ + "EFT text fitting files (*.cfg)|*.cfg|" \ "All Files (*)|*", style = wx.FD_OPEN | wx.FD_FILE_MUST_EXIST | wx.FD_MULTIPLE) if (dlg.ShowModal() == wx.ID_OK): - self.waitDialog = animUtils.WaitDialog(self, title = "Importing") - sFit.importFitsThreaded(dlg.GetPaths(), self.importCallback) - dlg.Destroy() - self.waitDialog.ShowModal() - def importCallback(self, fits): - self.waitDialog.Destroy() - sFit = service.Fit.getInstance() - IDs = sFit.saveImportedFits(fits) - self._openAfterImport(len(fits), IDs) + self.progressDialog = wx.ProgressDialog("Importing fits", " "*100, parent=self, + style = wx.PD_APP_MODAL | wx.PD_ELAPSED_TIME) + self.progressDialog.message = None + sFit.importFitsThreaded(dlg.GetPaths(), self.importCallback) + self.progressDialog.ShowModal() + dlg.Destroy() + + def importCallback(self, info): + if info == -1: + self.progressDialog.Destroy() + elif info != self.progressDialog.message and info is not None: + self.progressDialog.message = info + self.progressDialog.Pulse(info) + else: + self.progressDialog.Pulse() + + # @todo: implement saveImportedFits where needed, modify _openAfterImport + #sFit = service.Fit.getInstance() + #IDs = sFit.saveImportedFits(fits) + #self._openAfterImport(len(fits), IDs) def _openAfterImport(self, importCount, fitIDs): if importCount == 1: diff --git a/service/fit.py b/service/fit.py index a9005e5a5..3c5faa9fc 100644 --- a/service/fit.py +++ b/service/fit.py @@ -17,7 +17,6 @@ # along with pyfa. If not, see . #=============================================================================== -import os.path import locale import copy import threading @@ -53,6 +52,7 @@ class FitBackupThread(threading.Thread): backupFile.close() wx.CallAfter(self.callback, -1) + class FitImportThread(threading.Thread): def __init__(self, paths, callback): threading.Thread.__init__(self) @@ -60,14 +60,10 @@ class FitImportThread(threading.Thread): self.callback = callback def run(self): - importedFits = [] - paths = self.paths sFit = Fit.getInstance() - for path in paths: - pathImported = sFit.importFit(path) - if pathImported is not None: - importedFits += pathImported - wx.CallAfter(self.callback, importedFits) + sFit.importFitFromFiles(self.paths, self.callback) + + wx.CallAfter(self.callback, -1) class Fit(object): @@ -772,26 +768,37 @@ class Fit(object): thread = FitImportThread(paths, callback) thread.start() - def importFit(self, path): - filename = os.path.split(path)[1] - + def importFitFromFiles(self, paths, callback=None): defcodepage = locale.getpreferredencoding() - file = open(path, "r") - srcString = file.read() - # If file had ANSI encoding, convert it to unicode using system - # default codepage, or use fallback cp1252 on any encoding errors - if isinstance(srcString, str): - try: - srcString = unicode(srcString, defcodepage) - except UnicodeDecodeError: - srcString = unicode(srcString, "cp1252") + fitImport = [] + for path in paths: + if callback: # Pulse + wx.CallAfter(callback, "Processing file:\n%s"%path) - _, fits = Port.importAuto(srcString, filename) - for fit in fits: + file = open(path, "r") + srcString = file.read() + # If file had ANSI encoding, convert it to unicode using system + # default codepage, or use fallback cp1252 on any encoding errors + if isinstance(srcString, str): + try: + srcString = unicode(srcString, defcodepage) + except UnicodeDecodeError: + srcString = unicode(srcString, "cp1252") + + _, fits = Port.importAuto(srcString, path, callback=callback) + fitImport += fits + + IDs = [] + for i, fit in enumerate(fitImport): fit.character = self.character fit.damagePattern = self.pattern fit.targetResists = self.targetResists + eos.db.save(fit) + IDs.append(fit.ID) + if callback: # Pulse + wx.CallAfter(callback, "Saving fit\n%d/%d"%(i+1, len(fitImport))) + return fits def importFitFromBuffer(self, bufferStr, activeFit=None): diff --git a/service/port.py b/service/port.py index 535665d3d..800447d19 100644 --- a/service/port.py +++ b/service/port.py @@ -19,7 +19,6 @@ import re import xml.dom -import json from eos.types import State, Slot, Module, Cargo, Fit, Ship, Drone, Implant, Booster import service @@ -36,20 +35,20 @@ class Port(object): """Service which houses all import/export format functions""" @classmethod - def importAuto(cls, string, sourceFileName=None, activeFit=None): + def importAuto(cls, string, sourceFileName=None, activeFit=None, callback=None): # Get first line and strip space symbols of it to avoid possible detection errors firstLine = re.split("[\n\r]+", string.strip(), maxsplit=1)[0] firstLine = firstLine.strip() # If XML-style start of tag encountered, detect as XML if re.match("<", firstLine): - return "XML", cls.importXml(string) + return "XML", cls.importXml(string, callback) # 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 sourceFileName is not None: shipName = sourceFileName.rsplit('.')[0] - return "EFT Config", cls.importEftCfg(shipName, string) + return "EFT Config", cls.importEftCfg(shipName, string, callback) # If no file is specified and there's comma between brackets, # consider that we have [ship, setup name] and detect like eft export format @@ -201,7 +200,7 @@ class Port(object): return fit @staticmethod - def importEftCfg(shipname, contents): + def importEftCfg(shipname, contents, callback=None): """Handle import from EFT config store file""" # Check if we have such ship in database, bail if we don't @@ -347,6 +346,9 @@ class Port(object): f.modules.append(m) # Append fit to list of fits fits.append(f) + + if callback: + wx.CallAfter(callback, None) # Skip fit silently if we get an exception except Exception: pass @@ -354,14 +356,16 @@ class Port(object): return fits @staticmethod - def importXml(text): + def importXml(text, callback=None): sMkt = service.Market.getInstance() doc = xml.dom.minidom.parseString(text.encode("utf-8")) fittings = doc.getElementsByTagName("fittings").item(0) fittings = fittings.getElementsByTagName("fitting") fits = [] - for fitting in fittings: + + for i, fitting in enumerate(fittings): + print "fitting" f = Fit() f.name = fitting.getAttribute("name") # Maelstrom @@ -403,6 +407,8 @@ class Port(object): except KeyboardInterrupt: continue fits.append(f) + if callback: + wx.CallAfter(callback, None) return fits From 71bf1556a1cb0b6c32afadd326ffd46873d941f9 Mon Sep 17 00:00:00 2001 From: Ryan Holmes Date: Fri, 19 Dec 2014 00:02:39 -0500 Subject: [PATCH 03/62] Fix column name in upgrade3 migration script --- eos/db/migrations/upgrade3.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eos/db/migrations/upgrade3.py b/eos/db/migrations/upgrade3.py index 5467fdf2d..0350ded72 100644 --- a/eos/db/migrations/upgrade3.py +++ b/eos/db/migrations/upgrade3.py @@ -8,6 +8,6 @@ import sqlalchemy def upgrade(saveddata_engine): try: - saveddata_engine.execute("SELECT mode FROM fits LIMIT 1") + saveddata_engine.execute("SELECT modeID FROM fits LIMIT 1") except sqlalchemy.exc.DatabaseError: saveddata_engine.execute("ALTER TABLE fits ADD COLUMN modeID INTEGER") From c59b8186775b2de7379d000143d174976a6014a2 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Fri, 19 Dec 2014 00:13:06 -0500 Subject: [PATCH 04/62] Add wx.ProgressDialog to HTML export, along with some documentation and silent try-except in HTML export --- gui/mainFrame.py | 193 +++++++++++++++++++++------------------- gui/utils/exportHtml.py | 42 ++++++--- service/fit.py | 31 ++++--- service/port.py | 1 - 4 files changed, 150 insertions(+), 117 deletions(-) diff --git a/gui/mainFrame.py b/gui/mainFrame.py index 053fe08f7..61a5573b9 100644 --- a/gui/mainFrame.py +++ b/gui/mainFrame.py @@ -330,57 +330,16 @@ class MainFrame(wx.Frame): dlg.ShowModal() dlg.Destroy() - def showImportDialog(self, event): - fits = [] - sFit = service.Fit.getInstance() - dlg=wx.FileDialog( - self, - "Open One Or More Fitting Files", - wildcard = "EVE XML fitting files (*.xml)|*.xml|" \ - "EFT text fitting files (*.cfg)|*.cfg|" \ - "All Files (*)|*", - style = wx.FD_OPEN | wx.FD_FILE_MUST_EXIST | wx.FD_MULTIPLE) - if (dlg.ShowModal() == wx.ID_OK): - - self.progressDialog = wx.ProgressDialog("Importing fits", " "*100, parent=self, - style = wx.PD_APP_MODAL | wx.PD_ELAPSED_TIME) - self.progressDialog.message = None - sFit.importFitsThreaded(dlg.GetPaths(), self.importCallback) - self.progressDialog.ShowModal() - dlg.Destroy() - - def importCallback(self, info): - if info == -1: - self.progressDialog.Destroy() - elif info != self.progressDialog.message and info is not None: - self.progressDialog.message = info - self.progressDialog.Pulse(info) - else: - self.progressDialog.Pulse() - - # @todo: implement saveImportedFits where needed, modify _openAfterImport - #sFit = service.Fit.getInstance() - #IDs = sFit.saveImportedFits(fits) - #self._openAfterImport(len(fits), IDs) - - def _openAfterImport(self, importCount, fitIDs): - if importCount == 1: - wx.PostEvent(self, FitSelected(fitID=fitIDs[0])) - - self.shipBrowser.RefreshContent() - def showExportDialog(self, event): - dlg=wx.FileDialog( - self, - "Save Fitting As...", - wildcard = "EVE XML fitting files (*.xml)|*.xml", - style = wx.FD_SAVE) - if (dlg.ShowModal() == wx.ID_OK): + """ Export active fit """ + dlg = wx.FileDialog(self, "Save Fitting As...", + wildcard = "EVE XML fitting files (*.xml)|*.xml", + style = wx.FD_SAVE) + if dlg.ShowModal() == wx.ID_OK: sFit = service.Fit.getInstance() format = dlg.GetFilterIndex() - output = "" path = dlg.GetPath() - if (format == 0): + if format == 0: output = sFit.exportXml(self.getActiveFit()) if '.' not in os.path.basename(path): path += ".xml" @@ -420,7 +379,7 @@ class MainFrame(wx.Frame): # Target Resists editor self.Bind(wx.EVT_MENU, self.showTargetResistsEditor, id=menuBar.targetResistsEditorId) # Import dialog - self.Bind(wx.EVT_MENU, self.showImportDialog, id=wx.ID_OPEN) + self.Bind(wx.EVT_MENU, self.fileImportDialog, id=wx.ID_OPEN) # Export dialog self.Bind(wx.EVT_MENU, self.showExportDialog, id=wx.ID_SAVEAS) # Import from Clipboard @@ -565,12 +524,10 @@ class MainFrame(wx.Frame): sFit = service.Fit.getInstance() try: fits = sFit.importFitFromBuffer(fromClipboard(), self.getActiveFit()) - IDs = sFit.saveImportedFits(fits) - self._openAfterImport(len(fits), IDs) + #self._openAfterImport(len(fits), IDs) except: pass - def exportToClipboard(self, event): CopySelectDict = {CopySelectDialog.copyFormatEft: self.clipboardEft, CopySelectDialog.copyFormatEftImps: self.clipboardEftImps, @@ -585,59 +542,103 @@ class MainFrame(wx.Frame): pass dlg.Destroy() - def updateProgressDialog(self,count): - if count == -1: + def fileImportDialog(self, event): + """Handles importing single/multiple EVE XML / EFT cfg fit files""" + sFit = service.Fit.getInstance() + dlg = wx.FileDialog(self, "Open One Or More Fitting Files", + wildcard = "EVE XML fitting files (*.xml)|*.xml|" \ + "EFT text fitting files (*.cfg)|*.cfg|" \ + "All Files (*)|*", + style = wx.FD_OPEN | wx.FD_FILE_MUST_EXIST | wx.FD_MULTIPLE) + if (dlg.ShowModal() == wx.ID_OK): + self.progressDialog = wx.ProgressDialog( + "Importing fits", + " "*100, # set some arbitrary spacing to create wifth in window + parent=self, style = wx.PD_APP_MODAL | wx.PD_ELAPSED_TIME) + self.progressDialog.message = None + sFit.importFitsThreaded(dlg.GetPaths(), self.importCallback) + self.progressDialog.ShowModal() + dlg.Destroy() + + def importCallback(self, info): + """ + While importing fits from file, the logic calls back to this function to + update progress bar to show activity. If -1, closes dialog. If None, + simply Pulse()s progress. If there is a message to show new activity, + overwrites cached message and updates dialog + """ + if info == -1: self.progressDialog.Destroy() + elif info != self.progressDialog.message and info is not None: + self.progressDialog.message = info + self.progressDialog.Pulse(info) else: - self.progressDialog.Update(count) + self.progressDialog.Pulse() + + # @todo: modify _openAfterImport + #self._openAfterImport(len(fits), IDs) + + def _openAfterImport(self, importCount, fitIDs): + if importCount == 1: + wx.PostEvent(self, FitSelected(fitID=fitIDs[0])) + + self.shipBrowser.RefreshContent() def backupToXml(self, event): - sFit = service.Fit.getInstance() - + """ Back up all fits to EVE XML file """ defaultFile = "pyfa-fits-%s.xml"%strftime("%Y%m%d_%H%M%S", gmtime()) - saveDialog = wx.FileDialog( - self, - "Save Backup As...", - wildcard = "EVE XML fitting file (*.xml)|*.xml", - style = wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT, - defaultFile=defaultFile) + saveDialog = wx.FileDialog(self, "Save Backup As...", + wildcard = "EVE XML fitting file (*.xml)|*.xml", + style = wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT, + defaultFile=defaultFile) - if (saveDialog.ShowModal() == wx.ID_OK): + if saveDialog.ShowModal() == wx.ID_OK: filePath = saveDialog.GetPath() if '.' not in os.path.basename(filePath): filePath += ".xml" + sFit = service.Fit.getInstance() max = sFit.countAllFits() + self.progressDialog = wx.ProgressDialog("Backup fits", "Backing up %d fits to: %s"%(max, filePath), - maximum = max, parent=self, - style = wx.PD_APP_MODAL | wx.PD_ELAPSED_TIME) + maximum=max, parent=self, + style=wx.PD_APP_MODAL | wx.PD_ELAPSED_TIME) - sFit.backupFits(filePath, self.updateProgressDialog) + sFit.backupFits(filePath, self.backupCallback) self.progressDialog.ShowModal() + def backupCallback(self, info): + #print info + if info == -1: + self.progressDialog.Destroy() + else: + self.progressDialog.Update(info) + def exportSkillsNeeded(self, event): + """ Exports skills needed for active fit and active character """ sCharacter = service.Character.getInstance() - saveDialog = wx.FileDialog( - self, - "Export Skills Needed As...", - wildcard = "EVEMon skills training file (*.emp)|*.emp|" \ - "EVEMon skills training XML file (*.xml)|*.xml|" \ - "Text skills training file (*.txt)|*.txt", - style = wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT) - if (saveDialog.ShowModal() == wx.ID_OK): + saveDialog = wx.FileDialog(self, "Export Skills Needed As...", + wildcard = "EVEMon skills training file (*.emp)|*.emp|" \ + "EVEMon skills training XML file (*.xml)|*.xml|" \ + "Text skills training file (*.txt)|*.txt", + style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT) + + if saveDialog.ShowModal() == wx.ID_OK: saveFmtInt = saveDialog.GetFilterIndex() - saveFmt = "" + if saveFmtInt == 0: # Per ordering of wildcards above saveFmt = "emp" elif saveFmtInt == 1: saveFmt = "xml" else: saveFmt = "txt" + filePath = saveDialog.GetPath() if '.' not in os.path.basename(filePath): filePath += ".{0}".format(saveFmt) + self.waitDialog = animUtils.WaitDialog(self) sCharacter.backupSkills(filePath, saveFmt, self.getActiveFit(), self.closeWaitDialog) self.waitDialog.ShowModal() @@ -645,29 +646,39 @@ class MainFrame(wx.Frame): saveDialog.Destroy() def importCharacter(self, event): - sCharacter = service.Character.getInstance() - dlg=wx.FileDialog( - self, - "Open One Or More Character Files", - wildcard = "EVE CCP API XML character files (*.xml)|*.xml|" \ - "All Files (*)|*", - style = wx.FD_OPEN | wx.FD_FILE_MUST_EXIST | wx.FD_MULTIPLE) - if (dlg.ShowModal() == wx.ID_OK): - self.waitDialog = animUtils.WaitDialog(self, title = "Importing Character") + """ Imports character XML file from EVE API """ + dlg = wx.FileDialog(self, "Open One Or More Character Files", + wildcard="EVE API XML character files (*.xml)|*.xml|" \ + "All Files (*)|*", + style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST | wx.FD_MULTIPLE) + + if dlg.ShowModal() == wx.ID_OK: + self.waitDialog = animUtils.WaitDialog(self, title="Importing Character") + sCharacter = service.Character.getInstance() sCharacter.importCharacter(dlg.GetPaths(), self.importCharacterCallback) dlg.Destroy() self.waitDialog.ShowModal() - def exportHtml(self, event): - from gui.utils.exportHtml import exportHtml - self.waitDialog = animUtils.WaitDialog(self) - exportHtml.getInstance().refreshFittingHtml(True, self.closeWaitDialog) - self.waitDialog.ShowModal() - def importCharacterCallback(self): self.waitDialog.Destroy() wx.PostEvent(self, GE.CharListUpdated()) + def exportHtml(self, event): + from gui.utils.exportHtml import exportHtml + sFit = service.Fit.getInstance() + settings = service.settings.HTMLExportSettings.getInstance() + + max = sFit.countAllFits() + path = settings.getPath() + print max + self.progressDialog = wx.ProgressDialog("Backup fits", + "Generating HTML file at:\n%s"%path, + maximum=max, parent=self, + style=wx.PD_APP_MODAL | wx.PD_ELAPSED_TIME) + + exportHtml.getInstance().refreshFittingHtml(True, self.backupCallback) + self.progressDialog.ShowModal() + def closeWaitDialog(self): self.waitDialog.Destroy() @@ -679,7 +690,7 @@ class MainFrame(wx.Frame): else: self.graphFrame.SetFocus() - def openWXInspectTool(self,event): + def openWXInspectTool(self, event): from wx.lib.inspection import InspectionTool if not InspectionTool().initialized: InspectionTool().Init() diff --git a/gui/utils/exportHtml.py b/gui/utils/exportHtml.py index c61c2444a..281b5c32c 100644 --- a/gui/utils/exportHtml.py +++ b/gui/utils/exportHtml.py @@ -7,7 +7,7 @@ class exportHtml(): _instance = None @classmethod def getInstance(cls): - if cls._instance == None: + if cls._instance is None: cls._instance = exportHtml() return cls._instance @@ -15,17 +15,17 @@ class exportHtml(): def __init__(self): self.thread = exportHtmlThread() - def refreshFittingHtml(self, force = False, callback = False): + def refreshFittingHtml(self, force=False, callback=False): settings = service.settings.HTMLExportSettings.getInstance() - if (force or settings.getEnabled()): + if force or settings.getEnabled(): self.thread.stop() self.thread = exportHtmlThread(callback) self.thread.start() class exportHtmlThread(threading.Thread): - def __init__(self, callback = False): + def __init__(self, callback=False): threading.Thread.__init__(self) self.callback = callback self.stopRunning = False @@ -40,7 +40,7 @@ class exportHtmlThread(threading.Thread): return sMkt = service.Market.getInstance() - sFit = service.Fit.getInstance() + sFit = service.Fit.getInstance() settings = service.settings.HTMLExportSettings.getInstance() timestamp = time.localtime(time.time()) @@ -135,6 +135,9 @@ class exportHtmlThread(threading.Thread): HTML += '
    \n' categoryList = list(sMkt.getShipRoot()) categoryList.sort(key=lambda ship: ship.name) + + count = 1 + for group in categoryList: # init market group string to give ships something to attach to HTMLgroup = '' @@ -153,9 +156,17 @@ class exportHtmlThread(threading.Thread): if self.stopRunning: return fit = fits[0] - dnaFit = sFit.exportDna(fit[0]) - HTMLgroup += ( - '
  • ' + ship.name + ": " + fit[1] + '
  • \n') + try: + print fit[0] + dnaFit = sFit.exportDna(fit[0]) + HTMLgroup += ( + '
  • ' + ship.name + ": " + fit[1] + '
  • \n') + except: + pass + finally: + count += 1 + if self.callback: + wx.CallAfter(self.callback, count) else: # Ship group header HTMLship = ( @@ -166,11 +177,18 @@ class exportHtmlThread(threading.Thread): for fit in fits: if self.stopRunning: return - dnaFit = sFit.exportDna(fit[0]) - HTMLship += '
  • ' + fit[1] + '
  • \n' - + try: + dnaFit = sFit.exportDna(fit[0]) + HTMLship += '
  • ' + fit[1] + '
  • \n' + except: + continue + finally: + count += 1 + if self.callback: + wx.CallAfter(self.callback, count) HTMLgroup += HTMLship + ('
\n' ' \n') + if groupFits > 0: # Market group header HTML += ( @@ -197,5 +215,5 @@ class exportHtmlThread(threading.Thread): pass if self.callback: - wx.CallAfter(self.callback) + wx.CallAfter(self.callback, -1) diff --git a/service/fit.py b/service/fit.py index 3c5faa9fc..25635b070 100644 --- a/service/fit.py +++ b/service/fit.py @@ -50,6 +50,8 @@ class FitBackupThread(threading.Thread): backupFile = open(path, "w", encoding="utf-8") backupFile.write(backedUpFits) backupFile.close() + + # Send done signal to GUI wx.CallAfter(self.callback, -1) @@ -63,6 +65,7 @@ class FitImportThread(threading.Thread): sFit = Fit.getInstance() sFit.importFitFromFiles(self.paths, self.callback) + # Send done signal to GUI wx.CallAfter(self.callback, -1) @@ -769,9 +772,16 @@ class Fit(object): thread.start() def importFitFromFiles(self, paths, callback=None): + """ + Imports fits from file(s). First processes all provided paths and stores + assembled fits into a list. This allows us to call back to the GUI as + fits are processed as well as when fits are being saved. + + returns + """ defcodepage = locale.getpreferredencoding() - fitImport = [] + fits = [] for path in paths: if callback: # Pulse wx.CallAfter(callback, "Processing file:\n%s"%path) @@ -786,18 +796,20 @@ class Fit(object): except UnicodeDecodeError: srcString = unicode(srcString, "cp1252") - _, fits = Port.importAuto(srcString, path, callback=callback) - fitImport += fits + _, fitsImport = Port.importAuto(srcString, path, callback=callback) + fits += fitsImport IDs = [] - for i, fit in enumerate(fitImport): + numFits = len(fits) + for i, fit in enumerate(fits): + # Set some more fit attributes and save fit.character = self.character fit.damagePattern = self.pattern fit.targetResists = self.targetResists eos.db.save(fit) IDs.append(fit.ID) if callback: # Pulse - wx.CallAfter(callback, "Saving fit\n%d/%d"%(i+1, len(fitImport))) + wx.CallAfter(callback, "Saving fit\n%d/%d"%(i+1, numFits)) return fits @@ -807,15 +819,8 @@ class Fit(object): fit.character = self.character fit.damagePattern = self.pattern fit.targetResists = self.targetResists - return fits - - def saveImportedFits(self, fits): - IDs = [] - for fit in fits: eos.db.save(fit) - IDs.append(fit.ID) - - return IDs + return fits def checkStates(self, fit, base): changed = False diff --git a/service/port.py b/service/port.py index 800447d19..600cb4bcc 100644 --- a/service/port.py +++ b/service/port.py @@ -365,7 +365,6 @@ class Port(object): fits = [] for i, fitting in enumerate(fittings): - print "fitting" f = Fit() f.name = fitting.getAttribute("name") # Maelstrom From 18c86daea62cac9b358379102a8a019e201dc543 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Tue, 30 Dec 2014 21:08:55 -0500 Subject: [PATCH 05/62] Do not include rigs in skill requirement checks --- service/character.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/service/character.py b/service/character.py index e78ec990d..c41031e00 100644 --- a/service/character.py +++ b/service/character.py @@ -301,9 +301,12 @@ class Character(object): return char.implants def checkRequirements(self, fit): - toCheck = [] reqs = {} for thing in itertools.chain(fit.modules, fit.drones, (fit.ship,)): + slot = getattr(thing, "slot", None) + if slot == eos.types.Slot.RIG: + # Do not include rigs in requirement checks + continue for attr in ("item", "charge"): subThing = getattr(thing, attr, None) subReqs = {} From e42671fbec65cf934e28fd5ddcb1be298012674d Mon Sep 17 00:00:00 2001 From: blitzmann Date: Wed, 31 Dec 2014 16:00:09 -0500 Subject: [PATCH 06/62] Workaround for seg fault (see comments in pull request # 232) --- gui/mainFrame.py | 8 +++----- gui/utils/exportHtml.py | 1 - 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/gui/mainFrame.py b/gui/mainFrame.py index 61a5573b9..4fa5866d1 100644 --- a/gui/mainFrame.py +++ b/gui/mainFrame.py @@ -568,7 +568,7 @@ class MainFrame(wx.Frame): overwrites cached message and updates dialog """ if info == -1: - self.progressDialog.Destroy() + self.progressDialog.Hide() elif info != self.progressDialog.message and info is not None: self.progressDialog.message = info self.progressDialog.Pulse(info) @@ -610,9 +610,8 @@ class MainFrame(wx.Frame): self.progressDialog.ShowModal() def backupCallback(self, info): - #print info if info == -1: - self.progressDialog.Destroy() + self.progressDialog.Hide() else: self.progressDialog.Update(info) @@ -670,9 +669,8 @@ class MainFrame(wx.Frame): max = sFit.countAllFits() path = settings.getPath() - print max self.progressDialog = wx.ProgressDialog("Backup fits", - "Generating HTML file at:\n%s"%path, + "Generating HTML file at: %s"%path, maximum=max, parent=self, style=wx.PD_APP_MODAL | wx.PD_ELAPSED_TIME) diff --git a/gui/utils/exportHtml.py b/gui/utils/exportHtml.py index 281b5c32c..726bec265 100644 --- a/gui/utils/exportHtml.py +++ b/gui/utils/exportHtml.py @@ -157,7 +157,6 @@ class exportHtmlThread(threading.Thread): return fit = fits[0] try: - print fit[0] dnaFit = sFit.exportDna(fit[0]) HTMLgroup += ( '
  • ' + ship.name + ": " + fit[1] + '
  • \n') From 1c3f9ccf5b60cb8c76b63987769803f1dd4574ef Mon Sep 17 00:00:00 2001 From: blitzmann Date: Wed, 31 Dec 2014 19:57:10 -0500 Subject: [PATCH 07/62] Fix #240 --- service/character.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/service/character.py b/service/character.py index c41031e00..af4b43106 100644 --- a/service/character.py +++ b/service/character.py @@ -44,12 +44,14 @@ class CharacterImportThread(threading.Thread): paths = self.paths sCharacter = Character.getInstance() for path in paths: - with open(path, mode='r') as charFile: - sheet = service.ParseXML(charFile) - charID = sCharacter.new() - sCharacter.rename(charID, sheet.name+" (imported)") - sCharacter.apiUpdateCharSheet(charID, sheet) - + try: + with open(path, mode='r') as charFile: + sheet = service.ParseXML(charFile) + charID = sCharacter.new() + sCharacter.rename(charID, sheet.name+" (imported)") + sCharacter.apiUpdateCharSheet(charID, sheet) + except: + continue wx.CallAfter(self.callback) class SkillBackupThread(threading.Thread): @@ -301,12 +303,9 @@ class Character(object): return char.implants def checkRequirements(self, fit): + toCheck = [] reqs = {} for thing in itertools.chain(fit.modules, fit.drones, (fit.ship,)): - slot = getattr(thing, "slot", None) - if slot == eos.types.Slot.RIG: - # Do not include rigs in requirement checks - continue for attr in ("item", "charge"): subThing = getattr(thing, attr, None) subReqs = {} From ea77e6851e7a402056a9feb70a154379685473ff Mon Sep 17 00:00:00 2001 From: blitzmann Date: Wed, 31 Dec 2014 20:07:36 -0500 Subject: [PATCH 08/62] Fix #238 --- service/price.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/service/price.py b/service/price.py index fafdf3297..aefd1b14f 100644 --- a/service/price.py +++ b/service/price.py @@ -63,7 +63,7 @@ class Price(): data = [] # Base request URL - baseurl = "https://api.eve-central.com/api/marketstat" + baseurl = "https://eve-central.com/api/marketstat" data.append(("usesystem", 30000142)) # Use Jita for market for typeID in toRequest: # Add all typeID arguments From 19579fb0874d7971308a87e20376da2da9617931 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Wed, 31 Dec 2014 20:18:16 -0500 Subject: [PATCH 09/62] Implement middle click to offline modules --- gui/builtinViews/fittingView.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gui/builtinViews/fittingView.py b/gui/builtinViews/fittingView.py index 455e1e06b..4b2547d8a 100644 --- a/gui/builtinViews/fittingView.py +++ b/gui/builtinViews/fittingView.py @@ -141,6 +141,7 @@ class FittingView(d.Display): self.Bind(wx.EVT_KEY_UP, self.kbEvent) self.Bind(wx.EVT_LEFT_DOWN, self.click) self.Bind(wx.EVT_RIGHT_DOWN, self.click) + self.Bind(wx.EVT_MIDDLE_DOWN, self.click) self.Bind(wx.EVT_SHOW, self.OnShow) self.Bind(wx.EVT_MOTION, self.OnMouseMove) self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveWindow) @@ -522,7 +523,7 @@ class FittingView(d.Display): sFit = service.Fit.getInstance() fitID = self.mainFrame.getActiveFit() - ctrl = wx.GetMouseState().CmdDown() + ctrl = wx.GetMouseState().CmdDown() or wx.GetMouseState().MiddleDown() click = "ctrl" if ctrl is True else "right" if event.Button == 3 else "left" sFit.toggleModulesState(fitID, self.mods[self.GetItemData(row)], mods, click) wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.mainFrame.getActiveFit())) From 9c2a66763574f203f03c67cfeacd753bc06fdea3 Mon Sep 17 00:00:00 2001 From: Stefan Ott Date: Fri, 2 Jan 2015 16:55:05 +0100 Subject: [PATCH 10/62] Made tab tooltips optional --- gui/builtinPreferenceViews/pyfaGeneralPreferences.py | 9 +++++++++ gui/builtinViews/fittingView.py | 3 ++- gui/chromeTabs.py | 6 ++++++ service/fit.py | 3 ++- 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/gui/builtinPreferenceViews/pyfaGeneralPreferences.py b/gui/builtinPreferenceViews/pyfaGeneralPreferences.py index 98190fcde..59cb527c2 100644 --- a/gui/builtinPreferenceViews/pyfaGeneralPreferences.py +++ b/gui/builtinPreferenceViews/pyfaGeneralPreferences.py @@ -53,6 +53,10 @@ class PFGeneralPref ( PreferenceView): labelSizer.Add( self.cbRackLabels, 0, wx.ALL|wx.EXPAND, 5 ) mainSizer.Add( labelSizer, 0, wx.LEFT|wx.EXPAND, 30 ) + self.cbShowTooltip = wx.CheckBox( panel, wx.ID_ANY, u"Show tab tooltips", wx.DefaultPosition, wx.DefaultSize, 0 ) + mainSizer.Add( self.cbShowTooltip, 0, wx.ALL|wx.EXPAND, 5 ) + + defCharSizer = wx.BoxSizer( wx.HORIZONTAL ) self.sFit = service.Fit.getInstance() @@ -65,6 +69,7 @@ class PFGeneralPref ( PreferenceView): self.cbRackLabels.SetValue(self.sFit.serviceFittingOptions["rackLabels"] or False) self.cbCompactSkills.SetValue(self.sFit.serviceFittingOptions["compactSkills"] or False) self.cbReopenFits.SetValue(self.openFitsSettings["enabled"]) + self.cbShowTooltip.SetValue(self.sFit.serviceFittingOptions["showTooltip"] or False) self.cbGlobalChar.Bind(wx.EVT_CHECKBOX, self.OnCBGlobalCharStateChange) self.cbGlobalDmgPattern.Bind(wx.EVT_CHECKBOX, self.OnCBGlobalDmgPatternStateChange) @@ -74,6 +79,7 @@ class PFGeneralPref ( PreferenceView): self.cbRackLabels.Bind(wx.EVT_CHECKBOX, self.onCBGlobalRackLabels) self.cbCompactSkills.Bind(wx.EVT_CHECKBOX, self.onCBCompactSkills) self.cbReopenFits.Bind(wx.EVT_CHECKBOX, self.onCBReopenFits) + self.cbShowTooltip.Bind(wx.EVT_CHECKBOX, self.onCBShowTooltip) self.cbRackLabels.Enable(self.sFit.serviceFittingOptions["rackSlots"] or False) @@ -127,6 +133,9 @@ class PFGeneralPref ( PreferenceView): def onCBReopenFits(self, event): self.openFitsSettings["enabled"] = self.cbReopenFits.GetValue() + def onCBShowTooltip(self, event): + self.sFit.serviceFittingOptions["showTooltip"] = self.cbShowTooltip.GetValue() + def getImage(self): return bitmapLoader.getBitmap("prefs_settings", "icons") diff --git a/gui/builtinViews/fittingView.py b/gui/builtinViews/fittingView.py index 4b2547d8a..5dfbde2c8 100644 --- a/gui/builtinViews/fittingView.py +++ b/gui/builtinViews/fittingView.py @@ -166,7 +166,8 @@ class FittingView(d.Display): if self.DEFAULT_COLS[col] == "Miscellanea": tooltip = self.activeColumns[col].getToolTip(mod) if tooltip is not None: - self.SetToolTipString(tooltip) + #self.SetToolTipString(tooltip) + self.SetToolTip(None) else: self.SetToolTip(None) else: diff --git a/gui/chromeTabs.py b/gui/chromeTabs.py index 7ea61a2e3..3a0c7b11c 100644 --- a/gui/chromeTabs.py +++ b/gui/chromeTabs.py @@ -24,6 +24,8 @@ import gui.utils.drawUtils as drawUtils from gui import bitmapLoader import gui.utils.fonts as fonts +import service + _PageChanging, EVT_NOTEBOOK_PAGE_CHANGING = wx.lib.newevent.NewEvent() _PageChanged, EVT_NOTEBOOK_PAGE_CHANGED = wx.lib.newevent.NewEvent() _PageAdding, EVT_NOTEBOOK_PAGE_ADDING = wx.lib.newevent.NewEvent() @@ -677,6 +679,7 @@ class PFTabsContainer(wx.Panel): self.containerHeight = height self.startDrag = False self.dragging = False + self.sFit = service.Fit.getInstance() self.inclination = 7 if canAdd: @@ -1010,6 +1013,9 @@ class PFTabsContainer(wx.Panel): Checks to see if we have a tab preview and sets up the timer for it to display """ + if not self.sFit.serviceFittingOptions["showTooltip"] or False: + return + if self.previewTimer: if self.previewTimer.IsRunning(): if self.previewWnd: diff --git a/service/fit.py b/service/fit.py index e731c3edf..37b2f8e4e 100644 --- a/service/fit.py +++ b/service/fit.py @@ -96,7 +96,8 @@ class Fit(object): "colorFitBySlot": False, "rackSlots": True, "rackLabels": True, - "compactSkills": True} + "compactSkills": True, + "showTooltip": True} self.serviceFittingOptions = SettingsProvider.getInstance().getSettings( "pyfaServiceFittingOptions", serviceFittingDefaultOptions) From 0ed91e4079880ad3c07cc2222c9f91d8b52dc40c Mon Sep 17 00:00:00 2001 From: Stefan Ott Date: Fri, 2 Jan 2015 17:04:10 +0100 Subject: [PATCH 11/62] Fixed code formatting --- gui/builtinPreferenceViews/pyfaGeneralPreferences.py | 5 ++--- service/fit.py | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/gui/builtinPreferenceViews/pyfaGeneralPreferences.py b/gui/builtinPreferenceViews/pyfaGeneralPreferences.py index 59cb527c2..60468ec9a 100644 --- a/gui/builtinPreferenceViews/pyfaGeneralPreferences.py +++ b/gui/builtinPreferenceViews/pyfaGeneralPreferences.py @@ -56,7 +56,6 @@ class PFGeneralPref ( PreferenceView): self.cbShowTooltip = wx.CheckBox( panel, wx.ID_ANY, u"Show tab tooltips", wx.DefaultPosition, wx.DefaultSize, 0 ) mainSizer.Add( self.cbShowTooltip, 0, wx.ALL|wx.EXPAND, 5 ) - defCharSizer = wx.BoxSizer( wx.HORIZONTAL ) self.sFit = service.Fit.getInstance() @@ -69,7 +68,7 @@ class PFGeneralPref ( PreferenceView): self.cbRackLabels.SetValue(self.sFit.serviceFittingOptions["rackLabels"] or False) self.cbCompactSkills.SetValue(self.sFit.serviceFittingOptions["compactSkills"] or False) self.cbReopenFits.SetValue(self.openFitsSettings["enabled"]) - self.cbShowTooltip.SetValue(self.sFit.serviceFittingOptions["showTooltip"] or False) + self.cbShowTooltip.SetValue(self.sFit.serviceFittingOptions["showTooltip"] or False) self.cbGlobalChar.Bind(wx.EVT_CHECKBOX, self.OnCBGlobalCharStateChange) self.cbGlobalDmgPattern.Bind(wx.EVT_CHECKBOX, self.OnCBGlobalDmgPatternStateChange) @@ -79,7 +78,7 @@ class PFGeneralPref ( PreferenceView): self.cbRackLabels.Bind(wx.EVT_CHECKBOX, self.onCBGlobalRackLabels) self.cbCompactSkills.Bind(wx.EVT_CHECKBOX, self.onCBCompactSkills) self.cbReopenFits.Bind(wx.EVT_CHECKBOX, self.onCBReopenFits) - self.cbShowTooltip.Bind(wx.EVT_CHECKBOX, self.onCBShowTooltip) + self.cbShowTooltip.Bind(wx.EVT_CHECKBOX, self.onCBShowTooltip) self.cbRackLabels.Enable(self.sFit.serviceFittingOptions["rackSlots"] or False) diff --git a/service/fit.py b/service/fit.py index 37b2f8e4e..fa53b2557 100644 --- a/service/fit.py +++ b/service/fit.py @@ -97,7 +97,7 @@ class Fit(object): "rackSlots": True, "rackLabels": True, "compactSkills": True, - "showTooltip": True} + "showTooltip": True} self.serviceFittingOptions = SettingsProvider.getInstance().getSettings( "pyfaServiceFittingOptions", serviceFittingDefaultOptions) From c202aefd2ed808cb7fb4ea62be61af6442e3a2dc Mon Sep 17 00:00:00 2001 From: Stefan Ott Date: Fri, 2 Jan 2015 17:06:26 +0100 Subject: [PATCH 12/62] Reverted accidentally committed change --- gui/builtinViews/fittingView.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gui/builtinViews/fittingView.py b/gui/builtinViews/fittingView.py index 5dfbde2c8..4b2547d8a 100644 --- a/gui/builtinViews/fittingView.py +++ b/gui/builtinViews/fittingView.py @@ -166,8 +166,7 @@ class FittingView(d.Display): if self.DEFAULT_COLS[col] == "Miscellanea": tooltip = self.activeColumns[col].getToolTip(mod) if tooltip is not None: - #self.SetToolTipString(tooltip) - self.SetToolTip(None) + self.SetToolTipString(tooltip) else: self.SetToolTip(None) else: From 487f65d62b6daa04cca171a272d2d2ed04016f9f Mon Sep 17 00:00:00 2001 From: blitmann Date: Sun, 4 Jan 2015 17:19:53 -0600 Subject: [PATCH 13/62] Fix #233 --- gui/builtinContextMenus/damagePattern.py | 6 +++--- gui/contextMenu.py | 19 +++++++++++++------ 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/gui/builtinContextMenus/damagePattern.py b/gui/builtinContextMenus/damagePattern.py index 352340204..29a029389 100644 --- a/gui/builtinContextMenus/damagePattern.py +++ b/gui/builtinContextMenus/damagePattern.py @@ -24,7 +24,7 @@ class DamagePattern(ContextMenu): self.fit = sFit.getFit(fitID) self.patterns = sDP.getDamagePatternList() - self.patterns.sort(key=lambda p: (p.name not in ["Uniform","Selected Ammo"], p.name)) + self.patterns.sort(key=lambda p: (p.name not in ["Uniform", "Selected Ammo"], p.name)) self.patternIds = {} self.subMenus = OrderedDict() @@ -71,7 +71,6 @@ class DamagePattern(ContextMenu): def getSubMenu(self, context, selection, rootMenu, i, pitem): msw = True if "wxMSW" in wx.PlatformInfo else False - rootMenu.Bind(wx.EVT_MENU, self.handlePatternSwitch) # this bit is required for some reason if self.m[i] not in self.subMenus: # if we're trying to get submenu to something that shouldn't have one, @@ -79,10 +78,11 @@ class DamagePattern(ContextMenu): # our patternIds mapping, then return None for no submenu id = pitem.GetId() self.patternIds[id] = self.singles[i] + rootMenu.Bind(wx.EVT_MENU, self.handlePatternSwitch, pitem) if self.patternIds[id] == self.fit.damagePattern: bitmap = bitmapLoader.getBitmap("state_active_small", "icons") pitem.SetBitmap(bitmap) - return None + return False sub = wx.Menu() diff --git a/gui/contextMenu.py b/gui/contextMenu.py index 41bbca392..4ed09f9c1 100644 --- a/gui/contextMenu.py +++ b/gui/contextMenu.py @@ -73,18 +73,25 @@ class ContextMenu(object): rootMenu.info[id] = (m, fullContext, it) sub = m.getSubMenu(srcContext, selection, rootMenu, it, rootItem) + if sub is None: # if there is no sub menu, bind the handler to the rootItem rootMenu.Bind(wx.EVT_MENU, cls.handler, rootItem) - else: + elif sub: + # If sub exists and is not False, set submenu. + # Sub might return False when we have a mix of + # single menu items and submenus (see: damage profile + # context menu) + # # If there is a submenu, it is expected that the sub - # logic take care of it's own binding. No binding is - # done here + # logic take care of it's own bindings, including for + # any single root items. No binding is done here # # It is important to remember that when binding sub - # menu items, bind them to the rootMenu for proper - # event handling, eg: - # rootMenu.Bind(wx.EVE_MENU, self.handle, menuItem) + # menu items, the menu to bind to depends on platform. + # Windows should bind to rootMenu, and all other + # platforms should bind to sub menu. See existing + # implementations for examples. rootItem.SetSubMenu(sub) if bitmap is not None: From 192d6f4605c276784ce66d919e30ff11b554452d Mon Sep 17 00:00:00 2001 From: blitzmann Date: Mon, 5 Jan 2015 22:50:33 -0500 Subject: [PATCH 14/62] Fix #156 --- eos/saveddata/fit.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/eos/saveddata/fit.py b/eos/saveddata/fit.py index 484e314fe..a382ae01d 100644 --- a/eos/saveddata/fit.py +++ b/eos/saveddata/fit.py @@ -406,12 +406,14 @@ class Fit(object): (effect.isType("active") and thing.state >= State.ACTIVE): # Run effect, and get proper bonuses applied try: + self.register(thing) effect.handler(self, thing, context) except: pass else: # Run effect, and get proper bonuses applied try: + self.register(thing) effect.handler(self, thing, context) except: pass From 07da5aa8610963fc842eacfd68d28d887c0d1c89 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Thu, 8 Jan 2015 12:39:16 -0500 Subject: [PATCH 15/62] Resolve #245 - Adding tooltips to fitting columns --- gui/builtinViewColumns/ammo.py | 1 - gui/builtinViewColumns/attributeDisplay.py | 6 ++++++ gui/builtinViewColumns/capacitorUse.py | 8 +++++--- gui/builtinViewColumns/maxRange.py | 3 +++ gui/builtinViewColumns/price.py | 3 +++ gui/builtinViews/fittingView.py | 9 +++------ gui/viewColumn.py | 2 +- icons/capacitorRecharge_small.png | Bin 0 -> 656 bytes 8 files changed, 21 insertions(+), 11 deletions(-) create mode 100644 icons/capacitorRecharge_small.png diff --git a/gui/builtinViewColumns/ammo.py b/gui/builtinViewColumns/ammo.py index cb3234ccc..fe50c6fbd 100644 --- a/gui/builtinViewColumns/ammo.py +++ b/gui/builtinViewColumns/ammo.py @@ -42,7 +42,6 @@ class Ammo(ViewColumn): return text - def getImageId(self, mod): return -1 diff --git a/gui/builtinViewColumns/attributeDisplay.py b/gui/builtinViewColumns/attributeDisplay.py index a55a50407..86966574b 100644 --- a/gui/builtinViewColumns/attributeDisplay.py +++ b/gui/builtinViewColumns/attributeDisplay.py @@ -89,6 +89,12 @@ class AttributeDisplay(ViewColumn): def getImageId(self, mod): return -1 + def getToolTip(self, stuff): + if self.info.name == "cpu": + return "CPU" + else: + return self.info.name.title() + @staticmethod def getParameters(): return (("attribute", str, None), diff --git a/gui/builtinViewColumns/capacitorUse.py b/gui/builtinViewColumns/capacitorUse.py index 9e4916f2b..497869a66 100644 --- a/gui/builtinViewColumns/capacitorUse.py +++ b/gui/builtinViewColumns/capacitorUse.py @@ -34,9 +34,8 @@ class CapacitorUse(ViewColumn): sAttr = service.Attribute.getInstance() info = sAttr.getAttributeInfo("capacitorNeed") - self.imageId = fittingView.imageList.GetImageIndex(info.icon.iconFile, "pack") - self.bitmap = bitmapLoader.getBitmap(info.icon.iconFile, "pack") - + self.imageId = fittingView.imageList.GetImageIndex("capacitorRecharge_small", "icons") + self.bitmap = bitmapLoader.getBitmap("capacitorRecharge_small", "icons") def getText(self, mod): if isinstance(mod, Mode): @@ -51,4 +50,7 @@ class CapacitorUse(ViewColumn): def getImageId(self, mod): return -1 + def getToolTip(self, mod): + return self.name + CapacitorUse.register() diff --git a/gui/builtinViewColumns/maxRange.py b/gui/builtinViewColumns/maxRange.py index be6be2a86..17d27ef5d 100644 --- a/gui/builtinViewColumns/maxRange.py +++ b/gui/builtinViewColumns/maxRange.py @@ -74,4 +74,7 @@ class MaxRange(ViewColumn): return (("displayName", bool, False), ("showIcon", bool, True)) + def getToolTip(self, mod): + return "Optimal + Falloff" + MaxRange.register() diff --git a/gui/builtinViewColumns/price.py b/gui/builtinViewColumns/price.py index 0afcb22c0..5fe6ef954 100644 --- a/gui/builtinViewColumns/price.py +++ b/gui/builtinViewColumns/price.py @@ -60,4 +60,7 @@ class Price(ViewColumn): def getImageId(self, mod): return -1 + def getToolTip(self, mod): + return self.name + Price.register() diff --git a/gui/builtinViews/fittingView.py b/gui/builtinViews/fittingView.py index 4b2547d8a..8e3db0836 100644 --- a/gui/builtinViews/fittingView.py +++ b/gui/builtinViews/fittingView.py @@ -163,12 +163,9 @@ class FittingView(d.Display): self.hoveredColumn = col if row != -1 and row not in self.blanks and col != -1 and col < len(self.DEFAULT_COLS): mod = self.mods[self.GetItemData(row)] - if self.DEFAULT_COLS[col] == "Miscellanea": - tooltip = self.activeColumns[col].getToolTip(mod) - if tooltip is not None: - self.SetToolTipString(tooltip) - else: - self.SetToolTip(None) + tooltip = self.activeColumns[col].getToolTip(mod) + if tooltip is not None: + self.SetToolTipString(tooltip) else: self.SetToolTip(None) else: diff --git a/gui/viewColumn.py b/gui/viewColumn.py index 948d09074..c2ffff612 100644 --- a/gui/viewColumn.py +++ b/gui/viewColumn.py @@ -50,7 +50,7 @@ class ViewColumn(object): return "" def getToolTip(self, mod): - return "" + return None def getImageId(self, mod): return -1 diff --git a/icons/capacitorRecharge_small.png b/icons/capacitorRecharge_small.png new file mode 100644 index 0000000000000000000000000000000000000000..d1c662dd88ff2b6080ee6d304fd7d2bae9fa9b79 GIT binary patch literal 656 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl47=r_RLR^8|q8O){tz|{=KFg-G z=tv7DdK!vzv7B1lw`OwLog*u2lUx#lU1v6DXT}6adz!Wv`sOBv@7}!X|NpbwH>_l1 zW#(gLU}ItwCG)&3tDpu(qbof)o)$YSrG3tqbBy)mWA8a%+pYm>?w_z)|h$jOE$LBj%PLHsY zbJmkOb7a@;OGithovl>3_bh7@c-@c*G&;N_$PXCIIDtf2izy>h>wO#3r>%_ai~sGZ zmGt|xUs>e9(`fdzKj)p2etvy>#fG>2<&QmwAB3|B1=m#^NN48pO5+veiF(|w3^aJE zr;B5V#O34!1#ttf($o)Y|a`}>FOVek}nAP~R=Fc;+nUOawcTNjqN?>$U%$~ic zCVDqhHG5*mOr<`*b9(FY-pS2d6cBx6&z{kc3I8&X0~tJB{an^LB{Ts5KHdDG literal 0 HcmV?d00001 From 059af217aaeed7126f20219ed896371afc397de1 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Thu, 8 Jan 2015 15:04:22 -0500 Subject: [PATCH 16/62] Fix #246 --- gui/patternEditor.py | 2 +- service/fit.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gui/patternEditor.py b/gui/patternEditor.py index f3b8da855..7a5bceb01 100644 --- a/gui/patternEditor.py +++ b/gui/patternEditor.py @@ -125,7 +125,7 @@ class DmgPatternEditorDlg (wx.Dialog): editObj.Bind(wx.EVT_TEXT, self.ValuesUpdated) editObj.SetLimited(True) editObj.SetMin(0) - editObj.SetMax(99999) + editObj.SetMax(2000000) contentSizer.Add(dmgeditSizer, 1, wx.EXPAND | wx.ALL, 5) self.slfooter = wx.StaticLine(self) diff --git a/service/fit.py b/service/fit.py index 25635b070..2da369576 100644 --- a/service/fit.py +++ b/service/fit.py @@ -742,7 +742,7 @@ class Fit(object): fit = eos.db.getFit(fitID) for attr in ("em", "thermal", "kinetic", "explosive"): - setattr(dp, "%sAmount" % attr, ammo.getAttribute("%sDamage" % attr)) + setattr(dp, "%sAmount" % attr, ammo.getAttribute("%sDamage" % attr) or 0) fit.damagePattern = dp self.recalc(fit) From 731477b366919135547b3f8f6d612cb6d82fd9e6 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Sun, 11 Jan 2015 00:43:05 +0300 Subject: [PATCH 17/62] Open fit upon importing --- gui/mainFrame.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gui/mainFrame.py b/gui/mainFrame.py index 4fa5866d1..f8f36502b 100644 --- a/gui/mainFrame.py +++ b/gui/mainFrame.py @@ -524,9 +524,11 @@ class MainFrame(wx.Frame): sFit = service.Fit.getInstance() try: fits = sFit.importFitFromBuffer(fromClipboard(), self.getActiveFit()) - #self._openAfterImport(len(fits), IDs) except: pass + else: + ids = tuple(fit.ID for fit in fits) + self._openAfterImport(len(fits), ids) def exportToClipboard(self, event): CopySelectDict = {CopySelectDialog.copyFormatEft: self.clipboardEft, From 0a6274474ed95519389e742fbd11267e6c780bc4 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Sat, 10 Jan 2015 21:53:30 -0500 Subject: [PATCH 18/62] Fixes #204 --- gui/builtinStatsViews/firepowerViewFull.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/gui/builtinStatsViews/firepowerViewFull.py b/gui/builtinStatsViews/firepowerViewFull.py index e6e1df75a..a7180252e 100644 --- a/gui/builtinStatsViews/firepowerViewFull.py +++ b/gui/builtinStatsViews/firepowerViewFull.py @@ -43,12 +43,10 @@ class FirepowerViewFull(StatsView): parent = self.panel = contentPanel self.headerPanel = headerPanel - headerContentSizer = wx.BoxSizer(wx.HORIZONTAL) - hsizer = headerPanel.GetSizer() - hsizer.Add(headerContentSizer, 0, 0, 0) - self.stEff = wx.StaticText(headerPanel, wx.ID_ANY, "( Effective )") - headerContentSizer.Add(self.stEff) - headerPanel.GetParent().AddToggleItem(self.stEff) + hsizer = self.headerPanel.GetSizer() + self.stEff = wx.StaticText(self.headerPanel, wx.ID_ANY, "( Effective )") + hsizer.Add(self.stEff) + self.headerPanel.GetParent().AddToggleItem(self.stEff) panel = "full" @@ -59,7 +57,7 @@ class FirepowerViewFull(StatsView): counter = 0 - for damageType, image in (("weapon", "turret") , ("drone", "droneDPS")): + for damageType, image in (("weapon", "turret"), ("drone", "droneDPS")): baseBox = wx.BoxSizer(wx.HORIZONTAL) sizerFirepower.Add(baseBox, 1, wx.ALIGN_LEFT if counter == 0 else wx.ALIGN_CENTER_HORIZONTAL) @@ -124,6 +122,12 @@ class FirepowerViewFull(StatsView): # And no longer display us self.panel.GetSizer().Clear(True) self.panel.GetSizer().Layout() + + # Remove effective label + hsizer = self.headerPanel.GetSizer() + hsizer.Remove(self.stEff) + self.stEff.Destroy() + # Get the new view view = StatsView.getView("miningyieldViewFull")(self.parent) view.populatePanel(self.panel, self.headerPanel) From 9b8b7aba072cefaf144d060673d7753d57e1cb56 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Mon, 12 Jan 2015 23:37:40 -0500 Subject: [PATCH 19/62] Add module state information to state tooltip --- gui/builtinViewColumns/state.py | 4 ++++ gui/builtinViews/fittingView.py | 11 ++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/gui/builtinViewColumns/state.py b/gui/builtinViewColumns/state.py index 01e93e4f6..d26c46443 100644 --- a/gui/builtinViewColumns/state.py +++ b/gui/builtinViewColumns/state.py @@ -44,6 +44,10 @@ class State(ViewColumn): def getText(self, mod): return "" + def getToolTip(self, mod): + if isinstance(mod, Module) and not mod.isEmpty: + return State_.getName(mod.state).title() + def getImageId(self, stuff): if isinstance(stuff, Drone): return self.checkedId if stuff.amountActive > 0 else self.uncheckedId diff --git a/gui/builtinViews/fittingView.py b/gui/builtinViews/fittingView.py index 8e3db0836..76c291cdd 100644 --- a/gui/builtinViews/fittingView.py +++ b/gui/builtinViews/fittingView.py @@ -523,13 +523,18 @@ class FittingView(d.Display): ctrl = wx.GetMouseState().CmdDown() or wx.GetMouseState().MiddleDown() click = "ctrl" if ctrl is True else "right" if event.Button == 3 else "left" sFit.toggleModulesState(fitID, self.mods[self.GetItemData(row)], mods, click) + + # update state tooltip + tooltip = self.activeColumns[col].getToolTip(self.mods[self.GetItemData(row)]) + self.SetToolTipString(tooltip) + wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.mainFrame.getActiveFit())) else: event.Skip() - slotColourMap = {1: wx.Colour(250, 235, 204), # yellow = low slots - 2: wx.Colour(188,215,241), # blue = mid slots - 3: wx.Colour(235,204,209), # red = high slots + slotColourMap = {1: wx.Colour(250, 235, 204), # yellow = low slots + 2: wx.Colour(188, 215, 241), # blue = mid slots + 3: wx.Colour(235, 204, 209), # red = high slots 4: '', 5: ''} From 371e33764e2f4a623df218c6ee49e997188af5e6 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Tue, 13 Jan 2015 17:26:56 -0500 Subject: [PATCH 20/62] Ammo name tooltip added to charge icon --- gui/builtinViewColumns/ammoIcon.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gui/builtinViewColumns/ammoIcon.py b/gui/builtinViewColumns/ammoIcon.py index 4378e2458..1dfddf791 100644 --- a/gui/builtinViewColumns/ammoIcon.py +++ b/gui/builtinViewColumns/ammoIcon.py @@ -48,4 +48,8 @@ class AmmoIcon(ViewColumn): else: return -1 + def getToolTip(self, mod): + if isinstance(mod, Module) and mod.charge is not None: + return mod.charge.name + AmmoIcon.register() From d52e88cdaadbe00cad7079f4c10d81e76797e7f0 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Wed, 14 Jan 2015 02:59:15 +0300 Subject: [PATCH 21/62] Update database to proteus & add tiericide item conversions --- eos/db/migrations/upgrade4.py | 141 ++++++++++++++++++++++++++++++++++ staticdata/eve.db | Bin 14256128 -> 14307328 bytes 2 files changed, 141 insertions(+) create mode 100644 eos/db/migrations/upgrade4.py diff --git a/eos/db/migrations/upgrade4.py b/eos/db/migrations/upgrade4.py new file mode 100644 index 000000000..87906cffc --- /dev/null +++ b/eos/db/migrations/upgrade4.py @@ -0,0 +1,141 @@ +""" +Migration 4 + +- Converts modules based on Proteus Module Tiericide + Some modules have been unpublished (and unpublished module attributes are removed + from database), which causes pyfa to crash. We therefore replace these + modules with their new replacements + + Based on http://community.eveonline.com/news/patch-notes/patch-notes-for-proteus/ + and output of itemDiff.py +""" + + +CONVERSIONS = { + 506: ( # 'Basic' Capacitor Power Relay + 8205, # Alpha Reactor Control: Capacitor Power Relay + 8209, # Marked Generator Refitting: Capacitor Power Relay + 8203, # Partial Power Plant Manager: Capacity Power Relay + 8207, # Type-E Power Core Modification: Capacitor Power Relay + ), + 8177: ( # Mark I Compact Capacitor Power Relay + 8173, # Beta Reactor Control: Capacitor Power Relay I + ), + 8175: ( # Type-D Restrained Capacitor Power Relay + 8171, # Local Power Plant Manager: Capacity Power Relay I + ), + + 421: ( # 'Basic' Capacitor Recharger + 4425, # AGM Capacitor Charge Array, + 4421, # F-a10 Buffer Capacitor Regenerator + 4423, # Industrial Capacitor Recharger + 4427, # Secondary Parallel Link-Capacitor + ), + 4435: ( # Eutectic Compact Cap Recharger + 4433, # Barton Reactor Capacitor Recharger I + 4431, # F-b10 Nominal Capacitor Regenerator + 4437, # Fixed Parallel Link-Capacitor I + ), + + 1315: ( # 'Basic' Expanded Cargohold + 5483, # Alpha Hull Mod Expanded Cargo + 5479, # Marked Modified SS Expanded Cargo + 5481, # Partial Hull Conversion Expanded Cargo + 5485, # Type-E Altered SS Expanded Cargo + ), + 5493: ( # Type-D Restrained Expanded Cargo + 5491, # Beta Hull Mod Expanded Cargo + 5489, # Local Hull Conversion Expanded Cargo I + 5487, # Mark I Modified SS Expanded Cargo + ), + + 1401: ( # 'Basic' Inertial Stabilizers + 5523, # Alpha Hull Mod Inertial Stabilizers + 5521, # Partial Hull Conversion Inertial Stabilizers + 5525, # Type-E Altered SS Inertial Stabilizers + ), + 5533: ( # Type-D Restrained Inertial Stabilizers + 5531, # Beta Hull Mod Inertial Stabilizers + 5529, # Local Hull Conversion Inertial Stabilizers I + 5527, # Mark I Modified SS Inertial Stabilizers + 5519, # Marked Modified SS Inertial Stabilizers + ), + + 5239: ( # EP-S Gaussian Scoped Mining Laser + 5241, # Dual Diode Mining Laser I + ), + 5233: ( # Single Diode Basic Mining Laser + 5231, # EP-R Argon Ion Basic Excavation Pulse + 5237, # Rubin Basic Particle Bore Stream + 5235, # Xenon Basic Drilling Beam + ), + 5245: ( # Particle Bore Compact Mining Laser + 5243, # XeCl Drilling Beam I + ), + + 22619: ( # Frigoris Restrained Ice Harvester Upgrade + 22617, # Crisium Ice Harvester Upgrade + ), + 22611: ( # Elara Restrained Mining Laser Upgrade + 22609, # Erin Mining Laser Upgrade + ), + + 1242: ( # 'Basic' Nanofiber Internal Structure + 5591, # Alpha Hull Mod Nanofiber Structure + 5595, # Marked Modified SS Nanofiber Structure + 5559, # Partial Hull Conversion Nanofiber Structure + 5593, # Type-E Altered SS Nanofiber Structure + ), + 5599: ( # Type-D Restrained Nanofiber Structure + 5597, # Beta Hull Mod Nanofiber Structure + 5561, # Local Hull Conversion Nanofiber Structure I + 5601, # Mark I Modified SS Nanofiber Structure + ), + + 1192: ( # 'Basic' Overdrive Injector System + 5613, # Alpha Hull Mod Overdrive Injector + 5617, # Marked Modified SS Overdrive Injector + 5611, # Partial Hull Conversion Overdrive Injector + 5615, # Type-E Altered SS Overdrive Injector + ), + 5631: ( # Type-D Restrained Overdrive Injector + 5629, # Beta Hull Mod Overdrive Injector + 5627, # Local Hull Conversion Overdrive Injector I + 5633, # Mark I Modified SS Overdrive Injector + ), + + 1537: ( # 'Basic' Power Diagnostic System + 8213, # Alpha Reactor Control: Diagnostic System + 8217, # Marked Generator Refitting: Diagnostic System + 8211, # Partial Power Plant Manager: Diagnostic System + 8215, # Type-E Power Core Modification: Diagnostic System + 8255, # Type-E Power Core Modification: Reaction Control + ), + 8225: ( # Mark I Compact Power Diagnostic System + 8221, # Beta Reactor Control: Diagnostic System I + 8219, # Local Power Plant Manager: Diagnostic System I + 8223, # Type-D Power Core Modification: Diagnostic System + ), + + 1240: ( # 'Basic' Reinforced Bulkheads + 5677, # Alpha Hull Mod Reinforced Bulkheads + 5681, # Marked Modified SS Reinforced Bulkheads + 5675, # Partial Hull Conversion Reinforced Bulkheads + 5679, # Type-E Altered SS Reinforced Bulkheads + ), + 5649: ( # Mark I Compact Reinforced Bulkheads + 5645, # Beta Hull Mod Reinforced Bulkheads + ), + 5647: ( # Type-D Restrained Reinforced Bulkheads + 5643, # Local Hull Conversion Reinforced Bulkheads I + ), +} + +def upgrade(saveddata_engine): + + # Convert modules + for replacement_item, list in CONVERSIONS.iteritems(): + for retired_item in list: + saveddata_engine.execute('UPDATE "modules" SET "itemID" = ? WHERE "itemID" = ?', (replacement_item, retired_item)) + saveddata_engine.execute('UPDATE "cargo" SET "itemID" = ? WHERE "itemID" = ?', (replacement_item, retired_item)) + diff --git a/staticdata/eve.db b/staticdata/eve.db index e52adba6a95f674069f863dd93ad1202f4c51470..b29208ba5ac142b6c2f12bc48a8f57d00740c4e1 100644 GIT binary patch literal 14307328 zcmeEv349#Im3JS;rezy*+s1%}!GHnVGo#T+!Weu>#^3{A_yBu6l19?lBaN7mY>T_) z+ZJF9KJa2lz>-5Y2e}~E=1vH?wX6O!x~@_qaL->a_f8A&bm$PP<_ z^wY2BRdw}yb=RwRR4re+FxC_;tVty6BTa=x$}mM$m05*_ilUsSD51ykEC0>~FiZyU zt7gG&;Caf_UyL{dZ_m(wNog+9-_rl2|CjzN5p?@(D1N90hHBvS*1!el0N>f8@fclz zN5PqRoH?Arn*Loy|93ow{)TE`s0RMNYv4jnpLkhybA4mDDOMl#2Lpb8Nm+4`?*dhy zJiaO(i#9ZcE1P5S>eAw3yrQW<(|@Muzr$nbZ>R=_YTzHN21e@>ReL_r#^{rc>{)<# zb5(zf%KWhS`3EchP;rK8V5kOMYT%)JY5XVDGWxkeeMMWNmTM2`Q`MN>px>q`z0I z(C<*!=`X3DRjah?wEv_1K`&B&q}{ES=_m9bXv_7#=uO(EwQsApYGM6ub*cVw{Xz9- z>ihMyx=KB+zp2gAbiGb}O8=tzy!wJxrhi-esXkgCub-zT)NT4twI66{eU|ow_L#Oy z->H8{tIc#&P1MGz&DuHYVQr!IKl+vWr?m$mH5jfvt$s<}ufD8(LH(;1*CSd= z`=DlM9r|N>g}y@jxxPrfSNoOTrXSTNt9!J7`iA~<^|$&&z09QwP9b{Bcc$a(Rc%#x zPTWh|tC=ThSGBHdHlBBPCGku>z6#Hh!*}4hci$#F=cez%v(9|>9{emYI|}i$ExiTL zGP7efewLW+*WsttJU#b9GTX=F zXOr1Z6}G}`kK?C2Lls)s*^K9Av;9W=?0e{XJc~}^pRGMQ$_ z75JHTjQHLiPbBb+n8(-SXN}o@HhykNFTrzmx)#r?(nKU-avk1g9W2{;~V< zyvaN<4nMxk1U%=N9aN#$n;ldSSDPJFDc3zlsP8n}*Wl-xG*#r{wrlZR+qntPMO`I$ zuJ0m}t1~n4yxHuy20t;god`@dJE*C{`!B<@?K^99{M??IgXiw9oAI1v9;c?hH%%ya z9;9ZiPSfkVx~P4UofQ9I`aV2s%@cSk)68~*e(y{sA=fH&g>d zHSmvL1M1mN_-W2KOP{Xje}n|^RlQUHvi=GEefmNDe!Wqz)|crw;N{TYPz?;#0M)?A zvvlQ>7164?!UYQ!oIhGurq4~(*GC$vqshX#$>vxpnml`yu3S|fC#{+lQ!r9jCRp&O z0$rInFPdsfCR(D&3k+THI~XdGvD!#eG*dfs;-O|FpdA=N+EbDK4t=iDj|>%;D;Yv6oz;n&GBMWjtCRZHiP!nj-R7o4c%h_KNbt6|?6oEH9L?g;y6C zHL+;CI^2Mig}2XMHuvV)%L*4SSy8xn<-ʞTC}Bk^YYJw@NPY{8=0%hnX$TE3?6 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