def fetchCharList(self, event): self.stStatus.SetLabel("") if self.inputID.GetLineText(0) == "" or self.inputKey.GetLineText(0) == "": self.stStatus.SetLabel("Invalid keyID or vCode!") return sChar = Character.getInstance() try: activeChar = self.charEditor.entityEditor.getActiveEntity() charList = sChar.apiCharList(activeChar.ID, self.inputID.GetLineText(0), self.inputKey.GetLineText(0)) except AuthenticationError: self.stStatus.SetLabel("Authentication failure. Please check keyID and vCode combination.") except TimeoutError: self.stStatus.SetLabel("Request timed out. Please check network connectivity and/or proxy settings.") except Exception as e: self.stStatus.SetLabel("Error:\n%s" % e.message) else: self.charChoice.Clear() for charName in charList: self.charChoice.Append(charName) self.btnFetchSkills.Enable(True) self.charChoice.Enable(True) self.Layout() self.charChoice.SetSelection(0)
def charChanged(self, event): sChar = Character.getInstance() activeChar = self.charEditor.entityEditor.getActiveEntity() ID, key, char, chars = sChar.getApiDetails(activeChar.ID) self.inputID.SetValue(str(ID)) self.inputKey.SetValue(key) self.charChoice.Clear() if chars: for charName in chars: self.charChoice.Append(charName) self.charChoice.SetStringSelection(char) self.charChoice.Enable(True) self.btnFetchSkills.Enable(True) else: self.charChoice.Append("No characters...", 0) self.charChoice.SetSelection(0) self.charChoice.Enable(False) self.btnFetchSkills.Enable(False) if activeChar.name in ("All 0", "All 5"): self.Enable(False) self.stDisabledTip.Show() self.Layout() else: self.Enable() self.stDisabledTip.Hide() self.Layout() if event is not None: event.Skip()
def refreshCharacterList(self, event=None): choice = self.charChoice sChar = Character.getInstance() activeChar = self.getActiveCharacter() choice.Clear() charList = sChar.getCharacterList() picked = False for char in charList: currId = choice.Append(char.name, char.ID) if char.ID == activeChar: choice.SetSelection(currId) self.charChanged(None) picked = True if not picked: charID = sChar.all5ID() self.selectChar(charID) fitID = self.mainFrame.getActiveFit() sFit = Fit.getInstance() sFit.changeChar(fitID, charID) choice.Append(u"\u2015 Open Character Editor \u2015", -1) self.charCache = self.charChoice.GetCurrentSelection() if event is not None: event.Skip()
def change(self, event): sChar = Character.getInstance() sChar.saveCharacterAs(self.charID, self.input.GetLineText(0)) wx.PostEvent(self.parent, GE.CharListUpdated()) event.Skip() self.Close()
def _buildSkillsTooltip(self, reqs, currItem="", tabulationLevel=0): tip = "" sCharacter = Character.getInstance() if tabulationLevel == 0: for item, subReqs in reqs.iteritems(): tip += "%s:\n" % item.name tip += self._buildSkillsTooltip(subReqs, item.name, 1) else: for name, info in reqs.iteritems(): level, ID, more = info sCharacter.skillReqsDict['skills'].append({ 'item': currItem, 'skillID': ID, 'skill': name, 'level': level, 'indent': tabulationLevel, }) tip += "%s%s: %d\n" % (" " * tabulationLevel, name, level) tip += self._buildSkillsTooltip(more, currItem, tabulationLevel + 1) return tip
def changeLevel(self, event): level = self.levelIds.get(event.Id) sChar = Character.getInstance() char = self.charEditor.entityEditor.getActiveEntity() selection = self.skillTreeListCtrl.GetSelection() skillID = self.skillTreeListCtrl.GetPyData(selection) if level is not None: self.skillTreeListCtrl.SetItemText(selection, "Level %d" % level if isinstance(level, int) else level, 1) sChar.changeLevel(char.ID, skillID, level, persist=True) elif event.Id == self.revertID: sChar.revertLevel(char.ID, skillID) elif event.Id == self.saveID: sChar.saveSkill(char.ID, skillID) self.skillTreeListCtrl.SetItemTextColour(selection, None) dirtySkills = sChar.getDirtySkills(char.ID) dirtyGroups = set([skill.item.group.ID for skill in dirtySkills]) parentID = self.skillTreeListCtrl.GetItemParent(selection) groupID = self.skillTreeListCtrl.GetPyData(parentID) if groupID not in dirtyGroups: self.skillTreeListCtrl.SetItemTextColour(parentID, None) event.Skip()
def fetchSkills(self, event): charName = self.charChoice.GetString(self.charChoice.GetSelection()) if charName: try: sChar = Character.getInstance() activeChar = self.charEditor.entityEditor.getActiveEntity() sChar.apiFetch(activeChar.ID, charName) self.stStatus.SetLabel("Successfully fetched %s\'s skills from EVE API." % charName) except Exception as e: self.stStatus.SetLabel("Unable to retrieve %s\'s skills. Error message:\n%s" % (charName, e))
def changeChar(self, fitID, charID): if fitID is None or charID is None: if charID is not None: self.character = Character.getInstance().all5() return fit = getFit(fitID) fit.character = self.character = getCharacter(charID) self.recalc(fit)
def fitChanged(self, event): self.charChoice.Enable(event.fitID is not None) choice = self.charChoice sFit = Fit.getInstance() currCharID = choice.GetClientData(choice.GetCurrentSelection()) fit = sFit.getFit(event.fitID) newCharID = fit.character.ID if fit is not None else None if event.fitID is None: self.skillReqsStaticBitmap.SetBitmap(self.cleanSkills) self.skillReqsStaticBitmap.SetToolTipString("No active fit") else: sCharacter = Character.getInstance() reqs = sCharacter.checkRequirements(fit) sCharacter.skillReqsDict = { 'charname': fit.character.name, 'skills': [] } if len(reqs) == 0: tip = "All skill prerequisites have been met" self.skillReqsStaticBitmap.SetBitmap(self.greenSkills) else: tip = "Skills required:\n" condensed = sFit.serviceFittingOptions["compactSkills"] if condensed: dict_ = self._buildSkillsTooltipCondensed(reqs, skillsMap={}) for key in sorted(dict_): tip += "%s: %d\n" % (key, dict_[key]) else: tip += self._buildSkillsTooltip(reqs) self.skillReqsStaticBitmap.SetBitmap(self.redSkills) self.skillReqsStaticBitmap.SetToolTipString(tip.strip()) if newCharID is None: sChar = Character.getInstance() self.selectChar(sChar.all5ID()) elif currCharID != newCharID: self.selectChar(newCharID) self.charChanged(None) event.Skip()
def refreshApi(self, event): sChar = Character.getInstance() ID, key, charName, chars = sChar.getApiDetails( self.getActiveCharacter()) if charName: try: sChar.apiFetch(self.getActiveCharacter(), charName) except: # can we do a popup, notifying user of API error? pass self.refreshCharacterList()
def getEntitiesFromContext(self): sChar = Character.getInstance() charList = sorted(sChar.getCharacterList(), key=lambda c: c.name) # Do some processing to ensure that we have All 0 and All 5 at the top all5 = sChar.all5() all0 = sChar.all0() charList.remove(all5) charList.remove(all0) charList.insert(0, all5) charList.insert(0, all0) return charList
def fitChanged(self, event): enable = event.fitID is not None self.Enable(wx.ID_SAVEAS, enable) self.Enable(wx.ID_COPY, enable) self.Enable(self.exportSkillsNeededId, enable) sChar = Character.getInstance() charID = self.mainFrame.charSelection.getActiveCharacter() char = sChar.getCharacter(charID) # enable/disable character saving stuff self.Enable(self.saveCharId, not char.ro and char.isDirty) self.Enable(self.saveCharAsId, char.isDirty) self.Enable(self.revertCharId, char.isDirty) event.Skip()
def __init__(self, parent, charID): wx.Dialog.__init__(self, parent, title="Save Character As...", size=wx.Size(300, 60)) self.charID = charID self.parent = parent sChar = Character.getInstance() name = sChar.getCharName(charID) bSizer1 = wx.BoxSizer(wx.HORIZONTAL) self.input = wx.TextCtrl(self, wx.ID_ANY, name, style=wx.TE_PROCESS_ENTER) bSizer1.Add(self.input, 1, wx.ALL, 5) self.input.Bind(wx.EVT_TEXT_ENTER, self.change) self.button = wx.Button(self, wx.ID_OK, u"Save") bSizer1.Add(self.button, 0, wx.ALL, 5) self.SetSizer(bSizer1) self.Layout() self.Centre(wx.BOTH) self.button.Bind(wx.EVT_BUTTON, self.change)
def expandLookup(self, event): root = event.Item tree = self.skillTreeListCtrl child, cookie = tree.GetFirstChild(root) if tree.GetItemText(child) == "dummy": tree.Delete(child) # Get the real intrestin' stuff sChar = Character.getInstance() char = self.charEditor.entityEditor.getActiveEntity() for id, name in sChar.getSkills(tree.GetPyData(root)): iconId = self.skillBookImageId childId = tree.AppendItem(root, name, iconId, data=wx.TreeItemData(id)) level, dirty = sChar.getSkillLevel(char.ID, id) tree.SetItemText(childId, "Level %d" % level if isinstance(level, int) else level, 1) if dirty: tree.SetItemTextColour(childId, wx.BLUE) tree.SortChildren(root)
def charChanged(self, event): fitID = self.mainFrame.getActiveFit() charID = self.getActiveCharacter() sChar = Character.getInstance() if charID == -1: # revert to previous character self.charChoice.SetSelection(self.charCache) self.mainFrame.showCharacterEditor(event) return if sChar.getCharName(charID) not in ( "All 0", "All 5") and sChar.apiEnabled(charID): self.btnRefresh.Enable(True) else: self.btnRefresh.Enable(False) sFit = Fit.getInstance() sFit.changeChar(fitID, charID) self.charCache = self.charChoice.GetCurrentSelection() wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
def _buildSkillsTooltipCondensed(self, reqs, currItem="", tabulationLevel=0, skillsMap=None): if skillsMap is None: skillsMap = {} sCharacter = Character.getInstance() if tabulationLevel == 0: for item, subReqs in reqs.iteritems(): skillsMap = self._buildSkillsTooltipCondensed( subReqs, item.name, 1, skillsMap) sorted(skillsMap, key=skillsMap.get) else: for name, info in reqs.iteritems(): level, ID, more = info sCharacter.skillReqsDict['skills'].append({ 'item': currItem, 'skillID': ID, 'skill': name, 'level': level, 'indent': tabulationLevel, }) if name not in skillsMap: skillsMap[name] = level elif skillsMap[name] < level: skillsMap[name] = level skillsMap = self._buildSkillsTooltipCondensed( more, currItem, tabulationLevel + 1, skillsMap) return skillsMap
def display(self, srcContext, selection): if self.mainFrame.getActiveFit() is None or srcContext not in ( "fittingModule", "fittingCharge", "fittingShip"): return False self.sChar = Character.getInstance() self.sFit = Fit.getInstance() fit = self.sFit.getFit(self.mainFrame.getActiveFit()) self.charID = fit.character.ID # if self.sChar.getCharName(self.charID) in ("All 0", "All 5"): # return False if srcContext == "fittingShip": fitID = self.mainFrame.getActiveFit() sFit = Fit.getInstance() self.stuff = sFit.getFit(fitID).ship cont = sFit.getFit(fitID).ship.itemModifiedAttributes elif srcContext == "fittingCharge": cont = selection[0].chargeModifiedAttributes else: cont = selection[0].itemModifiedAttributes skills = set() for attrName in cont.iterAfflictions(): if cont[attrName] == 0: continue for fit, afflictors in cont.getAfflictions(attrName).iteritems(): for afflictor, modifier, amount, used in afflictors: # only add Skills if not isinstance(afflictor, Skill): continue skills.add(afflictor) self.skills = sorted(skills, key=lambda x: x.item.name) return len(self.skills) > 0
def populateSkillTree(self, event=None): sChar = Character.getInstance() char = self.charEditor.entityEditor.getActiveEntity() dirtyGroups = set([skill.item.group.ID for skill in char.dirtySkills]) groups = sChar.getSkillGroups() imageId = self.skillBookImageId root = self.root tree = self.skillTreeListCtrl tree.DeleteChildren(root) for id, name in groups: childId = tree.AppendItem(root, name, imageId) tree.SetPyData(childId, id) tree.AppendItem(childId, "dummy") if id in dirtyGroups: tree.SetItemTextColour(childId, wx.BLUE) tree.SortChildren(root) if event: event.Skip()
def handleSelection(self, event): implant_set = self.idmap.get(event.Id, None) if implant_set is None: event.Skip() return if self.context == "implantEditor": # we are calling from character editor, the implant source is different sChar = Character.getInstance() charID = self.selection.getActiveCharacter() for implant in implant_set.implants: sChar.addImplant(charID, implant.item.ID) wx.PostEvent(self.selection, GE.CharChanged()) else: sFit = Fit.getInstance() fitID = self.mainFrame.getActiveFit() for implant in implant_set.implants: sFit.addImplant(fitID, implant.item.ID, recalc=implant == implant_set.implants[-1]) wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
def RefreshCharacterList(self, event=None): sChar = Character.getInstance() charList = sChar.getCharacterList() for id_ in self.fleet: choice = self.fleet[id_]['chChar'] chCurrSelection = choice.GetSelection() chCurrData = -1 if chCurrSelection != -1: chCurrData = choice.GetClientData(chCurrSelection) chCurrSelString = choice.GetString(chCurrSelection) choice.Clear() currSelFound = False for char in charList: choice.Append(char.name, char.ID) if chCurrData == char.ID: currSelFound = True if chCurrSelection == -1: choice.SetSelection(1) else: if currSelFound: choice.SetStringSelection(chCurrSelString) else: choice.SetSelection(1)
def removeImplantFromContext(self, implant): sChar = Character.getInstance() char = self.Parent.Parent.entityEditor.getActiveEntity() sChar.removeImplant(char.ID, implant)
def getImplantsFromContext(self): sChar = Character.getInstance() char = self.Parent.Parent.entityEditor.getActiveEntity() return sChar.getImplants(char.ID)
def DoDelete(self, entity): sChar = Character.getInstance() sChar.delete(entity)
def DoCopy(self, entity, name): sChar = Character.getInstance() copy = sChar.copy(entity) sChar.rename(copy, name) return copy
def DoRename(self, entity, name): sChar = Character.getInstance() sChar.rename(entity, name)
def DoNew(self, name): sChar = Character.getInstance() return sChar.new(name)
def addImplantToContext(self, item): sChar = Character.getInstance() char = self.Parent.Parent.entityEditor.getActiveEntity() sChar.addImplant(char.ID, item.ID)
def revertChar(self, event): sChr = Character.getInstance() char = self.entityEditor.getActiveEntity() sChr.revertCharacter(char.ID) wx.PostEvent(self, GE.CharListUpdated())