Merge branch 'master' into ammo_graph

# Conflicts:
#	gui/builtinMarketBrowser/itemView.py
#	service/market.py
This commit is contained in:
DarkPhoenix
2020-02-04 01:43:52 +03:00
70 changed files with 650 additions and 4687 deletions

View File

@@ -112,6 +112,8 @@ class ItemAffectedBy(wx.Panel):
else:
try:
self.affectedBy.CollapseAll()
except (KeyboardInterrupt, SystemExit):
raise
except:
pass
@@ -171,7 +173,7 @@ class ItemAffectedBy(wx.Panel):
def sortAttrDisplayName(self, attr):
info = self.stuff.item.attributes.get(attr)
if info and info.displayName != "":
if info and info.displayName:
return info.displayName
return attr
@@ -251,7 +253,7 @@ class ItemAffectedBy(wx.Panel):
for attrName in attrOrder:
attrInfo = self.stuff.item.attributes.get(attrName)
displayName = attrInfo.displayName if attrInfo and attrInfo.displayName != "" else attrName
displayName = attrInfo.displayName if attrInfo and attrInfo.displayName else attrName
if attrInfo:
if attrInfo.iconID is not None:
@@ -444,7 +446,7 @@ class ItemAffectedBy(wx.Panel):
attrModifier = "-"
attrAmount = -attrAmount
attributes.append((attrName, (displayName if displayName != "" else attrName), attrModifier,
attributes.append((attrName, (displayName if displayName else attrName), attrModifier,
attrAmount, penalized, attrIcon))
attrSorted = sorted(attributes, key=lambda attribName: attribName[0])
@@ -454,14 +456,14 @@ class ItemAffectedBy(wx.Panel):
if self.showRealNames:
display = "%s %s %.2f %s" % (attrName, attrModifier, attrAmount, penalized)
saved = "%s %s %.2f %s" % (
displayName if displayName != "" else attrName,
displayName if displayName else attrName,
attrModifier,
attrAmount,
penalized
)
else:
display = "%s %s %.2f %s" % (
displayName if displayName != "" else attrName,
displayName if displayName else attrName,
attrModifier,
attrAmount,
penalized

View File

@@ -86,6 +86,8 @@ class ItemProperties(wx.Panel):
valueUnit = str(value)
self.paramList.SetItem(index, 1, valueUnit)
except (KeyboardInterrupt, SystemExit):
raise
except:
# TODO: Add logging to this.
# We couldn't get a property for some reason. Skip it for now.

View File

@@ -48,7 +48,6 @@ class ItemView(Display):
self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.itemActivated)
self.Bind(wx.EVT_LIST_BEGIN_DRAG, self.startDrag)
# Make reverse map, used by sorter
self.active = []
def delaySearch(self, evt):
@@ -178,7 +177,7 @@ class ItemView(Display):
return
self.marketBrowser.mode = 'search'
self.sMkt.searchItems(search, self.populateSearch)
self.sMkt.searchItems(search, self.populateSearch, 'market')
def clearSearch(self, event=None):
# Wipe item store and update everything to accomodate with it
@@ -201,7 +200,6 @@ class ItemView(Display):
self.setToggles()
self.filterItemStore()
def contextMenu(self, event):
clickedPos = self.getRowByAbs(event.Position)
self.ensureSelection(clickedPos)
@@ -235,11 +233,9 @@ class ItemView(Display):
# Re-sort stuff
if self.marketBrowser.mode != 'recent':
items.sort(key=self.sMkt.itemSort)
for i, item in enumerate(items[:9]):
# set shortcut info for first 9 modules
item.marketShortcut = i + 1
Display.refresh(self, items)
def columnBackground(self, colItem, item):

View File

@@ -63,6 +63,8 @@ class MarketTree(wx.TreeCtrl):
iconId = self.addImage(sMkt.getIconByMarketGroup(childMktGrp))
try:
childId = self.AppendItem(root, childMktGrp.name, iconId, data=childMktGrp.ID)
except (KeyboardInterrupt, SystemExit):
raise
except Exception as e:
pyfalog.debug("Error appending item.")
pyfalog.debug(e)

View File

@@ -66,6 +66,8 @@ class FitSpawner(gui.multiSwitch.TabSpawner):
self.multiSwitch.SetSelection(index)
wx.PostEvent(self.mainFrame, GE.FitChanged(fitIDs=(event.fitID,)))
break
except (KeyboardInterrupt, SystemExit):
raise
except Exception as e:
pyfalog.critical("Caught exception in fitSelected")
pyfalog.critical(e)
@@ -812,6 +814,8 @@ class FittingView(d.Display):
if self and not self.IsShown():
try:
self.MakeSnapshot()
except (KeyboardInterrupt, SystemExit):
raise
except Exception as e:
pyfalog.critical("Failed to make snapshot")
pyfalog.critical(e)
@@ -837,6 +841,8 @@ class FittingView(d.Display):
sFit = Fit.getInstance()
try:
fit = sFit.getFit(self.activeFitID)
except (KeyboardInterrupt, SystemExit):
raise
except Exception as e:
pyfalog.critical("Failed to get fit")
pyfalog.critical(e)

View File

@@ -309,7 +309,7 @@ class ItemView(d.Display):
self.clearSearch()
return
sMkt.searchItems(search, self.populateSearch, ["Implant"])
sMkt.searchItems(search, self.populateSearch, 'implants')
def populateSearch(self, items):
if not self.IsShown():

View File

@@ -475,6 +475,8 @@ class SkillTreeView(wx.Panel):
if skill:
skill.setLevel(level, ignoreRestrict=True)
except (KeyboardInterrupt, SystemExit):
raise
except Exception as e:
pyfalog.error(e)
with wx.MessageDialog(self, "There was an error importing skills, please see log file", "Error", wx.ICON_ERROR) as dlg:
@@ -839,7 +841,7 @@ class APIView(wx.Panel):
def getActiveCharacter(self):
selection = self.charChoice.GetCurrentSelection()
return self.charChoice.GetClientData(selection) if selection is not -1 else None
return self.charChoice.GetClientData(selection) if selection != -1 else None
def ssoListChanged(self, event):
if not self: # todo: fix event not unbinding properly

View File

@@ -122,7 +122,7 @@ class CharacterSelection(wx.Panel):
def getActiveCharacter(self):
selection = self.charChoice.GetCurrentSelection()
return self.charChoice.GetClientData(selection) if selection is not -1 else None
return self.charChoice.GetClientData(selection) if selection != -1 else None
def refreshCharacterList(self, event=None):
choice = self.charChoice
@@ -303,7 +303,6 @@ class CharacterSelection(wx.Panel):
if tabulationLevel == 0:
for item, subReqs in reqs.items():
skillsMap = self._buildSkillsTooltipCondensed(subReqs, item.name, 1, skillsMap)
sorted(skillsMap, key=skillsMap.get)
else:
for name, info in reqs.items():
level, ID, more = info
@@ -323,3 +322,25 @@ class CharacterSelection(wx.Panel):
skillsMap = self._buildSkillsTooltipCondensed(more, currItem, tabulationLevel + 1, skillsMap)
return skillsMap
def _buildSkillsTooltipSuperCondensed(self, reqs, currItem="", tabulationLevel=0, skillsMap=None):
allReqs = {}
implicitReqs = {}
def traverseReqs(itemReqs, topLevel=True):
for skillName, (skillLevel, skillTypeID, subReqs) in itemReqs.items():
if (skillTypeID, skillName) not in allReqs or allReqs[(skillTypeID, skillName)] < skillLevel:
allReqs[(skillTypeID, skillName)] = skillLevel
if not topLevel and (skillTypeID not in implicitReqs or implicitReqs[skillTypeID] < skillLevel):
implicitReqs[skillTypeID] = skillLevel
traverseReqs(subReqs, topLevel=False)
for item, itemReqs in reqs.items():
traverseReqs(itemReqs)
newReqs = {}
for (skillTypeID, skillName), skillLevel in allReqs.items():
if skillTypeID not in implicitReqs or implicitReqs[skillTypeID] < skillLevel:
newReqs[skillName] = skillLevel, skillTypeID
return newReqs

View File

@@ -1138,6 +1138,8 @@ class _TabsContainer(wx.Panel):
self.preview_tab = tab
self.preview_timer.Start(500, True)
break
except (KeyboardInterrupt, SystemExit):
raise
except:
pass

View File

@@ -125,6 +125,8 @@ class EveFittings(AuxiliaryFrame):
# Can't do this in a finally because then it obscures the message dialog
del waitDialog # noqa: F821
ESIExceptionHandler(self, ex)
except (KeyboardInterrupt, SystemExit):
raise
except Exception as ex:
del waitDialog # noqa: F821
raise ex
@@ -302,6 +304,8 @@ class ExportToEve(AuxiliaryFrame):
except APIException as ex:
try:
ESIExceptionHandler(self, ex)
except (KeyboardInterrupt, SystemExit):
raise
except Exception as ex:
self.statusbar.SetStatusText("ERROR", 0)
self.statusbar.SetStatusText("{} - {}".format(res.status_code, res.reason), 1)
@@ -381,6 +385,8 @@ class SsoCharacterMgmt(AuxiliaryFrame):
try:
sEsi = Esi.getInstance()
sEsi.login()
except (KeyboardInterrupt, SystemExit):
raise
except Exception as ex:
ESIServerExceptionHandler(self, ex)
@@ -457,6 +463,8 @@ class FittingsTreeView(wx.Panel):
cargo = Cargo(getItem(item['type_id']))
cargo.amount = item['quantity']
list.append(cargo)
except (KeyboardInterrupt, SystemExit):
raise
except Exception as e:
pyfalog.critical("Exception caught in displayFit")
pyfalog.critical(e)

View File

@@ -99,12 +99,14 @@ class PFPanel(wx.Panel):
class OpenFitsThread(threading.Thread):
def __init__(self, fits, callback):
threading.Thread.__init__(self)
self.name = "LoadingOpenFits"
self.mainFrame = MainFrame.getInstance()
self.callback = callback
self.fits = fits
self.running = True
self.start()
def run(self):
@@ -118,10 +120,15 @@ class OpenFitsThread(threading.Thread):
# We use 1 for all fits except the last one where we use 2 so that we
# have correct calculations displayed at startup
for fitID in self.fits[:-1]:
wx.PostEvent(self.mainFrame, FitSelected(fitID=fitID, startup=1))
if self.running:
wx.PostEvent(self.mainFrame, FitSelected(fitID=fitID, startup=1))
wx.PostEvent(self.mainFrame, FitSelected(fitID=self.fits[-1], startup=2))
wx.CallAfter(self.callback)
if self.running:
wx.PostEvent(self.mainFrame, FitSelected(fitID=self.fits[-1], startup=2))
wx.CallAfter(self.callback)
def stop(self):
self.running = False
# todo: include IPortUser again
@@ -251,10 +258,12 @@ class MainFrame(wx.Frame):
fit = sFit.getFit(id, basic=True)
if fit is None:
fits.remove(id)
except (KeyboardInterrupt, SystemExit):
raise
except:
fits.remove(id)
if not self.prevOpenFits['enabled'] or len(fits) is 0:
if not self.prevOpenFits['enabled'] or len(fits) == 0:
# add blank page if there are no fits to be loaded
self.fitMultiSwitch.AddPage()
return
@@ -747,9 +756,12 @@ class MainFrame(wx.Frame):
activeFit = self.getActiveFit()
try:
importType, importData = Port().importFitFromBuffer(clipboard, activeFit)
if importType == "MutatedItem":
# we've imported an Abyssal module, need to fire off the command to add it to the fit
self.command.Submit(cmd.GuiImportLocalMutatedModuleCommand(activeFit, *importData[0]))
if importType == "FittingItem":
baseItem, mutaplasmidItem, mutations = importData[0]
if mutaplasmidItem:
self.command.Submit(cmd.GuiImportLocalMutatedModuleCommand(activeFit, baseItem, mutaplasmidItem, mutations))
else:
self.command.Submit(cmd.GuiAddLocalModuleCommand(activeFit, baseItem.ID))
return
if importType == "AdditionsDrones":
if self.command.Submit(cmd.GuiImportLocalDronesCommand(activeFit, [(i.ID, a) for i, a in importData[0]])):
@@ -771,6 +783,8 @@ class MainFrame(wx.Frame):
if self.command.Submit(cmd.GuiImportCargosCommand(activeFit, [(i.ID, a) for i, a in importData[0]])):
self.additionsPane.select("Cargo")
return
except (KeyboardInterrupt, SystemExit):
raise
except:
pyfalog.error("Attempt to import failed:\n{0}", clipboard)
else:

View File

@@ -265,6 +265,8 @@ class DmgPatternEditor(AuxiliaryFrame):
except ImportError as e:
pyfalog.error(e)
self.stNotice.SetLabel(str(e))
except (KeyboardInterrupt, SystemExit):
raise
except Exception as e:
msg = "Could not import from clipboard: unknown errors"
pyfalog.warning(msg)

View File

@@ -168,10 +168,7 @@ class ItemView(d.Display):
def __init__(self, parent):
d.Display.__init__(self, parent)
sMkt = Market.getInstance()
self.things = sMkt.getItemsWithOverrides()
self.items = self.things
self.activeItems = []
self.searchBox = parent.Parent.Parent.searchBox
# Bind search actions
@@ -180,20 +177,16 @@ class ItemView(d.Display):
self.searchBox.Bind(SBox.EVT_CANCEL_BTN, self.clearSearch)
self.searchBox.Bind(SBox.EVT_TEXT, self.scheduleSearch)
self.update(self.items)
self.update(Market.getInstance().getItemsWithOverrides())
def clearSearch(self, event=None):
if event:
self.searchBox.Clear()
self.items = self.things
self.update(self.items)
self.update(Market.getInstance().getItemsWithOverrides())
def updateItems(self, updateDisplay=False):
sMkt = Market.getInstance()
self.things = sMkt.getItemsWithOverrides()
self.items = self.things
if updateDisplay:
self.update(self.things)
self.update(Market.getInstance().getItemsWithOverrides())
def scheduleSearch(self, event=None):
sMkt = Market.getInstance()
@@ -206,12 +199,40 @@ class ItemView(d.Display):
self.clearSearch()
return
sMkt.searchItems(search, self.populateSearch, False)
sMkt.searchItems(search, self.populateSearch, 'everything')
def itemSort(self, item):
sMkt = Market.getInstance()
isFittable = item.group.name in sMkt.FIT_GROUPS or item.category.name in sMkt.FIT_CATEGORIES
catname = sMkt.getCategoryByItem(item).name
try:
mktgrpid = sMkt.getMarketGroupByItem(item).ID
except AttributeError:
mktgrpid = -1
pyfalog.warning("unable to find market group for {}".format(item.name))
parentname = sMkt.getParentItemByItem(item).name
# Get position of market group
metagrpid = sMkt.getMetaGroupIdByItem(item)
metatab = sMkt.META_MAP_REVERSE_INDICES.get(metagrpid)
metalvl = item.metaLevel or 0
return not isFittable, catname, mktgrpid, parentname, metatab, metalvl, item.name
def populateSearch(self, items):
self.items = list(items)
self.update(items)
def populate(self, items):
if len(items) > 0:
self.unselectAll()
items.sort(key=self.itemSort)
self.activeItems = items
d.Display.populate(self, items)
def refresh(self, items):
if len(items) > 1:
items.sort(key=self.itemSort)
d.Display.refresh(self, items)
class AttributeGrid(wxpg.PropertyGrid):
def __init__(self, parent):
@@ -236,7 +257,7 @@ class AttributeGrid(wxpg.PropertyGrid):
self.Clear()
self.btn.Enable(True)
sel = event.EventObject.GetFirstSelected()
self.item = item = self.itemView.items[sel]
self.item = item = self.itemView.activeItems[sel]
for key in sorted(item.attributes.keys()):
override = item.overrides.get(key, None)

View File

@@ -211,6 +211,8 @@ class ImplantSetEditor(AuxiliaryFrame):
except ImportError as e:
pyfalog.error(e)
self.stNotice.SetLabel(str(e))
except (KeyboardInterrupt, SystemExit):
raise
except Exception as e:
pyfalog.error(e)
self.stNotice.SetLabel("Could not import from clipboard: unknown errors")

View File

@@ -352,6 +352,8 @@ class TargetProfileEditor(AuxiliaryFrame):
except ImportError as e:
pyfalog.error(e)
self.stNotice.SetLabel(str(e))
except (KeyboardInterrupt, SystemExit):
raise
except Exception as e:
msg = "Could not import from clipboard:"
pyfalog.warning(msg)

View File

@@ -70,6 +70,8 @@ class exportHtmlThread(threading.Thread):
except IOError as ex:
pyfalog.warning("Failed to write to " + settings.getPath())
pass
except (KeyboardInterrupt, SystemExit):
raise
except Exception as ex:
pass
@@ -226,6 +228,8 @@ class exportHtmlThread(threading.Thread):
HTMLfit += ' </ul>\n </li>\n'
HTMLship += HTMLfit
except (KeyboardInterrupt, SystemExit):
raise
except:
pyfalog.warning("Failed to export line")
continue
@@ -281,6 +285,8 @@ class exportHtmlThread(threading.Thread):
HTML += '<a class="outOfGameBrowserLink" target="_blank" href="' + dnaUrl + dnaFit + '">' \
+ ship.name + ': ' + \
fit[1] + '</a><br> \n'
except (KeyboardInterrupt, SystemExit):
raise
except:
pyfalog.error("Failed to export line")
continue