def importCrest(str): fit = json.loads(str) sMkt = Market.getInstance() f = Fit() f.name = fit['name'] try: try: f.ship = Ship(sMkt.getItem(fit['ship']['id'])) except ValueError: f.ship = Citadel(sMkt.getItem(fit['ship']['id'])) except: return None items = fit['items'] items.sort(key=lambda k: k['flag']) moduleList = [] for module in items: try: item = sMkt.getItem(module['type']['id'], eager="group.category") if module['flag'] == INV_FLAG_DRONEBAY: d = Drone(item) d.amount = module['quantity'] f.drones.append(d) elif module['flag'] == INV_FLAG_CARGOBAY: c = Cargo(item) c.amount = module['quantity'] f.cargo.append(c) else: try: m = Module(item) # When item can't be added to any slot (unknown item or just charge), ignore it except ValueError: continue # Add subsystems before modules to make sure T3 cruisers have subsystems installed if item.category.name == "Subsystem": if m.fits(f): f.modules.append(m) else: if m.isValidState(State.ACTIVE): m.state = State.ACTIVE moduleList.append(m) except: continue # Recalc to get slot numbers correct for T3 cruisers Fit.getInstance().recalc(f) for module in moduleList: if module.fits(f): f.modules.append(module) return f
def getText(self, stuff): if isinstance(stuff, Drone): return "%dx %s" % (stuff.amount, stuff.item.name) elif isinstance(stuff, Fighter): return "%d/%d %s" % ( stuff.amountActive, stuff.getModifiedItemAttr("fighterSquadronMaxSize"), stuff.item.name) elif isinstance(stuff, Cargo): return "%dx %s" % (stuff.amount, stuff.item.name) elif isinstance(stuff, s_Fit): if self.projectedView: # we need a little more information for the projected view fitID = self.mainFrame.getActiveFit() return "%dx %s (%s)" % (stuff.getProjectionInfo(fitID).amount, stuff.name, stuff.ship.item.name) else: return "%s (%s)" % (stuff.name, stuff.ship.item.name) elif isinstance(stuff, Rack): if s_Fit.getInstance().serviceFittingOptions["rackLabels"]: if stuff.slot == Slot.MODE: return u'─ Tactical Mode ─' else: return u'─ {} Slots ─'.format( Slot.getName(stuff.slot).capitalize()) else: return "" elif isinstance(stuff, Module): if stuff.isEmpty: return "%s Slot" % Slot.getName(stuff.slot).capitalize() else: return stuff.item.name elif isinstance(stuff, Implant): return stuff.item.name else: item = getattr(stuff, "item", stuff) if s_Fit.getInstance( ).serviceFittingOptions["showMarketShortcuts"]: marketShortcut = getattr(item, "marketShortcut", None) if marketShortcut: # use unicode subscript to display shortcut value shortcut = unichr(marketShortcut + 8320) + u" " del item.marketShortcut return shortcut + item.name return item.name
def switchToMiningYieldView(self, event): # Getting the active fit mainFrame = gui.mainFrame.MainFrame.getInstance() sFit = Fit.getInstance() fit = sFit.getFit(mainFrame.getActiveFit()) # Remove ourselves from statsPane's view list self.parent.views.remove(self) self._cachedValues = [] # 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) # Populate us in statsPane's view list self.parent.views.append(view) # Get the TogglePanel tp = self.panel.GetParent() tp.SetLabel(view.getHeaderText(fit)) view.refreshPanel(fit)
def getText(self, itmContext, selection): sDP = import_DamagePattern.getInstance() sFit = Fit.getInstance() fitID = self.mainFrame.getActiveFit() 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.patternIds = {} self.subMenus = OrderedDict() self.singles = [] # iterate and separate damage patterns based on "[Parent] Child" for pattern in self.patterns: start, end = pattern.name.find('['), pattern.name.find(']') if start is not -1 and end is not -1: currBase = pattern.name[start + 1:end] # set helper attr setattr(pattern, "_name", pattern.name[end + 1:].strip()) if currBase not in self.subMenus: self.subMenus[currBase] = [] self.subMenus[currBase].append(pattern) else: self.singles.append(pattern) # return list of names, with singles first followed by submenu names self.m = map(lambda p: p.name, self.singles) + self.subMenus.keys() return self.m
def fitChanged(self, event): sFit = Fit.getInstance() fit = sFit.getFit(event.fitID) self.Parent.Parent.DisablePage(self, not fit or fit.isStructure) # Clear list and get out if current fitId is None if event.fitID is None and self.lastFitId is not None: self.DeleteAllItems() self.lastFitId = None event.Skip() return self.origional = fit.boosters if fit is not None else None self.boosters = stuff = fit.boosters[:] if fit is not None else None if event.fitID != self.lastFitId: self.lastFitId = event.fitID item = self.GetNextItem(-1, wx.LIST_NEXT_ALL, wx.LIST_STATE_DONTCARE) if item != -1: self.EnsureVisible(item) self.deselectItems() self.populate(stuff) self.refresh(stuff) event.Skip()
def fitChanged(self, event): sFit = Fit.getInstance() fit = sFit.getFit(event.fitID) self.Parent.Parent.Parent.DisablePage(self.Parent, not fit) # Clear list and get out if current fitId is None if event.fitID is None and self.lastFitId is not None: self.DeleteAllItems() self.lastFitId = None event.Skip() return self.original = fit.fighters if fit is not None else None self.fighters = stuff = fit.fighters[:] if fit is not None else None ''' if stuff is not None: stuff.sort(key=self.droneKey) ''' if event.fitID != self.lastFitId: self.lastFitId = event.fitID item = self.GetNextItem(-1, wx.LIST_NEXT_ALL, wx.LIST_STATE_DONTCARE) if item != -1: self.EnsureVisible(item) self.deselectItems() self.update(stuff) event.Skip()
def fitChanged(self, event): sFit = Fit.getInstance() fit = sFit.getFit(event.fitID) self.Parent.Parent.DisablePage(self, not fit or fit.isStructure) # Clear list and get out if current fitId is None if event.fitID is None and self.lastFitId is not None: self.DeleteAllItems() self.lastFitId = None event.Skip() return stuff = [] if fit is not None: self.fits = fit.commandFits[:] self.fits.sort(key=self.fitSort) stuff.extend(self.fits) if event.fitID != self.lastFitId: self.lastFitId = event.fitID item = self.GetNextItem(-1, wx.LIST_NEXT_ALL, wx.LIST_STATE_DONTCARE) if item != -1: self.EnsureVisible(item) self.deselectItems() # todo: verify if stuff == []: stuff = [DummyEntry("Drag a fit to this area")] self.update(stuff)
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 activate(self, fullContext, selection, i): srcContext = fullContext[0] if srcContext == "fittingShip": fitID = self.mainFrame.getActiveFit() sFit = Fit.getInstance() stuff = sFit.getFit(fitID).ship else: stuff = selection[0] if srcContext == "fittingModule" and stuff.isEmpty: return mstate = wx.GetMouseState() reuse = False if mstate.CmdDown(): reuse = True if self.mainFrame.GetActiveStatsWindow() is None and reuse: ItemStatsDialog(stuff, fullContext) elif reuse: lastWnd = self.mainFrame.GetActiveStatsWindow() pos = lastWnd.GetPosition() maximized = lastWnd.IsMaximized() if not maximized: size = lastWnd.GetSize() else: size = wx.DefaultSize pos = wx.DefaultPosition ItemStatsDialog(stuff, fullContext, pos, size, maximized) lastWnd.closeEvent(None) else: ItemStatsDialog(stuff, fullContext)
def _merge(self, src, dst): dstDrone = self.get(dst) if isinstance(dstDrone, es_Drone): sFit = Fit.getInstance() fitID = self.mainFrame.getActiveFit() if sFit.mergeDrones(fitID, self.get(src), dstDrone, True): wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
def RefreshBoosterFits(self, event=None): sFit = Fit.getInstance() sMkt = Market.getInstance() fitList = sFit.getBoosterFits() for id_ in self.fleet: choice = self.fleet[id_]['chFit'] chCurrSelection = choice.GetSelection() chCurrData = -1 if chCurrSelection != -1: chCurrData = choice.GetClientData(chCurrSelection) chCurrSelString = choice.GetString(chCurrSelection) choice.Clear() currSelFound = False choice.Append("None", -1) for fit in fitList: fit_id, name, type_ = fit ship = sMkt.getItem(type_) choice.Append(ship.name + ': ' + name, fit_id) if chCurrData == fit_id: currSelFound = True if chCurrSelection == -1: choice.SetSelection(0) else: if currSelFound: choice.SetStringSelection(chCurrSelString) else: choice.SetSelection(0)
def spawnMenu(self): if self.activeFitID is None: return sMkt = Market.getInstance() selection = [] sel = self.GetFirstSelected() contexts = [] while sel != -1 and sel not in self.blanks: mod = self.mods[self.GetItemData(sel)] if not mod.isEmpty: srcContext = "fittingModule" itemContext = sMkt.getCategoryByItem(mod.item).name fullContext = (srcContext, itemContext) if srcContext not in tuple(fCtxt[0] for fCtxt in contexts): contexts.append(fullContext) if mod.charge is not None: srcContext = "fittingCharge" itemContext = sMkt.getCategoryByItem(mod.charge).name fullContext = (srcContext, itemContext) if srcContext not in tuple(fCtxt[0] for fCtxt in contexts): contexts.append(fullContext) selection.append(mod) sel = self.GetNextSelected(sel) sFit = Fit.getInstance() fit = sFit.getFit(self.activeFitID) contexts.append(("fittingShip", "Ship" if not fit.isStructure else "Citadel")) menu = ContextMenu.getMenu(selection, *contexts) self.PopupMenu(menu)
def activate(self, fullContext, selection, i): sFit = Fit.getInstance() fitID = self.mainFrame.getActiveFit() trigger = sFit.project(fitID, selection[0]) if trigger: wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) self.mainFrame.additionsPane.select("Projected")
def spawnMenu(self): sel = self.GetFirstSelected() menu = None sFit = Fit.getInstance() fit = sFit.getFit(self.mainFrame.getActiveFit()) if not fit: return if sel != -1: implant = fit.appliedImplants[sel] sMkt = Market.getInstance() sourceContext = "implantItem" if fit.implantSource == ImplantLocation.FIT else "implantItemChar" itemContext = sMkt.getCategoryByItem(implant.item).name menu = ContextMenu.getMenu((implant,), (sourceContext, itemContext)) elif sel == -1 and fit.implantSource == ImplantLocation.FIT: fitID = self.mainFrame.getActiveFit() if fitID is None: return context = (("implantView",),) menu = ContextMenu.getMenu([], *context) if menu is not None: self.PopupMenu(menu)
def swapItems(self, x, y, srcIdx): '''Swap two modules in fitting window''' mstate = wx.GetMouseState() sFit = Fit.getInstance() fit = sFit.getFit(self.activeFitID) if mstate.CmdDown(): clone = True else: clone = False dstRow, _ = self.HitTest((x, y)) if dstRow != -1 and dstRow not in self.blanks: mod1 = fit.modules[srcIdx] mod2 = self.mods[dstRow] # can't swap modules to different racks if mod1.slot != mod2.slot: return if clone and mod2.isEmpty: sFit.cloneModule(self.mainFrame.getActiveFit(), mod1.position, mod2.position) else: sFit.swapModules(self.mainFrame.getActiveFit(), mod1.position, mod2.position) wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.mainFrame.getActiveFit()))
def activate(self, fullContext, selection, i): srcContext = fullContext[0] sFit = Fit.getInstance() fitID = self.mainFrame.getActiveFit() fit = sFit.getFit(fitID) if srcContext == "fittingModule": for module in selection: if module is not None: sFit.removeModule(fitID, fit.modules.index(module)) elif srcContext in ("fittingCharge", "projectedCharge"): sFit.setAmmo(fitID, None, selection) elif srcContext == "droneItem": sFit.removeDrone(fitID, fit.drones.index(selection[0])) elif srcContext == "fighterItem": sFit.removeFighter(fitID, fit.fighters.index(selection[0])) elif srcContext == "implantItem": sFit.removeImplant(fitID, fit.implants.index(selection[0])) elif srcContext == "boosterItem": sFit.removeBooster(fitID, fit.boosters.index(selection[0])) elif srcContext == "cargoItem": sFit.removeCargo(fitID, fit.cargo.index(selection[0])) else: sFit.removeProjected(fitID, selection[0]) wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
def run(self): # wait 1 second just in case a lot of modifications get made time.sleep(1) if self.stopRunning: return sMkt = Market.getInstance() sFit = Fit.getInstance() settings = HTMLExportSettings.getInstance() minimal = settings.getMinimalEnabled() dnaUrl = "https://o.smium.org/loadout/dna/" if minimal: HTML = self.generateMinimalHTML(sMkt, sFit, dnaUrl) else: HTML = self.generateFullHTML(sMkt, sFit, dnaUrl) try: FILE = open(settings.getPath(), "w") FILE.write(HTML.encode('utf-8')) FILE.close() except IOError: print("Failed to write to " + settings.getPath()) pass if self.callback: wx.CallAfter(self.callback, -1)
def exportFitting(self, event): sFit = Fit.getInstance() fitID = self.mainFrame.getActiveFit() self.statusbar.SetStatusText("", 0) if fitID is None: self.statusbar.SetStatusText( "Please select an active fitting in the main window", 1) return self.statusbar.SetStatusText("Sending request and awaiting response", 1) sCrest = Crest.getInstance() try: data = sFit.exportCrest(fitID) res = sCrest.postFitting(self.getActiveCharacter(), data) self.statusbar.SetStatusText( "%d: %s" % (res.status_code, res.reason), 0) try: text = json.loads(res.text) self.statusbar.SetStatusText(text['message'], 1) except ValueError: self.statusbar.SetStatusText("", 1) except requests.exceptions.ConnectionError: self.statusbar.SetStatusText( "Connection error, please check your internet connection", 1)
def RemoveBooster(self, event): activeFitID = self.mainFrame.getActiveFit() if not activeFitID: return location = event.GetEventObject() for id_ in self.fleet: if location == self.fleet[id_]['stText']: type_ = id_ sFit = Fit.getInstance() boostee = sFit.getFit(activeFitID) booster = None fleetSrv = Fleet.getInstance() if type_ == 0: fleetSrv.setLinearFleetCom(boostee, booster) elif type_ == 1: fleetSrv.setLinearWingCom(boostee, booster) elif type_ == 2: fleetSrv.setLinearSquadCom(boostee, booster) # Hide stText and, default fit selection, and enable it location.Hide() choice = self.fleet[type_]['chFit'] choice.SetSelection(0) choice.Show() sFit.recalc(boostee, withBoosters=True) wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=activeFitID))
def swapModule(self, x, y, modIdx): '''Swap a module from fitting window with cargo''' sFit = Fit.getInstance() fit = sFit.getFit(self.mainFrame.getActiveFit()) dstRow, _ = self.HitTest((x, y)) mstate = wx.GetMouseState() # Gather module information to get position module = fit.modules[modIdx] if dstRow != -1: # we're swapping with cargo if mstate.CmdDown(): # if copying, append to cargo sFit.addCargo(self.mainFrame.getActiveFit(), module.item.ID) else: # else, move / swap sFit.moveCargoToModule(self.mainFrame.getActiveFit(), module.position, dstRow) else: # dragging to blank spot, append sFit.addCargo(self.mainFrame.getActiveFit(), module.item.ID) if not mstate.CmdDown(): # if not copying, remove module sFit.removeModule(self.mainFrame.getActiveFit(), module.position) wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.mainFrame.getActiveFit()))
def fitChanged(self, event): sFit = Fit.getInstance() fit = sFit.getFit(event.fitID) self.Parent.Parent.Parent.DisablePage(self.Parent, not fit or fit.isStructure) # Clear list and get out if current fitId is None if event.fitID is None and self.lastFitId is not None: self.DeleteAllItems() self.lastFitId = None event.Skip() return self.original = fit.implants if fit is not None else None self.implants = stuff = fit.appliedImplants if fit is not None else None if stuff is not None: stuff.sort(key=lambda implant: implant.slot) if event.fitID != self.lastFitId: self.lastFitId = event.fitID item = self.GetNextItem(-1, wx.LIST_NEXT_ALL, wx.LIST_STATE_DONTCARE) if item != -1: self.EnsureVisible(item) self.deselectItems() self.update(stuff) event.Skip()
def importFitting(self, event): selection = self.fitView.fitSelection if not selection: return data = self.fitTree.fittingsTreeCtrl.GetPyData(selection) sFit = Fit.getInstance() fits = sFit.importFitFromBuffer(data) self.mainFrame._openAfterImport(fits)
def removeModule(self, module): sFit = Fit.getInstance() fit = sFit.getFit(self.activeFitID) populate = sFit.removeModule(self.activeFitID, fit.modules.index(module)) if populate is not None: self.slotsChanged() wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.activeFitID))
def pageChanged(self, event): if self.parent.IsActive(self): fitID = self.getActiveFit() sFit = Fit.getInstance() sFit.switchFit(fitID) wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) event.Skip()
def activate(self, fullContext, selection, i): sFit = Fit.getInstance() fitID = self.mainFrame.getActiveFit() typeID = int(selection[0].ID) sFit.addCargo(fitID, typeID) self.mainFrame.additionsPane.select("Cargo") wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
def Destroy(self): sFit = Fit.getInstance() fitID = self.mainFrame.getActiveFit() if fitID is not None: sFit.clearFit(fitID) wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) wx.Frame.Destroy(self)
def remove(self, event): row, _ = self.HitTest(event.Position) if row != -1: col = self.getColumn(event.Position) if col != self.getColIndex(State): fitID = self.mainFrame.getActiveFit() sFit = Fit.getInstance() sFit.removeProjected(fitID, self.get(row)) wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
def activate(self, fullContext, selection, i): fitID = self.mainFrame.getActiveFit() sFit = Fit.getInstance() stuff = sFit.getFit(fitID).ship groupID = stuff.item.group.ID self.mainFrame.notebookBrowsers.SetSelection(1) wx.PostEvent(self.mainFrame.shipBrowser, Stage3Selected(shipID=stuff.item.ID, back=groupID))
def run(self): sFit = Fit.getInstance() success, result = sFit.importFitFromFiles(self.paths, self.callback) if not success: # there was an error during processing logger.error("Error while processing file import: %s", result) wx.CallAfter(self.callback, -2, result) else: # Send done signal to GUI wx.CallAfter(self.callback, -1, result)
def handleDrag(self, type, fitID): # Those are drags coming from pyfa sources, NOT builtin wx drags if type == "fit": activeFit = self.mainFrame.getActiveFit() if activeFit: sFit = Fit.getInstance() draggedFit = sFit.getFit(fitID) sFit.project(activeFit, draggedFit) wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=activeFit))