def __init__(self, parent): wx.Panel.__init__( self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.Size(500, 300), style=wx.TAB_TRAVERSAL ) pmainSizer = wx.BoxSizer(wx.HORIZONTAL) availableSizer = wx.BoxSizer(wx.VERTICAL) pmainSizer.Add(availableSizer, 1, wx.ALL | wx.EXPAND, 5) self.availableImplantsSearch = wx.SearchCtrl(self, wx.ID_ANY, style=wx.TE_PROCESS_ENTER) self.availableImplantsSearch.ShowCancelButton(True) availableSizer.Add(self.availableImplantsSearch, 0, wx.BOTTOM | wx.EXPAND, 2) 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) buttonSizer = wx.BoxSizer(wx.VERTICAL) pmainSizer.Add(buttonSizer, 0, wx.TOP, 5) self.btnAdd = GenBitmapButton( self, wx.ID_ADD, bitmapLoader.getBitmap("fit_add_small", "icons"), style=wx.BORDER_NONE ) buttonSizer.Add(self.btnAdd, 0) self.btnRemove = GenBitmapButton( self, wx.ID_REMOVE, bitmapLoader.getBitmap("fit_delete_small", "icons"), style=wx.BORDER_NONE ) buttonSizer.Add(self.btnRemove, 0) self.pluggedImplantsTree = AvailableImplantsView(self, style=wx.LC_SINGLE_SEL) pmainSizer.Add(self.pluggedImplantsTree, 1, wx.ALL | wx.EXPAND, 5) self.SetSizer(pmainSizer) # Populate the market tree sMkt = service.Market.getInstance() for mktGrp in sMkt.getImplantTree(): iconId = self.addMarketViewImage(sMkt.getIconByMarketGroup(mktGrp)) childId = self.availableImplantsTree.AppendItem(root, mktGrp.name, iconId, data=wx.TreeItemData(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) # Bind add & remove buttons self.btnAdd.Bind(wx.EVT_BUTTON, self.addImplant) self.btnRemove.Bind(wx.EVT_BUTTON, self.removeImplant) # Bind the change of a character* self.Parent.Parent.Bind(GE.CHAR_CHANGED, self.charChanged) self.Enable(False) self.Layout()
def PopulateList(self): self.paramList.InsertColumn(0, "Attribute") self.paramList.InsertColumn(1, "Value") self.paramList.SetColumnWidth(1, 150) self.paramList.setResizeColumn(1) self.imageList = wx.ImageList(16, 16) self.paramList.SetImageList(self.imageList, wx.IMAGE_LIST_SMALL) names = list(self.attrValues.iterkeys()) names.sort() idNameMap = {} idCount = 0 for name in names: info = self.attrInfo.get(name) att = self.attrValues[name] 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: if info.icon is not None: iconFile = info.icon.iconFile icon = bitmapLoader.getBitmap(iconFile, "pack") if icon is None: icon = bitmapLoader.getBitmap("transparent16x16", "icons") attrIcon = self.imageList.Add(icon) else: attrIcon = self.imageList.Add(bitmapLoader.getBitmap("07_15", "pack")) else: attrIcon = self.imageList.Add(bitmapLoader.getBitmap("07_15", "pack")) index = self.paramList.InsertImageStringItem(sys.maxint, 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.TranslateValueUnit(value, info.unit.displayName, info.unit.name) else: valueUnit = formatAmount(value, 3, 0, 0) self.paramList.SetStringItem(index, 1, valueUnit) self.paramList.SortItems(lambda id1, id2: cmp(idNameMap[id1], idNameMap[id2])) self.paramList.RefreshRows() self.totalAttrsLabel.SetLabel("%d attributes. " % idCount) self.Layout()
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.SetPyData(self.root, None) self.imageList = wx.ImageList(16, 16) self.reqTree.SetImageList(self.imageList) skillBookId = self.imageList.Add( bitmapLoader.getBitmap("skill_small", "icons")) self.getFullSkillTree(item, self.root, skillBookId) self.reqTree.ExpandAll() self.Layout()
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.SetPyData(self.root, None) self.imageList = wx.ImageList(16, 16) self.reqTree.SetImageList(self.imageList) skillBookId = self.imageList.Add(bitmapLoader.getBitmap("skill_small", "icons")) self.getFullSkillTree(item,self.root,skillBookId) self.reqTree.ExpandAll() self.Layout()
def __init__(self, parent, style=wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE | wx.FRAME_FLOAT_ON_PARENT): wx.Frame.__init__(self, parent, title=u"pyfa: Graph Generator", style=style, size=(640, 480)) i = wx.IconFromBitmap(bitmapLoader.getBitmap("graphs_small", "icons")) self.SetIcon(i) self.mainFrame = gui.mainFrame.MainFrame.getInstance() self.CreateStatusBar() horSizer = wx.BoxSizer(wx.HORIZONTAL) self.SetSizer(horSizer) self.mainSizer = wx.BoxSizer(wx.VERTICAL) horSizer.Add(self.mainSizer, 1, wx.EXPAND) sFit = service.Fit.getInstance() fit = sFit.getFit(self.mainFrame.getActiveFit()) self.fits = [fit] if fit is not None else [] self.fitList = FitList(self) self.fitList.SetMinSize((320, -1)) horSizer.Add(self.fitList, 0, wx.EXPAND) 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)) self.canvas = Canvas(self, -1, self.figure) self.subplot = self.figure.add_subplot(111) self.subplot.grid(True) self.mainSizer.Add(self.canvas, 1, 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, 2) 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.fitList.fitList.Bind(wx.EVT_LEFT_DCLICK, self.removeItem) self.mainFrame.Bind(gui.fittingView.FIT_CHANGED, self.draw) self.Bind(wx.EVT_CLOSE, self.close)
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 addMarketViewImage(self, iconFile): if iconFile is None: return -1 bitmap = bitmapLoader.getBitmap(iconFile, "pack") 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 __init__(self, victim, context = None): wx.Dialog.__init__(self, gui.mainFrame.MainFrame.getInstance(), wx.ID_ANY, title="Item stats", style = wx.CAPTION | wx.CLOSE_BOX | wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.RESIZE_BORDER| wx.SYSTEM_MENU) empty = getattr(victim, "isEmpty", False) if empty: self.Hide() self.Destroy() return item = getattr(victim, "item", None) if context.lower() not in ("projectedammo", "ammo") else getattr(victim, "charge", None) if item is None: sMarket = service.Market.getInstance() item = sMarket.getItem(victim.ID) victim = None self.context = context if item.icon is not None: before,sep,after = item.icon.iconFile.rpartition("_") iconFile = "%s%s%s" % (before,sep,"0%s" % after if len(after) < 2 else after) itemImg = bitmapLoader.getBitmap(iconFile, "pack") if itemImg is not None: self.SetIcon(wx.IconFromBitmap(itemImg)) self.SetTitle("%s: %s" % ("%s stats" % context.capitalize() if context is not None else "Stats", item.name)) self.SetMinSize((300, 200)) self.SetSize((500, 300)) self.SetMaxSize((500, -1)) self.mainSizer = wx.BoxSizer(wx.VERTICAL) self.container = ItemStatsContainer(self, victim, item, context) self.mainSizer.Add(self.container, 1, wx.EXPAND) self.SetSizer(self.mainSizer) parent = gui.mainFrame.MainFrame.getInstance() dlgsize = self.GetSize() psize = parent.GetSize() ppos = parent.GetPosition() ItemStatsDialog.counter += 1 self.dlgOrder = ItemStatsDialog.counter counter = ItemStatsDialog.counter dlgStep = 30 if counter * dlgStep > ppos.x+psize.width-dlgsize.x or counter * dlgStep > ppos.y+psize.height-dlgsize.y: ItemStatsDialog.counter = 1 dlgx = ppos.x + counter * dlgStep dlgy = ppos.y + counter * dlgStep self.SetPosition((dlgx,dlgy)) self.Show() self.Bind(wx.EVT_CLOSE, self.closeEvent)
def __init__(self, parent): wx.Panel.__init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.Size(500, 300), style=wx.TAB_TRAVERSAL) pmainSizer = wx.BoxSizer(wx.VERTICAL) tree = self.skillTreeListCtrl = wx.gizmos.TreeListCtrl( self, wx.ID_ANY, style=wx.TR_DEFAULT_STYLE | wx.TR_HIDE_ROOT) pmainSizer.Add(tree, 1, wx.EXPAND | wx.ALL, 5) self.imageList = wx.ImageList(16, 16) tree.SetImageList(self.imageList) self.skillBookImageId = self.imageList.Add( bitmapLoader.getBitmap("skill_small", "icons")) tree.AddColumn("Skill") tree.AddColumn("Level") tree.SetMainColumn(0) self.root = tree.AddRoot("Skills") tree.SetItemText(self.root, "Levels", 1) tree.SetColumnWidth(0, 500) self.populateSkillTree() tree.Bind(wx.EVT_TREE_ITEM_EXPANDING, self.expandLookup) tree.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.scheduleMenu) 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 xrange(6): id = wx.NewId() self.levelIds[id] = level self.levelChangeMenu.Append(id, "Level %d" % level) self.levelChangeMenu.Bind(wx.EVT_MENU, self.changeLevel) self.SetSizer(pmainSizer) self.Layout()
def Add(self, *loaderArgs): key = "".join(loaderArgs) if key not in self.map: bitmap = bitmapLoader.getBitmap(*loaderArgs) if bitmap is None: return -1 id = wx.ImageList.Add(self, bitmap) self.map[key] = id else: id = self.map[key] return id
def Add(self, *loaderArgs): key = "".join(loaderArgs) if key not in self.map: bitmap = bitmapLoader.getBitmap(*loaderArgs) if bitmap is None: return -1 id = wx.ImageList.Add(self,bitmap) self.map[key] = id else: id = self.map[key] return id
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.IconFromBitmap(bitmapLoader.getBitmap("preferences_small", "icons")) 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.SetImageList(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.AddSpacer( ( 0, 0), 1, wx.EXPAND, 5 ) self.btnOK = wx.Button( self, wx.ID_ANY, u"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.Panel(self.listbook) bmp = prefView.getImage() if bmp: imgID = self.imageList.Add(bmp) else: imgID = -1 prefView.populatePanel(page) self.listbook.AddPage(page, prefView.title, imageId = imgID) # Set the height based on a condition. Can all the panels fit in the current height? # If not, use the .GetBestVirtualSize() to ensure that all content is available. minHeight = 360 bestFit = self.GetBestVirtualSize() if minHeight > bestFit[1]: self.SetSizeWH(450, minHeight) else: self.SetSizeWH(450, bestFit[1]) self.Layout() self.btnOK.Bind(wx.EVT_BUTTON, self.OnBtnOK)
def setTabTitle(self, tab, fitID): page = self.GetPage(tab) if page.type == "fit": if fitID == None: self.SetPageText(tab, "Empty Tab") self.SetPageImage(tab, -1) else: cFit = service.Fit.getInstance() fit = cFit.getFit(fitID) self.SetPageText(tab, "%s: %s" % (fit.ship.item.name, fit.name)) bitmap = bitmapLoader.getBitmap("race_%s_small" % fit.ship.item.race, "icons") if bitmap: self.SetPageImage(tab, self.imageList.Add(bitmap))
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.IconFromBitmap( bitmapLoader.getBitmap("preferences_small", "icons")) self.SetIcon(i) mainSizer = wx.BoxSizer(wx.VERTICAL) self.listbook = wx.Listbook(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LB_DEFAULT) self.listbook.GetListView().SetMinSize((500, -1)) self.listbook.GetListView().SetSize((500, -1)) self.imageList = wx.ImageList(64, 64) self.listbook.SetImageList(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.AddSpacer((0, 0), 1, wx.EXPAND, 5) self.btnOK = wx.Button(self, wx.ID_ANY, u"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 title, prefView in PreferenceView.views.iteritems(): page = wx.Panel(self.listbook) bmp = prefView.getImage() if bmp: imgID = self.imageList.Add(bmp) else: imgID = -1 prefView.populatePanel(page) self.listbook.AddPage(page, title, imageId=imgID) self.Fit() self.Layout() self.btnOK.Bind(wx.EVT_BUTTON, self.OnBtnOK)
def __init__(self, parent): wx.Panel.__init__( self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.Size(500, 300), style=wx.TAB_TRAVERSAL ) pmainSizer = wx.BoxSizer(wx.VERTICAL) tree = self.skillTreeListCtrl = wx.gizmos.TreeListCtrl( self, wx.ID_ANY, style=wx.TR_DEFAULT_STYLE | wx.TR_HIDE_ROOT ) pmainSizer.Add(tree, 1, wx.EXPAND | wx.ALL, 5) self.imageList = wx.ImageList(16, 16) tree.SetImageList(self.imageList) self.skillBookImageId = self.imageList.Add(bitmapLoader.getBitmap("skill_small", "icons")) tree.AddColumn("Skill") tree.AddColumn("Level") tree.SetMainColumn(0) self.root = tree.AddRoot("Skills") tree.SetItemText(self.root, "Levels", 1) tree.SetColumnWidth(0, 500) self.populateSkillTree() tree.Bind(wx.EVT_TREE_ITEM_EXPANDING, self.expandLookup) tree.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.scheduleMenu) 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 xrange(6): id = wx.NewId() self.levelIds[id] = level self.levelChangeMenu.Append(id, "Level %d" % level) self.levelChangeMenu.Bind(wx.EVT_MENU, self.changeLevel) self.SetSizer(pmainSizer) self.Layout()
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.IconFromBitmap(bitmapLoader.getBitmap("preferences_small", "icons")) self.SetIcon(i) mainSizer = wx.BoxSizer(wx.VERTICAL) self.listbook = wx.Listbook(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LB_DEFAULT) self.listbook.GetListView().SetMinSize((500, -1)) self.listbook.GetListView().SetSize((500, -1)) self.imageList = wx.ImageList(64,64) self.listbook.SetImageList(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.AddSpacer( ( 0, 0), 1, wx.EXPAND, 5 ) self.btnOK = wx.Button( self, wx.ID_ANY, u"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 title, prefView in PreferenceView.views.iteritems(): page = wx.Panel(self.listbook) bmp = prefView.getImage() if bmp: imgID = self.imageList.Add(bmp) else: imgID = -1 prefView.populatePanel(page) self.listbook.AddPage(page, title, imageId = imgID) self.Fit() self.Layout() self.btnOK.Bind(wx.EVT_BUTTON, self.OnBtnOK)
def __init__(self, parent): wx.Panel.__init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.Size(500, 300), style=wx.TAB_TRAVERSAL) pmainSizer = wx.BoxSizer(wx.HORIZONTAL) availableSizer = wx.BoxSizer(wx.VERTICAL) pmainSizer.Add(availableSizer, 1, wx.ALL | wx.EXPAND, 5) self.availableImplantsSearch = wx.SearchCtrl(self, wx.ID_ANY, style=wx.TE_PROCESS_ENTER) self.availableImplantsSearch.ShowCancelButton(True) availableSizer.Add(self.availableImplantsSearch, 0, wx.BOTTOM | wx.EXPAND, 2) 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) buttonSizer = wx.BoxSizer(wx.VERTICAL) pmainSizer.Add(buttonSizer, 0, wx.TOP, 5) self.btnAdd = GenBitmapButton(self, wx.ID_ADD, bitmapLoader.getBitmap( "fit_add_small", "icons"), style=wx.BORDER_NONE) buttonSizer.Add(self.btnAdd, 0) self.btnRemove = GenBitmapButton(self, wx.ID_REMOVE, bitmapLoader.getBitmap( "fit_delete_small", "icons"), style=wx.BORDER_NONE) buttonSizer.Add(self.btnRemove, 0) self.pluggedImplantsTree = AvailableImplantsView( self, style=wx.LC_SINGLE_SEL) pmainSizer.Add(self.pluggedImplantsTree, 1, wx.ALL | wx.EXPAND, 5) self.SetSizer(pmainSizer) # Populate the market tree sMkt = service.Market.getInstance() for mktGrp in sMkt.getImplantTree(): iconId = self.addMarketViewImage(sMkt.getIconByMarketGroup(mktGrp)) childId = self.availableImplantsTree.AppendItem( root, mktGrp.name, iconId, data=wx.TreeItemData(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) #Bind add & remove buttons self.btnAdd.Bind(wx.EVT_BUTTON, self.addImplant) self.btnRemove.Bind(wx.EVT_BUTTON, self.removeImplant) #Bind the change of a character* self.Parent.Parent.Bind(GE.CHAR_CHANGED, self.charChanged) self.Enable(False) self.Layout()
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) or 0): continue for fit, afflictors in attributes.getAfflictions( attrName).iteritems(): for afflictor, modifier, amount, 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) # 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, modifier, amount) in info[2]: continue info[2].append((attrName, modifier, amount)) # Make sure projected fits are on top rootOrder = 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", "icons")) child = self.affectedBy.AppendItem( root, "{} ({})".format(thing.name, thing.ship.item.name), icon) parent = child items = container[thing] order = 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", "icons")) elif item.icon: bitmap = bitmapLoader.getBitmap(item.icon.iconFile, "pack") 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.SetPyData(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.icon is not None: iconFile = attrInfo.icon.iconFile icon = bitmapLoader.getBitmap(iconFile, "pack") if icon is None: icon = bitmapLoader.getBitmap( "transparent16x16", "icons") attrIcon = self.imageList.Add(icon) else: attrIcon = self.imageList.Add( bitmapLoader.getBitmap("07_15", "pack")) else: attrIcon = self.imageList.Add( bitmapLoader.getBitmap("07_15", "pack")) if attrModifier == "s*": attrModifier = "*" penalized = "(penalized)" else: penalized = "" 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.SetPyData(treeitem, saved) self.treeItems.append(treeitem)
def __init__(self, parent): wx.Frame.__init__(self, parent, id=wx.ID_ANY, title=u"pyfa: Character Editor", pos=wx.DefaultPosition, size=wx.Size(641, 600), style=wx.DEFAULT_FRAME_STYLE | wx.FRAME_FLOAT_ON_PARENT | wx.TAB_TRAVERSAL) i = wx.IconFromBitmap( bitmapLoader.getBitmap("character_small", "icons")) self.SetIcon(i) self.disableWin = wx.WindowDisabler(self) self.SetSizeHintsSz(wx.Size(640, 600), wx.DefaultSize) self.SetBackgroundColour( wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNFACE)) mainSizer = wx.BoxSizer(wx.VERTICAL) self.navSizer = wx.BoxSizer(wx.HORIZONTAL) cChar = service.Character.getInstance() charList = cChar.getCharacterList() charList.sort(key=lambda t: t[1]) self.btnSave = wx.Button(self, wx.ID_SAVE) self.btnSave.Hide() self.btnSave.Bind(wx.EVT_BUTTON, self.processRename) self.characterRename = wx.TextCtrl(self, wx.ID_ANY, style=wx.TE_PROCESS_ENTER) self.characterRename.Hide() self.characterRename.Bind(wx.EVT_TEXT_ENTER, self.processRename) self.skillTreeChoice = wx.Choice(self, wx.ID_ANY, style=0) for id, name, active in charList: i = self.skillTreeChoice.Append(name, id) if active: self.skillTreeChoice.SetSelection(i) self.navSizer.Add(self.skillTreeChoice, 1, wx.ALL | wx.EXPAND, 5) buttons = (("new", wx.ART_NEW), ("rename", bitmapLoader.getBitmap("rename", "icons")), ("copy", wx.ART_COPY), ("delete", wx.ART_DELETE)) size = None for name, art 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.SetToolTipString("%s character" % name.capitalize()) btn.Bind(wx.EVT_BUTTON, getattr(self, name)) setattr(self, "btn%s" % name.capitalize(), btn) self.navSizer.Add(btn, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 2) mainSizer.Add(self.navSizer, 0, wx.ALL | wx.EXPAND, 5) self.viewsNBContainer = wx.Notebook(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, 0) self.sview = SkillTreeView(self.viewsNBContainer) self.iview = ImplantsTreeView(self.viewsNBContainer) #======================================================================= # RC2 self.iview.Show(False) #======================================================================= self.aview = APIView(self.viewsNBContainer) self.viewsNBContainer.AddPage(self.sview, "Skills") #======================================================================= # Disabled for RC2 # self.viewsNBContainer.AddPage(self.iview, "Implants") #======================================================================= self.viewsNBContainer.AddPage(self.aview, "API") mainSizer.Add(self.viewsNBContainer, 1, wx.EXPAND | wx.ALL, 5) bSizerButtons = wx.BoxSizer(wx.HORIZONTAL) self.btnOK = wx.Button(self, wx.ID_OK) bSizerButtons.Add(self.btnOK, 0, wx.ALL, 5) self.btnOK.Bind(wx.EVT_BUTTON, self.editingFinished) mainSizer.Add(bSizerButtons, 0, wx.ALIGN_RIGHT, 5) self.SetSizer(mainSizer) self.Layout() self.Centre(wx.BOTH) charID = self.getActiveCharacter() if cChar.getCharName(charID) in ("All 0", "All 5"): self.restrict() self.registerEvents() self.mainFrame = gui.mainFrame.MainFrame.getInstance()
def __init__(self): self.characterEditorId = wx.NewId() self.damagePatternEditorId = wx.NewId() self.targetResistsEditorId = 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.mainFrame = gui.mainFrame.MainFrame.getInstance() 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) copyText = "&To Clipboard" + ("\tCTRL+C" if 'wxMSW' in wx.PlatformInfo else "") pasteText = "&From Clipboard" + ("\tCTRL+V" if 'wxMSW' in wx.PlatformInfo else "") editMenu.Append(wx.ID_COPY, copyText, "Export a fit to the clipboard") editMenu.Append(wx.ID_PASTE, pasteText, "Import a fit from the clipboard") # 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", "icons")) windowMenu.AppendItem(charEditItem) damagePatternEditItem = wx.MenuItem(windowMenu, self.damagePatternEditorId, "Damage Pattern Editor\tCTRL+D") damagePatternEditItem.SetBitmap(bitmapLoader.getBitmap("damagePattern_small", "icons")) windowMenu.AppendItem(damagePatternEditItem) targetResistsEditItem = wx.MenuItem(windowMenu, self.targetResistsEditorId, "Target Resists Editor\tCTRL+R") targetResistsEditItem.SetBitmap(bitmapLoader.getBitmap("explosive_big", "icons")) windowMenu.AppendItem(targetResistsEditItem) graphFrameItem = wx.MenuItem(windowMenu, self.graphFrameId, "Graphs\tCTRL+G") graphFrameItem.SetBitmap(bitmapLoader.getBitmap("graphs_small", "icons")) windowMenu.AppendItem(graphFrameItem) preferencesItem = wx.MenuItem(windowMenu, wx.ID_PREFERENCES, "Preferences\tCTRL+P") preferencesItem.SetBitmap(bitmapLoader.getBitmap("preferences_small", "icons")) windowMenu.AppendItem(preferencesItem) # 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 Widgets Inspect tool", "Open Widgets Inspect tool") self.mainFrame.Bind(GE.FIT_CHANGED, self.fitChanged)
def __init__(self, parent, style=wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE | wx.FRAME_FLOAT_ON_PARENT): global enabled global mplImported self.legendFix = False if not enabled: return try: import matplotlib as mpl try: cache_dir = mpl._get_cachedir() except: cache_dir = unicode( 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') from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as Canvas from matplotlib.figure import Figure enabled = True if 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 except: print "Problems importing matplotlib; continuing without graphs" enabled = False return mplImported = True wx.Frame.__init__(self, parent, title=u"pyfa: Graph Generator", style=style, size=(520, 390)) i = wx.IconFromBitmap(bitmapLoader.getBitmap("graphs_small", "icons")) self.SetIcon(i) self.mainFrame = gui.mainFrame.MainFrame.getInstance() self.CreateStatusBar() self.mainSizer = wx.BoxSizer(wx.VERTICAL) self.SetSizer(self.mainSizer) sFit = service.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) 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 __init__(self, parent): wx.Dialog.__init__(self, parent, id=wx.ID_ANY, title=u"Damage Pattern Editor", size=wx.Size(400, 240)) self.block = False self.SetSizeHintsSz(wx.DefaultSize, wx.DefaultSize) mainSizer = wx.BoxSizer(wx.VERTICAL) self.headerSizer = headerSizer = wx.BoxSizer(wx.HORIZONTAL) cDP = service.DamagePattern.getInstance() self.choices = cDP.getDamagePatternList() # Remove "Uniform" and "Selected Ammo" Damage Patterns for dp in self.choices: if dp.name in ("Uniform", "Selected Ammo"): self.choices.remove(dp) # Sort the remaining list and continue on self.choices.sort(key=lambda p: p.name) self.ccDmgPattern = wx.Choice(self, choices=map(lambda p: p.name, self.choices)) self.ccDmgPattern.Bind(wx.EVT_CHOICE, self.patternChanged) self.ccDmgPattern.SetSelection(0) self.namePicker = wx.TextCtrl(self, style=wx.TE_PROCESS_ENTER) self.namePicker.Bind(wx.EVT_TEXT_ENTER, self.processRename) self.namePicker.Hide() self.btnSave = wx.Button(self, wx.ID_SAVE) self.btnSave.Hide() self.btnSave.Bind(wx.EVT_BUTTON, self.processRename) size = None headerSizer.Add(self.ccDmgPattern, 1, wx.ALIGN_CENTER_VERTICAL | wx.RIGHT | wx.LEFT, 3) buttons = (("new", wx.ART_NEW), ("rename", bitmapLoader.getBitmap("rename", "icons")), ("copy", wx.ART_COPY), ("delete", wx.ART_DELETE)) for name, art 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.Layout() setattr(self, name, btn) btn.Enable(True) btn.SetToolTipString("%s pattern" % name.capitalize()) headerSizer.Add(btn, 0, wx.ALIGN_CENTER_VERTICAL) mainSizer.Add(headerSizer, 0, wx.EXPAND | wx.ALL, 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", "icons") self.thermbitmap = bitmapLoader.getBitmap("thermal_big", "icons") self.kinbitmap = bitmapLoader.getBitmap("kinetic_big", "icons") self.expbitmap = bitmapLoader.getBitmap("explosive_big", "icons") dmgeditSizer = wx.FlexGridSizer(2, 4, 0, 2) dmgeditSizer.AddGrowableCol(1) dmgeditSizer.AddGrowableCol(2) dmgeditSizer.SetFlexibleDirection(wx.BOTH) dmgeditSizer.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED) width = -1 defSize = wx.Size(width, -1) self.editEm = IntCtrl(self, wx.ID_ANY, 0, wx.DefaultPosition, defSize, wx.TE_RIGHT) dmgeditSizer.Add(self.editEm, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5) self.bmpEM = wx.StaticBitmap(self, wx.ID_ANY, self.embitmap) dmgeditSizer.Add(self.bmpEM, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 5) self.bmpTHERM = wx.StaticBitmap(self, wx.ID_ANY, self.thermbitmap) dmgeditSizer.Add( self.bmpTHERM, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT, 5) self.editThermal = IntCtrl(self, wx.ID_ANY, 0, wx.DefaultPosition, defSize, 0) dmgeditSizer.Add(self.editThermal, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5) self.editKinetic = IntCtrl(self, wx.ID_ANY, 0, wx.DefaultPosition, defSize, wx.TE_RIGHT) dmgeditSizer.Add(self.editKinetic, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5) self.bmpKIN = wx.StaticBitmap(self, wx.ID_ANY, self.kinbitmap) dmgeditSizer.Add(self.bmpKIN, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 5) self.bmpEXP = wx.StaticBitmap(self, wx.ID_ANY, self.expbitmap) dmgeditSizer.Add( self.bmpEXP, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT, 5) self.editExplosive = IntCtrl(self, wx.ID_ANY, 0, wx.DefaultPosition, defSize, 0) dmgeditSizer.Add(self.editExplosive, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5) 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.stPercentages = wx.StaticText(self, wx.ID_ANY, u"") self.stPercentages.Wrap(-1) perSizer.Add(self.stPercentages, 0, wx.BOTTOM | wx.LEFT, 5) footerSizer.Add(perSizer, 0, 0, 5) self.totSizer = wx.BoxSizer(wx.VERTICAL) self.stTotal = wx.StaticText(self, wx.ID_ANY, u"") self.stTotal.Wrap(-1) self.totSizer.Add(self.stTotal, 0, wx.ALIGN_RIGHT | wx.BOTTOM | wx.RIGHT, 5) footerSizer.Add(self.totSizer, 1, 0, 5) contentSizer.Add(footerSizer, 0, wx.EXPAND, 5) mainSizer.Add(contentSizer, 1, wx.EXPAND, 0) self.SetSizer(mainSizer) self.Layout() bsize = self.GetBestSize() self.SetSize((-1, bsize.height)) self.editEm.SetLimited(True) self.editThermal.SetLimited(True) self.editKinetic.SetLimited(True) self.editExplosive.SetLimited(True) self.editEm.SetMin(0) self.editThermal.SetMin(0) self.editKinetic.SetMin(0) self.editExplosive.SetMin(0) self.editEm.SetMax(99999) self.editThermal.SetMax(99999) self.editKinetic.SetMax(99999) self.editExplosive.SetMax(99999) self.new.Bind(wx.EVT_BUTTON, self.newPattern) self.rename.Bind(wx.EVT_BUTTON, self.renamePattern) self.copy.Bind(wx.EVT_BUTTON, self.copyPattern) self.delete.Bind(wx.EVT_BUTTON, self.deletePattern) self.editEm.Bind(wx.EVT_TEXT, self.ValuesUpdated) self.editThermal.Bind(wx.EVT_TEXT, self.ValuesUpdated) self.editKinetic.Bind(wx.EVT_TEXT, self.ValuesUpdated) self.editExplosive.Bind(wx.EVT_TEXT, self.ValuesUpdated) self.patternChanged()
def __init__(self, parent, style=wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE | wx.FRAME_FLOAT_ON_PARENT): global enabled global mplImported self.legendFix = False if not enabled: return try: import matplotlib as mpl if not mplImported: mpl.use('wxagg') from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as Canvas from matplotlib.figure import Figure import matplotlib.pyplot as pyplot; enabled = True if 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 except: print "Problems importing matplotlib; continuing without graphs" enabled = False return mplImported = True wx.Frame.__init__(self, parent, title=u"pyfa: DPS map Generator", style=style, size=(520, 390)) i = wx.IconFromBitmap(bitmapLoader.getBitmap("graphs_small", "icons")) self.SetIcon(i) self.mainFrame = gui.mainFrame.MainFrame.getInstance() self.CreateStatusBar() self.mainSizer = wx.BoxSizer(wx.VERTICAL) self.SetSizer(self.mainSizer) sFit = service.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)) self.colorBar = None; 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.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) 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 PopulateTree(self): root = self.affectedBy.AddRoot("WINPWNZ0R") self.affectedBy.SetPyData(root, None) self.imageList = wx.ImageList(16, 16) self.affectedBy.SetImageList(self.imageList) cont = self.stuff.itemModifiedAttributes if self.item == self.stuff.item else self.stuff.chargeModifiedAttributes things = {} for attrName in cont.iterAfflictions(): # if value is 0 or there has been no change from original to modified, return if cont[attrName] == (cont.getOriginal(attrName) or 0): continue for fit, afflictors in cont.getAfflictions(attrName).iteritems(): for afflictor, modifier, amount, used in afflictors: if not used or afflictor.item is None: continue if afflictor.item.name not in things: things[afflictor.item.name] = [ type(afflictor), set(), set() ] info = things[afflictor.item.name] info[1].add(afflictor) info[2].add((attrName, modifier, amount)) order = things.keys() order.sort(key=lambda x: (self.ORDER.index(things[x][0]), x)) for itemName in order: info = things[itemName] afflictorType, afflictors, attrData = info counter = len(afflictors) baseAfflictor = afflictors.pop() if afflictorType == Ship: itemIcon = self.imageList.Add( bitmapLoader.getBitmap("ship_small", "icons")) elif baseAfflictor.item.icon: bitmap = bitmapLoader.getBitmap( baseAfflictor.item.icon.iconFile, "pack") itemIcon = self.imageList.Add(bitmap) if bitmap else -1 else: itemIcon = -1 child = self.affectedBy.AppendItem( root, "%s" % itemName if counter == 1 else "%s x %d" % (itemName, counter), itemIcon) 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.icon is not None: iconFile = attrInfo.icon.iconFile icon = bitmapLoader.getBitmap(iconFile, "pack") if icon is None: icon = bitmapLoader.getBitmap( "transparent16x16", "icons") attrIcon = self.imageList.Add(icon) else: attrIcon = self.imageList.Add( bitmapLoader.getBitmap("07_15", "pack")) else: attrIcon = self.imageList.Add( bitmapLoader.getBitmap("07_15", "pack")) if attrModifier == "s*": attrModifier = "*" penalized = "(penalized)" else: penalized = "" 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.toggleView == 1: treeitem = self.affectedBy.AppendItem( child, "%s %s %.2f %s" % ((displayName if displayName != "" else attrName), attrModifier, attrAmount, penalized), attrIcon) self.affectedBy.SetPyData( treeitem, "%s %s %.2f %s" % (attrName, attrModifier, attrAmount, penalized)) else: treeitem = self.affectedBy.AppendItem( child, "%s %s %.2f %s" % (attrName, attrModifier, attrAmount, penalized), attrIcon) self.affectedBy.SetPyData( treeitem, "%s %s %.2f %s" % ((displayName if displayName != "" else attrName), attrModifier, attrAmount, penalized)) self.ExpandCollapseTree()
def __init__(self, victim, fullContext=None, pos=wx.DefaultPosition, size=wx.DefaultSize, maximized=False): wx.Dialog.__init__(self, gui.mainFrame.MainFrame.getInstance(), wx.ID_ANY, title="Item stats", pos=pos, size=size, style=wx.CAPTION | wx.CLOSE_BOX | wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.RESIZE_BORDER | wx.SYSTEM_MENU) empty = getattr(victim, "isEmpty", False) if empty: self.Hide() self.Destroy() return srcContext = fullContext[0] try: itmContext = fullContext[1] except IndexError: itmContext = None item = getattr(victim, "item", None) if srcContext.lower() not in ( "projectedcharge", "fittingcharge") else getattr(victim, "charge", None) if item is None: sMarket = service.Market.getInstance() item = sMarket.getItem(victim.ID) victim = None self.context = itmContext if item.icon is not None: before, sep, after = item.icon.iconFile.rpartition("_") iconFile = "%s%s%s" % (before, sep, "0%s" % after if len(after) < 2 else after) itemImg = bitmapLoader.getBitmap(iconFile, "pack") if itemImg is not None: self.SetIcon(wx.IconFromBitmap(itemImg)) self.SetTitle( "%s: %s" % ("%s Stats" % itmContext if itmContext is not None else "Stats", item.name)) self.SetMinSize((300, 200)) self.SetSize((500, 300)) self.SetMaxSize((500, -1)) self.mainSizer = wx.BoxSizer(wx.VERTICAL) self.container = ItemStatsContainer(self, victim, item, itmContext) self.mainSizer.Add(self.container, 1, wx.EXPAND) if "wxGTK" in wx.PlatformInfo: self.closeBtn = wx.Button(self, wx.ID_ANY, u"Close", wx.DefaultPosition, wx.DefaultSize, 0) self.mainSizer.Add(self.closeBtn, 0, wx.ALL | wx.ALIGN_RIGHT, 5) self.closeBtn.Bind(wx.EVT_BUTTON, self.closeEvent) self.SetSizer(self.mainSizer) self.parentWnd = gui.mainFrame.MainFrame.getInstance() dlgsize = self.GetSize() psize = self.parentWnd.GetSize() ppos = self.parentWnd.GetPosition() ItemStatsDialog.counter += 1 self.dlgOrder = ItemStatsDialog.counter counter = ItemStatsDialog.counter dlgStep = 30 if counter * dlgStep > ppos.x + psize.width - dlgsize.x or counter * dlgStep > ppos.y + psize.height - dlgsize.y: ItemStatsDialog.counter = 1 dlgx = ppos.x + counter * dlgStep dlgy = ppos.y + counter * dlgStep if pos == wx.DefaultPosition: self.SetPosition((dlgx, dlgy)) else: self.SetPosition(pos) if maximized: self.Maximize(True) else: if size != wx.DefaultSize: self.SetSize(size) self.parentWnd.RegisterStatsWindow(self) self.Show() self.Bind(wx.EVT_CLOSE, self.closeEvent) self.Bind(wx.EVT_ACTIVATE, self.OnActivate)
def __init__(self, parent): wx.Dialog.__init__(self, parent, id = wx.ID_ANY, title = u"Target Resists Editor", size = wx.Size( 350,240 )) self.block = False self.SetSizeHintsSz(wx.DefaultSize, wx.DefaultSize) mainSizer = wx.BoxSizer(wx.VERTICAL) self.headerSizer = headerSizer = wx.BoxSizer(wx.HORIZONTAL) sTR = service.TargetResists.getInstance() self.choices = sTR.getTargetResistsList() # Sort the remaining list and continue on self.choices.sort(key=lambda p: p.name) self.ccResists = wx.Choice(self, choices=map(lambda p: p.name, self.choices)) self.ccResists.Bind(wx.EVT_CHOICE, self.patternChanged) self.ccResists.SetSelection(0) self.namePicker = wx.TextCtrl(self, style=wx.TE_PROCESS_ENTER) self.namePicker.Bind(wx.EVT_TEXT_ENTER, self.processRename) self.namePicker.Hide() self.btnSave = wx.Button(self, wx.ID_SAVE) self.btnSave.Hide() self.btnSave.Bind(wx.EVT_BUTTON, self.processRename) size = None headerSizer.Add(self.ccResists, 1, wx.ALIGN_CENTER_VERTICAL | wx.RIGHT | wx.LEFT, 3) buttons = (("new", wx.ART_NEW), ("rename", bitmapLoader.getBitmap("rename", "icons")), ("copy", wx.ART_COPY), ("delete", wx.ART_DELETE)) for name, art 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.Layout() setattr(self, name, btn) btn.Enable(True) btn.SetToolTipString("%s resist profile" % name.capitalize()) headerSizer.Add(btn, 0, wx.ALIGN_CENTER_VERTICAL) mainSizer.Add(headerSizer, 0, wx.EXPAND | wx.ALL, 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) width = -1 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, "icons")) 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, u"%", wx.DefaultPosition, wx.DefaultSize, 0 ), 0, wx.BOTTOM | wx.TOP | wx.ALIGN_CENTER_VERTICAL, 5) editObj.Bind(wx.EVT_TEXT, self.ValuesUpdated) 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, u"") 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, u"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.SetToolTipString("%s patterns %s clipboard" % (name, direction) ) footerSizer.Add(btn, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_RIGHT) self.Layout() bsize = self.GetBestSize() self.SetSize((-1,bsize.height)) self.new.Bind(wx.EVT_BUTTON, self.newPattern) self.rename.Bind(wx.EVT_BUTTON, self.renamePattern) self.copy.Bind(wx.EVT_BUTTON, self.copyPattern) self.delete.Bind(wx.EVT_BUTTON, self.deletePattern) self.Import.Bind(wx.EVT_BUTTON, self.importPatterns) self.Export.Bind(wx.EVT_BUTTON, self.exportPatterns) self.patternChanged()
def __init__(self, parent): wx.Dialog.__init__ (self, parent, id = wx.ID_ANY, title = u"Damage Pattern Editor", size = wx.Size( 400,240 )) self.block = False self.SetSizeHintsSz(wx.DefaultSize, wx.DefaultSize) mainSizer = wx.BoxSizer(wx.VERTICAL) self.headerSizer = headerSizer = wx.BoxSizer(wx.HORIZONTAL) sDP = service.DamagePattern.getInstance() self.choices = sDP.getDamagePatternList() # Remove "Selected Ammo" Damage Pattern for dp in self.choices: if dp.name == "Selected Ammo": self.choices.remove(dp) # Sort the remaining list and continue on self.choices.sort(key=lambda p: p.name) self.ccDmgPattern = wx.Choice(self, choices=map(lambda p: p.name, self.choices)) self.ccDmgPattern.Bind(wx.EVT_CHOICE, self.patternChanged) self.ccDmgPattern.SetSelection(0) self.namePicker = wx.TextCtrl(self, style=wx.TE_PROCESS_ENTER) self.namePicker.Bind(wx.EVT_TEXT_ENTER, self.processRename) self.namePicker.Hide() self.btnSave = wx.Button(self, wx.ID_SAVE) self.btnSave.Hide() self.btnSave.Bind(wx.EVT_BUTTON, self.processRename) size = None headerSizer.Add(self.ccDmgPattern, 1, wx.ALIGN_CENTER_VERTICAL | wx.RIGHT|wx.LEFT, 3) buttons = (("new", wx.ART_NEW), ("rename", bitmapLoader.getBitmap("rename", "icons")), ("copy", wx.ART_COPY), ("delete", wx.ART_DELETE)) for name, art 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.Layout() setattr(self, name, btn) btn.Enable(True) btn.SetToolTipString("%s pattern" % name.capitalize()) headerSizer.Add(btn, 0, wx.ALIGN_CENTER_VERTICAL) mainSizer.Add(headerSizer, 0, wx.EXPAND | wx.ALL, 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", "icons") self.thermbitmap = bitmapLoader.getBitmap("thermal_big", "icons") self.kinbitmap = bitmapLoader.getBitmap("kinetic_big", "icons") self.expbitmap = bitmapLoader.getBitmap("explosive_big", "icons") dmgeditSizer = wx.FlexGridSizer(2, 4, 0, 2) dmgeditSizer.AddGrowableCol(0) dmgeditSizer.AddGrowableCol(3) dmgeditSizer.SetFlexibleDirection(wx.BOTH) dmgeditSizer.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED) width = -1 defSize = wx.Size(width,-1) self.bmpEM = wx.StaticBitmap(self, wx.ID_ANY, self.embitmap) dmgeditSizer.Add(self.bmpEM, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT, 5) self.editEm = IntCtrl(self, wx.ID_ANY, 0, wx.DefaultPosition, defSize) dmgeditSizer.Add(self.editEm, 0, wx.BOTTOM | wx.TOP | wx.ALIGN_CENTER_VERTICAL, 5) self.bmpTHERM = wx.StaticBitmap(self, wx.ID_ANY, self.thermbitmap) dmgeditSizer.Add(self.bmpTHERM, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT | wx.LEFT, 25) self.editThermal = IntCtrl(self, wx.ID_ANY, 0, wx.DefaultPosition, defSize, 0) dmgeditSizer.Add(self.editThermal, 0, wx.BOTTOM | wx.TOP | wx.ALIGN_CENTER_VERTICAL, 5) self.bmpKIN = wx.StaticBitmap(self, wx.ID_ANY, self.kinbitmap) dmgeditSizer.Add(self.bmpKIN, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT, 5) self.editKinetic = IntCtrl(self, wx.ID_ANY, 0, wx.DefaultPosition, defSize) dmgeditSizer.Add(self.editKinetic, 0, wx.BOTTOM | wx.TOP | wx.ALIGN_CENTER_VERTICAL, 5) self.bmpEXP = wx.StaticBitmap(self, wx.ID_ANY, self.expbitmap) dmgeditSizer.Add(self.bmpEXP, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT | wx.LEFT, 25) self.editExplosive = IntCtrl(self, wx.ID_ANY, 0, wx.DefaultPosition, defSize, 0) dmgeditSizer.Add(self.editExplosive, 0, wx.BOTTOM | wx.TOP | wx.ALIGN_CENTER_VERTICAL, 5) 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.stPercentages = wx.StaticText(self, wx.ID_ANY, u"") self.stPercentages.Wrap(-1) perSizer.Add(self.stPercentages, 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, u"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.SetToolTipString("%s patterns %s clipboard" % (name, direction) ) footerSizer.Add(btn, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_RIGHT) self.Layout() bsize = self.GetBestSize() self.SetSize((-1,bsize.height)) self.editEm.SetLimited(True) self.editThermal.SetLimited(True) self.editKinetic.SetLimited(True) self.editExplosive.SetLimited(True) self.editEm.SetMin(0) self.editThermal.SetMin(0) self.editKinetic.SetMin(0) self.editExplosive.SetMin(0) self.editEm.SetMax(99999) self.editThermal.SetMax(99999) self.editKinetic.SetMax(99999) self.editExplosive.SetMax(99999) self.new.Bind(wx.EVT_BUTTON, self.newPattern) self.rename.Bind(wx.EVT_BUTTON, self.renamePattern) self.copy.Bind(wx.EVT_BUTTON, self.copyPattern) self.delete.Bind(wx.EVT_BUTTON, self.deletePattern) self.Import.Bind(wx.EVT_BUTTON, self.importPatterns) self.Export.Bind(wx.EVT_BUTTON, self.exportPatterns) self.editEm.Bind(wx.EVT_TEXT, self.ValuesUpdated) self.editThermal.Bind(wx.EVT_TEXT, self.ValuesUpdated) self.editKinetic.Bind(wx.EVT_TEXT, self.ValuesUpdated) self.editExplosive.Bind(wx.EVT_TEXT, self.ValuesUpdated) self.patternChanged()
def __init__(self, parent): wx.Dialog.__init__ (self, parent, id = wx.ID_ANY, title = u"Target Resists Editor", size = wx.Size( 350,240 )) self.block = False self.SetSizeHintsSz(wx.DefaultSize, wx.DefaultSize) mainSizer = wx.BoxSizer(wx.VERTICAL) self.headerSizer = headerSizer = wx.BoxSizer(wx.HORIZONTAL) sTR = service.TargetResists.getInstance() self.choices = sTR.getTargetResistsList() # Sort the remaining list and continue on self.choices.sort(key=lambda p: p.name) self.ccResists = wx.Choice(self, choices=map(lambda p: p.name, self.choices)) self.ccResists.Bind(wx.EVT_CHOICE, self.patternChanged) self.ccResists.SetSelection(0) self.namePicker = wx.TextCtrl(self, style=wx.TE_PROCESS_ENTER) self.namePicker.Bind(wx.EVT_TEXT_ENTER, self.processRename) self.namePicker.Hide() self.btnSave = wx.Button(self, wx.ID_SAVE) self.btnSave.Hide() self.btnSave.Bind(wx.EVT_BUTTON, self.processRename) size = None headerSizer.Add(self.ccResists, 1, wx.ALIGN_CENTER_VERTICAL | wx.RIGHT | wx.LEFT, 3) buttons = (("new", wx.ART_NEW), ("rename", bitmapLoader.getBitmap("rename", "icons")), ("copy", wx.ART_COPY), ("delete", wx.ART_DELETE)) for name, art 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.Layout() setattr(self, name, btn) btn.Enable(True) btn.SetToolTipString("%s resist profile" % name.capitalize()) headerSizer.Add(btn, 0, wx.ALIGN_CENTER_VERTICAL) mainSizer.Add(headerSizer, 0, wx.EXPAND | wx.ALL, 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) width = -1 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, "icons")) 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, u"%", wx.DefaultPosition, wx.DefaultSize, 0 ), 0, wx.BOTTOM | wx.TOP | wx.ALIGN_CENTER_VERTICAL, 5) editObj.Bind(wx.EVT_TEXT, self.ValuesUpdated) 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, u"") 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, u"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.SetToolTipString("%s patterns %s clipboard" % (name, direction) ) footerSizer.Add(btn, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_RIGHT) self.Layout() bsize = self.GetBestSize() self.SetSize((-1,bsize.height)) self.new.Bind(wx.EVT_BUTTON, self.newPattern) self.rename.Bind(wx.EVT_BUTTON, self.renamePattern) self.copy.Bind(wx.EVT_BUTTON, self.copyPattern) self.delete.Bind(wx.EVT_BUTTON, self.deletePattern) self.Import.Bind(wx.EVT_BUTTON, self.importPatterns) self.Export.Bind(wx.EVT_BUTTON, self.exportPatterns) self.patternChanged()
def __init__(self): self.characterEditorId = wx.NewId() self.damagePatternEditorId = wx.NewId() self.graphFrameId = wx.NewId() self.backupFitsId = wx.NewId() self.mainFrame = gui.mainFrame.MainFrame.getInstance() wx.MenuBar.__init__(self) # File menu fileMenu = wx.Menu() self.Append(fileMenu, "&File") fileMenu.Append(self.mainFrame.addTabId, "&New Tab\tCTRL+T", "Open a new fitting tab") fileMenu.Append(self.mainFrame.closeTabId, "&Close Tab\tCTRL+W", "Close the current fit") fileMenu.AppendSeparator() fileMenu.Append(self.backupFitsId, "&Backup fits", "Backup all fittings to a XML file") fileMenu.Append(wx.ID_OPEN, "&Import\tCTRL+O", "Import a fit into pyfa.") fileMenu.Append(wx.ID_SAVEAS, "&Export\tCTRL+S", "Export the fit to another format.") 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) copyText = "&To Clipboard" + ("\tCTRL+C" if 'wxMSW' in wx.PlatformInfo else "") pasteText = "&From Clipboard" + ("\tCTRL+V" if 'wxMSW' in wx.PlatformInfo else "") editMenu.Append(wx.ID_COPY, copyText, "Export a fit to the clipboard") editMenu.Append(wx.ID_PASTE, pasteText, "Import a fit from the clipboard") # 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", "icons")) windowMenu.AppendItem(charEditItem) damagePatternEditItem = wx.MenuItem(windowMenu, self.damagePatternEditorId, "Damage Pattern Editor\tCTRL+D") damagePatternEditItem.SetBitmap(bitmapLoader.getBitmap("damagePattern_small", "icons")) windowMenu.AppendItem(damagePatternEditItem) graphFrameItem = wx.MenuItem(windowMenu, self.graphFrameId, "Graphs\tCTRL+G") graphFrameItem.SetBitmap(bitmapLoader.getBitmap("graphs_small", "icons")) graphFrameItem.Enable(gui.graphFrame.enabled) windowMenu.AppendItem(graphFrameItem) #windowMenu.Append(wx.ID_PREFERENCES) # Help menu helpMenu = wx.Menu() self.Append(helpMenu, "&Help") helpMenu.Append(wx.ID_ABOUT) #helpMenu.Append(wx.ID_HELP, "User manual", "User manual") helpMenu.Append(911,"Open Widgets Inspect tool", "Open Widgets Inspect tool") self.mainFrame.Bind(gui.fittingView.FIT_CHANGED, self.fitChanged)
def PopulateList(self): self.paramList.InsertColumn(0, "Attribute") self.paramList.InsertColumn(1, "Value") self.paramList.SetColumnWidth(1, 150) self.paramList.setResizeColumn(1) self.imageList = wx.ImageList(16, 16) self.paramList.SetImageList(self.imageList, wx.IMAGE_LIST_SMALL) if self.stuff is None or self.stuff.item == self.item: attrs = self.stuff.itemModifiedAttributes if self.stuff is not None else self.item.attributes attrsInfo = self.item.attributes if self.stuff is None else self.stuff.item.attributes else: attrs = self.stuff.chargeModifiedAttributes if self.stuff is not None else self.item.attributes attrsInfo = self.item.attributes if self.stuff is None else self.stuff.charge.attributes names = list(attrs.iterkeys()) names.sort() idNameMap = {} idCount = 0 for name in names: info = attrsInfo.get(name) att = attrs[name] 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: if info.icon is not None: iconFile = info.icon.iconFile icon = bitmapLoader.getBitmap(iconFile, "pack") if icon is None: icon = bitmapLoader.getBitmap("transparent16x16", "icons") attrIcon = self.imageList.Add(icon) else: attrIcon = self.imageList.Add( bitmapLoader.getBitmap("07_15", "pack")) else: attrIcon = self.imageList.Add( bitmapLoader.getBitmap("07_15", "pack")) index = self.paramList.InsertImageStringItem( sys.maxint, 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.TranslateValueUnit(value, info.unit.displayName, info.unit.name) else: valueUnit = formatAmount(value, 3, 0, 0) self.paramList.SetStringItem(index, 1, valueUnit) self.paramList.SortItems( lambda id1, id2: cmp(idNameMap[id1], idNameMap[id2])) self.paramList.RefreshRows() self.totalAttrsLabel.SetLabel("%d attributes. " % idCount) self.Layout()
def PopulateTree(self): root = self.affectedBy.AddRoot("WINPWNZ0R") self.affectedBy.SetPyData(root, None) self.imageList = wx.ImageList(16, 16) self.affectedBy.SetImageList(self.imageList) cont = self.stuff.itemModifiedAttributes if self.item == self.stuff.item else self.stuff.chargeModifiedAttributes things = {} for attrName in cont.iterAfflictions(): if cont[attrName] == (cont.getOriginal(attrName) or 0): continue for fit, afflictors in cont.getAfflictions(attrName).iteritems(): for afflictor, modifier, amount in afflictors: if afflictor.item.name not in things: things[afflictor.item.name] = [type(afflictor), set(), set()] info = things[afflictor.item.name] info[1].add(afflictor) info[2].add((attrName, modifier, amount)) order = things.keys() order.sort(key=lambda x: (self.ORDER.index(things[x][0]), x)) for itemName in order: info = things[itemName] afflictorType, afflictors, attrData = info counter = len(afflictors) baseAfflictor = afflictors.pop() if afflictorType == Ship: itemIcon = self.imageList.Add(bitmapLoader.getBitmap("ship_small", "icons")) elif baseAfflictor.item.icon: itemIcon = self.imageList.Add(bitmapLoader.getBitmap(baseAfflictor.item.icon.iconFile, "pack")) else: itemIcon = -1 child = self.affectedBy.AppendItem(root, "%s" % itemName if counter == 1 else "%s x %d" % (itemName,counter), itemIcon) if counter > 0: for attrName, attrModifier, attrAmount in attrData: attrInfo = self.stuff.item.attributes.get(attrName) displayName = attrInfo.displayName if attrInfo else "" if attrInfo: if attrInfo.icon is not None: iconFile = attrInfo.icon.iconFile attrIcon = self.imageList.Add(bitmapLoader.getBitmap(iconFile, "pack")) else: attrIcon = self.imageList.Add(bitmapLoader.getBitmap("07_15", "pack")) else: attrIcon = self.imageList.Add(bitmapLoader.getBitmap("07_15", "pack")) if attrModifier == "s*": attrModifier = "*" penalized = "(penalized)" else: penalized = "" if self.toggleView == 1: treeitem = self.affectedBy.AppendItem(child, "%s %s %.2f %s" % ((displayName if displayName != "" else attrName), attrModifier, attrAmount, penalized), attrIcon) self.affectedBy.SetPyData(treeitem,"%s %s %.2f %s" % (attrName, attrModifier, attrAmount, penalized)) else: treeitem = self.affectedBy.AppendItem(child, "%s %s %.2f %s" % (attrName, attrModifier, attrAmount, penalized), attrIcon) self.affectedBy.SetPyData(treeitem,"%s %s %.2f %s" % ((displayName if displayName != "" else attrName), attrModifier, attrAmount, penalized)) self.ExpandCollapseTree()
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) or 0): continue for fit, afflictors in attributes.getAfflictions( attrName).iteritems(): for afflictor, modifier, amount, 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, modifier, amount, getattr(afflictor, "projected", False))) # Make sure projected fits are on top rootOrder = 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", "icons")) child = self.affectedBy.AppendItem( root, "{} ({})".format(thing.name, thing.ship.item.name), icon) parent = child attributes = container[thing] attrOrder = sorted(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.icon is not None: iconFile = attrInfo.icon.iconFile icon = bitmapLoader.getBitmap(iconFile, "pack") if icon is None: icon = bitmapLoader.getBitmap( "transparent16x16", "icons") attrIcon = self.imageList.Add(icon) else: attrIcon = self.imageList.Add( bitmapLoader.getBitmap("07_15", "pack")) else: attrIcon = self.imageList.Add( bitmapLoader.getBitmap("07_15", "pack")) 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.SetPyData(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", "icons")) elif item.icon: bitmap = bitmapLoader.getBitmap( item.icon.iconFile, "pack") itemIcon = self.imageList.Add(bitmap) if bitmap else -1 else: itemIcon = -1 displayStr = item.name if projected: displayStr += " (projected)" if attrModifier == "s*": attrModifier = "*" penalized = "(penalized)" else: penalized = "" # 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.SetPyData(treeItem, afflictor)
def __init__(self): self.characterEditorId = wx.NewId() self.damagePatternEditorId = wx.NewId() self.graphFrameId = wx.NewId() self.backupFitsId = wx.NewId() self.preferencesId = wx.NewId() self.mainFrame = gui.mainFrame.MainFrame.getInstance() 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 fits", "Backup all fittings to a XML file") fileMenu.Append(wx.ID_OPEN, "&Import\tCTRL+O", "Import a fit into pyfa.") fileMenu.Append(wx.ID_SAVEAS, "&Export\tCTRL+S", "Export the fit to another format.") 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) copyText = "&To Clipboard" + ("\tCTRL+C" if 'wxMSW' in wx.PlatformInfo else "") pasteText = "&From Clipboard" + ("\tCTRL+V" if 'wxMSW' in wx.PlatformInfo else "") editMenu.Append(wx.ID_COPY, copyText, "Export a fit to the clipboard") editMenu.Append(wx.ID_PASTE, pasteText, "Import a fit from the clipboard") # 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", "icons")) windowMenu.AppendItem(charEditItem) damagePatternEditItem = wx.MenuItem(windowMenu, self.damagePatternEditorId, "Damage Pattern Editor\tCTRL+D") damagePatternEditItem.SetBitmap( bitmapLoader.getBitmap("damagePattern_small", "icons")) windowMenu.AppendItem(damagePatternEditItem) graphFrameItem = wx.MenuItem(windowMenu, self.graphFrameId, "Graphs\tCTRL+G") graphFrameItem.SetBitmap( bitmapLoader.getBitmap("graphs_small", "icons")) windowMenu.AppendItem(graphFrameItem) #======================================================================= # DISABLED FOR RC2 Release # preferencesItem = wx.MenuItem(windowMenu, self.preferencesId, "Preferences\tCTRL+P") preferencesItem.SetBitmap( bitmapLoader.getBitmap("preferences_small", "icons")) windowMenu.AppendItem(preferencesItem) #======================================================================= # Help menu helpMenu = wx.Menu() self.Append(helpMenu, "&Help") helpMenu.Append(wx.ID_ABOUT) if config.debug: helpMenu.Append(self.mainFrame.widgetInspectMenuID, "Open Widgets Inspect tool", "Open Widgets Inspect tool") self.mainFrame.Bind(GE.FIT_CHANGED, self.fitChanged)
def __init__( self, victim, fullContext=None, pos=wx.DefaultPosition, size=wx.DefaultSize, maximized = False ): wx.Dialog.__init__( self, gui.mainFrame.MainFrame.getInstance(), wx.ID_ANY, title="Item stats", pos=pos, size=size, style=wx.CAPTION | wx.CLOSE_BOX | wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.RESIZE_BORDER| wx.SYSTEM_MENU ) empty = getattr(victim, "isEmpty", False) if empty: self.Hide() self.Destroy() return srcContext = fullContext[0] try: itmContext = fullContext[1] except IndexError: itmContext = None item = getattr(victim, "item", None) if srcContext.lower() not in ("projectedcharge", "fittingcharge") else getattr(victim, "charge", None) if item is None: sMkt = service.Market.getInstance() item = sMkt.getItem(victim.ID) victim = None self.context = itmContext if item.icon is not None: before,sep,after = item.icon.iconFile.rpartition("_") iconFile = "%s%s%s" % (before,sep,"0%s" % after if len(after) < 2 else after) itemImg = bitmapLoader.getBitmap(iconFile, "pack") if itemImg is not None: self.SetIcon(wx.IconFromBitmap(itemImg)) self.SetTitle("%s: %s" % ("%s Stats" % itmContext if itmContext is not None else "Stats", item.name)) self.SetMinSize((300, 200)) if "wxGTK" in wx.PlatformInfo: # GTK has huge tab widgets, give it a bit more room self.SetSize((530, 300)) else: self.SetSize((500, 300)) #self.SetMaxSize((500, -1)) self.mainSizer = wx.BoxSizer(wx.VERTICAL) self.container = ItemStatsContainer(self, victim, item, itmContext) self.mainSizer.Add(self.container, 1, wx.EXPAND) if "wxGTK" in wx.PlatformInfo: self.closeBtn = wx.Button( self, wx.ID_ANY, u"Close", wx.DefaultPosition, wx.DefaultSize, 0 ) self.mainSizer.Add( self.closeBtn, 0, wx.ALL|wx.ALIGN_RIGHT, 5 ) self.closeBtn.Bind(wx.EVT_BUTTON, self.closeEvent) self.SetSizer(self.mainSizer) self.parentWnd = gui.mainFrame.MainFrame.getInstance() dlgsize = self.GetSize() psize = self.parentWnd.GetSize() ppos = self.parentWnd.GetPosition() ItemStatsDialog.counter += 1 self.dlgOrder = ItemStatsDialog.counter counter = ItemStatsDialog.counter dlgStep = 30 if counter * dlgStep > ppos.x+psize.width-dlgsize.x or counter * dlgStep > ppos.y+psize.height-dlgsize.y: ItemStatsDialog.counter = 1 dlgx = ppos.x + counter * dlgStep dlgy = ppos.y + counter * dlgStep if pos == wx.DefaultPosition: self.SetPosition((dlgx,dlgy)) else: self.SetPosition(pos) if maximized: self.Maximize(True) else: if size != wx.DefaultSize: self.SetSize(size) self.parentWnd.RegisterStatsWindow(self) self.Show() self.Bind(wx.EVT_CLOSE, self.closeEvent) self.Bind(wx.EVT_ACTIVATE, self.OnActivate)
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.IconFromBitmap( bitmapLoader.getBitmap("preferences_small", "icons")) 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.SetImageList(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.AddSpacer((0, 0), 1, wx.EXPAND, 5) self.btnOK = wx.Button(self, wx.ID_ANY, u"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.Panel(self.listbook) bmp = prefView.getImage() if bmp: imgID = self.imageList.Add(bmp) else: imgID = -1 prefView.populatePanel(page) self.listbook.AddPage(page, prefView.title, imageId=imgID) # Set the height based on a condition. Can all the panels fit in the current height? # If not, use the .GetBestVirtualSize() to ensure that all content is available. minHeight = 360 bestFit = self.GetBestVirtualSize() if minHeight > bestFit[1]: self.SetSizeWH(450, minHeight) else: self.SetSizeWH(450, bestFit[1]) self.Layout() self.btnOK.Bind(wx.EVT_BUTTON, self.OnBtnOK)
def PopulateTree(self): root = self.affectedBy.AddRoot("WINPWNZ0R") self.affectedBy.SetPyData(root, None) self.imageList = wx.ImageList(16, 16) self.affectedBy.SetImageList(self.imageList) cont = self.stuff.itemModifiedAttributes if self.item == self.stuff.item else self.stuff.chargeModifiedAttributes things = {} for attrName in cont.iterAfflictions(): # if value is 0 or there has been no change from original to modified, return if cont[attrName] == (cont.getOriginal(attrName) or 0): continue for fit, afflictors in cont.getAfflictions(attrName).iteritems(): for afflictor, modifier, amount, used in afflictors: if not used or afflictor.item is None: continue if afflictor.item.name not in things: things[afflictor.item.name] = [type(afflictor), set(), []] info = things[afflictor.item.name] info[1].add(afflictor) # 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, modifier, amount) in info[2]: continue info[2].append((attrName, modifier, amount)) order = things.keys() order.sort(key=lambda x: (self.ORDER.index(things[x][0]), x)) for itemName in order: info = things[itemName] afflictorType, afflictors, attrData = info counter = len(afflictors) baseAfflictor = afflictors.pop() if afflictorType == Ship: itemIcon = self.imageList.Add(bitmapLoader.getBitmap("ship_small", "icons")) elif baseAfflictor.item.icon: bitmap = bitmapLoader.getBitmap(baseAfflictor.item.icon.iconFile, "pack") itemIcon = self.imageList.Add(bitmap) if bitmap else -1 else: itemIcon = -1 child = self.affectedBy.AppendItem(root, "%s" % itemName if counter == 1 else "%s x %d" % (itemName,counter), itemIcon) 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.icon is not None: iconFile = attrInfo.icon.iconFile icon = bitmapLoader.getBitmap(iconFile, "pack") if icon is None: icon = bitmapLoader.getBitmap("transparent16x16", "icons") attrIcon = self.imageList.Add(icon) else: attrIcon = self.imageList.Add(bitmapLoader.getBitmap("07_15", "pack")) else: attrIcon = self.imageList.Add(bitmapLoader.getBitmap("07_15", "pack")) if attrModifier == "s*": attrModifier = "*" penalized = "(penalized)" else: penalized = "" 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.toggleView == 1: treeitem = self.affectedBy.AppendItem(child, "%s %s %.2f %s" % ((displayName if displayName != "" else attrName), attrModifier, attrAmount, penalized), attrIcon) self.affectedBy.SetPyData(treeitem,"%s %s %.2f %s" % (attrName, attrModifier, attrAmount, penalized)) else: treeitem = self.affectedBy.AppendItem(child, "%s %s %.2f %s" % (attrName, attrModifier, attrAmount, penalized), attrIcon) self.affectedBy.SetPyData(treeitem,"%s %s %.2f %s" % ((displayName if displayName != "" else attrName), attrModifier, attrAmount, penalized)) self.ExpandCollapseTree()
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) or 0): continue for fit, afflictors in attributes.getAfflictions(attrName).iteritems(): for afflictor, modifier, amount, 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, modifier, amount, getattr(afflictor, "projected", False))) # Make sure projected fits are on top rootOrder = 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", "icons")) child = self.affectedBy.AppendItem(root, "{} ({})".format(thing.name, thing.ship.item.name), icon) parent = child attributes = container[thing] attrOrder = sorted(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.icon is not None: iconFile = attrInfo.icon.iconFile icon = bitmapLoader.getBitmap(iconFile, "pack") if icon is None: icon = bitmapLoader.getBitmap("transparent16x16", "icons") attrIcon = self.imageList.Add(icon) else: attrIcon = self.imageList.Add(bitmapLoader.getBitmap("07_15", "pack")) else: attrIcon = self.imageList.Add(bitmapLoader.getBitmap("07_15", "pack")) 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.SetPyData(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", "icons")) elif item.icon: bitmap = bitmapLoader.getBitmap(item.icon.iconFile, "pack") itemIcon = self.imageList.Add(bitmap) if bitmap else -1 else: itemIcon = -1 displayStr = item.name if projected: displayStr += " (projected)" if attrModifier == "s*": attrModifier = "*" penalized = "(penalized)" else: penalized = "" # 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.SetPyData(treeItem, afflictor)
def __init__(self, parent): wx.Frame.__init__ (self, parent, id=wx.ID_ANY, title=u"pyfa: Character Editor", pos=wx.DefaultPosition, size=wx.Size(641, 600), style=wx.DEFAULT_FRAME_STYLE|wx.FRAME_FLOAT_ON_PARENT|wx.TAB_TRAVERSAL) i = wx.IconFromBitmap(bitmapLoader.getBitmap("character_small", "icons")) self.SetIcon(i) self.disableWin= wx.WindowDisabler(self) self.SetSizeHintsSz(wx.Size(640, 600), wx.DefaultSize) self.SetBackgroundColour( wx.SystemSettings.GetColour( wx.SYS_COLOUR_BTNFACE ) ) mainSizer = wx.BoxSizer(wx.VERTICAL) self.navSizer = wx.BoxSizer(wx.HORIZONTAL) cChar = service.Character.getInstance() charList = cChar.getCharacterList() charList.sort(key=lambda t: t[1]) self.btnSave = wx.Button(self, wx.ID_SAVE) self.btnSave.Hide() self.btnSave.Bind(wx.EVT_BUTTON, self.processRename) self.characterRename = wx.TextCtrl(self, wx.ID_ANY, style=wx.TE_PROCESS_ENTER) self.characterRename.Hide() self.characterRename.Bind(wx.EVT_TEXT_ENTER, self.processRename) self.skillTreeChoice = wx.Choice(self, wx.ID_ANY, style=0) for id, name, active in charList: i = self.skillTreeChoice.Append(name, id) if active: self.skillTreeChoice.SetSelection(i) self.navSizer.Add(self.skillTreeChoice, 1, wx.ALL | wx.EXPAND, 5) buttons = (("new", wx.ART_NEW), ("rename", bitmapLoader.getBitmap("rename", "icons")), ("copy", wx.ART_COPY), ("delete", wx.ART_DELETE)) size = None for name, art 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.SetToolTipString("%s character" % name.capitalize()) btn.Bind(wx.EVT_BUTTON, getattr(self, name)) setattr(self, "btn%s" % name.capitalize(), btn) self.navSizer.Add(btn, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 2) mainSizer.Add(self.navSizer, 0, wx.ALL | wx.EXPAND, 5) self.viewsNBContainer = wx.Notebook(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, 0) self.sview = SkillTreeView(self.viewsNBContainer) self.iview = ImplantsTreeView(self.viewsNBContainer) #======================================================================= # RC2 self.iview.Show(False) #======================================================================= self.aview = APIView(self.viewsNBContainer) self.viewsNBContainer.AddPage(self.sview, "Skills") #======================================================================= # Disabled for RC2 # self.viewsNBContainer.AddPage(self.iview, "Implants") #======================================================================= self.viewsNBContainer.AddPage(self.aview, "API") mainSizer.Add(self.viewsNBContainer, 1, wx.EXPAND | wx.ALL, 5) bSizerButtons = wx.BoxSizer(wx.HORIZONTAL) self.btnOK = wx.Button(self, wx.ID_OK) bSizerButtons.Add(self.btnOK, 0, wx.ALL, 5) self.btnOK.Bind(wx.EVT_BUTTON, self.editingFinished) mainSizer.Add(bSizerButtons, 0, wx.ALIGN_RIGHT, 5) self.SetSizer(mainSizer) self.Layout() self.Centre(wx.BOTH) charID = self.getActiveCharacter() if cChar.getCharName(charID) in ("All 0", "All 5"): self.restrict() self.registerEvents() self.mainFrame = gui.mainFrame.MainFrame.getInstance()
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) or 0): continue for fit, afflictors in attributes.getAfflictions(attrName).iteritems(): for afflictor, modifier, amount, 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) # 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, modifier, amount) in info[2]: continue info[2].append((attrName, modifier, amount)) # Make sure projected fits are on top rootOrder = 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", "icons")) child = self.affectedBy.AppendItem(root, "{} ({})".format(thing.name, thing.ship.item.name), icon) parent = child items = container[thing] order = 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", "icons")) elif item.icon: bitmap = bitmapLoader.getBitmap(item.icon.iconFile, "pack") 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.SetPyData(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.icon is not None: iconFile = attrInfo.icon.iconFile icon = bitmapLoader.getBitmap(iconFile, "pack") if icon is None: icon = bitmapLoader.getBitmap("transparent16x16", "icons") attrIcon = self.imageList.Add(icon) else: attrIcon = self.imageList.Add(bitmapLoader.getBitmap("07_15", "pack")) else: attrIcon = self.imageList.Add(bitmapLoader.getBitmap("07_15", "pack")) if attrModifier == "s*": attrModifier = "*" penalized = "(penalized)" else: penalized = "" 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.SetPyData(treeitem, saved) self.treeItems.append(treeitem)