From 47cbc71e8a87305f876483e79ef61a2dc617539d Mon Sep 17 00:00:00 2001 From: blitzmann Date: Mon, 14 Aug 2017 23:21:26 -0400 Subject: [PATCH] Implement simple skill import/export functionality, and some cleanup top pass tox --- eos/effects/doomsdayaoeecm.py | 2 +- eos/saveddata/character.py | 6 +- gui/builtinItemStatsViews/itemAffectedBy.py | 2 +- gui/builtinItemStatsViews/itemCompare.py | 1 + gui/builtinItemStatsViews/itemEffects.py | 2 +- gui/builtinItemStatsViews/itemTraits.py | 2 +- gui/characterEditor.py | 66 +++++++++++++++++++++ gui/characterSelection.py | 6 +- gui/itemStats.py | 1 + 9 files changed, 79 insertions(+), 9 deletions(-) diff --git a/eos/effects/doomsdayaoeecm.py b/eos/effects/doomsdayaoeecm.py index 0c6fd47ff..f21b89391 100644 --- a/eos/effects/doomsdayaoeecm.py +++ b/eos/effects/doomsdayaoeecm.py @@ -15,4 +15,4 @@ def handler(fit, module, context, **kwargs): if 'effect' in kwargs: strModifier *= ModifiedAttributeDict.getResistance(fit, kwargs['effect']) - fit.ecmProjectedStr *= strModifier \ No newline at end of file + fit.ecmProjectedStr *= strModifier diff --git a/eos/saveddata/character.py b/eos/saveddata/character.py index 0105add30..d68e43114 100644 --- a/eos/saveddata/character.py +++ b/eos/saveddata/character.py @@ -346,7 +346,7 @@ class Skill(HandledItem): return self.activeLevel or 0 - def setLevel(self, level, persist=False): + def setLevel(self, level, persist=False, ignoreRestrict=False): if (level < 0 or level > 5) and level is not None: raise ValueError(str(level) + " is not a valid value for level") @@ -356,7 +356,9 @@ class Skill(HandledItem): self.activeLevel = level - if eos.config.settings['strictSkillLevels']: + # todo: have a way to do bulk skill level editing. Currently, everytime a single skill is changed, this runs, + # which affects performance. Should have a checkSkillLevels() or something that is more efficient for bulk. + if not ignoreRestrict and eos.config.settings['strictSkillLevels']: start = time.time() for item, rlevel in self.item.requiredFor.iteritems(): if item.group.category.ID == 16: # Skill category diff --git a/gui/builtinItemStatsViews/itemAffectedBy.py b/gui/builtinItemStatsViews/itemAffectedBy.py index 7a852b2ca..b29d84b89 100644 --- a/gui/builtinItemStatsViews/itemAffectedBy.py +++ b/gui/builtinItemStatsViews/itemAffectedBy.py @@ -444,4 +444,4 @@ class ItemAffectedBy(wx.Panel): treeitem = self.affectedBy.AppendItem(child, display, attrIcon) self.affectedBy.SetPyData(treeitem, saved) - self.treeItems.append(treeitem) \ No newline at end of file + self.treeItems.append(treeitem) diff --git a/gui/builtinItemStatsViews/itemCompare.py b/gui/builtinItemStatsViews/itemCompare.py index 7690bdc78..4e560883e 100644 --- a/gui/builtinItemStatsViews/itemCompare.py +++ b/gui/builtinItemStatsViews/itemCompare.py @@ -9,6 +9,7 @@ from service.market import Market from service.attribute import Attribute from gui.utils.numberFormatter import formatAmount + class ItemCompare(wx.Panel): def __init__(self, parent, stuff, item, items, context=None): # Start dealing with Price stuff to get that thread going diff --git a/gui/builtinItemStatsViews/itemEffects.py b/gui/builtinItemStatsViews/itemEffects.py index ae4caacbb..81617fdc6 100644 --- a/gui/builtinItemStatsViews/itemEffects.py +++ b/gui/builtinItemStatsViews/itemEffects.py @@ -127,4 +127,4 @@ class ItemEffects(wx.Panel): self.effectList.RefreshRows() self.Layout() self.Thaw() - event.Skip() \ No newline at end of file + event.Skip() diff --git a/gui/builtinItemStatsViews/itemTraits.py b/gui/builtinItemStatsViews/itemTraits.py index ef6a4283b..12abd078d 100644 --- a/gui/builtinItemStatsViews/itemTraits.py +++ b/gui/builtinItemStatsViews/itemTraits.py @@ -14,4 +14,4 @@ class ItemTraits(wx.Panel): self.traits.SetPage(item.traits.traitText) mainSizer.Add(self.traits, 1, wx.ALL | wx.EXPAND, 0) - self.Layout() \ No newline at end of file + self.Layout() diff --git a/gui/characterEditor.py b/gui/characterEditor.py index ca3aacb70..90f955fcb 100644 --- a/gui/characterEditor.py +++ b/gui/characterEditor.py @@ -35,6 +35,9 @@ from service.character import Character from service.network import AuthenticationError, TimeoutError from service.market import Market from logbook import Logger + +from gui.utils.clipboard import toClipboard, fromClipboard + pyfalog = Logger(__name__) @@ -199,6 +202,7 @@ class CharacterEditor(wx.Frame): self.btnSaveChar.Enable(not char.ro and char.isDirty) self.btnSaveAs.Enable(char.isDirty) self.btnRevert.Enable(char.isDirty) + self.sview.importBtn.Enable(not char.ro) def refreshCharacterList(self, event=None): """This is only called when we save a modified character""" @@ -333,6 +337,26 @@ class SkillTreeView(wx.Panel): bSizerButtons = wx.BoxSizer(wx.HORIZONTAL) bSizerButtons.Add(self.btnSecStatus, 0, wx.ALL, 5) + + bSizerButtons.AddSpacer((0, 0), 1, wx.EXPAND, 5) + + importExport = (("Import", wx.ART_FILE_OPEN, "from"), + ("Export", wx.ART_FILE_SAVE_AS, "to")) + + for name, art, direction in importExport: + bitmap = wx.ArtProvider.GetBitmap(art, wx.ART_BUTTON) + btn = wx.BitmapButton(self, wx.ID_ANY, bitmap) + + btn.SetMinSize(btn.GetSize()) + btn.SetMaxSize(btn.GetSize()) + + btn.Layout() + setattr(self, "{}Btn".format(name.lower()), btn) + btn.Enable(True) + btn.SetToolTipString("%s skills %s clipboard" % (name, direction)) + bSizerButtons.Add(btn, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_RIGHT | wx.ALL, 5) + btn.Bind(wx.EVT_BUTTON, getattr(self, "{}Skills".format(name.lower()))) + pmainSizer.Add(bSizerButtons, 0, wx.EXPAND, 5) # bind the Character selection event @@ -368,6 +392,48 @@ class SkillTreeView(wx.Panel): self.Layout() + def importSkills(self, evt): + + dlg = wx.MessageDialog(self, "Importing skills into this character will set the skill levels as pending. " + + "To save the skills permanently, please click the Save button at the bottom of the window after importing" + , "Import Skills", wx.OK) + dlg.ShowModal() + dlg.Destroy() + + text = fromClipboard().strip() + if text: + char = self.charEditor.entityEditor.getActiveEntity() + try: + lines = text.splitlines() + + for l in lines: + skill, level = l.strip()[:-1].strip(), int(l.strip()[-1]) + skill = char.getSkill(skill) + if skill: + skill.setLevel(level, ignoreRestrict=True) + + except Exception as e: + dlg = wx.MessageDialog(self, "There was an error importing skills, please see log file", "Error", wx.ICON_ERROR) + dlg.ShowModal() + dlg.Destroy() + pyfalog.error(e) + + finally: + self.charEditor.btnRestrict() + self.populateSkillTree() + self.charEditor.entityEditor.refreshEntityList(char) + + def exportSkills(self, evt): + char = self.charEditor.entityEditor.getActiveEntity() + + skills = sorted(char.__class__.getSkillNameMap().keys()) + list = "" + for s in skills: + skill = char.getSkill(s) + list += "{} {}\n".format(skill.item.name, skill.level) + + toClipboard(list) + def onSecStatus(self, event): sChar = Character.getInstance() char = self.charEditor.entityEditor.getActiveEntity() diff --git a/gui/characterSelection.py b/gui/characterSelection.py index be31fdde9..7a1bfcb7a 100644 --- a/gui/characterSelection.py +++ b/gui/characterSelection.py @@ -254,10 +254,10 @@ class CharacterSelection(wx.Panel): def exportSkills(self, evt): skillsMap = self._buildSkillsTooltipCondensed(self.reqs, skillsMap={}) + list = "" - for skill in skillsMap: - for i in range(1, int(skillsMap[skill])): - list += skill + " " + str(i) + "\n" + for key in sorted(skillsMap): + list += "%s %d\n" % (key, skillsMap[key]) toClipboard(list) diff --git a/gui/itemStats.py b/gui/itemStats.py index 7a2fd178e..dec1bc12c 100644 --- a/gui/itemStats.py +++ b/gui/itemStats.py @@ -35,6 +35,7 @@ from gui.builtinItemStatsViews.itemEffects import ItemEffects from gui.builtinItemStatsViews.itemAffectedBy import ItemAffectedBy from gui.builtinItemStatsViews.itemProperties import ItemProperties + class ItemStatsDialog(wx.Dialog): counter = 0