Add two classes to handle user input
This commit is contained in:
98
gui/graphFrame/input.py
Normal file
98
gui/graphFrame/input.py
Normal file
@@ -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 <http://www.gnu.org/licenses/>.
|
||||
# =============================================================================
|
||||
|
||||
|
||||
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]))
|
||||
@@ -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 = {}
|
||||
|
||||
Reference in New Issue
Block a user