def SetupImageList(self): self.imageList.RemoveAll() self.blank_icon = self.imageList.Add(BitmapLoader.getBitmap("transparent16x16", "gui")) self.unknown_icon = self.imageList.Add(BitmapLoader.getBitmap("0", "icons")) self.paramList.AssignImageList(self.imageList)
def __init__(self, parent, **kwargs): PFSearchBox.__init__(self, parent, **kwargs) cancelBitmap = BitmapLoader.getBitmap("fit_delete_small", "gui") searchBitmap = BitmapLoader.getBitmap("fsearch_small", "gui") self.SetSearchBitmap(searchBitmap) self.SetCancelBitmap(cancelBitmap) self.ShowSearchButton() self.ShowCancelButton()
def __init__(self, parent): self.mainFrame = gui.mainFrame.MainFrame.getInstance() wx.Panel.__init__(self, parent) mainSizer = wx.BoxSizer(wx.HORIZONTAL) self.SetSizer(mainSizer) mainSizer.Add(wx.StaticText(self, wx.ID_ANY, "Character: "), 0, wx.CENTER | wx.RIGHT | wx.LEFT, 3) # cache current selection to fall back in case we choose to open char editor self.charCache = None self.charChoice = wx.Choice(self) mainSizer.Add(self.charChoice, 1, wx.ALIGN_CENTER_VERTICAL | wx.RIGHT | wx.LEFT, 3) self.refreshCharacterList() self.cleanSkills = BitmapLoader.getBitmap("skill_big", "gui") self.redSkills = BitmapLoader.getBitmap("skillRed_big", "gui") self.greenSkills = BitmapLoader.getBitmap("skillGreen_big", "gui") self.refresh = BitmapLoader.getBitmap("refresh", "gui") self.needsSkills = False self.btnRefresh = wx.BitmapButton(self, wx.ID_ANY, self.refresh) size = self.btnRefresh.GetSize() self.btnRefresh.SetMinSize(size) self.btnRefresh.SetMaxSize(size) self.btnRefresh.SetToolTip("Refresh API") self.btnRefresh.Bind(wx.EVT_BUTTON, self.refreshApi) self.btnRefresh.Enable(False) mainSizer.Add(self.btnRefresh, 0, wx.ALIGN_CENTER_VERTICAL | wx.RIGHT | wx.LEFT, 2) self.skillReqsStaticBitmap = wx.StaticBitmap(self) self.skillReqsStaticBitmap.SetBitmap(self.cleanSkills) mainSizer.Add(self.skillReqsStaticBitmap, 0, wx.ALIGN_CENTER_VERTICAL | wx.RIGHT | wx.LEFT, 3) self.skillReqsStaticBitmap.Bind(wx.EVT_RIGHT_UP, self.OnContextMenu) self.Bind(wx.EVT_CHOICE, self.charChanged) self.mainFrame.Bind(GE.CHAR_LIST_UPDATED, self.refreshCharacterList) self.mainFrame.Bind(GE.FIT_CHANGED, self.fitChanged) self.SetMinSize(wx.Size(25, -1)) self.toggleRefreshButton() self.charChoice.Enable(False)
def __init__(self, parent, stuff, item): wx.Panel.__init__(self, parent, style=wx.TAB_TRAVERSAL) # itemId is set by the parent. self.romanNb = ["0", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X"] self.skillIdHistory = [] mainSizer = wx.BoxSizer(wx.VERTICAL) self.reqTree = wx.TreeCtrl(self, style=wx.TR_DEFAULT_STYLE | wx.TR_HIDE_ROOT | wx.NO_BORDER) mainSizer.Add(self.reqTree, 1, wx.ALL | wx.EXPAND, 0) self.SetSizer(mainSizer) self.root = self.reqTree.AddRoot("WINRARZOR") self.reqTree.SetItemData(self.root, None) self.imageList = wx.ImageList(16, 16) self.reqTree.SetImageList(self.imageList) skillBookId = self.imageList.Add(BitmapLoader.getBitmap("skill_small", "gui")) self.getFullSkillTree(item, self.root, skillBookId) self.reqTree.ExpandAll() self.Layout()
def __init__(self, parent, categoryID, fittingInfo, size=(0, 16)): SFBrowserItem.__init__(self, parent, size=size) if categoryID: self.shipBmp = BitmapLoader.getBitmap("ship_small", "gui") else: self.shipBmp = wx.Bitmap(16, 16) self.dropShadowBitmap = drawUtils.CreateDropShadowBitmap(self.shipBmp, 0.2) self.categoryID = categoryID self.fittingInfo = fittingInfo self.shipBrowser = self.Parent.Parent self.padding = 4 self.fontBig = wx.Font(fonts.BIG, wx.SWISS, wx.NORMAL, wx.NORMAL) self.animTimerId = wx.NewId() self.animTimer = wx.Timer(self, self.animTimerId) self.animStep = 0 self.animPeriod = 10 self.animDuration = 100 self.Bind(wx.EVT_TIMER, self.OnTimer) # ===================================================================== # Disabled - it will be added as an option to Preferences self.animCount = 0
def __init__(self, parent, entityName): wx.Panel.__init__(self, parent, id=wx.ID_ANY, style=wx.TAB_TRAVERSAL) self.entityName = entityName self.validator = None self.navSizer = wx.BoxSizer(wx.HORIZONTAL) self.choices = [] self.choices.sort(key=lambda p: p.name) self.entityChoices = wx.Choice(self, choices=[p.name for p in self.choices]) self.navSizer.Add(self.entityChoices, 1, wx.ALL, 5) buttons = (("new", wx.ART_NEW, self.OnNew), ("rename", BitmapLoader.getBitmap("rename", "gui"), self.OnRename), ("copy", wx.ART_COPY, self.OnCopy), ("delete", wx.ART_DELETE, self.OnDelete)) size = None for name, art, func in buttons: bitmap = wx.ArtProvider.GetBitmap(art, wx.ART_BUTTON) if name != "rename" else art btn = wx.BitmapButton(self, wx.ID_ANY, bitmap) if size is None: size = btn.GetSize() btn.SetMinSize(size) btn.SetMaxSize(size) btn.SetToolTip("{} {}".format(name.capitalize(), self.entityName)) btn.Bind(wx.EVT_BUTTON, func) setattr(self, "btn%s" % name.capitalize(), btn) self.navSizer.Add(btn, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 2) self.SetSizer(self.navSizer) self.Layout() self.refreshEntityList()
def RebuildRaces(self, races): self.raceBmps = [] for race in races: if race: self.raceBmps.append(BitmapLoader.getBitmap("race_%s_small" % race, "gui")) self.raceNames = races self.CalcButtonsBarPos() self.Refresh()
def __init__(self, fittingView, params): ViewColumn.__init__(self, fittingView) self.mask = wx.LIST_MASK_IMAGE Attribute.getInstance().getAttributeInfo("capacitorNeed") self.imageId = fittingView.imageList.GetImageIndex("capacitorRecharge_small", "gui") self.bitmap = BitmapLoader.getBitmap("capacitorRecharge_small", "gui")
def addMarketViewImage(self, iconFile): if iconFile is None: return -1 bitmap = BitmapLoader.getBitmap(iconFile, "icons") if bitmap is None: return -1 else: return self.availableImplantsImageList.Add(bitmap)
def GetImageIndex(self, *loaderArgs): id_ = self.map.get(loaderArgs) if id_ is None: bitmap = BitmapLoader.getBitmap(*loaderArgs) if bitmap is None: return -1 id_ = self.map[loaderArgs] = wx.ImageList.Add(self, bitmap) return id_
def getIcons(self): icons = {} sAttr = Attribute.getInstance() for key, attrName in self.propertyAttributeMap.items(): iconFile = sAttr.getAttributeInfo(attrName).iconID bitmap = BitmapLoader.getBitmap(iconFile, "icons") if bitmap: icons[key] = bitmap return icons
def updateGraphWidgets(self): view = self.getView() view.clearCache() self.graphSubselSizer.Clear() self.inputsSizer.Clear() for child in self.graphCtrlPanel.Children: if child is not self.showY0Cb: child.Destroy() self.fields.clear() # Setup view options self.selectedYRbMap.clear() if len(view.yDefs) > 1: i = 0 for yAlias, yDef in view.yDefs.items(): if i == 0: rdo = wx.RadioButton(self.graphCtrlPanel, wx.ID_ANY, yDef.switchLabel, style=wx.RB_GROUP) else: rdo = wx.RadioButton(self.graphCtrlPanel, wx.ID_ANY, yDef.switchLabel) rdo.Bind(wx.EVT_RADIOBUTTON, self.OnYTypeUpdate) if i == (self.selectedY or 0): rdo.SetValue(True) self.graphSubselSizer.Add(rdo, 0, wx.ALL | wx.EXPAND, 0) self.selectedYRbMap[yDef.switchLabel] = i i += 1 # Setup inputs for fieldHandle, fieldDef in (('x', view.xDef), *view.extraInputs.items()): textBox = wx.TextCtrl(self.graphCtrlPanel, wx.ID_ANY, style=0) self.fields[fieldHandle] = textBox textBox.Bind(wx.EVT_TEXT, self.onFieldChanged) self.inputsSizer.Add(textBox, 1, wx.EXPAND | wx.ALIGN_CENTER_VERTICAL | wx.ALL, 3) if fieldDef.inputDefault is not None: inputDefault = fieldDef.inputDefault if not isinstance(inputDefault, str): inputDefault = ("%f" % inputDefault).rstrip("0") if inputDefault[-1:] == ".": inputDefault += "0" textBox.ChangeValue(inputDefault) imgLabelSizer = wx.BoxSizer(wx.HORIZONTAL) if fieldDef.inputIconID: icon = BitmapLoader.getBitmap(fieldDef.inputIconID, "icons") if icon is not None: static = wx.StaticBitmap(self.graphCtrlPanel) static.SetBitmap(icon) imgLabelSizer.Add(static, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 1) imgLabelSizer.Add(wx.StaticText(self.graphCtrlPanel, wx.ID_ANY, fieldDef.inputLabel), 0, wx.LEFT | wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, 3) self.inputsSizer.Add(imgLabelSizer, 0, wx.ALIGN_CENTER_VERTICAL) self.Layout() self.draw()
def addCharge(self, menu, charge): id_ = ContextMenuCombined.nextID() name = charge.name if charge is not None else "Empty" self.chargeIds[id_] = charge item = wx.MenuItem(menu, id_, name) menu.Bind(wx.EVT_MENU, self.handleAmmoSwitch, item) item.charge = charge if charge is not None and charge.iconID is not None: bitmap = BitmapLoader.getBitmap(charge.iconID, "icons") if bitmap is not None: item.SetBitmap(bitmap) return item
def __init__(self, parent): wx.Dialog.__init__(self, parent, id=wx.ID_ANY, size=wx.DefaultSize, style=wx.DEFAULT_DIALOG_STYLE) self.SetTitle("pyfa - Preferences") i = wx.Icon(BitmapLoader.getBitmap("preferences_small", "gui")) self.SetIcon(i) mainSizer = wx.BoxSizer(wx.VERTICAL) self.listbook = wx.Listbook(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LB_DEFAULT) self.listview = self.listbook.GetListView() # self.listview.SetMinSize((500, -1)) # self.listview.SetSize((500, -1)) self.imageList = wx.ImageList(32, 32) self.listbook.AssignImageList(self.imageList) mainSizer.Add(self.listbook, 1, wx.EXPAND | wx.TOP | wx.BOTTOM | wx.LEFT, 5) self.m_staticline2 = wx.StaticLine(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL) mainSizer.Add(self.m_staticline2, 0, wx.EXPAND, 5) btnSizer = wx.BoxSizer(wx.HORIZONTAL) btnSizer.AddStretchSpacer() self.btnOK = wx.Button(self, wx.ID_ANY, "OK", wx.DefaultPosition, wx.DefaultSize, 0) btnSizer.Add(self.btnOK, 0, wx.ALL, 5) mainSizer.Add(btnSizer, 0, wx.EXPAND, 5) self.SetSizer(mainSizer) self.Centre(wx.BOTH) for prefView in PreferenceView.views: page = wx.ScrolledWindow(self.listbook) page.SetScrollRate(15, 15) bmp = prefView.getImage() if bmp: imgID = self.imageList.Add(bmp) else: imgID = -1 prefView.populatePanel(page) self.listbook.AddPage(page, prefView.title, imageId=imgID) bestFit = self.GetBestVirtualSize() width = max(bestFit[0], 800 if "wxGTK" in wx.PlatformInfo else 650) height = max(bestFit[1], 550) self.SetSize(width, height) self.Layout() self.btnOK.Bind(wx.EVT_BUTTON, self.OnBtnOK) self.Bind(wx.EVT_CHAR_HOOK, self.kbEvent)
def __init__(self, fittingView, params=None): if params is None: params = {"showIcon": True, "displayName": False} ViewColumn.__init__(self, fittingView) if params["showIcon"]: self.imageId = fittingView.imageList.GetImageIndex("column_misc", "gui") self.bitmap = BitmapLoader.getBitmap("column_misc", "gui") self.mask = wx.LIST_MASK_IMAGE else: self.imageId = -1 if params["displayName"] or self.imageId == -1: self.columnText = "Misc data" self.mask |= wx.LIST_MASK_TEXT self.mainFrame = gui.mainFrame.MainFrame.getInstance() self.fittingView = fittingView
def addPattern(self, rootMenu, pattern): id = ContextMenuUnconditional.nextID() name = getattr(pattern, "_name", pattern.name) if pattern is not None else "No Profile" self.patternIds[id] = pattern menuItem = wx.MenuItem(rootMenu, id, name) rootMenu.Bind(wx.EVT_MENU, self.handlePatternSwitch, menuItem) # set pattern attr to menu item menuItem.pattern = pattern # determine active pattern sFit = Fit.getInstance() fitID = self.mainFrame.getActiveFit() fit = sFit.getFit(fitID) if fit: dp = fit.damagePattern if dp == pattern: bitmap = BitmapLoader.getBitmap("state_active_small", "gui") menuItem.SetBitmap(bitmap) return menuItem
def addPattern(self, rootMenu, pattern): id = ContextMenu.nextID() name = getattr(pattern, "_name", pattern.name) if pattern is not None else "No Profile" self.patternIds[id] = pattern item = wx.MenuItem(rootMenu, id, name) rootMenu.Bind(wx.EVT_MENU, self.handleResistSwitch, item) # set pattern attr to menu item item.pattern = pattern # determine active pattern sFit = Fit.getInstance() fitID = self.mainFrame.getActiveFit() f = sFit.getFit(fitID) tr = f.targetResists if tr == pattern: bitmap = BitmapLoader.getBitmap("state_active_small", "gui") item.SetBitmap(bitmap) return item
def getFullSkillTree(self, parentSkill, parent, sbIconId): levelToItems = {} for item, level in parentSkill.requiredFor.items(): if level not in levelToItems: levelToItems[level] = [] levelToItems[level].append(item) for x in sorted(levelToItems.keys()): items = levelToItems[x] items.sort(key=lambda x: x.name) child = self.reqTree.AppendItem(parent, "Level {}".format(self.romanNb[int(x)]), sbIconId) for item in items: if item.iconID: bitmap = BitmapLoader.getBitmap(item.iconID, "icons") itemIcon = self.imageList.Add(bitmap) if bitmap else -1 else: itemIcon = -1 self.reqTree.AppendItem(child, "{}".format(item.name), itemIcon)
def getSubMenu(self, context, mainItem, rootMenu, i, pitem): msw = True if "wxMSW" in wx.PlatformInfo else False self.skillIds = {} sub = wx.Menu() for skill in self.skills: skillItem = wx.MenuItem(sub, ContextMenuSingle.nextID(), skill.item.name) grandSub = wx.Menu() skillItem.SetSubMenu(grandSub) if skill.learned: bitmap = BitmapLoader.getBitmap("lvl%s" % skill.level, "gui") if bitmap is not None: skillItem.SetBitmap(bitmap) for i in range(-1, 6): levelItem = self.addSkill(rootMenu if msw else grandSub, skill, i) grandSub.Append(levelItem) if (not skill.learned and i == -1) or (skill.learned and skill.level == i): levelItem.Check(True) sub.Append(skillItem) return sub
def getSubMenu(self, context, selection, rootMenu, i, pitem): msw = True if "wxMSW" in wx.PlatformInfo else False if self.m[i] not in self.subMenus: # if we're trying to get submenu to something that shouldn't have one, # redirect event of the item to handlePatternSwitch and put pattern in # our patternIds mapping, then return None for no submenu id = pitem.GetId() self.patternIds[id] = self.singles[i] rootMenu.Bind(wx.EVT_MENU, self.handlePatternSwitch, pitem) if self.patternIds[id] == self.fit.damagePattern: bitmap = BitmapLoader.getBitmap("state_active_small", "gui") pitem.SetBitmap(bitmap) return False sub = wx.Menu() # Items that have a parent for pattern in self.subMenus[self.m[i]]: sub.Append(self.addPattern(rootMenu if msw else sub, pattern)) return sub
def __init__(self, fittingView, params): ViewColumn.__init__(self, fittingView) sAttr = Attribute.getInstance() info = sAttr.getAttributeInfo(params["attribute"]) self.info = info if params["showIcon"]: if info.name == "power": iconFile = "pg_small" iconType = "gui" else: iconFile = info.iconID iconType = "icons" if iconFile: self.imageId = fittingView.imageList.GetImageIndex(iconFile, iconType) self.bitmap = BitmapLoader.getBitmap(iconFile, iconType) else: self.imageId = -1 self.mask = wx.LIST_MASK_IMAGE else: self.imageId = -1 if params["displayName"] or self.imageId == -1: self.columnText = info.displayName if info.displayName != "" else info.name self.mask |= wx.LIST_MASK_IMAGE if params["direct"]: self.direct = True self.view = fittingView originalRefresh = fittingView.refresh sMkt = Market.getInstance() def refresh(stuff): # Hack into our master view and add a callback for ourselves to know when to query self.directInfo = sMkt.directAttrRequest(stuff, info) if stuff else None originalRefresh(stuff) fittingView.refresh = refresh
def __init__(self, fittingView, params=None): if params is None: params = {"showIcon": True, "displayName": False} ViewColumn.__init__(self, fittingView) sAttr = Attribute.getInstance() info = sAttr.getAttributeInfo("maxRange") self.info = info if params["showIcon"]: iconFile = info.iconID if iconFile: self.imageId = fittingView.imageList.GetImageIndex(iconFile, "icons") self.bitmap = BitmapLoader.getBitmap(iconFile, "icons") else: self.imageId = -1 self.mask = wx.LIST_MASK_IMAGE else: self.imageId = -1 if params["displayName"] or self.imageId == -1: self.columnText = info.displayName if info.displayName != "" else info.name self.mask |= wx.LIST_MASK_TEXT
def getSubMenu(self, context, mainItem, selection, rootMenu, i, pitem): msw = True if "wxMSW" in wx.PlatformInfo else False m = wx.Menu() self.chargeIds = {} hardpoint = self.module.hardpoint moduleName = self.module.item.name # Make sure we do not consider mining turrets as combat turrets if hardpoint == FittingHardpoint.TURRET and self.module.getModifiedItemAttr("miningAmount", None) is None: self.addSeperator(m, "Long Range") items = [] range_ = None nameBase = None sub = None chargesSorted = sorted(self.mainCharges, key=self.turretSorter) for charge in chargesSorted: if "civilian" in charge.name.lower(): continue currBase = charge.name.rsplit()[-2:] currRange = charge.getAttribute("weaponRangeMultiplier") if nameBase is None or range_ != currRange or nameBase != currBase: if sub is not None: self.addSeperator(sub, "More Damage") sub = None base = charge nameBase = currBase range_ = currRange item = self.addCharge(rootMenu if msw else m, charge) items.append(item) else: if sub is None and item and base: sub = wx.Menu() sub.Bind(wx.EVT_MENU, self.handleAmmoSwitch) self.addSeperator(sub, "Less Damage") item.SetSubMenu(sub) sub.Append(self.addCharge(rootMenu if msw else sub, base)) sub.Append(self.addCharge(rootMenu if msw else sub, charge)) if sub is not None: self.addSeperator(sub, "More Damage") for item in items: m.Append(item) self.addSeperator(m, "Short Range") elif hardpoint == FittingHardpoint.MISSILE and moduleName != 'Festival Launcher': type_ = None sub = None defender = None chargesSorted = sorted(self.mainCharges, key=self.missileSorter) for charge in chargesSorted: currType = self.damageInfo(charge)[0] if currType != type_ or type_ is None: if sub is not None: self.addSeperator(sub, "More Damage") type_ = currType item = wx.MenuItem(m, wx.ID_ANY, type_.capitalize()) bitmap = BitmapLoader.getBitmap("%s_small" % type_, "gui") if bitmap is not None: item.SetBitmap(bitmap) sub = wx.Menu() sub.Bind(wx.EVT_MENU, self.handleAmmoSwitch) self.addSeperator(sub, "Less Damage") item.SetSubMenu(sub) m.Append(item) if charge.name not in ("Light Defender Missile I", "Heavy Defender Missile I"): sub.Append(self.addCharge(rootMenu if msw else sub, charge)) else: defender = charge if defender is not None: m.Append(self.addCharge(rootMenu if msw else m, defender)) if sub is not None: self.addSeperator(sub, "More Damage") else: chargesSorted = sorted(self.mainCharges, key=self.nameSorter) for charge in chargesSorted: m.Append(self.addCharge(rootMenu if msw else m, charge)) m.Append(self.addCharge(rootMenu if msw else m, None)) return m
def __init__(self, mainFrame): pyfalog.debug("Initialize MainMenuBar") self.characterEditorId = wx.NewId() self.damagePatternEditorId = wx.NewId() self.targetProfileEditorId = wx.NewId() self.implantSetEditorId = wx.NewId() self.graphFrameId = wx.NewId() self.backupFitsId = wx.NewId() self.exportSkillsNeededId = wx.NewId() self.importCharacterId = wx.NewId() self.exportHtmlId = wx.NewId() self.wikiId = wx.NewId() self.forumId = wx.NewId() self.saveCharId = wx.NewId() self.saveCharAsId = wx.NewId() self.revertCharId = wx.NewId() self.eveFittingsId = wx.NewId() self.exportToEveId = wx.NewId() self.ssoLoginId = wx.NewId() self.attrEditorId = wx.NewId() self.toggleOverridesId = wx.NewId() self.toggleIgnoreRestrictionID = wx.NewId() self.devToolsId = wx.NewId() self.optimizeFitPrice = wx.NewId() self.mainFrame = mainFrame wx.MenuBar.__init__(self) # File menu fileMenu = wx.Menu() self.Append(fileMenu, "&File") fileMenu.Append(self.mainFrame.addPageId, "&New Tab\tCTRL+T", "Open a new fitting tab") fileMenu.Append(self.mainFrame.closePageId, "&Close Tab\tCTRL+W", "Close the current fit") fileMenu.Append(self.mainFrame.closeAllPagesId, "&Close All Tabs\tCTRL+ALT+W", "Close all open fits") fileMenu.AppendSeparator() fileMenu.Append(self.backupFitsId, "&Backup All Fittings", "Backup all fittings to a XML file") fileMenu.Append(self.exportHtmlId, "Export All Fittings to &HTML", "Export fits to HTML file (set in Preferences)") fileMenu.AppendSeparator() fileMenu.Append(wx.ID_EXIT) # Fit menu fitMenu = wx.Menu() self.Append(fitMenu, "Fi&t") fitMenu.Append(wx.ID_UNDO) fitMenu.Append(wx.ID_REDO) fitMenu.AppendSeparator() fitMenu.Append(wx.ID_COPY, "&To Clipboard\tCTRL+C", "Export a fit to the clipboard") fitMenu.Append(wx.ID_PASTE, "&From Clipboard\tCTRL+V", "Import a fit from the clipboard") fitMenu.AppendSeparator() fitMenu.Append(wx.ID_OPEN, "&Import Fittings\tCTRL+O", "Import fittings into pyfa") fitMenu.Append(wx.ID_SAVEAS, "&Export Fitting\tCTRL+S", "Export fitting to another format") fitMenu.AppendSeparator() fitMenu.Append(self.optimizeFitPrice, "&Optimize Fit Price\tCTRL+D") graphFrameItem = wx.MenuItem(fitMenu, self.graphFrameId, "&Graphs\tCTRL+G") graphFrameItem.SetBitmap(BitmapLoader.getBitmap("graphs_small", "gui")) fitMenu.Append(graphFrameItem) if not graphs.graphFrame_enabled: self.Enable(self.graphFrameId, False) self.ignoreRestrictionItem = fitMenu.Append( self.toggleIgnoreRestrictionID, "Disable Fitting Re&strictions") fitMenu.AppendSeparator() fitMenu.Append(self.eveFittingsId, "&Browse ESI Fittings\tCTRL+B") fitMenu.Append(self.exportToEveId, "E&xport to ESI\tCTRL+E") self.Enable(self.eveFittingsId, True) self.Enable(self.exportToEveId, True) # Character menu characterMenu = wx.Menu() self.Append(characterMenu, "&Character") characterMenu.Append(self.saveCharId, "&Save Character") characterMenu.Append(self.saveCharAsId, "Save Character &As...") characterMenu.Append(self.revertCharId, "&Revert Character") characterMenu.AppendSeparator() characterMenu.Append(self.importCharacterId, "&Import Character File", "Import characters into pyfa from file") characterMenu.Append(self.exportSkillsNeededId, "&Export Skills Needed", "Export skills needed for this fitting") characterMenu.AppendSeparator() characterMenu.Append(self.ssoLoginId, "&Manage ESI Characters") # Global Menu globalMenu = wx.Menu() if not self.mainFrame.disableOverrideEditor: attrItem = wx.MenuItem(globalMenu, self.attrEditorId, "Attribute &Overrides") attrItem.SetBitmap( BitmapLoader.getBitmap("fit_rename_small", "gui")) globalMenu.Append(attrItem) globalMenu.Append(self.toggleOverridesId, "&Turn Overrides On") globalMenu.AppendSeparator() self.Append(globalMenu, "&Global") preferencesShortCut = "CTRL+," if 'wxMac' in wx.PlatformInfo else "CTRL+P" preferencesItem = wx.MenuItem(globalMenu, wx.ID_PREFERENCES, "&Preferences\t" + preferencesShortCut) preferencesItem.SetBitmap( BitmapLoader.getBitmap("preferences_small", "gui")) globalMenu.Append(preferencesItem) # Editors menu editorsMenu = wx.Menu() self.Append(editorsMenu, "&Editors") charEditItem = wx.MenuItem(editorsMenu, self.characterEditorId, "&Character Editor\tCTRL+K") charEditItem.SetBitmap(BitmapLoader.getBitmap("character_small", "gui")) editorsMenu.Append(charEditItem) implantSetEditItem = wx.MenuItem(editorsMenu, self.implantSetEditorId, "&Implant Set Editor\tCTRL+I") implantSetEditItem.SetBitmap( BitmapLoader.getBitmap("hardwire_small", "gui")) editorsMenu.Append(implantSetEditItem) damagePatternEditItem = wx.MenuItem(editorsMenu, self.damagePatternEditorId, "&Damage Pattern Editor") damagePatternEditItem.SetBitmap( BitmapLoader.getBitmap("damagePattern_small", "gui")) editorsMenu.Append(damagePatternEditItem) targetProfileEditItem = wx.MenuItem(editorsMenu, self.targetProfileEditorId, "&Target Profile Editor") targetProfileEditItem.SetBitmap( BitmapLoader.getBitmap("explosive_small", "gui")) editorsMenu.Append(targetProfileEditItem) # Help menu helpMenu = wx.Menu() self.Append(helpMenu, "&Help") helpMenu.Append(self.wikiId, "&Wiki", "Go to wiki on GitHub") helpMenu.Append(self.forumId, "&Forums", "Go to EVE Online Forum thread") helpMenu.AppendSeparator() helpMenu.Append(wx.ID_ABOUT) if config.debug: helpMenu.Append(self.mainFrame.widgetInspectMenuID, "Open Wid&gets Inspect tool", "Open Widgets Inspect tool") helpMenu.Append(self.devToolsId, "Open &Dev Tools", "Dev Tools") self.mainFrame.Bind(GE.FIT_CHANGED, self.fitChanged) self.mainFrame.Bind(GE.FIT_RENAMED, self.fitRenamed)
def buildAttributeView(self, root): """ We first build a usable dictionary of items. The key is either a fit if the afflictions stem from a projected fit, or self.stuff if they are local afflictions (everything else, even gang boosts at this time) The value of this is yet another dictionary in the following format: "attribute name": { "Module Name": [ class of affliction, affliction item (required due to GH issue #335) modifier type amount of modification whether this affliction was projected ] } """ attributes = self.stuff.itemModifiedAttributes if self.item == self.stuff.item else self.stuff.chargeModifiedAttributes container = {} for attrName in attributes.iterAfflictions(): # if value is 0 or there has been no change from original to modified, return if attributes[attrName] == (attributes.getOriginal(attrName, 0)): continue for fit, afflictors in attributes.getAfflictions(attrName).items(): for afflictor, operator, stackingGroup, preResAmount, postResAmount, used in afflictors: if not used or afflictor.item is None: continue if fit.ID != self.activeFit: # affliction fit does not match our fit if fit not in container: container[fit] = {} items = container[fit] else: # local afflictions if self.stuff not in container: container[self.stuff] = {} items = container[self.stuff] # items hold our module: info mappings if attrName not in items: items[attrName] = [] if afflictor == self.stuff and getattr(afflictor, 'charge', None): # we are showing a charges modifications, see #335 item = afflictor.charge else: item = afflictor.item items[attrName].append(( type(afflictor), afflictor, item, formatOperator(operator, stackingGroup, preResAmount, postResAmount), postResAmount, getattr(afflictor, "projected", False))) # Make sure projected fits are on top rootOrder = list(container.keys()) rootOrder.sort(key=lambda x: self.ORDER.index(type(x))) # Now, we take our created dictionary and start adding stuff to our tree for thing in rootOrder: # This block simply directs which parent we are adding to (root or projected fit) if thing == self.stuff: parent = root else: # projected fit icon = self.imageList.Add(BitmapLoader.getBitmap("ship_small", "gui")) child = self.affectedBy.AppendItem(root, "{} ({})".format(thing.name, thing.ship.item.name), icon) parent = child attributes = container[thing] attrOrder = sorted(list(attributes.keys()), key=self.sortAttrDisplayName) for attrName in attrOrder: attrInfo = self.stuff.item.attributes.get(attrName) displayName = attrInfo.displayName if attrInfo and attrInfo.displayName else attrName if attrInfo: if attrInfo.iconID is not None: iconFile = attrInfo.iconID icon = BitmapLoader.getBitmap(iconFile, "icons") if icon is None: icon = BitmapLoader.getBitmap("transparent16x16", "gui") attrIcon = self.imageList.Add(icon) else: attrIcon = self.imageList.Add(BitmapLoader.getBitmap("0", "icons")) else: attrIcon = self.imageList.Add(BitmapLoader.getBitmap("0", "icons")) if self.showRealNames: display = attrName saved = displayName else: display = displayName saved = attrName # this is the attribute node child = self.affectedBy.AppendItem(parent, display, attrIcon) self.affectedBy.SetItemData(child, saved) self.treeItems.append(child) items = attributes[attrName] items.sort(key=lambda x: self.ORDER.index(x[0])) for itemInfo in items: afflictorType, afflictor, item, attrModifier, attrAmount, projected = itemInfo if afflictorType == Ship: itemIcon = self.imageList.Add(BitmapLoader.getBitmap("ship_small", "gui")) elif item.iconID: bitmap = BitmapLoader.getBitmap(item.iconID, "icons") itemIcon = self.imageList.Add(bitmap) if bitmap else -1 else: itemIcon = -1 displayStr = item.name if projected: displayStr += " (projected)" penalized = "" if '*' in attrModifier: if 's' in attrModifier: penalized += "(penalized)" if 'r' in attrModifier: penalized += "(resisted)" attrModifier = "*" if attrModifier == "+" and attrAmount < 0: attrModifier = "-" attrAmount = -attrAmount # this is the Module node, the attribute will be attached to this display = "%s %s %.2f %s" % (displayStr, attrModifier, attrAmount, penalized) treeItem = self.affectedBy.AppendItem(child, display, itemIcon) self.affectedBy.SetItemData(treeItem, afflictor)
def getImage(self): return BitmapLoader.getBitmap("settings_market", "gui")
def __init__(self, parent): super().__init__(parent, wx.ID_ANY, title=_t("Attribute Editor"), pos=wx.DefaultPosition, size=wx.Size(650, 600), resizeable=True) i = wx.Icon(BitmapLoader.getBitmap("fit_rename_small", "gui")) self.SetIcon(i) self.mainFrame = parent menubar = wx.MenuBar() fileMenu = wx.Menu() fileImport = fileMenu.Append(wx.ID_ANY, _t('Import'), _t('Import overrides')) fileExport = fileMenu.Append(wx.ID_ANY, _t('Export'), _t('Import overrides')) fileClear = fileMenu.Append(wx.ID_ANY, _t('Clear All'), _t('Clear all overrides')) menubar.Append(fileMenu, _t('&File')) self.SetMenuBar(menubar) self.Bind(wx.EVT_MENU, self.OnImport, fileImport) self.Bind(wx.EVT_MENU, self.OnExport, fileExport) self.Bind(wx.EVT_MENU, self.OnClear, fileClear) i = wx.Icon(BitmapLoader.getBitmap("fit_rename_small", "gui")) self.SetIcon(i) self.mainFrame = parent self.panel = panel = wx.Panel(self, wx.ID_ANY) mainSizer = wx.BoxSizer(wx.HORIZONTAL) leftSizer = wx.BoxSizer(wx.VERTICAL) leftPanel = wx.Panel(panel, wx.ID_ANY, style=wx.DOUBLE_BORDER if 'wxMSW' in wx.PlatformInfo else wx.SIMPLE_BORDER) self.searchBox = SearchBox(leftPanel) self.itemView = ItemView(leftPanel) leftSizer.Add(self.searchBox, 0, wx.EXPAND) leftSizer.Add(self.itemView, 1, wx.EXPAND) leftPanel.SetSizer(leftSizer) mainSizer.Add(leftPanel, 1, wx.ALL | wx.EXPAND, 5) rightSizer = wx.BoxSizer(wx.VERTICAL) self.btnRemoveOverrides = wx.Button(panel, wx.ID_ANY, _t("Remove Overides for Item"), wx.DefaultPosition, wx.DefaultSize, 0) self.pg = AttributeGrid(panel) rightSizer.Add(self.pg, 1, wx.ALL | wx.EXPAND, 5) rightSizer.Add(self.btnRemoveOverrides, 0, wx.ALL | wx.EXPAND, 5) self.btnRemoveOverrides.Bind(wx.EVT_BUTTON, self.pg.removeOverrides) self.btnRemoveOverrides.Enable(False) mainSizer.Add(rightSizer, 1, wx.EXPAND) panel.SetSizer(mainSizer) mainSizer.SetSizeHints(panel) sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(panel, 1, wx.EXPAND) self.SetSizer(sizer) self.SetAutoLayout(True) self.SetMinSize(self.GetSize()) self.Bind(wx.EVT_CLOSE, self.OnClose) self.Bind(wx.EVT_CHAR_HOOK, self.kbEvent)
def __init__(self, fittingView, params): ViewColumn.__init__(self, fittingView) self.mask = wx.LIST_MASK_IMAGE self.bitmap = BitmapLoader.getBitmap("totalPrice_small", "gui") self.imageId = fittingView.imageList.GetImageIndex("totalPrice_small", "gui")
def __init__(self, parent): super().__init__( parent, id=wx.ID_ANY, title="Target Profile Editor", resizeable=True, # Dropdown list widget is scaled to its longest content line on GTK, adapt to that size=wx.Size(500, 240) if "wxGTK" in wx.PlatformInfo else wx.Size( 350, 240)) self.mainFrame = gui.mainFrame.MainFrame.getInstance() self.block = False self.SetSizeHints(wx.DefaultSize, wx.DefaultSize) mainSizer = wx.BoxSizer(wx.VERTICAL) self.entityEditor = TargetProfileEntityEditor(parent=self) mainSizer.Add(self.entityEditor, 0, wx.ALL | wx.EXPAND, 2) self.sl = wx.StaticLine(self) mainSizer.Add(self.sl, 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 5) contentSizer = wx.BoxSizer(wx.VERTICAL) resistEditSizer = wx.FlexGridSizer(2, 6, 0, 2) resistEditSizer.AddGrowableCol(0) resistEditSizer.AddGrowableCol(5) resistEditSizer.SetFlexibleDirection(wx.BOTH) resistEditSizer.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED) defSize = wx.Size(50, -1) for i, type_ in enumerate(self.DAMAGE_TYPES): if i % 2: style = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT | wx.LEFT border = 25 else: style = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT border = 5 ttText = self.DAMAGE_TYPES[type_] bmp = wx.StaticBitmap( self, wx.ID_ANY, BitmapLoader.getBitmap("%s_big" % type_, "gui")) bmp.SetToolTip(wx.ToolTip(ttText)) resistEditSizer.Add(bmp, 0, style, border) # set text edit editBox = FloatBox(parent=self, id=wx.ID_ANY, value=None, pos=wx.DefaultPosition, size=defSize, validator=ResistValidator()) editBox.SetToolTip(wx.ToolTip(ttText)) self.Bind(event=wx.EVT_TEXT, handler=self.OnFieldChanged, source=editBox) setattr(self, '{}Edit'.format(type_), editBox) resistEditSizer.Add(editBox, 0, wx.BOTTOM | wx.TOP | wx.ALIGN_CENTER_VERTICAL, 5) unit = wx.StaticText(self, wx.ID_ANY, "%", wx.DefaultPosition, wx.DefaultSize, 0) unit.SetToolTip(wx.ToolTip(ttText)) resistEditSizer.Add(unit, 0, wx.BOTTOM | wx.TOP | wx.ALIGN_CENTER_VERTICAL, 5) contentSizer.Add(resistEditSizer, 0, wx.EXPAND | wx.ALL, 5) miscAttrSizer = wx.BoxSizer(wx.HORIZONTAL) miscAttrSizer.AddStretchSpacer() for attr in self.ATTRIBUTES: leftPad = 25 if attr != list(self.ATTRIBUTES)[0] else 0 ttText, unitText = self.ATTRIBUTES[attr] bmp = wx.StaticBitmap( self, wx.ID_ANY, BitmapLoader.getBitmap("%s_big" % attr, "gui")) bmp.SetToolTip(wx.ToolTip(ttText)) miscAttrSizer.Add( bmp, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT | wx.LEFT, leftPad) # set text edit editBox = FloatBox(parent=self, id=wx.ID_ANY, value=None, pos=wx.DefaultPosition, size=defSize) editBox.SetToolTip(wx.ToolTip(ttText)) self.Bind(event=wx.EVT_TEXT, handler=self.OnFieldChanged, source=editBox) setattr(self, '{}Edit'.format(attr), editBox) miscAttrSizer.Add(editBox, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5) unit = wx.StaticText(self, wx.ID_ANY, unitText, wx.DefaultPosition, wx.DefaultSize, 0) unit.SetToolTip(wx.ToolTip(ttText)) miscAttrSizer.Add(unit, 0, wx.BOTTOM | wx.TOP | wx.ALIGN_CENTER_VERTICAL, 5) miscAttrSizer.AddStretchSpacer() contentSizer.Add(miscAttrSizer, 1, wx.EXPAND | wx.ALL, 5) self.slfooter = wx.StaticLine(self) contentSizer.Add(self.slfooter, 0, wx.EXPAND | wx.TOP, 5) footerSizer = wx.BoxSizer(wx.HORIZONTAL) perSizer = wx.BoxSizer(wx.VERTICAL) self.stNotice = wx.StaticText(self, wx.ID_ANY, "") self.stNotice.Wrap(-1) perSizer.Add(self.stNotice, 0, wx.BOTTOM | wx.TOP | wx.LEFT, 5) footerSizer.Add(perSizer, 1, wx.ALIGN_CENTER_VERTICAL, 5) self.totSizer = wx.BoxSizer(wx.VERTICAL) contentSizer.Add(footerSizer, 0, wx.EXPAND, 5) mainSizer.Add(contentSizer, 1, wx.EXPAND, 0) self.SetSizer(mainSizer) 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, name, btn) btn.Enable(True) btn.SetToolTip("%s profiles %s clipboard" % (name, direction)) footerSizer.Add(btn, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_RIGHT) btn.Bind(wx.EVT_BUTTON, getattr(self, "{}Patterns".format(name.lower()))) if not self.entityEditor.checkEntitiesExist(): self.Close() return self.Layout() bsize = self.GetBestSize() self.SetSize((-1, bsize.height)) self.SetMinSize(self.GetSize()) self.CenterOnParent() self.Bind(wx.EVT_CHOICE, self.patternChanged) self.Bind(wx.EVT_CHAR_HOOK, self.kbEvent) self.inputTimer = wx.Timer(self) self.Bind(wx.EVT_TIMER, self.OnInputTimer, self.inputTimer) self.patternChanged()
def __init__(self, parent): wx.Frame.__init__(self, parent, id=wx.ID_ANY, title="pyfa: Character Editor", pos=wx.DefaultPosition, size=wx.Size(640, 600), style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER) i = wx.Icon(BitmapLoader.getBitmap("character_small", "gui")) self.SetIcon(i) self.mainFrame = parent # self.disableWin = wx.WindowDisabler(self) sFit = Fit.getInstance() self.SetBackgroundColour( wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNFACE)) mainSizer = wx.BoxSizer(wx.VERTICAL) self.entityEditor = CharacterEntityEditor(self) mainSizer.Add(self.entityEditor, 0, wx.ALL | wx.EXPAND, 2) # Default drop down to current fit's character self.entityEditor.setActiveEntity(sFit.character) self.viewsNBContainer = wx.Notebook(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, 0) self.sview = SkillTreeView(self.viewsNBContainer) self.iview = ImplantEditorView(self.viewsNBContainer, self) self.aview = APIView(self.viewsNBContainer) self.viewsNBContainer.AddPage(self.sview, "Skills") self.viewsNBContainer.AddPage(self.iview, "Implants") self.viewsNBContainer.AddPage(self.aview, "EVE SSO") mainSizer.Add(self.viewsNBContainer, 1, wx.EXPAND | wx.ALL, 5) bSizerButtons = wx.BoxSizer(wx.HORIZONTAL) self.btnSaveChar = wx.Button(self, wx.ID_ANY, "Save") self.btnSaveAs = wx.Button(self, wx.ID_ANY, "Save As...") self.btnRevert = wx.Button(self, wx.ID_ANY, "Revert") self.btnOK = wx.Button(self, wx.ID_OK) bSizerButtons.Add(self.btnSaveChar, 0, wx.ALL, 5) bSizerButtons.Add(self.btnSaveAs, 0, wx.ALL, 5) bSizerButtons.Add(self.btnRevert, 0, wx.ALL, 5) bSizerButtons.AddStretchSpacer() bSizerButtons.Add(self.btnOK, 0, wx.ALL, 5) self.btnSaveChar.Bind(wx.EVT_BUTTON, self.saveChar) self.btnSaveAs.Bind(wx.EVT_BUTTON, self.saveCharAs) self.btnRevert.Bind(wx.EVT_BUTTON, self.revertChar) self.btnOK.Bind(wx.EVT_BUTTON, self.editingFinished) mainSizer.Add(bSizerButtons, 0, wx.EXPAND, 5) self.btnRestrict() self.SetSizer(mainSizer) self.Layout() self.Centre(wx.BOTH) self.Bind(wx.EVT_CLOSE, self.closeEvent) self.Bind(GE.CHAR_LIST_UPDATED, self.refreshCharacterList) self.entityEditor.Bind(wx.EVT_CHOICE, self.charChanged) self.charChanged(None)
def __init__(self, mainFrame): pyfalog.debug("Initialize MainMenuBar") self.characterEditorId = wx.NewId() self.damagePatternEditorId = wx.NewId() self.targetResistsEditorId = wx.NewId() self.implantSetEditorId = wx.NewId() self.graphFrameId = wx.NewId() self.backupFitsId = wx.NewId() self.exportSkillsNeededId = wx.NewId() self.importCharacterId = wx.NewId() self.exportHtmlId = wx.NewId() self.wikiId = wx.NewId() self.forumId = wx.NewId() self.saveCharId = wx.NewId() self.saveCharAsId = wx.NewId() self.revertCharId = wx.NewId() self.eveFittingsId = wx.NewId() self.exportToEveId = wx.NewId() self.ssoLoginId = wx.NewId() self.attrEditorId = wx.NewId() self.toggleOverridesId = wx.NewId() self.importDatabaseDefaultsId = wx.NewId() self.toggleIgnoreRestrictionID = wx.NewId() self.devToolsId = wx.NewId() # pheonix: evaluate if this is needed if 'wxMac' in wx.PlatformInfo and wx.VERSION >= (3, 0): wx.ID_COPY = wx.NewId() wx.ID_PASTE = wx.NewId() self.mainFrame = mainFrame wx.MenuBar.__init__(self) # File menu fileMenu = wx.Menu() self.Append(fileMenu, "&File") fileMenu.Append(self.mainFrame.addPageId, "&New Tab\tCTRL+T", "Open a new fitting tab") fileMenu.Append(self.mainFrame.closePageId, "&Close Tab\tCTRL+W", "Close the current fit") fileMenu.AppendSeparator() fileMenu.Append(self.backupFitsId, "&Backup All Fittings", "Backup all fittings to a XML file") fileMenu.Append(wx.ID_OPEN, "&Import Fittings\tCTRL+O", "Import fittings into pyfa") fileMenu.Append(wx.ID_SAVEAS, "&Export Fitting\tCTRL+S", "Export fitting to another format") fileMenu.AppendSeparator() fileMenu.Append(self.exportHtmlId, "Export HTML", "Export fits to HTML file (set in Preferences)") fileMenu.Append(self.exportSkillsNeededId, "Export &Skills Needed", "Export skills needed for this fitting") fileMenu.Append(self.importCharacterId, "Import C&haracter File", "Import characters into pyfa from file") fileMenu.AppendSeparator() fileMenu.Append(wx.ID_EXIT) # Edit menu editMenu = wx.Menu() self.Append(editMenu, "&Edit") # editMenu.Append(wx.ID_UNDO) # editMenu.Append(wx.ID_REDO) editMenu.Append(wx.ID_COPY, "To Clipboard\tCTRL+C", "Export a fit to the clipboard") editMenu.Append(wx.ID_PASTE, "From Clipboard\tCTRL+V", "Import a fit from the clipboard") editMenu.AppendSeparator() editMenu.Append(self.saveCharId, "Save Character") editMenu.Append(self.saveCharAsId, "Save Character As...") editMenu.Append(self.revertCharId, "Revert Character") editMenu.AppendSeparator() self.ignoreRestrictionItem = editMenu.Append( self.toggleIgnoreRestrictionID, "Ignore Fitting Restrictions") # Character menu windowMenu = wx.Menu() self.Append(windowMenu, "&Window") charEditItem = wx.MenuItem(windowMenu, self.characterEditorId, "&Character Editor\tCTRL+E") charEditItem.SetBitmap(BitmapLoader.getBitmap("character_small", "gui")) windowMenu.Append(charEditItem) damagePatternEditItem = wx.MenuItem(windowMenu, self.damagePatternEditorId, "Damage Pattern Editor\tCTRL+D") damagePatternEditItem.SetBitmap( BitmapLoader.getBitmap("damagePattern_small", "gui")) windowMenu.Append(damagePatternEditItem) targetResistsEditItem = wx.MenuItem(windowMenu, self.targetResistsEditorId, "Target Resists Editor\tCTRL+R") targetResistsEditItem.SetBitmap( BitmapLoader.getBitmap("explosive_small", "gui")) windowMenu.Append(targetResistsEditItem) implantSetEditItem = wx.MenuItem(windowMenu, self.implantSetEditorId, "Implant Set Editor\tCTRL+I") implantSetEditItem.SetBitmap( BitmapLoader.getBitmap("hardwire_small", "gui")) windowMenu.Append(implantSetEditItem) graphFrameItem = wx.MenuItem(windowMenu, self.graphFrameId, "Graphs\tCTRL+G") graphFrameItem.SetBitmap(BitmapLoader.getBitmap("graphs_small", "gui")) windowMenu.Append(graphFrameItem) if not gui.graphFrame.graphFrame_enabled: self.Enable(self.graphFrameId, False) preferencesShortCut = "CTRL+," if 'wxMac' in wx.PlatformInfo else "CTRL+P" preferencesItem = wx.MenuItem(windowMenu, wx.ID_PREFERENCES, "Preferences\t" + preferencesShortCut) preferencesItem.SetBitmap( BitmapLoader.getBitmap("preferences_small", "gui")) windowMenu.Append(preferencesItem) # self.sEsi = Crest.getInstance() # CREST Menu esiMMenu = wx.Menu() self.Append(esiMMenu, "EVE &SSO") esiMMenu.Append(self.ssoLoginId, "Manage Characters") esiMMenu.Append(self.eveFittingsId, "Browse EVE Fittings") esiMMenu.Append(self.exportToEveId, "Export To EVE") # if self.sEsi.settings.get('mode') == CrestModes.IMPLICIT or len(self.sEsi.getCrestCharacters()) == 0: self.Enable(self.eveFittingsId, True) self.Enable(self.exportToEveId, True) if not self.mainFrame.disableOverrideEditor: windowMenu.AppendSeparator() attrItem = wx.MenuItem(windowMenu, self.attrEditorId, "Attribute Overrides\tCTRL+B") attrItem.SetBitmap( BitmapLoader.getBitmap("fit_rename_small", "gui")) windowMenu.Append(attrItem) windowMenu.Append(self.toggleOverridesId, "Turn Overrides On") # Help menu helpMenu = wx.Menu() self.Append(helpMenu, "&Help") helpMenu.Append(self.wikiId, "Wiki", "Go to wiki on GitHub") helpMenu.Append(self.forumId, "Forums", "Go to EVE Online Forum thread") helpMenu.AppendSeparator() helpMenu.Append(self.importDatabaseDefaultsId, "Import D&atabase Defaults", "Imports missing database defaults") helpMenu.AppendSeparator() helpMenu.Append(wx.ID_ABOUT) if config.debug: helpMenu.Append(self.mainFrame.widgetInspectMenuID, "Open Widgets Inspect tool", "Open Widgets Inspect tool") helpMenu.Append(self.devToolsId, "Open Dev Tools", "Dev Tools") self.mainFrame.Bind(GE.FIT_CHANGED, self.fitChanged)
def GetData(self, attr, displayOveride = None): info = self.attrInfo.get(attr) att = self.attrValues[attr] # If we're working with a stuff object, we should get the original value from our getItemBaseAttrValue function, # which will return the value with respect to the effective base (with mutators / overrides in place) valDefault = getattr(info, "value", None) # Get default value from attribute if self.stuff is not None: # if it's a stuff, overwrite default (with fallback to current value) if self.stuff.item == self.item: valDefault = self.stuff.getItemBaseAttrValue(attr, valDefault) elif self.stuff.charge == self.item: valDefault = self.stuff.getChargeBaseAttrValue(attr, valDefault) valueDefault = valDefault if valDefault is not None else att val = getattr(att, "value", None) value = val if val is not None else att if self.toggleView == AttributeView.NORMAL and ((attr not in GroupedAttributes and not (value or valueDefault)) or info is None or not info.published or attr in RequiredSkillAttrs): return None if info and info.displayName and self.toggleView == AttributeView.NORMAL: attrName = displayOveride or info.displayName else: attrName = attr if info and config.debug: attrName += " ({})".format(info.ID) if info: if info.iconID is not None: iconFile = info.iconID icon = BitmapLoader.getBitmap(iconFile, "icons") if icon is None: attrIcon = self.blank_icon else: attrIcon = self.imageList.Add(icon) else: attrIcon = self.unknown_icon else: attrIcon = self.unknown_icon # index = self.paramList.AppendItem(root, attrName) # idNameMap[idCount] = attrName # self.paramList.SetPyData(index, idCount) # idCount += 1 if self.toggleView == AttributeView.RAW: valueUnit = str(value) elif info and info.unit: valueUnit = self.FormatValue(*info.unit.PreformatValue(value)) else: valueUnit = formatAmount(value, 3, 0, 0) if self.toggleView == AttributeView.RAW: valueUnitDefault = str(valueDefault) elif info and info.unit: valueUnitDefault = self.FormatValue(*info.unit.PreformatValue(valueDefault)) else: valueUnitDefault = formatAmount(valueDefault, 3, 0, 0) # todo: attribute that point to another item should load that item's icon. return (attrIcon, attrName, valueUnit, valueUnitDefault)
def getSubMenu(self, context, selection, rootMenu, i, pitem): msw = True if "wxMSW" in wx.PlatformInfo else False m = wx.Menu() self.chargeIds = {} hardpoint = self.module.hardpoint moduleName = self.module.item.name # Make sure we do not consider mining turrets as combat turrets if hardpoint == FittingHardpoint.TURRET and self.module.getModifiedItemAttr( "miningAmount", None) is None: self.addSeperator(m, "Long Range") items = [] range_ = None nameBase = None sub = None self.charges.sort(key=self.turretSorter) for charge in self.charges: if "civilian" in charge.name.lower(): continue currBase = charge.name.rsplit()[-2:] currRange = charge.getAttribute("weaponRangeMultiplier") if nameBase is None or range_ != currRange or nameBase != currBase: if sub is not None: self.addSeperator(sub, "More Damage") sub = None base = charge nameBase = currBase range_ = currRange item = self.addCharge(rootMenu if msw else m, charge) items.append(item) else: if sub is None and item and base: sub = wx.Menu() sub.Bind(wx.EVT_MENU, self.handleAmmoSwitch) self.addSeperator(sub, "Less Damage") item.SetSubMenu(sub) sub.Append( self.addCharge(rootMenu if msw else sub, base)) sub.Append(self.addCharge(rootMenu if msw else sub, charge)) if sub is not None: self.addSeperator(sub, "More Damage") for item in items: m.Append(item) self.addSeperator(m, "Short Range") elif hardpoint == FittingHardpoint.MISSILE and moduleName != 'Festival Launcher': self.charges.sort(key=self.missileSorter) type_ = None sub = None defender = None for charge in self.charges: currType = self.damageInfo(charge)[0] if currType != type_ or type_ is None: if sub is not None: self.addSeperator(sub, "More Damage") type_ = currType item = wx.MenuItem(m, wx.ID_ANY, type_.capitalize()) bitmap = BitmapLoader.getBitmap("%s_small" % type_, "gui") if bitmap is not None: item.SetBitmap(bitmap) sub = wx.Menu() sub.Bind(wx.EVT_MENU, self.handleAmmoSwitch) self.addSeperator(sub, "Less Damage") item.SetSubMenu(sub) m.Append(item) if charge.name not in ("Light Defender Missile I", "Heavy Defender Missile I"): sub.Append(self.addCharge(rootMenu if msw else sub, charge)) else: defender = charge if defender is not None: m.Append(self.addCharge(rootMenu if msw else m, defender)) if sub is not None: self.addSeperator(sub, "More Damage") else: self.charges.sort(key=self.nameSorter) for charge in self.charges: m.Append(self.addCharge(rootMenu if msw else m, charge)) m.Append(self.addCharge(rootMenu if msw else m, None)) return m
def __init__(self, parent, shipID=None, shipFittingInfo=("Test", "TestTrait", 2), itemData=None, graphicID=None, id=wx.ID_ANY, pos=wx.DefaultPosition, size=(0, 40), style=0): SFItem.SFBrowserItem.__init__(self, parent, size=size) self.mainFrame = gui.mainFrame.MainFrame.getInstance() self._itemData = itemData self.shipRace = itemData self.shipID = shipID self.fontBig = wx.Font(fonts.BIG, wx.SWISS, wx.NORMAL, wx.BOLD) self.fontNormal = wx.Font(fonts.NORMAL, wx.SWISS, wx.NORMAL, wx.NORMAL) self.fontSmall = wx.Font(fonts.SMALL, wx.SWISS, wx.NORMAL, wx.NORMAL) self.shipBmp = None if graphicID: self.shipBmp = BitmapLoader.getBitmap(str(graphicID), "renders") if not self.shipBmp: self.shipBmp = BitmapLoader.getBitmap("ship_no_image_big", "gui") self.shipFittingInfo = shipFittingInfo self.shipName, self.shipTrait, self.shipFits = shipFittingInfo self.shipTrait = re.sub("<.*?>", " ", self.shipTrait) self.newBmp = BitmapLoader.getBitmap("fit_add_small", "gui") self.acceptBmp = BitmapLoader.getBitmap("faccept_small", "gui") self.shipEffBk = BitmapLoader.getBitmap("fshipbk_big", "gui") img = self.shipEffBk.ConvertToImage() img = img.Mirror(False) self.shipEffBkMirrored = wx.Bitmap(img) self.raceBmp = BitmapLoader.getBitmap("race_%s_small" % self.shipRace, "gui") if not self.raceBmp: self.raceBmp = BitmapLoader.getBitmap("fit_delete_small", "gui") self.raceDropShadowBmp = drawUtils.CreateDropShadowBitmap( self.raceBmp, 0.2) sFit = Fit.getInstance() if self.shipTrait and sFit.serviceFittingOptions[ "showShipBrowserTooltip"]: self.SetToolTip(wx.ToolTip(self.shipTrait)) self.shipBrowser = self.Parent.Parent self.editWidth = 150 self.padding = 4 self.tcFitName = wx.TextCtrl(self, wx.ID_ANY, "%s fit" % self.shipName, wx.DefaultPosition, (120, -1), wx.TE_PROCESS_ENTER) self.tcFitName.Show(False) self.newBtn = self.toolbar.AddButton(self.newBmp, "New", self.newBtnCB) self.tcFitName.Bind(wx.EVT_TEXT_ENTER, self.createNewFit) self.tcFitName.Bind(wx.EVT_KILL_FOCUS, self.editLostFocus) self.tcFitName.Bind(wx.EVT_KEY_DOWN, self.editCheckEsc) self.animTimerId = wx.NewId() self.animTimer = wx.Timer(self, self.animTimerId) self.animStep = 0 self.animPeriod = 10 self.animDuration = 100 self.Bind(wx.EVT_CONTEXT_MENU, self.OnShowPopup) self.marketInstance = Market.getInstance() self.baseItem = self.marketInstance.getItem(self.shipID) # ===================================================================== # DISABLED - it will be added as an option in PREFERENCES self.animCount = 0
def __init__(self, parent, size=(-1, 24)): SFItem.SFBrowserItem.__init__(self, parent, size=size) self.rewBmpH = BitmapLoader.getBitmap("frewind_small", "gui") self.forwBmp = BitmapLoader.getBitmap("fforward_small", "gui") self.searchBmpH = BitmapLoader.getBitmap("fsearch_small", "gui") self.newBmpH = BitmapLoader.getBitmap("fit_add_small", "gui") self.resetBmpH = BitmapLoader.getBitmap("freset_small", "gui") self.switchBmpH = BitmapLoader.getBitmap("fit_switch_view_mode_small", "gui") self.recentBmpH = BitmapLoader.getBitmap("frecent_small", "gui") switchImg = BitmapLoader.getImage("fit_switch_view_mode_small", "gui") switchImg = switchImg.AdjustChannels(1, 1, 1, 0.4) self.switchBmpD = wx.Bitmap(switchImg) recentImg = BitmapLoader.getImage("frecent_small", "gui") recentImg = recentImg.AdjustChannels(1, 1, 1, 0.4) self.recentBmpD = wx.Bitmap(recentImg) self.resetBmp = self.AdjustChannels(self.resetBmpH) self.rewBmp = self.AdjustChannels(self.rewBmpH) self.searchBmp = self.AdjustChannels(self.searchBmpH) self.switchBmp = self.AdjustChannels(self.switchBmpH) self.recentBmp = self.AdjustChannels(self.recentBmpH) self.newBmp = self.AdjustChannels(self.newBmpH) self.toolbar.AddButton(self.resetBmp, "Ship groups", clickCallback=self.OnHistoryReset, hoverBitmap=self.resetBmpH) self.toolbar.AddButton(self.rewBmp, "Back", clickCallback=self.OnHistoryBack, hoverBitmap=self.rewBmpH) self.btnNew = self.toolbar.AddButton(self.newBmp, "New fitting", clickCallback=self.OnNewFitting, hoverBitmap=self.newBmpH, show=False) self.btnSwitch = self.toolbar.AddButton(self.switchBmpD, "Hide empty ship groups", clickCallback=self.ToggleEmptyGroupsView, hoverBitmap=self.switchBmpH, show=False) self.btnRecent = self.toolbar.AddButton(self.recentBmpD, "Recent Fits", clickCallback=self.ToggleRecentShips, hoverBitmap=self.recentBmpH, show=True) modifier = "CTRL" if 'wxMac' not in wx.PlatformInfo else "CMD" self.toolbar.AddButton(self.searchBmp, "Search fittings ({}+F)".format(modifier), clickCallback=self.ToggleSearchBox, hoverBitmap=self.searchBmpH) self.padding = 4 self.lastSearch = "" self.recentSearches = [] # not used? self.inSearch = False self.fontSmall = wx.Font(fonts.SMALL, wx.SWISS, wx.NORMAL, wx.NORMAL) w, h = size self.BrowserSearchBox = wx.TextCtrl(self, wx.ID_ANY, "", wx.DefaultPosition, (-1, h - 2 if 'wxGTK' in wx.PlatformInfo else -1), (wx.BORDER_NONE if 'wxGTK' in wx.PlatformInfo else 0)) self.BrowserSearchBox.Show(False) # self.BrowserSearchBox.Bind(wx.EVT_TEXT_ENTER, self.OnBrowserSearchBoxEnter) # self.BrowserSearchBox.Bind(wx.EVT_KILL_FOCUS, self.OnBrowserSearchBoxLostFocus) self.BrowserSearchBox.Bind(wx.EVT_KEY_DOWN, self.OnBrowserSearchBoxEsc) self.BrowserSearchBox.Bind(wx.EVT_TEXT, self.OnScheduleSearch) self.SetMinSize(size) self.shipBrowser = self.Parent self.mainFrame = gui.mainFrame.MainFrame.getInstance() self.Bind(wx.EVT_SIZE, self.OnResize)
def __init__(self, parent): wx.Frame.__init__(self, parent, id=wx.ID_ANY, title="pyfa: Character Editor", pos=wx.DefaultPosition, size=wx.Size(640, 600), style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER) i = wx.Icon(BitmapLoader.getBitmap("character_small", "gui")) self.SetIcon(i) self.mainFrame = parent # self.disableWin = wx.WindowDisabler(self) sFit = Fit.getInstance() self.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNFACE)) mainSizer = wx.BoxSizer(wx.VERTICAL) self.entityEditor = CharacterEntityEditor(self) mainSizer.Add(self.entityEditor, 0, wx.ALL | wx.EXPAND, 2) # Default drop down to current fit's character self.entityEditor.setActiveEntity(sFit.character) self.viewsNBContainer = wx.Notebook(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, 0) self.sview = SkillTreeView(self.viewsNBContainer) self.iview = ImplantEditorView(self.viewsNBContainer, self) self.aview = APIView(self.viewsNBContainer) self.viewsNBContainer.AddPage(self.sview, "Skills") self.viewsNBContainer.AddPage(self.iview, "Implants") self.viewsNBContainer.AddPage(self.aview, "EVE SSO") mainSizer.Add(self.viewsNBContainer, 1, wx.EXPAND | wx.ALL, 5) bSizerButtons = wx.BoxSizer(wx.HORIZONTAL) self.btnSaveChar = wx.Button(self, wx.ID_ANY, "Save") self.btnSaveAs = wx.Button(self, wx.ID_ANY, "Save As...") self.btnRevert = wx.Button(self, wx.ID_ANY, "Revert") self.btnOK = wx.Button(self, wx.ID_OK) bSizerButtons.Add(self.btnSaveChar, 0, wx.ALL, 5) bSizerButtons.Add(self.btnSaveAs, 0, wx.ALL, 5) bSizerButtons.Add(self.btnRevert, 0, wx.ALL, 5) bSizerButtons.AddStretchSpacer() bSizerButtons.Add(self.btnOK, 0, wx.ALL, 5) self.btnSaveChar.Bind(wx.EVT_BUTTON, self.saveChar) self.btnSaveAs.Bind(wx.EVT_BUTTON, self.saveCharAs) self.btnRevert.Bind(wx.EVT_BUTTON, self.revertChar) self.btnOK.Bind(wx.EVT_BUTTON, self.editingFinished) mainSizer.Add(bSizerButtons, 0, wx.EXPAND, 5) self.btnRestrict() self.SetSizer(mainSizer) self.Layout() self.Centre(wx.BOTH) self.Bind(wx.EVT_CLOSE, self.closeEvent) self.Bind(GE.CHAR_LIST_UPDATED, self.refreshCharacterList) self.entityEditor.Bind(wx.EVT_CHOICE, self.charChanged) self.charChanged(None)
def __init__(self, parent, style=wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE | wx.FRAME_FLOAT_ON_PARENT): global graphFrame_enabled global mplImported global mpl_version self.legendFix = False if not graphFrame_enabled: pyfalog.warning("Matplotlib is not enabled. Skipping initialization.") return try: cache_dir = mpl._get_cachedir() except: cache_dir = os.path.expanduser(os.path.join("~", ".matplotlib")) cache_file = os.path.join(cache_dir, 'fontList.cache') if os.access(cache_dir, os.W_OK | os.X_OK) and os.path.isfile(cache_file): # remove matplotlib font cache, see #234 os.remove(cache_file) if not mplImported: mpl.use('wxagg') graphFrame_enabled = True if int(mpl.__version__[0]) < 1: print(("pyfa: Found matplotlib version ", mpl.__version__, " - activating OVER9000 workarounds")) print("pyfa: Recommended minimum matplotlib version is 1.0.0") self.legendFix = True mplImported = True wx.Frame.__init__(self, parent, title="pyfa: Graph Generator", style=style, size=(520, 390)) i = wx.Icon(BitmapLoader.getBitmap("graphs_small", "gui")) self.SetIcon(i) self.mainFrame = gui.mainFrame.MainFrame.getInstance() self.CreateStatusBar() self.mainSizer = wx.BoxSizer(wx.VERTICAL) self.SetSizer(self.mainSizer) sFit = Fit.getInstance() fit = sFit.getFit(self.mainFrame.getActiveFit()) self.fits = [fit] if fit is not None else [] self.fitList = FitList(self) self.fitList.SetMinSize((270, -1)) self.fitList.fitList.update(self.fits) self.graphSelection = wx.Choice(self, wx.ID_ANY, style=0) self.mainSizer.Add(self.graphSelection, 0, wx.EXPAND) self.figure = Figure(figsize=(4, 3)) rgbtuple = wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNFACE).Get() clr = [c / 255. for c in rgbtuple] self.figure.set_facecolor(clr) self.figure.set_edgecolor(clr) self.canvas = Canvas(self, -1, self.figure) self.canvas.SetBackgroundColour(wx.Colour(*rgbtuple)) self.subplot = self.figure.add_subplot(111) self.subplot.grid(True) self.mainSizer.Add(self.canvas, 1, wx.EXPAND) self.mainSizer.Add(wx.StaticLine(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL), 0, wx.EXPAND) self.gridPanel = wx.Panel(self) self.mainSizer.Add(self.gridPanel, 0, wx.EXPAND) dummyBox = wx.BoxSizer(wx.VERTICAL) self.gridPanel.SetSizer(dummyBox) self.gridSizer = wx.FlexGridSizer(0, 4, 0, 0) self.gridSizer.AddGrowableCol(1) dummyBox.Add(self.gridSizer, 0, wx.EXPAND) for view in Graph.views: view = view() self.graphSelection.Append(view.name, view) self.graphSelection.SetSelection(0) self.fields = {} self.select(0) self.sl1 = wx.StaticLine(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL) self.mainSizer.Add(self.sl1, 0, wx.EXPAND) self.mainSizer.Add(self.fitList, 0, wx.EXPAND) self.fitList.fitList.Bind(wx.EVT_LEFT_DCLICK, self.removeItem) self.mainFrame.Bind(GE.FIT_CHANGED, self.draw) self.Bind(wx.EVT_CLOSE, self.close) self.Fit() self.SetMinSize(self.GetSize())
def getImage(self): return BitmapLoader.getBitmap("settings_database", "gui")
def getImage(self): return BitmapLoader.getBitmap("prefs_proxy", "gui")
def __init__(self, fittingView, params): super().__init__(fittingView) self.mainFrame = gui.mainFrame.MainFrame.getInstance() self.imageId = fittingView.imageList.GetImageIndex(1391, "icons") self.bitmap = BitmapLoader.getBitmap(1391, "icons") self.mask = wx.LIST_MASK_IMAGE
def __init__(self, parent): wx.Dialog.__init__( self, parent, id=wx.ID_ANY, # Dropdown list widget is scaled to its longest content line on GTK, adapt to that title="Target Resists Editor", size=wx.Size(500, 240) if "wxGTK" in wx.PlatformInfo else wx.Size(350, 240)) self.block = False self.SetSizeHints(wx.DefaultSize, wx.DefaultSize) mainSizer = wx.BoxSizer(wx.VERTICAL) self.entityEditor = TargetResistsEntityEditor(self) mainSizer.Add(self.entityEditor, 0, wx.ALL | wx.EXPAND, 2) self.sl = wx.StaticLine(self) mainSizer.Add(self.sl, 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 5) contentSizer = wx.BoxSizer(wx.VERTICAL) resistEditSizer = wx.FlexGridSizer(2, 6, 0, 2) resistEditSizer.AddGrowableCol(0) resistEditSizer.AddGrowableCol(5) resistEditSizer.SetFlexibleDirection(wx.BOTH) resistEditSizer.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED) defSize = wx.Size(50, -1) for i, type_ in enumerate(self.DAMAGE_TYPES): if i % 2: style = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT | wx.LEFT border = 25 else: style = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT border = 5 bmp = wx.StaticBitmap(self, wx.ID_ANY, BitmapLoader.getBitmap("%s_big" % type_, "gui")) resistEditSizer.Add(bmp, 0, style, border) # set text edit setattr(self, "%sEdit" % type_, wx.TextCtrl(self, wx.ID_ANY, "", wx.DefaultPosition, defSize)) editObj = getattr(self, "%sEdit" % type_) resistEditSizer.Add(editObj, 0, wx.BOTTOM | wx.TOP | wx.ALIGN_CENTER_VERTICAL, 5) resistEditSizer.Add(wx.StaticText(self, wx.ID_ANY, "%", wx.DefaultPosition, wx.DefaultSize, 0), 0, wx.BOTTOM | wx.TOP | wx.ALIGN_CENTER_VERTICAL, 5) editObj.Bind(wx.EVT_TEXT, self.ValuesUpdated) # Color we use to reset invalid value color self.colorReset = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT) contentSizer.Add(resistEditSizer, 1, wx.EXPAND | wx.ALL, 5) self.slfooter = wx.StaticLine(self) contentSizer.Add(self.slfooter, 0, wx.EXPAND | wx.TOP, 5) footerSizer = wx.BoxSizer(wx.HORIZONTAL) perSizer = wx.BoxSizer(wx.VERTICAL) self.stNotice = wx.StaticText(self, wx.ID_ANY, "") self.stNotice.Wrap(-1) perSizer.Add(self.stNotice, 0, wx.BOTTOM | wx.TOP | wx.LEFT, 5) footerSizer.Add(perSizer, 1, wx.ALIGN_CENTER_VERTICAL, 5) self.totSizer = wx.BoxSizer(wx.VERTICAL) contentSizer.Add(footerSizer, 0, wx.EXPAND, 5) mainSizer.Add(contentSizer, 1, wx.EXPAND, 0) self.SetSizer(mainSizer) 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, name, btn) btn.Enable(True) btn.SetToolTip("%s patterns %s clipboard" % (name, direction)) footerSizer.Add(btn, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_RIGHT) btn.Bind(wx.EVT_BUTTON, getattr(self, "{}Patterns".format(name.lower()))) if not self.entityEditor.checkEntitiesExist(): self.Destroy() return self.Layout() bsize = self.GetBestSize() self.SetSize((-1, bsize.height)) self.CenterOnParent() self.Bind(wx.EVT_CHOICE, self.patternChanged) self.Bind(wx.EVT_CHAR_HOOK, self.kbEvent) self.patternChanged() self.ShowModal()
def PopulateList(self): self.paramList.InsertColumn(0, "Attribute") self.paramList.InsertColumn(1, "Current Value") if self.stuff is not None: self.paramList.InsertColumn(2, "Base Value") self.paramList.SetColumnWidth(0, 110) self.paramList.SetColumnWidth(1, 90) if self.stuff is not None: self.paramList.SetColumnWidth(2, 90) self.paramList.setResizeColumn(0) self.imageList = wx.ImageList(16, 16) self.paramList.SetImageList(self.imageList, wx.IMAGE_LIST_SMALL) names = list(self.attrValues.keys()) names.sort() idNameMap = {} idCount = 0 for name in names: info = self.attrInfo.get(name) att = self.attrValues[name] # If we're working with a stuff object, we should get the original value from our getBaseAttrValue function, # which will return the value with respect to the effective base (with mutators / overrides in place) valDefault = getattr(info, "value", None) # Get default value from attribute if self.stuff is not None: # if it's a stuff, overwrite default (with fallback to current value) valDefault = self.stuff.getBaseAttrValue(name, valDefault) valueDefault = valDefault if valDefault is not None else att val = getattr(att, "value", None) value = val if val is not None else att if info and info.displayName and self.toggleView == 1: attrName = info.displayName else: attrName = name if info and config.debug: attrName += " ({})".format(info.ID) if info: if info.iconID is not None: iconFile = info.iconID icon = BitmapLoader.getBitmap(iconFile, "icons") if icon is None: icon = BitmapLoader.getBitmap("transparent16x16", "gui") attrIcon = self.imageList.Add(icon) else: attrIcon = self.imageList.Add( BitmapLoader.getBitmap("0", "icons")) else: attrIcon = self.imageList.Add( BitmapLoader.getBitmap("0", "icons")) index = self.paramList.InsertItem(self.paramList.GetItemCount(), attrName, attrIcon) idNameMap[idCount] = attrName self.paramList.SetItemData(index, idCount) idCount += 1 if self.toggleView != 1: valueUnit = str(value) elif info and info.unit: valueUnit = self.FormatValue(*info.unit.PreformatValue(value)) else: valueUnit = formatAmount(value, 3, 0, 0) if self.toggleView != 1: valueUnitDefault = str(valueDefault) elif info and info.unit: valueUnitDefault = self.FormatValue( *info.unit.PreformatValue(valueDefault)) else: valueUnitDefault = formatAmount(valueDefault, 3, 0, 0) self.paramList.SetItem(index, 1, valueUnit) if self.stuff is not None: self.paramList.SetItem(index, 2, valueUnitDefault) # @todo: pheonix, this lamda used cmp() which no longer exists in py3. Probably a better way to do this in the # long run, take a look self.paramList.SortItems(lambda id1, id2: (idNameMap[id1] > idNameMap[ id2]) - (idNameMap[id1] < idNameMap[id2])) self.paramList.RefreshRows() self.totalAttrsLabel.SetLabel("%d attributes. " % idCount) self.Layout()
def __init__(self, parent): wx.Panel.__init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.TAB_TRAVERSAL) self.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW)) pmainSizer = wx.BoxSizer(wx.HORIZONTAL) availableSizer = wx.BoxSizer(wx.VERTICAL) self.searchBox = SearchBox(self) self.itemView = ItemView(self) self.itemView.Hide() availableSizer.Add(self.searchBox, 0, wx.EXPAND) availableSizer.Add(self.itemView, 1, wx.EXPAND) self.availableImplantsTree = wx.TreeCtrl(self, wx.ID_ANY, style=wx.TR_DEFAULT_STYLE | wx.TR_HIDE_ROOT) root = self.availableRoot = self.availableImplantsTree.AddRoot("Available") self.availableImplantsImageList = wx.ImageList(16, 16) self.availableImplantsTree.SetImageList(self.availableImplantsImageList) availableSizer.Add(self.availableImplantsTree, 1, wx.EXPAND) pmainSizer.Add(availableSizer, 1, wx.ALL | wx.EXPAND, 5) buttonSizer = wx.BoxSizer(wx.VERTICAL) buttonSizer.AddStretchSpacer() self.btnAdd = GenBitmapButton(self, wx.ID_ADD, BitmapLoader.getBitmap("fit_add_small", "gui"), style=wx.BORDER_NONE) buttonSizer.Add(self.btnAdd, 0) self.btnRemove = GenBitmapButton(self, wx.ID_REMOVE, BitmapLoader.getBitmap("fit_delete_small", "gui"), style=wx.BORDER_NONE) buttonSizer.Add(self.btnRemove, 0) buttonSizer.AddStretchSpacer() pmainSizer.Add(buttonSizer, 0, wx.EXPAND, 0) characterImplantSizer = wx.BoxSizer(wx.VERTICAL) self.pluggedImplantsTree = AvailableImplantsView(self) characterImplantSizer.Add(self.pluggedImplantsTree, 1, wx.ALL | wx.EXPAND, 5) pmainSizer.Add(characterImplantSizer, 1, wx.EXPAND, 5) self.SetSizer(pmainSizer) # Populate the market tree sMkt = Market.getInstance() for mktGrp in sMkt.getImplantTree(): iconId = self.addMarketViewImage(sMkt.getIconByMarketGroup(mktGrp)) childId = self.availableImplantsTree.AppendItem(root, mktGrp.name, iconId, data=mktGrp.ID) if sMkt.marketGroupHasTypesCheck(mktGrp) is False: self.availableImplantsTree.AppendItem(childId, "dummy") self.availableImplantsTree.SortChildren(self.availableRoot) # Bind the event to replace dummies by real data self.availableImplantsTree.Bind(wx.EVT_TREE_ITEM_EXPANDING, self.expandLookup) self.availableImplantsTree.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.itemSelected) self.itemView.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.itemSelected) # Bind add & remove buttons self.btnAdd.Bind(wx.EVT_BUTTON, self.itemSelected) self.btnRemove.Bind(wx.EVT_BUTTON, self.removeItem) # We update with an empty list first to set the initial size for Layout(), then update later with actual # implants for character. This helps with sizing issues. self.pluggedImplantsTree.update([]) self.bindContext() self.Layout() self.update()
def __init__(self, parent, fitID=None, shipFittingInfo=("Test", "TestTrait", "cnc's avatar", 0, 0, None), shipID=None, itemData=None, graphicID=None, id=wx.ID_ANY, pos=wx.DefaultPosition, size=(0, 40), style=0): # ===================================================================== # animCount should be 10 if we enable animation in Preferences # ===================================================================== self.animCount = 0 self.selectedDelta = 0 SFItem.SFBrowserItem.__init__(self, parent, size=size) self.mainFrame = gui.mainFrame.MainFrame.getInstance() self._itemData = itemData self.fitID = fitID self.shipID = shipID self.shipBrowser = self.Parent.Parent self.shipBmp = None self.deleted = False if shipID: self.shipBmp = BitmapLoader.getBitmap(str(graphicID), "renders") if not self.shipBmp: self.shipBmp = BitmapLoader.getBitmap("ship_no_image_big", "gui") self.shipFittingInfo = shipFittingInfo self.shipName, self.shipTrait, self.fitName, self.fitBooster, self.timestamp, self.notes = shipFittingInfo if config.debug: self.fitName = '({}) {}'.format(self.fitID, self.fitName) self.shipTrait = re.sub("<.*?>", " ", self.shipTrait) # see GH issue #62 # Disabling this due to change in gang boosts Nov 2016 # if self.fitBooster is None: self.fitBooster = False self.fitBooster = False self.boosterBmp = BitmapLoader.getBitmap("fleet_fc_small", "gui") self.copyBmp = BitmapLoader.getBitmap("fit_add_small", "gui") self.renameBmp = BitmapLoader.getBitmap("fit_rename_small", "gui") self.deleteBmp = BitmapLoader.getBitmap("fit_delete_small", "gui") self.acceptBmp = BitmapLoader.getBitmap("faccept_small", "gui") self.shipEffBk = BitmapLoader.getBitmap("fshipbk_big", "gui") img = self.shipEffBk.ConvertToImage() img = img.Mirror(False) self.shipEffBkMirrored = wx.Bitmap(img) self.dragTLFBmp = None self.bkBitmap = None self.__setToolTip() self.padding = 4 self.editWidth = 150 self.dragging = False self.dragged = False self.dragMotionTrail = 5 self.dragMotionTrigger = self.dragMotionTrail self.dragWindow = None self.fontBig = wx.Font(fonts.BIG, wx.SWISS, wx.NORMAL, wx.BOLD) self.fontNormal = wx.Font(fonts.NORMAL, wx.SWISS, wx.NORMAL, wx.NORMAL) self.fontSmall = wx.Font(fonts.SMALL, wx.SWISS, wx.NORMAL, wx.NORMAL) self.SetDraggable() self.boosterBtn = self.toolbar.AddButton(self.boosterBmp, "Booster", show=self.fitBooster) self.toolbar.AddButton(self.copyBmp, "Copy", self.copyBtnCB) self.renameBtn = self.toolbar.AddButton(self.renameBmp, "Rename", self.renameBtnCB) self.toolbar.AddButton(self.deleteBmp, "Delete", self.deleteBtnCB) self.tcFitName = wx.TextCtrl(self, wx.ID_ANY, "%s" % self.fitName, wx.DefaultPosition, (self.editWidth, -1), wx.TE_PROCESS_ENTER) if self.shipBrowser.fitIDMustEditName != self.fitID: self.tcFitName.Show(False) else: self.tcFitName.SetFocus() self.tcFitName.SelectAll() self.shipBrowser.fitIDMustEditName = -1 self.renameBtn.SetBitmap(self.acceptBmp) self.tcFitName.Bind(wx.EVT_TEXT_ENTER, self.renameFit) self.tcFitName.Bind(wx.EVT_KILL_FOCUS, self.editLostFocus) self.tcFitName.Bind(wx.EVT_KEY_DOWN, self.editCheckEsc) self.Bind(wx.EVT_MOUSE_CAPTURE_LOST, self.OnMouseCaptureLost) self.mainFrame.Bind(EVT_FIT_RENAMED, self.OnFitRename) self.animTimerId = wx.NewId() self.animTimer = wx.Timer(self, self.animTimerId) self.animStep = 0 self.animPeriod = 10 self.animDuration = 100 self.maxDelta = 48 self.Bind(wx.EVT_TIMER, self.OnTimer) # ===================================================================== # DISABLED - it will be added as an option in PREFERENCES # if self.shipBrowser.GetActiveStage() != 4 and self.shipBrowser.GetLastStage() !=3: # self.animTimer.Start(self.animPeriod) # else: # self.animCount = 0 # ===================================================================== """ # Remove this bit as the time stuff is non-functional (works... but not exactly sure what it's meant to do) self.selTimerID = wx.NewId() self.selTimer = wx.Timer(self, self.selTimerID) self.selTimer.Start(100) """ self.Bind(wx.EVT_RIGHT_UP, self.OnContextMenu) self.Bind(wx.EVT_MIDDLE_UP, self.OpenNewTab)
def __init__(self, parent, size=(-1, 24)): SFItem.SFBrowserItem.__init__(self, parent, size=size) self.rewBmpH = BitmapLoader.getBitmap("frewind_small", "gui") self.forwBmp = BitmapLoader.getBitmap("fforward_small", "gui") self.searchBmpH = BitmapLoader.getBitmap("fsearch_small", "gui") self.newBmpH = BitmapLoader.getBitmap("fit_add_small", "gui") self.resetBmpH = BitmapLoader.getBitmap("freset_small", "gui") self.switchBmpH = BitmapLoader.getBitmap("fit_switch_view_mode_small", "gui") self.recentBmpH = BitmapLoader.getBitmap("frecent_small", "gui") switchImg = BitmapLoader.getImage("fit_switch_view_mode_small", "gui") switchImg = switchImg.AdjustChannels(1, 1, 1, 0.4) self.switchBmpD = wx.Bitmap(switchImg) recentImg = BitmapLoader.getImage("frecent_small", "gui") recentImg = recentImg.AdjustChannels(1, 1, 1, 0.4) self.recentBmpD = wx.Bitmap(recentImg) self.resetBmp = self.AdjustChannels(self.resetBmpH) self.rewBmp = self.AdjustChannels(self.rewBmpH) self.searchBmp = self.AdjustChannels(self.searchBmpH) self.switchBmp = self.AdjustChannels(self.switchBmpH) self.recentBmp = self.AdjustChannels(self.recentBmpH) self.newBmp = self.AdjustChannels(self.newBmpH) self.toolbar.AddButton(self.resetBmp, _t("Ship groups"), clickCallback=self.OnHistoryReset, hoverBitmap=self.resetBmpH) self.toolbar.AddButton(self.rewBmp, _t("Back"), clickCallback=self.OnHistoryBack, hoverBitmap=self.rewBmpH) self.btnNew = self.toolbar.AddButton(self.newBmp, _t("New fitting"), clickCallback=self.OnNewFitting, hoverBitmap=self.newBmpH, show=False) self.btnSwitch = self.toolbar.AddButton( self.switchBmpD, _t("Hide empty ship groups"), clickCallback=self.ToggleEmptyGroupsView, hoverBitmap=self.switchBmpH, show=False) self.btnRecent = self.toolbar.AddButton( self.recentBmpD, _t("Recent Fits"), clickCallback=self.ToggleRecentShips, hoverBitmap=self.recentBmpH, show=True) modifier = "CTRL" if 'wxMac' not in wx.PlatformInfo else "CMD" self.toolbar.AddButton(self.searchBmp, _t("Search fittings") + " ({}+F)".format(modifier), clickCallback=self.ToggleSearchBox, hoverBitmap=self.searchBmpH) self.padding = 4 self.lastSearch = "" self.recentSearches = [] # not used? self.inSearch = False self.fontSmall = wx.Font(fonts.SMALL, wx.SWISS, wx.NORMAL, wx.NORMAL) w, h = size self.BrowserSearchBox = wx.TextCtrl( self, wx.ID_ANY, "", wx.DefaultPosition, (-1, h - 2 if 'wxGTK' in wx.PlatformInfo else -1), (wx.BORDER_NONE if 'wxGTK' in wx.PlatformInfo else 0)) self.BrowserSearchBox.Show(False) # self.BrowserSearchBox.Bind(wx.EVT_TEXT_ENTER, self.OnBrowserSearchBoxEnter) # self.BrowserSearchBox.Bind(wx.EVT_KILL_FOCUS, self.OnBrowserSearchBoxLostFocus) self.BrowserSearchBox.Bind(wx.EVT_KEY_DOWN, self.OnBrowserSearchBoxKeyPress) self.BrowserSearchBox.Bind(wx.EVT_TEXT, self.OnScheduleSearch) self.SetMinSize(size) self.shipBrowser = self.Parent self.mainFrame = gui.mainFrame.MainFrame.getInstance() self.Bind(wx.EVT_SIZE, self.OnResize)
def __init__(self, parent): super().__init__(parent, id=wx.ID_ANY, title="Character Editor", resizeable=True, pos=wx.DefaultPosition, size=wx.Size(950, 650) if "wxGTK" in wx.PlatformInfo else wx.Size(850, 600)) i = wx.Icon(BitmapLoader.getBitmap("character_small", "gui")) self.SetIcon(i) self.mainFrame = parent # self.disableWin = wx.WindowDisabler(self) sFit = Fit.getInstance() mainSizer = wx.BoxSizer(wx.VERTICAL) self.entityEditor = CharacterEntityEditor(self) mainSizer.Add(self.entityEditor, 0, wx.ALL | wx.EXPAND, 2) # Default drop down to current fit's character self.entityEditor.setActiveEntity(sFit.character) self.viewsNBContainer = wx.Notebook(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, 0) self.sview = SkillTreeView(self.viewsNBContainer) self.iview = ImplantEditorView(self.viewsNBContainer, self) self.aview = APIView(self.viewsNBContainer) self.viewsNBContainer.AddPage(self.sview, "Skills") self.viewsNBContainer.AddPage(self.iview, "Implants") self.viewsNBContainer.AddPage(self.aview, "EVE SSO") mainSizer.Add(self.viewsNBContainer, 1, wx.EXPAND | wx.ALL, 5) bSizerButtons = wx.BoxSizer(wx.HORIZONTAL) self.btnSaveChar = wx.Button(self, wx.ID_ANY, "Save") self.btnSaveAs = wx.Button(self, wx.ID_ANY, "Save As...") self.btnRevert = wx.Button(self, wx.ID_ANY, "Revert") self.btnOK = wx.Button(self, wx.ID_OK) bSizerButtons.Add(self.btnSaveChar, 0, wx.ALL, 5) bSizerButtons.Add(self.btnSaveAs, 0, wx.ALL, 5) bSizerButtons.Add(self.btnRevert, 0, wx.ALL, 5) bSizerButtons.AddStretchSpacer() bSizerButtons.Add(self.btnOK, 0, wx.ALL, 5) self.btnSaveChar.Bind(wx.EVT_BUTTON, self.saveChar) self.btnSaveAs.Bind(wx.EVT_BUTTON, self.saveCharAs) self.btnRevert.Bind(wx.EVT_BUTTON, self.revertChar) self.btnOK.Bind(wx.EVT_BUTTON, self.editingFinished) mainSizer.Add(bSizerButtons, 0, wx.EXPAND, 5) self.btnRestrict() self.SetSizer(mainSizer) self.Layout() self.SetMinSize(self.GetSize()) self.Centre(wx.BOTH) self.Bind(wx.EVT_CLOSE, self.OnClose) self.Bind(wx.EVT_CHAR_HOOK, self.kbEvent) self.Bind(GE.CHAR_LIST_UPDATED, self.refreshCharacterList) self.entityEditor.Bind(wx.EVT_CHOICE, self.charChanged) self.charChanged(None)
def buildModuleView(self, root): """ We first build a usable dictionary of items. The key is either a fit if the afflictions stem from a projected fit, or self.stuff if they are local afflictions (everything else, even gang boosts at this time) The value of this is yet another dictionary in the following format: "Module Name": [ class of affliction, set of afflictors (such as 2 of the same module), info on affliction (attribute name, modifier, and modification amount), item that will be used to determine icon (required due to GH issue #335) whether this affliction is actually used (unlearned skills are not used) ] """ attributes = self.stuff.itemModifiedAttributes if self.item == self.stuff.item else self.stuff.chargeModifiedAttributes container = {} for attrName in attributes.iterAfflictions(): # if value is 0 or there has been no change from original to modified, return if attributes[attrName] == (attributes.getOriginal(attrName, 0)): continue for fit, afflictors in attributes.getAfflictions(attrName).items(): for afflictor, operator, stackingGroup, preResAmount, postResAmount, used in afflictors: if not used or getattr(afflictor, 'item', None) is None: continue if fit.ID != self.activeFit: # affliction fit does not match our fit if fit not in container: container[fit] = {} items = container[fit] else: # local afflictions if self.stuff not in container: container[self.stuff] = {} items = container[self.stuff] if afflictor == self.stuff and getattr(afflictor, 'charge', None): # we are showing a charges modifications, see #335 item = afflictor.charge else: item = afflictor.item # items hold our module: info mappings if item.name not in items: items[item.name] = [type(afflictor), set(), [], item, getattr(afflictor, "projected", False)] info = items[item.name] info[1].add(afflictor) operatorStr = formatOperator(operator, stackingGroup, preResAmount, postResAmount) # If info[1] > 1, there are two separate modules working. # Check to make sure we only include the modifier once # See GH issue 154 if len(info[1]) > 1 and (attrName, operatorStr, postResAmount) in info[2]: continue info[2].append((attrName, operatorStr, postResAmount)) # Make sure projected fits are on top rootOrder = list(container.keys()) rootOrder.sort(key=lambda x: self.ORDER.index(type(x))) # Now, we take our created dictionary and start adding stuff to our tree for thing in rootOrder: # This block simply directs which parent we are adding to (root or projected fit) if thing == self.stuff: parent = root else: # projected fit icon = self.imageList.Add(BitmapLoader.getBitmap("ship_small", "gui")) child = self.affectedBy.AppendItem(root, "{} ({})".format(thing.name, thing.ship.item.name), icon) parent = child items = container[thing] order = list(items.keys()) order.sort(key=lambda x: (self.ORDER.index(items[x][0]), x)) for itemName in order: info = items[itemName] afflictorType, afflictors, attrData, item, projected = info counter = len(afflictors) if afflictorType == Ship: itemIcon = self.imageList.Add(BitmapLoader.getBitmap("ship_small", "gui")) elif item.iconID: bitmap = BitmapLoader.getBitmap(item.iconID, "icons") itemIcon = self.imageList.Add(bitmap) if bitmap else -1 else: itemIcon = -1 displayStr = itemName if counter > 1: displayStr += " x {}".format(counter) if projected: displayStr += " (projected)" # this is the Module node, the attribute will be attached to this child = self.affectedBy.AppendItem(parent, displayStr, itemIcon) self.affectedBy.SetItemData(child, afflictors.pop()) if counter > 0: attributes = [] for attrName, attrModifier, attrAmount in attrData: attrInfo = self.stuff.item.attributes.get(attrName) displayName = attrInfo.displayName if attrInfo else "" if attrInfo: if attrInfo.iconID is not None: iconFile = attrInfo.iconID icon = BitmapLoader.getBitmap(iconFile, "icons") if icon is None: icon = BitmapLoader.getBitmap("transparent16x16", "gui") attrIcon = self.imageList.Add(icon) else: attrIcon = self.imageList.Add(BitmapLoader.getBitmap("0", "icons")) else: attrIcon = self.imageList.Add(BitmapLoader.getBitmap("0", "icons")) penalized = "" if '*' in attrModifier: if 's' in attrModifier: penalized += "(penalized)" if 'r' in attrModifier: penalized += "(resisted)" attrModifier = "*" if attrModifier == "+" and attrAmount < 0: attrModifier = "-" attrAmount = -attrAmount attributes.append((attrName, (displayName if displayName else attrName), attrModifier, attrAmount, penalized, attrIcon)) attrSorted = sorted(attributes, key=lambda attribName: attribName[0]) for attr in attrSorted: attrName, displayName, attrModifier, attrAmount, penalized, attrIcon = attr if self.showRealNames: display = "%s %s %.2f %s" % (attrName, attrModifier, attrAmount, penalized) saved = "%s %s %.2f %s" % ( displayName if displayName else attrName, attrModifier, attrAmount, penalized ) else: display = "%s %s %.2f %s" % ( displayName if displayName else attrName, attrModifier, attrAmount, penalized ) saved = "%s %s %.2f %s" % (attrName, attrModifier, attrAmount, penalized) treeitem = self.affectedBy.AppendItem(child, display, attrIcon) self.affectedBy.SetItemData(treeitem, saved) self.treeItems.append(treeitem)
def __init__(self, parent): wx.Panel.__init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.TAB_TRAVERSAL) self.charEditor = self.Parent.Parent # first parent is Notebook, second is Character Editor self.SetBackgroundColour( wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW)) pmainSizer = wx.BoxSizer(wx.VERTICAL) hSizer = wx.BoxSizer(wx.HORIZONTAL) self.clonesChoice = wx.Choice(self, wx.ID_ANY, style=0) i = self.clonesChoice.Append("Omega Clone", None) self.clonesChoice.SetSelection(i) hSizer.Add(self.clonesChoice, 5, wx.ALL | wx.EXPAND, 5) self.searchInput = PlaceholderTextCtrl(self, wx.ID_ANY, placeholder="Search...") hSizer.Add(self.searchInput, 1, wx.ALL | wx.EXPAND, 5) self.searchInput.Bind(wx.EVT_TEXT, self.delaySearch) sChar = Character.getInstance() self.alphaClones = sChar.getAlphaCloneList() char = self.charEditor.entityEditor.getActiveEntity() for clone in self.alphaClones: i = self.clonesChoice.Append(clone.alphaCloneName, clone.ID) if clone.ID == char.alphaCloneID: self.clonesChoice.SetSelection(i) self.clonesChoice.Bind(wx.EVT_CHOICE, self.cloneChanged) self.clonesChoice.SetToolTip( wx.ToolTip( "Setting an Alpha clone does not replace the character's skills, but rather caps them to Alpha levels." )) pmainSizer.Add(hSizer, 0, wx.EXPAND | wx.ALL, 5) # Set up timer for skill search self.searchTimer = wx.Timer(self) self.Bind(wx.EVT_TIMER, self.populateSkillTreeSkillSearch, self.searchTimer) tree = self.skillTreeListCtrl = TreeListCtrl( self, wx.ID_ANY, style=wx.dataview.TL_DEFAULT_STYLE) pmainSizer.Add(tree, 1, wx.EXPAND | wx.ALL, 5) self.imageList = wx.ImageList(16, 16) tree.SetImageList(self.imageList) self.skillBookImageId = self.imageList.Add( wx.Icon(BitmapLoader.getBitmap("skill_small", "gui"))) self.skillBookDirtyImageId = self.imageList.Add( wx.Icon(BitmapLoader.getBitmap("skill_small_red", "gui"))) tree.AppendColumn("Skill") tree.AppendColumn("Level", align=wx.ALIGN_CENTER) # tree.SetMainColumn(0) self.root = tree.GetRootItem() # self.root = tree.AppendItem(root, "Skills") # # tree.SetItemText(self.root, 1, "Levels") # first one doesn't work right in Windows. Second one doesn't work right in GTK. Together, we make sure it works. # Gotta love wx tree.SetColumnWidth(0, 525) tree.SetColumnWidth(1, 100) self.btnSecStatus = wx.Button( self, wx.ID_ANY, "Sec Status: {0:.2f}".format(char.secStatus or 0.0)) self.btnSecStatus.Bind(wx.EVT_BUTTON, self.onSecStatus) self.populateSkillTree() tree.Bind(wx.dataview.EVT_TREELIST_ITEM_ACTIVATED, self.expand) tree.Bind(wx.dataview.EVT_TREELIST_ITEM_EXPANDING, self.expandLookup) tree.Bind(wx.dataview.EVT_TREELIST_ITEM_CONTEXT_MENU, self.spawnMenu) bSizerButtons = wx.BoxSizer(wx.HORIZONTAL) bSizerButtons.Add(self.btnSecStatus, 0, wx.ALL, 5) bSizerButtons.AddStretchSpacer() 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.SetToolTip("%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 self.charEditor.entityEditor.Bind(wx.EVT_CHOICE, self.charChanged) self.charEditor.Bind(GE.CHAR_LIST_UPDATED, self.populateSkillTree) # Context menu stuff self.idUnlearned = wx.NewId() self.levelIds = {} self.idLevels = {} self.levelIds[self.idUnlearned] = "Not learned" for level in range(6): id = wx.NewId() self.levelIds[id] = level self.idLevels[level] = id self.revertID = wx.NewId() self.saveID = wx.NewId() self.SetSizer(pmainSizer) # This cuases issues with GTK, see #1866 # self.Layout() # For level keyboard shortcuts self.ChangeLevelEvent, CHANGE_LEVEL_EVENT = wx.lib.newevent.NewEvent() self.Bind(wx.EVT_CHAR_HOOK, self.kbEvent) self.Bind(CHANGE_LEVEL_EVENT, self.changeLevel)
def __init__(self, parent): wx.Dialog.__init__(self, parent, id=wx.ID_ANY, title="Damage Pattern Editor", size=wx.Size(400, 240)) self.block = False self.SetSizeHints(wx.DefaultSize, wx.DefaultSize) mainSizer = wx.BoxSizer(wx.VERTICAL) self.entityEditor = DmgPatternEntityEditor(self) mainSizer.Add(self.entityEditor, 0, wx.ALL | wx.EXPAND, 2) self.sl = wx.StaticLine(self) mainSizer.Add(self.sl, 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 5) contentSizer = wx.BoxSizer(wx.VERTICAL) self.embitmap = BitmapLoader.getBitmap("em_big", "gui") self.thermbitmap = BitmapLoader.getBitmap("thermal_big", "gui") self.kinbitmap = BitmapLoader.getBitmap("kinetic_big", "gui") self.expbitmap = BitmapLoader.getBitmap("explosive_big", "gui") dmgeditSizer = wx.FlexGridSizer(2, 6, 0, 2) dmgeditSizer.AddGrowableCol(0) dmgeditSizer.AddGrowableCol(5) dmgeditSizer.SetFlexibleDirection(wx.BOTH) dmgeditSizer.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED) width = -1 defSize = wx.Size(width, -1) for i, type_ in enumerate(self.DAMAGE_TYPES): bmp = wx.StaticBitmap( self, wx.ID_ANY, BitmapLoader.getBitmap("%s_big" % type_, "gui")) if i % 2: style = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT | wx.LEFT border = 20 else: style = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT border = 5 # set text edit setattr(self, "%sEdit" % type_, IntCtrl(self, wx.ID_ANY, 0, wx.DefaultPosition, defSize)) setattr(self, "%sPerc" % type_, wx.StaticText(self, wx.ID_ANY, "0%")) editObj = getattr(self, "%sEdit" % type_) dmgeditSizer.Add(bmp, 0, style, border) dmgeditSizer.Add(editObj, 0, wx.BOTTOM | wx.TOP | wx.ALIGN_CENTER_VERTICAL, 5) dmgeditSizer.Add(getattr(self, "%sPerc" % type_), 0, wx.LEFT | wx.ALIGN_CENTER_VERTICAL, 5) editObj.Bind(wx.EVT_TEXT, self.ValuesUpdated) editObj.SetLimited(True) editObj.SetMin(0) editObj.SetMax(2000000) contentSizer.Add(dmgeditSizer, 1, wx.EXPAND | wx.ALL, 5) self.slfooter = wx.StaticLine(self) contentSizer.Add(self.slfooter, 0, wx.EXPAND | wx.TOP, 5) footerSizer = wx.BoxSizer(wx.HORIZONTAL) perSizer = wx.BoxSizer(wx.VERTICAL) self.stNotice = wx.StaticText(self, wx.ID_ANY, "") self.stNotice.Wrap(-1) perSizer.Add(self.stNotice, 0, wx.BOTTOM | wx.TOP | wx.LEFT, 5) footerSizer.Add(perSizer, 1, wx.ALIGN_CENTER_VERTICAL, 5) self.totSizer = wx.BoxSizer(wx.VERTICAL) contentSizer.Add(footerSizer, 0, wx.EXPAND, 5) mainSizer.Add(contentSizer, 1, wx.EXPAND, 0) if "wxGTK" in wx.PlatformInfo: self.closeBtn = wx.Button(self, wx.ID_ANY, "Close", wx.DefaultPosition, wx.DefaultSize, 0) mainSizer.Add(self.closeBtn, 0, wx.ALL | wx.ALIGN_RIGHT, 5) self.closeBtn.Bind(wx.EVT_BUTTON, self.closeEvent) self.SetSizer(mainSizer) 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, name, btn) btn.Enable(True) btn.SetToolTip("%s patterns %s clipboard" % (name, direction)) footerSizer.Add(btn, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_RIGHT) btn.Bind(wx.EVT_BUTTON, getattr(self, "{}Patterns".format(name.lower()))) self.Layout() bsize = self.GetBestSize() self.SetSize((-1, bsize.height)) self.CenterOnParent() self.Bind(wx.EVT_CHOICE, self.patternChanged) self.patternChanged()
def __init__(self, title="pyfa"): pyfalog.debug("Initialize MainFrame") self.title = title super().__init__(None, wx.ID_ANY, self.title) self.supress_left_up = False MainFrame.__instance = self # Load stored settings (width/height/maximized..) self.LoadMainFrameAttribs() self.disableOverrideEditor = disableOverrideEditor # Fix for msw (have the frame background color match panel color if 'wxMSW' in wx.PlatformInfo: self.SetBackgroundColour( wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNFACE)) # Load and set the icon for pyfa main window i = wx.Icon(BitmapLoader.getBitmap("pyfa", "gui")) self.SetIcon(i) # Create the layout and windows mainSizer = wx.BoxSizer(wx.HORIZONTAL) self.browser_fitting_split = wx.SplitterWindow(self, style=wx.SP_LIVE_UPDATE) self.fitting_additions_split = wx.SplitterWindow( self.browser_fitting_split, style=wx.SP_LIVE_UPDATE) mainSizer.Add(self.browser_fitting_split, 1, wx.EXPAND | wx.LEFT, 2) self.fitMultiSwitch = MultiSwitch(self.fitting_additions_split) self.additionsPane = AdditionsPane(self.fitting_additions_split) self.notebookBrowsers = ChromeNotebook(self.browser_fitting_split, False) marketImg = BitmapLoader.getImage("market_small", "gui") shipBrowserImg = BitmapLoader.getImage("ship_small", "gui") self.marketBrowser = MarketBrowser(self.notebookBrowsers) self.notebookBrowsers.AddPage(self.marketBrowser, "Market", image=marketImg, closeable=False) self.marketBrowser.splitter.SetSashPosition(self.marketHeight) self.shipBrowser = ShipBrowser(self.notebookBrowsers) self.notebookBrowsers.AddPage(self.shipBrowser, "Fittings", image=shipBrowserImg, closeable=False) self.notebookBrowsers.SetSelection(1) self.browser_fitting_split.SplitVertically( self.notebookBrowsers, self.fitting_additions_split) self.browser_fitting_split.SetMinimumPaneSize(204) self.browser_fitting_split.SetSashPosition(self.browserWidth) self.fitting_additions_split.SplitHorizontally(self.fitMultiSwitch, self.additionsPane, -200) self.fitting_additions_split.SetMinimumPaneSize(200) self.fitting_additions_split.SetSashPosition(self.fittingHeight) self.fitting_additions_split.SetSashGravity(1.0) cstatsSizer = wx.BoxSizer(wx.VERTICAL) self.charSelection = CharacterSelection(self) cstatsSizer.Add(self.charSelection, 0, wx.EXPAND) # @todo pheonix: fix all stats stuff self.statsPane = StatsPane(self) cstatsSizer.Add(self.statsPane, 0, wx.EXPAND) mainSizer.Add(cstatsSizer, 0, wx.EXPAND) self.SetSizer(mainSizer) # Add menu self.addPageId = wx.NewId() self.closePageId = wx.NewId() self.closeAllPagesId = wx.NewId() self.widgetInspectMenuID = wx.NewId() self.SetMenuBar(MainMenuBar(self)) self.registerMenu() # Internal vars to keep track of other windows self.statsWnds = [] self.activeStatsWnd = None self.Bind(wx.EVT_CLOSE, self.OnClose) # Show ourselves self.Show() self.LoadPreviousOpenFits() # Check for updates self.sUpdate = Update.getInstance() self.sUpdate.CheckUpdate(self.ShowUpdateBox) self.Bind(GE.EVT_SSO_LOGIN, self.onSSOLogin)
def getImage(self): return BitmapLoader.getBitmap("settings_fitting", "gui")
def __init__(self, fittingView, params): super().__init__(fittingView) self.imageId = fittingView.imageList.GetImageIndex(1393, 'icons') self.bitmap = BitmapLoader.getBitmap(1393, 'icons') self.mask = wx.LIST_MASK_TEXT
def __init__(self, mainFrame): pyfalog.debug("Initialize MainMenuBar") self.characterEditorId = wx.NewId() self.damagePatternEditorId = wx.NewId() self.targetResistsEditorId = wx.NewId() self.implantSetEditorId = wx.NewId() self.graphFrameId = wx.NewId() self.backupFitsId = wx.NewId() self.exportSkillsNeededId = wx.NewId() self.importCharacterId = wx.NewId() self.exportHtmlId = wx.NewId() self.wikiId = wx.NewId() self.forumId = wx.NewId() self.saveCharId = wx.NewId() self.saveCharAsId = wx.NewId() self.revertCharId = wx.NewId() self.eveFittingsId = wx.NewId() self.exportToEveId = wx.NewId() self.ssoLoginId = wx.NewId() self.attrEditorId = wx.NewId() self.toggleOverridesId = wx.NewId() self.importDatabaseDefaultsId = wx.NewId() self.toggleIgnoreRestrictionID = wx.NewId() self.devToolsId = wx.NewId() # pheonix: evaluate if this is needed if 'wxMac' in wx.PlatformInfo and wx.VERSION >= (3, 0): wx.ID_COPY = wx.NewId() wx.ID_PASTE = wx.NewId() self.mainFrame = mainFrame wx.MenuBar.__init__(self) # File menu fileMenu = wx.Menu() self.Append(fileMenu, "&File") fileMenu.Append(self.mainFrame.addPageId, "&New Tab\tCTRL+T", "Open a new fitting tab") fileMenu.Append(self.mainFrame.closePageId, "&Close Tab\tCTRL+W", "Close the current fit") fileMenu.AppendSeparator() fileMenu.Append(self.backupFitsId, "&Backup All Fittings", "Backup all fittings to a XML file") fileMenu.Append(wx.ID_OPEN, "&Import Fittings\tCTRL+O", "Import fittings into pyfa") fileMenu.Append(wx.ID_SAVEAS, "&Export Fitting\tCTRL+S", "Export fitting to another format") fileMenu.AppendSeparator() fileMenu.Append(self.exportHtmlId, "Export HTML", "Export fits to HTML file (set in Preferences)") fileMenu.Append(self.exportSkillsNeededId, "Export &Skills Needed", "Export skills needed for this fitting") fileMenu.Append(self.importCharacterId, "Import C&haracter File", "Import characters into pyfa from file") fileMenu.AppendSeparator() fileMenu.Append(wx.ID_EXIT) # Edit menu editMenu = wx.Menu() self.Append(editMenu, "&Edit") # editMenu.Append(wx.ID_UNDO) # editMenu.Append(wx.ID_REDO) editMenu.Append(wx.ID_COPY, "To Clipboard\tCTRL+C", "Export a fit to the clipboard") editMenu.Append(wx.ID_PASTE, "From Clipboard\tCTRL+V", "Import a fit from the clipboard") editMenu.AppendSeparator() editMenu.Append(self.saveCharId, "Save Character") editMenu.Append(self.saveCharAsId, "Save Character As...") editMenu.Append(self.revertCharId, "Revert Character") editMenu.AppendSeparator() self.ignoreRestrictionItem = editMenu.Append(self.toggleIgnoreRestrictionID, "Ignore Fitting Restrictions") # Character menu windowMenu = wx.Menu() self.Append(windowMenu, "&Window") charEditItem = wx.MenuItem(windowMenu, self.characterEditorId, "&Character Editor\tCTRL+E") charEditItem.SetBitmap(BitmapLoader.getBitmap("character_small", "gui")) windowMenu.Append(charEditItem) damagePatternEditItem = wx.MenuItem(windowMenu, self.damagePatternEditorId, "Damage Pattern Editor\tCTRL+D") damagePatternEditItem.SetBitmap(BitmapLoader.getBitmap("damagePattern_small", "gui")) windowMenu.Append(damagePatternEditItem) targetResistsEditItem = wx.MenuItem(windowMenu, self.targetResistsEditorId, "Target Resists Editor\tCTRL+R") targetResistsEditItem.SetBitmap(BitmapLoader.getBitmap("explosive_small", "gui")) windowMenu.Append(targetResistsEditItem) implantSetEditItem = wx.MenuItem(windowMenu, self.implantSetEditorId, "Implant Set Editor\tCTRL+I") implantSetEditItem.SetBitmap(BitmapLoader.getBitmap("hardwire_small", "gui")) windowMenu.Append(implantSetEditItem) graphFrameItem = wx.MenuItem(windowMenu, self.graphFrameId, "Graphs\tCTRL+G") graphFrameItem.SetBitmap(BitmapLoader.getBitmap("graphs_small", "gui")) windowMenu.Append(graphFrameItem) if not gui.graphFrame.graphFrame_enabled: self.Enable(self.graphFrameId, False) preferencesShortCut = "CTRL+," if 'wxMac' in wx.PlatformInfo else "CTRL+P" preferencesItem = wx.MenuItem(windowMenu, wx.ID_PREFERENCES, "Preferences\t" + preferencesShortCut) preferencesItem.SetBitmap(BitmapLoader.getBitmap("preferences_small", "gui")) windowMenu.Append(preferencesItem) # self.sEsi = Crest.getInstance() # CREST Menu esiMMenu = wx.Menu() self.Append(esiMMenu, "EVE &SSO") esiMMenu.Append(self.ssoLoginId, "Manage Characters") esiMMenu.Append(self.eveFittingsId, "Browse EVE Fittings") esiMMenu.Append(self.exportToEveId, "Export To EVE") # if self.sEsi.settings.get('mode') == CrestModes.IMPLICIT or len(self.sEsi.getCrestCharacters()) == 0: self.Enable(self.eveFittingsId, True) self.Enable(self.exportToEveId, True) if not self.mainFrame.disableOverrideEditor: windowMenu.AppendSeparator() attrItem = wx.MenuItem(windowMenu, self.attrEditorId, "Attribute Overrides\tCTRL+B") attrItem.SetBitmap(BitmapLoader.getBitmap("fit_rename_small", "gui")) windowMenu.Append(attrItem) windowMenu.Append(self.toggleOverridesId, "Turn Overrides On") # Help menu helpMenu = wx.Menu() self.Append(helpMenu, "&Help") helpMenu.Append(self.wikiId, "Wiki", "Go to wiki on GitHub") helpMenu.Append(self.forumId, "Forums", "Go to EVE Online Forum thread") helpMenu.AppendSeparator() helpMenu.Append(self.importDatabaseDefaultsId, "Import D&atabase Defaults", "Imports missing database defaults") helpMenu.AppendSeparator() helpMenu.Append(wx.ID_ABOUT) if config.debug: helpMenu.Append(self.mainFrame.widgetInspectMenuID, "Open Widgets Inspect tool", "Open Widgets Inspect tool") helpMenu.Append(self.devToolsId, "Open Dev Tools", "Dev Tools") self.mainFrame.Bind(GE.FIT_CHANGED, self.fitChanged)
def __init__(self, parent, includeHidden=False): if not canvasPanel.graphFrame_enabled: pyfalog.warning( 'Matplotlib is not enabled. Skipping initialization.') return super().__init__(parent, title=_t('Graphs'), size=(520, 390), resizeable=True) self.mainFrame = gui.mainFrame.MainFrame.getInstance() self.includeHidden = includeHidden self.SetIcon(wx.Icon(BitmapLoader.getBitmap('graphs_small', 'gui'))) mainSizer = wx.BoxSizer(wx.VERTICAL) # Layout - graph selector self.graphSelection = wx.Choice(self, wx.ID_ANY, style=0) self.graphSelection.Bind(wx.EVT_CHOICE, self.OnGraphSwitched) mainSizer.Add(self.graphSelection, 0, wx.EXPAND) # Layout - plot area self.canvasPanel = canvasPanel.GraphCanvasPanel(self, self) mainSizer.Add(self.canvasPanel, 1, wx.EXPAND | wx.ALL, 0) mainSizer.Add( wx.StaticLine(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL), 0, wx.EXPAND) # Layout - graph control panel self.ctrlPanel = GraphControlPanel(self, self) mainSizer.Add(self.ctrlPanel, 0, wx.EXPAND | wx.ALL, 0) self.SetSizer(mainSizer) # Setup - graph selector for view in FitGraph.views: if view.hidden and not self.includeHidden: continue self.graphSelection.Append(view.name, view()) self.graphSelection.SetSelection(0) self.ctrlPanel.updateControls(layout=False) # Event bindings - local events self.Bind(wx.EVT_CLOSE, self.OnClose) self.Bind(wx.EVT_CHAR_HOOK, self.kbEvent) # Event bindings - external events self.mainFrame.Bind(GE.FIT_RENAMED, self.OnFitRenamed) self.mainFrame.Bind(GE.FIT_CHANGED, self.OnFitChanged) self.mainFrame.Bind(GE.FIT_REMOVED, self.OnFitRemoved) self.mainFrame.Bind(GE.TARGET_PROFILE_RENAMED, self.OnProfileRenamed) self.mainFrame.Bind(GE.TARGET_PROFILE_CHANGED, self.OnProfileChanged) self.mainFrame.Bind(GE.TARGET_PROFILE_REMOVED, self.OnProfileRemoved) self.mainFrame.Bind(RESIST_MODE_CHANGED, self.OnResistModeChanged) self.mainFrame.Bind(GE.GRAPH_OPTION_CHANGED, self.OnGraphOptionChanged) self.mainFrame.Bind(GE.EFFECTIVE_HP_TOGGLED, self.OnEffectiveHpToggled) self.drawTimer = wx.Timer(self) self.Bind(wx.EVT_TIMER, self.OnDrawTimer, self.drawTimer) self.Layout() self.UpdateWindowSize() self.draw()
def __init__(self, parent, id=wx.ID_ANY, label="", pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, layout=wx.VERTICAL, animate=False): wx.Window.__init__(self, parent, id, pos=pos, size=size, style=style) self.animTimerID = wx.NewId() self.animTimer = wx.Timer(self, self.animTimerID) self.animPeriod = 25 self.animDuration = 250 self.animStep = 0 self.maxWidth = 24 self.minWidth = 5 if animate else self.maxWidth self.maxHeight = 24 self.minHeight = 10 if animate else self.maxHeight self.direction = 0 if animate else 1 self.layout = layout self.animate = animate if layout == wx.VERTICAL: self.SetSize(wx.Size(self.minWidth, -1)) self.SetMinSize(wx.Size(self.minWidth, -1)) else: self.SetSize(wx.Size(-1, self.minHeight)) self.SetMinSize(wx.Size(-1, self.minHeight)) self.checkTimerID = wx.NewId() self.checkTimer = wx.Timer(self, self.checkTimerID) self.checkPeriod = 250 self.checkMaximize = True self.shipBrowser = self.Parent self.raceBmps = [] self.raceNames = [] self.hoveredItem = None if layout == wx.VERTICAL: self.buttonsBarPos = (4, 0) else: self.buttonsBarPos = (0, 4) self.buttonsPadding = 4 if layout == wx.VERTICAL: self.bmpArrow = BitmapLoader.getBitmap("down-arrow2", "gui") else: self.bmpArrow = BitmapLoader.getBitmap("up-arrow2", "gui") # Make the bitmaps have the same color as window text sysTextColour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT) img = self.bmpArrow.ConvertToImage() if layout == wx.VERTICAL: img = img.Rotate90(False) img.Replace(0, 0, 0, sysTextColour[0], sysTextColour[1], sysTextColour[2]) if layout == wx.VERTICAL: img = img.Scale(self.minWidth, 8, wx.IMAGE_QUALITY_HIGH) self.bmpArrow = wx.Bitmap(img) self.RebuildRaces(self.shipBrowser.RACE_ORDER) self.Bind(wx.EVT_ENTER_WINDOW, self.OnWindowEnter) self.Bind(wx.EVT_LEAVE_WINDOW, self.OnWindowLeave) self.Bind(wx.EVT_TIMER, self.OnTimer) self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnBackgroundErase) self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) self.Bind(wx.EVT_MOTION, self.OnMouseMove) self.Bind(wx.EVT_SIZE, self.OnSizeUpdate) self.Layout() self.SetBackgroundStyle(wx.BG_STYLE_PAINT)
def getImage(self): return BitmapLoader.getBitmap("pref-gauges_big", "gui")
def getImage(self): return BitmapLoader.getBitmap("prefs_settings", "gui")
def populatePanel(self, contentPanel, headerPanel): contentSizer = contentPanel.GetSizer() parent = self.panel = contentPanel self.headerPanel = headerPanel hsizer = self.headerPanel.GetSizer() self.stEff = wx.StaticText(self.headerPanel, wx.ID_ANY, "( Effective )") hsizer.Add(self.stEff) self.headerPanel.GetParent().AddToggleItem(self.stEff) panel = "full" sizerFirepower = wx.FlexGridSizer(1, 4, 0, 0) sizerFirepower.AddGrowableCol(1) contentSizer.Add(sizerFirepower, 0, wx.EXPAND, 0) counter = 0 for damageType, image in (("weapon", "turret"), ("drone", "droneDPS")): baseBox = wx.BoxSizer(wx.HORIZONTAL) sizerFirepower.Add(baseBox, 1, wx.ALIGN_LEFT if counter == 0 else wx.ALIGN_CENTER_HORIZONTAL) baseBox.Add(BitmapLoader.getStaticBitmap("%s_big" % image, parent, "gui"), 0, wx.ALIGN_CENTER) box = wx.BoxSizer(wx.VERTICAL) baseBox.Add(box, 0, wx.ALIGN_CENTER) box.Add(wx.StaticText(parent, wx.ID_ANY, damageType.capitalize()), 0, wx.ALIGN_LEFT) hbox = wx.BoxSizer(wx.HORIZONTAL) box.Add(hbox, 1, wx.ALIGN_CENTER) lbl = wx.StaticText(parent, wx.ID_ANY, "0.0 DPS") setattr(self, "label%sDps%s" % (panel.capitalize(), damageType.capitalize()), lbl) hbox.Add(lbl, 0, wx.ALIGN_CENTER) self._cachedValues.append(0) counter += 1 targetSizer = sizerFirepower baseBox = wx.BoxSizer(wx.HORIZONTAL) targetSizer.Add(baseBox, 0, wx.ALIGN_RIGHT) baseBox.Add(BitmapLoader.getStaticBitmap("volley_big", parent, "gui"), 0, wx.ALIGN_CENTER) gridS = wx.GridSizer(2, 2, 0, 0) baseBox.Add(gridS, 0) lbl = wx.StaticText(parent, wx.ID_ANY, "0.0") setattr(self, "label%sVolleyTotal" % panel.capitalize(), lbl) gridS.Add(wx.StaticText(parent, wx.ID_ANY, " Volley: "), 0, wx.ALL | wx.ALIGN_RIGHT) gridS.Add(lbl, 0, wx.ALIGN_LEFT) self._cachedValues.append(0) lbl = wx.StaticText(parent, wx.ID_ANY, "0.0") setattr(self, "label%sDpsTotal" % panel.capitalize(), lbl) gridS.Add(wx.StaticText(parent, wx.ID_ANY, " DPS: "), 0, wx.ALL | wx.ALIGN_RIGHT) self._cachedValues.append(0) gridS.Add(lbl, 0, wx.ALIGN_LEFT) image = BitmapLoader.getBitmap("mining_small", "gui") self.miningyield = wx.BitmapButton(contentPanel, -1, image) self.miningyield.SetToolTip(wx.ToolTip("Click to toggle to Mining Yield ")) self.miningyield.Bind(wx.EVT_BUTTON, self.switchToMiningYieldView) sizerFirepower.Add(self.miningyield, 0, wx.ALIGN_LEFT) self._cachedValues.append(0)
def __init__(self, parent): wx.Panel.__init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.TAB_TRAVERSAL) self.charEditor = self.Parent.Parent # first parent is Notebook, second is Character Editor self.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW)) pmainSizer = wx.BoxSizer(wx.VERTICAL) hSizer = wx.BoxSizer(wx.HORIZONTAL) self.clonesChoice = wx.Choice(self, wx.ID_ANY, style=0) i = self.clonesChoice.Append("Omega Clone", None) self.clonesChoice.SetSelection(i) hSizer.Add(self.clonesChoice, 5, wx.ALL | wx.EXPAND, 5) self.searchInput = PlaceholderTextCtrl(self, wx.ID_ANY, placeholder="Search...") hSizer.Add(self.searchInput, 1, wx.ALL | wx.EXPAND, 5) self.searchInput.Bind(wx.EVT_TEXT, self.delaySearch) sChar = Character.getInstance() self.alphaClones = sChar.getAlphaCloneList() char = self.charEditor.entityEditor.getActiveEntity() for clone in self.alphaClones: i = self.clonesChoice.Append(clone.alphaCloneName, clone.ID) if clone.ID == char.alphaCloneID: self.clonesChoice.SetSelection(i) self.clonesChoice.Bind(wx.EVT_CHOICE, self.cloneChanged) self.clonesChoice.SetToolTip( wx.ToolTip("Setting an Alpha clone does not replace the character's skills, but rather caps them to Alpha levels.")) pmainSizer.Add(hSizer, 0, wx.EXPAND | wx.ALL, 5) # Set up timer for skill search self.searchTimer = wx.Timer(self) self.Bind(wx.EVT_TIMER, self.populateSkillTreeSkillSearch, self.searchTimer) tree = self.skillTreeListCtrl = TreeListCtrl(self, wx.ID_ANY, style=wx.dataview.TL_DEFAULT_STYLE) pmainSizer.Add(tree, 1, wx.EXPAND | wx.ALL, 5) self.imageList = wx.ImageList(16, 16) tree.SetImageList(self.imageList) self.skillBookImageId = self.imageList.Add(wx.Icon(BitmapLoader.getBitmap("skill_small", "gui"))) self.skillBookDirtyImageId = self.imageList.Add(wx.Icon(BitmapLoader.getBitmap("skill_small_red", "gui"))) tree.AppendColumn("Skill") tree.AppendColumn("Level") # tree.SetMainColumn(0) self.root = tree.GetRootItem() # self.root = tree.AppendItem(root, "Skills") # # tree.SetItemText(self.root, 1, "Levels") # tree.SetColumnWidth(0, 300) self.btnSecStatus = wx.Button(self, wx.ID_ANY, "Sec Status: {0:.2f}".format(char.secStatus or 0.0)) self.btnSecStatus.Bind(wx.EVT_BUTTON, self.onSecStatus) self.populateSkillTree() tree.Bind(wx.dataview.EVT_TREELIST_ITEM_EXPANDING, self.expandLookup) tree.Bind(wx.dataview.EVT_TREELIST_ITEM_CONTEXT_MENU, self.scheduleMenu) bSizerButtons = wx.BoxSizer(wx.HORIZONTAL) bSizerButtons.Add(self.btnSecStatus, 0, wx.ALL, 5) bSizerButtons.AddStretchSpacer() 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.SetToolTip("%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 self.charEditor.entityEditor.Bind(wx.EVT_CHOICE, self.charChanged) self.charEditor.Bind(GE.CHAR_LIST_UPDATED, self.populateSkillTree) srcContext = "skillItem" itemContext = "Skill" context = (srcContext, itemContext) self.statsMenu = ContextMenu.getMenu(None, context) self.levelChangeMenu = ContextMenu.getMenu(None, context) or wx.Menu() self.levelChangeMenu.AppendSeparator() self.levelIds = {} idUnlearned = wx.NewId() self.levelIds[idUnlearned] = "Not learned" self.levelChangeMenu.Append(idUnlearned, "Unlearn") for level in range(6): id = wx.NewId() self.levelIds[id] = level self.levelChangeMenu.Append(id, "Level %d" % level) self.levelChangeMenu.AppendSeparator() self.revertID = wx.NewId() self.levelChangeMenu.Append(self.revertID, "Revert") self.saveID = wx.NewId() self.levelChangeMenu.Append(self.saveID, "Save") self.levelChangeMenu.Bind(wx.EVT_MENU, self.changeLevel) self.SetSizer(pmainSizer) self.Layout()
def getImage(self): return BitmapLoader.getBitmap("eve", "gui")