def ValuesUpdated(self, event=None): """ Event that is fired when resists values change. Iterates through all resist edit fields. If blank, sets it to 0.0. If it is not a proper decimal value, sets text color to red and refuses to save changes until issue is resolved """ if self.block: return editObj = None try: p = self.entityEditor.getActiveEntity() for type_ in self.DAMAGE_TYPES: editObj = getattr(self, "%sEdit" % type_) if editObj.GetValue() == "": # if we are blank, overwrite with 0 editObj.ChangeValue("0.0") editObj.SetInsertionPointEnd() value = float(editObj.GetValue()) # assertion, because they're easy assert 0 <= value <= 100 # if everything checks out, set resist attribute setattr(p, "%sAmount" % type_, value / 100) editObj.SetForegroundColour(self.colorReset) self.stNotice.SetLabel("") self.totSizer.Layout() if event is not None: event.Skip() TargetResists.getInstance().saveChanges(p) except ValueError: editObj.SetForegroundColour(wx.RED) msg = "Incorrect Formatting (decimals only)" pyfalog.warning(msg) self.stNotice.SetLabel(msg) except AssertionError: editObj.SetForegroundColour(wx.RED) msg = "Incorrect Range (must be 0-100)" pyfalog.warning(msg) self.stNotice.SetLabel(msg) finally: # Refresh for color changes to take effect immediately self.Refresh()
def ValuesUpdated(self, event=None): """ Event that is fired when resists values change. Iterates through all resist edit fields. If blank, sets it to 0.0. If it is not a proper decimal value, sets text color to red and refuses to save changes until issue is resolved """ if self.block: return editObj = None try: p = self.entityEditor.getActiveEntity() for type_ in self.DAMAGE_TYPES: editObj = getattr(self, "%sEdit" % type_) if editObj.GetValue() == "": # if we are blank, overwrite with 0 editObj.ChangeValue("0.0") editObj.SetInsertionPointEnd() value = float(editObj.GetValue()) # assertion, because they're easy assert 0 <= value <= 100 # if everything checks out, set resist attribute setattr(p, "%sAmount" % type_, value / 100) editObj.SetForegroundColour(self.colorReset) self.stNotice.SetLabel("") self.totSizer.Layout() if event is not None: event.Skip() TargetResists.getInstance().saveChanges(p) except ValueError: editObj.SetForegroundColour(wx.RED) msg = "Incorrect Formatting (decimals only)" pyfalog.warning(msg) self.stNotice.SetLabel(msg) except AssertionError: editObj.SetForegroundColour(wx.RED) msg = "Incorrect Range (must be 0-100)" pyfalog.warning(msg) self.stNotice.SetLabel(msg) finally: # Refresh for color changes to take effect immediately self.Refresh()
def display(self, srcContext, selection): if self.mainFrame.getActiveFit() is None or srcContext != "firepowerViewFull": return False sTR = svc_TargetResists.getInstance() self.patterns = sTR.getTargetResistsList() self.patterns.sort(key=lambda p: (p.name in ["None"], p.name)) return len(self.patterns) > 0
def display(self, srcContext, selection): if self.mainFrame.getActiveFit() is None or srcContext != "firepowerViewFull": return False sTR = svc_TargetResists.getInstance() self.patterns = sTR.getTargetResistsList() self.patterns.sort(key=lambda p: (p.name in ["None"], p.name)) return len(self.patterns) > 0
def importPatterns(self, event): "Event fired when import from clipboard button is clicked" text = fromClipboard() if text: sTR = TargetResists.getInstance() try: sTR.importPatterns(text) self.stNotice.SetLabel("Patterns successfully imported from clipboard") except ImportError as e: self.stNotice.SetLabel(str(e)) except Exception: self.stNotice.SetLabel("Could not import from clipboard: unknown errors") finally: self.entityEditor.refreshEntityList() else: self.stNotice.SetLabel("Could not import from clipboard")
def display(self, srcContext, selection): if not self.settings.get('targetResists'): return False if srcContext == "firepowerViewFull": if self.mainFrame.getActiveFit() is None: return False elif srcContext in ("graphTargetFitsResists", "graphTargetResists"): pass else: return False sTR = svc_TargetResists.getInstance() self.patterns = sTR.getTargetResistsList() self.patterns.sort(key=lambda p: (p.name in ["None"], p.name)) return len(self.patterns) > 0
def importPatterns(self, event): """Event fired when import from clipboard button is clicked""" text = fromClipboard() if text: sTR = TargetResists.getInstance() try: sTR.importPatterns(text) self.stNotice.SetLabel("Patterns successfully imported from clipboard") except ImportError as e: pyfalog.error(e) self.stNotice.SetLabel(str(e)) except Exception as e: msg = "Could not import from clipboard:" pyfalog.warning(msg) pyfalog.error(e) self.stNotice.SetLabel(msg) finally: self.entityEditor.refreshEntityList() else: self.stNotice.SetLabel("Could not import from clipboard")
def DoDelete(self, entity): sTR = TargetResists.getInstance() sTR.deletePattern(entity)
def DoCopy(self, entity, name): sTR = TargetResists.getInstance() copy = sTR.copyPattern(entity) sTR.renamePattern(copy, name) return copy
def DoRename(self, entity, name): sTR = TargetResists.getInstance() sTR.renamePattern(entity, name)
def DoCopy(self, entity, name): sTR = TargetResists.getInstance() copy = sTR.copyPattern(entity) sTR.renamePattern(copy, name) return copy
def DoNew(self, name): sTR = TargetResists.getInstance() return sTR.newPattern(name)
def calculate(self, calcID=None, markerOnly=False): values = self.getValues() sFit = Fit.getInstance() oldLineData = self.lineData self.lineData = {} # don't clear lineColor so that removing and re-adding a pairing re-uses the previous color for fitID, fit in self.fits.iteritems(): for tgtID, tgt in (self.tgts.iteritems() if self.tgts else ((None, None), )): lineID = (fitID, tgtID) # if we're only recalculating for a specific fit, recycle plotted data for lines that don't involve that fit if (lineID in oldLineData) and (calcID is not None): if ((type(calcID) != type(fitID)) or (calcID != fitID)) and ((type(calcID) != type(tgtID)) or (calcID != tgtID)): self.lineData[lineID] = oldLineData[lineID] continue color = self.lineColor.get(lineID) if color is None: color = hsv_to_rgb( hsl_to_hsv(self.COLORS[self.nextColor][:3])) self.nextColor = (self.nextColor + 1) % len(self.COLORS) self.lineColor[lineID] = color if tgtID is None: tgt = None elif tgtID == "": tgt = self.dummyTargetProfile elif type(tgtID) is int: tgt = sFit.getFit(tgtID) else: tgt = svc_TargetResists.getTargetResists(tgtID) try: if markerOnly and (lineID in oldLineData): self.lineData[lineID] = oldLineData[lineID] else: x_success, y_status = self.currentView.getPoints( values, fit, tgt) if not x_success: # TODO: Add a pwetty statys bar to report errors with self.SetStatusText(y_status) return False self.lineData[lineID] = [x_success, y_status, None] markerY = self.currentView.getPoint( values, (self.markerX, ), fit, tgt) if self.markerX else None if self.markerX and markerY is None: x = bisect.bisect(self.lineData[lineID][0], self.markerX) if x > 0 and x < (len(self.lineData[lineID][1]) - 1): dx = (self.lineData[lineID][0][x] - self.lineData[lineID][0][x - 1]) dy = (self.lineData[lineID][1][x] - self.lineData[lineID][1][x - 1]) markerY = self.lineData[lineID][1][x - 1] + dy * ( self.markerX - self.lineData[lineID][0][x - 1]) / dx self.lineData[lineID][2] = markerY except ValueError as e: msg = u"Error calculating fit '{}' vs target '{}'".format( fit.name, (tgt.name if tgt else "N/A")) self.SetStatusText(msg) pyfalog.warning(msg) pyfalog.warning(str(e)) return False # for tgtID # for fitID self.plotPanel.labelX.SetLabel( self.currentView.getVariableLabels(values)[0]) self.SetStatusText("") return True
def selectView(self, index): if self.currentViewIndex == index: return self.currentViewIndex = index self.currentView = self.graphSelection.GetClientData(index) self.graphSelection.SetSelection(index) self.controlPanel.DestroyChildren() self.fields.clear() viewPanel = self.currentView.getControlPanel(self.controlPanel, self.onFieldChanged) if not viewPanel: fields = self.currentView.getFields() if fields: viewPanel = wx.Panel(self.controlPanel) viewSizer = wx.FlexGridSizer(0, 4) viewSizer.AddGrowableCol(1) viewPanel.SetSizer(viewSizer) # Setup textboxes icons = self.currentView.getIcons() labels = self.currentView.getLabels() for field in sorted(fields.keys()): textBox = wx.TextCtrl(viewPanel) self.fields[field] = textBox textBox.Bind(wx.EVT_TEXT_ENTER, self.onFieldChanged) textBox.Bind(wx.EVT_KILL_FOCUS, self.onFieldChanged) defaultVal = fields[field] if defaultVal is not None: if not isinstance(defaultVal, basestring): defaultVal = "%g" % (defaultVal, ) textBox.ChangeValue(defaultVal) viewSizer.Add(textBox, proportion=1, flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL, border=3) imgLabelSizer = wx.BoxSizer(wx.HORIZONTAL) icon = icons.get(field) if icons else None if icon is not None: static = wx.StaticBitmap(viewPanel, bitmap=icon) imgLabelSizer.Add(static, proportion=0, flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=1) label = labels.get(field, field) if labels else field imgLabelSizer.Add(wx.StaticText(viewPanel, label=label), proportion=0, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT | wx.RIGHT, border=3) viewSizer.Add(imgLabelSizer, proportion=0, flag=wx.ALIGN_CENTER_VERTICAL) if viewPanel is not None: self.controlSizer.Add(viewPanel, 0, wx.EXPAND) self.tgts.clear() if self.currentView.allowTargetResists(): for fitID, fit in self.fits.iteritems(): tgtID = fit.targetResists.name if fit.targetResists else "" if tgtID not in self.tgts: self.tgts[tgtID] = svc_TargetResists.getTargetResists( tgtID) if tgtID else self.dummyTargetProfile self.tgtList.Show() elif self.currentView.allowTargetFits(): self.tgtList.Show() else: self.tgtList.Hide() self.tgtList.fitList.update(self.tgts.values()) self.nextColor = 0 self.markerX = 0 self.selected = None self.Layout() self.calculate() self.draw()
def exportPatterns(self, event): """Event fired when export to clipboard button is clicked""" sTR = TargetResists.getInstance() toClipboard(sTR.exportPatterns()) self.stNotice.SetLabel("Patterns exported to clipboard")
def getEntitiesFromContext(self): sTR = TargetResists.getInstance() choices = sorted(sTR.getTargetResistsList(), key=lambda p: p.name) return choices
def exportPatterns(self, event): "Event fired when export to clipboard button is clicked" sTR = TargetResists.getInstance() toClipboard(sTR.exportPatterns()) self.stNotice.SetLabel("Patterns exported to clipboard")
def DoRename(self, entity, name): sTR = TargetResists.getInstance() sTR.renamePattern(entity, name)
def getEntitiesFromContext(self): sTR = TargetResists.getInstance() choices = sorted(sTR.getTargetResistsList(), key=lambda p: p.name) return choices
def DoDelete(self, entity): sTR = TargetResists.getInstance() sTR.deletePattern(entity)
def DoNew(self, name): sTR = TargetResists.getInstance() return sTR.newPattern(name)