diff --git a/gui/graphFrame/input.py b/gui/graphFrame/input.py new file mode 100644 index 000000000..cc73417ce --- /dev/null +++ b/gui/graphFrame/input.py @@ -0,0 +1,98 @@ +# ============================================================================= +# Copyright (C) 2010 Diego Duclos +# +# This file is part of pyfa. +# +# pyfa is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# pyfa is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with pyfa. If not, see . +# ============================================================================= + + +import wx + +import re + + +def valToStr(val): + if val is None: + return '' + if int(val) == val: + val = int(val) + return str(val) + + +def strToFloat(val): + try: + return float(val) + except ValueError: + return None + + +class ConstantBox(wx.TextCtrl): + + def __init__(self, parent, initial): + super().__init__(parent, wx.ID_ANY, style=0) + self.Bind(wx.EVT_TEXT, self.OnText) + self._storedValue = '' + self.ChangeValue(valToStr(initial)) + + + def ChangeValue(self, value): + self._storedValue = value + super().ChangeValue(value) + + def OnText(self, event): + currentValue = self.GetValue() + if currentValue == self._storedValue: + event.Skip() + return + if currentValue == '' or re.match('^\d*\.?\d*$', currentValue): + self._storedValue = currentValue + event.Skip() + else: + self.ChangeValue(self._storedValue) + + def GetValueFloat(self): + return strToFloat(self.GetValue()) + + +class RangeBox(wx.TextCtrl): + + def __init__(self, parent, initialLow, initialHigh): + super().__init__(parent, wx.ID_ANY, style=0) + self.Bind(wx.EVT_TEXT, self.OnText) + self._storedValue = '' + self.ChangeValue('{}-{}'.format(valToStr(initialLow), valToStr(initialHigh))) + + def ChangeValue(self, value): + self._storedValue = value + super().ChangeValue(value) + + def OnText(self, event): + currentValue = self.GetValue() + if currentValue == self._storedValue: + event.Skip() + return + if currentValue == '' or re.match('^\d*\.?\d*\-?\d*\.?\d*$', currentValue): + self._storedValue = currentValue + event.Skip() + else: + self.ChangeValue(self._storedValue) + + def GetValueRange(self): + parts = self.GetValue().split('-') + if len(parts) == 1: + val = strToFloat(parts) + return (val, val) + else: + return (strToFloat(parts[0]), strToFloat(parts[1])) diff --git a/gui/graphFrame/panel.py b/gui/graphFrame/panel.py index 1ffdf5b7c..504630ea0 100644 --- a/gui/graphFrame/panel.py +++ b/gui/graphFrame/panel.py @@ -23,6 +23,7 @@ import wx from gui.bitmap_loader import BitmapLoader from service.fit import Fit +from .input import ConstantBox, RangeBox from .lists import FitList, TargetList from .vector import VectorPicker @@ -143,18 +144,14 @@ class GraphControlPanel(wx.Panel): self.inputsSizer.Clear() self.inputs.clear() - def addInputField(inputDef, handledHandles): + def addInputField(inputDef, handledHandles, mainInput=False): handledHandles.add(inputDef.handle) fieldSizer = wx.BoxSizer(wx.HORIZONTAL) - fieldTextBox = wx.TextCtrl(self, wx.ID_ANY, style=0) + if mainInput: + fieldTextBox = RangeBox(self, *inputDef.defaultRange) + else: + fieldTextBox = ConstantBox(self, inputDef.defaultValue) fieldTextBox.Bind(wx.EVT_TEXT, self.OnFieldChanged) - if inputDef.defaultValue is not None: - inputDefault = inputDef.defaultValue - if not isinstance(inputDefault, str): - inputDefault = ('%f' % inputDefault).rstrip('0') - if inputDefault[-1:] == '.': - inputDefault += '0' - fieldTextBox.ChangeValue(inputDefault) fieldSizer.Add(fieldTextBox, 0, wx.EXPAND | wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, 5) fieldIcon = None if inputDef.iconID is not None: @@ -182,7 +179,7 @@ class GraphControlPanel(wx.Panel): handledHandles.add(tgtVectorDef.angleHandle) selectedX = view.xDefMap[self.xType] # Always add main input - addInputField(view.inputMap[selectedX.mainInput], handledHandles) + addInputField(view.inputMap[selectedX.mainInput], handledHandles, mainInput=True) for inputDef in view.inputs: if inputDef.mainOnly: continue @@ -217,8 +214,8 @@ class GraphControlPanel(wx.Panel): def OnDrawTimer(self, event): event.Skip() - self.graphFrame.clearCache() - self.graphFrame.draw() + # self.graphFrame.clearCache() + # self.graphFrame.draw() def getValues(self): values = {}