Add two classes to handle user input

This commit is contained in:
DarkPhoenix
2019-06-26 15:46:17 +03:00
parent 15a8c5750a
commit ee4a1f936b
2 changed files with 107 additions and 12 deletions

98
gui/graphFrame/input.py Normal file
View 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]))

View File

@@ -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 = {}