Exemple #1
0
    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()
Exemple #2
0
    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()
Exemple #3
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
Exemple #4
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
Exemple #5
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")
Exemple #6
0
    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
Exemple #7
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")
Exemple #8
0
 def DoDelete(self, entity):
     sTR = TargetResists.getInstance()
     sTR.deletePattern(entity)
Exemple #9
0
 def DoCopy(self, entity, name):
     sTR = TargetResists.getInstance()
     copy = sTR.copyPattern(entity)
     sTR.renamePattern(copy, name)
     return copy
Exemple #10
0
 def DoRename(self, entity, name):
     sTR = TargetResists.getInstance()
     sTR.renamePattern(entity, name)
Exemple #11
0
 def DoCopy(self, entity, name):
     sTR = TargetResists.getInstance()
     copy = sTR.copyPattern(entity)
     sTR.renamePattern(copy, name)
     return copy
Exemple #12
0
 def DoNew(self, name):
     sTR = TargetResists.getInstance()
     return sTR.newPattern(name)
Exemple #13
0
    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
Exemple #14
0
    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()
Exemple #15
0
 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")
Exemple #16
0
 def getEntitiesFromContext(self):
     sTR = TargetResists.getInstance()
     choices = sorted(sTR.getTargetResistsList(), key=lambda p: p.name)
     return choices
Exemple #17
0
 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")
Exemple #18
0
 def DoRename(self, entity, name):
     sTR = TargetResists.getInstance()
     sTR.renamePattern(entity, name)
Exemple #19
0
 def getEntitiesFromContext(self):
     sTR = TargetResists.getInstance()
     choices = sorted(sTR.getTargetResistsList(), key=lambda p: p.name)
     return choices
Exemple #20
0
 def DoDelete(self, entity):
     sTR = TargetResists.getInstance()
     sTR.deletePattern(entity)
Exemple #21
0
 def DoNew(self, name):
     sTR = TargetResists.getInstance()
     return sTR.newPattern(name)