diff --git a/eos/saveddata/character.py b/eos/saveddata/character.py index 182ad2893..bc98de0f1 100644 --- a/eos/saveddata/character.py +++ b/eos/saveddata/character.py @@ -91,6 +91,7 @@ class Character(object): self.defaultLevel = defaultLevel self.__skills = [] self.__skillIdMap = {} + self.dirtySkills = set() for item in self.getSkillList(): self.addSkill(Skill(item.ID, self.defaultLevel)) @@ -103,6 +104,7 @@ class Character(object): self.__skillIdMap = {} for skill in self.__skills: self.__skillIdMap[skill.itemID] = skill + self.dirtySkills = set() def apiUpdateCharSheet(self, skills): del self.__skills[:] @@ -150,12 +152,12 @@ class Character(object): @property def isDirty(self): - return getattr(self, "dirty", False) + return len(self.dirtySkills) > 0 def saveLevels(self): - for skill in self.skills: - skill.__level = skill.level - self.dirty = False + for skill in self.dirtySkills: + skill.saveLevel() + self.dirtySkills = set() eos.db.commit() def filteredSkillIncrease(self, filter, *args, **kwargs): @@ -221,9 +223,12 @@ class Skill(HandledItem): self.__suppressed = False self.activeLevel = self.__level + def saveLevel(self): + self.__level = self.activeLevel + @property def learned(self): - return self.__level is not None + return self.activeLevel is not None @property def level(self): @@ -238,7 +243,10 @@ class Skill(HandledItem): raise ReadOnlyException() self.activeLevel = level - self.character.dirty = True + if self.activeLevel == self.__level: + self.character.dirtySkills.remove(self) + else: + self.character.dirtySkills.add(self) @property def item(self): diff --git a/gui/characterEditor.py b/gui/characterEditor.py index 1d3a2c400..e94ee98d9 100644 --- a/gui/characterEditor.py +++ b/gui/characterEditor.py @@ -34,6 +34,8 @@ class CharacterEditor(wx.Frame): 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) + self.mainFrame = parent + i = wx.IconFromBitmap(bitmapLoader.getBitmap("character_small", "icons")) self.SetIcon(i) @@ -45,8 +47,6 @@ class CharacterEditor(wx.Frame): self.navSizer = wx.BoxSizer(wx.HORIZONTAL) sChar = service.Character.getInstance() - charList = sChar.getCharacterList() - charList.sort(key=lambda t: t[1]) self.btnSave = wx.Button(self, wx.ID_SAVE) self.btnSave.Hide() @@ -56,14 +56,17 @@ class CharacterEditor(wx.Frame): self.characterRename.Hide() self.characterRename.Bind(wx.EVT_TEXT_ENTER, self.processRename) - self.skillTreeChoice = wx.Choice(self, wx.ID_ANY, style=0) + self.charChoice = wx.Choice(self, wx.ID_ANY, style=0) + self.navSizer.Add(self.charChoice, 1, wx.ALL | wx.EXPAND, 5) + self.refreshCharacterList() + + ''' for id, name, active in charList: - i = self.skillTreeChoice.Append(name, id) + i = self.charChoice.Append(name, id) if active: - self.skillTreeChoice.SetSelection(i) - - self.navSizer.Add(self.skillTreeChoice, 1, wx.ALL | wx.EXPAND, 5) + self.charChoice.SetSelection(i) + ''' buttons = (("new", wx.ART_NEW), ("rename", bitmapLoader.getBitmap("rename", "icons")), @@ -128,7 +131,16 @@ class CharacterEditor(wx.Frame): self.registerEvents() - self.mainFrame = gui.mainFrame.MainFrame.getInstance() + + def refreshCharacterList(self, event=None): + sChar = service.Character.getInstance() + charList = sChar.getCharacterList() + self.charChoice.Clear() + + for id, name, active in charList: + i = self.charChoice.Append(name, id) + if active: + self.charChoice.SetSelection(i) def editingFinished(self, event): del self.disableWin @@ -137,7 +149,8 @@ class CharacterEditor(wx.Frame): def registerEvents(self): self.Bind(wx.EVT_CLOSE, self.closeEvent) - self.skillTreeChoice.Bind(wx.EVT_CHOICE, self.charChanged) + self.Bind(GE.CHAR_LIST_UPDATED, self.refreshCharacterList) + self.charChoice.Bind(wx.EVT_CHOICE, self.charChanged) def closeEvent(self, event): del self.disableWin @@ -182,14 +195,14 @@ class CharacterEditor(wx.Frame): event.Skip() def getActiveCharacter(self): - selection = self.skillTreeChoice.GetCurrentSelection() - return self.skillTreeChoice.GetClientData(selection) if selection is not None else None + selection = self.charChoice.GetCurrentSelection() + return self.charChoice.GetClientData(selection) if selection is not None else None def new(self, event): sChar = service.Character.getInstance() charID = sChar.new() - id = self.skillTreeChoice.Append(sChar.getCharName(charID), charID) - self.skillTreeChoice.SetSelection(id) + id = self.charChoice.Append(sChar.getCharName(charID), charID) + self.charChoice.SetSelection(id) self.unrestrict() self.btnSave.SetLabel("Create") self.rename(None) @@ -198,9 +211,9 @@ class CharacterEditor(wx.Frame): def rename(self, event): if event is not None: self.btnSave.SetLabel("Rename") - self.skillTreeChoice.Hide() + self.charChoice.Hide() self.characterRename.Show() - self.navSizer.Replace(self.skillTreeChoice, self.characterRename) + self.navSizer.Replace(self.charChoice, self.characterRename) self.characterRename.SetFocus() for btn in (self.btnNew, self.btnCopy, self.btnRename, self.btnDelete): btn.Hide() @@ -225,9 +238,9 @@ class CharacterEditor(wx.Frame): charID = self.getActiveCharacter() sChar.rename(charID, newName) - self.skillTreeChoice.Show() + self.charChoice.Show() self.characterRename.Hide() - self.navSizer.Replace(self.characterRename, self.skillTreeChoice) + self.navSizer.Replace(self.characterRename, self.charChoice) for btn in (self.btnNew, self.btnCopy, self.btnRename, self.btnDelete): btn.Show() self.navSizer.Add(btn, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 2) @@ -235,16 +248,13 @@ class CharacterEditor(wx.Frame): self.navSizer.Remove(self.btnSave) self.btnSave.Hide() self.navSizer.Layout() - selection = self.skillTreeChoice.GetCurrentSelection() - self.skillTreeChoice.Delete(selection) - self.skillTreeChoice.Insert(newName, selection, charID) - self.skillTreeChoice.SetSelection(selection) + self.refreshCharacterList() def copy(self, event): sChar = service.Character.getInstance() charID = sChar.copy(self.getActiveCharacter()) - id = self.skillTreeChoice.Append(sChar.getCharName(charID), charID) - self.skillTreeChoice.SetSelection(id) + id = self.charChoice.Append(sChar.getCharName(charID), charID) + self.charChoice.SetSelection(id) self.unrestrict() self.btnSave.SetLabel("Copy") self.rename(None) @@ -253,9 +263,9 @@ class CharacterEditor(wx.Frame): def delete(self, event): sChar = service.Character.getInstance() sChar.delete(self.getActiveCharacter()) - sel = self.skillTreeChoice.GetSelection() - self.skillTreeChoice.Delete(sel) - self.skillTreeChoice.SetSelection(sel - 1) + sel = self.charChoice.GetSelection() + self.charChoice.Delete(sel) + self.charChoice.SetSelection(sel - 1) newSelection = self.getActiveCharacter() if sChar.getCharName(newSelection) in ("All 0", "All 5"): self.restrict() @@ -383,6 +393,8 @@ class SkillTreeView (wx.Panel): self.skillTreeListCtrl.SetItemText(selection, "Level %d" % level if isinstance(level, int) else level, 1) sChar.changeLevel(charID, skillID, level) + sChar.saveCharacter(charID) + wx.PostEvent(self.Parent.Parent, GE.CharListUpdated()) event.Skip() diff --git a/gui/characterSelection.py b/gui/characterSelection.py index 855882e78..c9328750a 100644 --- a/gui/characterSelection.py +++ b/gui/characterSelection.py @@ -81,7 +81,6 @@ class CharacterSelection(wx.Panel): choice.Clear() charList = sChar.getCharacterList() - sChar.getCharacterList() picked = False for id, name, active in charList: diff --git a/service/character.py b/service/character.py index 3a170ac03..f109ead05 100644 --- a/service/character.py +++ b/service/character.py @@ -226,7 +226,6 @@ class Character(object): return eos.db.getCharacter(charID).name def new(self): - #@todo: seems setting skills on a new character doesn't trigger the dirty setting. Probably goes for character copy too char = eos.types.Character("New Character") eos.db.save(char) return char.ID