Import LinuxCNC source tree
This commit is contained in:
285
lib/python/qtvcp/widgets/touchEntry.py
Normal file
285
lib/python/qtvcp/widgets/touchEntry.py
Normal file
@@ -0,0 +1,285 @@
|
||||
from qtpy.QtCore import Property, Signal, QSize, QObject, Qt
|
||||
from qtpy.QtGui import QDoubleValidator, QIntValidator
|
||||
from qtpy.QtWidgets import QWidget, QPushButton,QLineEdit, QHBoxLayout
|
||||
|
||||
import decimal
|
||||
from decimal import Decimal
|
||||
|
||||
|
||||
class LineEdit(QLineEdit):
|
||||
|
||||
clicked = Signal(bool)
|
||||
|
||||
def __init__(self, parent=None):
|
||||
super().__init__(parent)
|
||||
#self.clicked.connect(lambda :self.entryClicked())
|
||||
|
||||
def mousePressEvent(self,event):
|
||||
self.clicked.emit(True)
|
||||
|
||||
class TouchSpinBox(QWidget):
|
||||
def __init__(self, parent=None):
|
||||
super().__init__(parent)
|
||||
self._value = 0
|
||||
self._multiplierIndex = 0
|
||||
|
||||
self.setMinimumSize(QSize(200, 25))
|
||||
self.setMaximumSize(QSize(300, 50))
|
||||
|
||||
lay = QHBoxLayout()
|
||||
lay.setContentsMargins(0,0,0,0)
|
||||
lay.setSpacing(0)
|
||||
self.setLayout(lay)
|
||||
|
||||
self.entry = LineEdit()
|
||||
self.entry.setMaximumHeight(100)
|
||||
self.entry.setMinimumWidth(100)
|
||||
|
||||
self.entry.clicked.connect(lambda :self.callDialog(self))
|
||||
lay.addWidget(self.entry)
|
||||
|
||||
up = QPushButton('Up')
|
||||
up.setMaximumHeight(100)
|
||||
up.setMaximumWidth(40)
|
||||
up.pressed.connect(lambda :self.updateValue(True))
|
||||
lay.addWidget(up)
|
||||
|
||||
self.select = QPushButton(str('<-'))
|
||||
self.select.setMaximumHeight(100)
|
||||
self.select.setMaximumWidth(40)
|
||||
self.select.pressed.connect(lambda :self.moveLeft())
|
||||
lay.addWidget(self.select)
|
||||
|
||||
self.selectR = QPushButton(str('->'))
|
||||
self.selectR.setMaximumHeight(100)
|
||||
self.selectR.setMaximumWidth(40)
|
||||
self.selectR.pressed.connect(lambda :self.moveRight())
|
||||
lay.addWidget(self.selectR)
|
||||
|
||||
self.down = QPushButton('Dwn')
|
||||
self.down.setMaximumHeight(100)
|
||||
self.down.setMaximumWidth(40)
|
||||
self.down.pressed.connect(lambda :self.updateValue(False))
|
||||
lay.addWidget(self.down)
|
||||
|
||||
self.init_settings()
|
||||
|
||||
def init_settings(self):
|
||||
self.entry.setText(str('00'))
|
||||
self.validInt = QIntValidator(-99999, 99999)
|
||||
self.entry.setValidator(self.validInt)
|
||||
|
||||
def updateValue(self, state):
|
||||
mult = pow(10,self._multiplierIndex)
|
||||
print('update mult:',mult)
|
||||
decimal.getcontext().prec = 8
|
||||
x = Decimal(self._value) + Decimal( mult)
|
||||
print('Dec:',x)
|
||||
if state:
|
||||
self.setValue(Decimal(self._value) + Decimal( mult))
|
||||
else:
|
||||
self.setValue(Decimal(self._value) - Decimal( mult))
|
||||
|
||||
def moveLeft(self):
|
||||
mult = self._multiplierIndex + 1
|
||||
t = len(self.entry.text())
|
||||
print('mult',mult, 't',t)
|
||||
if t < 0:t=0
|
||||
if mult >= t:
|
||||
mult = 0
|
||||
|
||||
pwr = pow(10,mult)
|
||||
print('pow',pwr)
|
||||
|
||||
self._multiplierIndex = mult
|
||||
#self.select.setText(str(pow(10,mult)))
|
||||
print('left',t-self._multiplierIndex-1,mult)
|
||||
self.entry.setSelection (t-self._multiplierIndex-1,1)
|
||||
|
||||
def moveRight(self):
|
||||
mult = self._multiplierIndex - 1
|
||||
t = len(self.entry.text())
|
||||
print('mult',mult, 't',t)
|
||||
if t < 0:t=0
|
||||
if mult < 0:
|
||||
mult = t-1
|
||||
|
||||
pwr = pow(10,mult)
|
||||
print('pow',pwr)
|
||||
|
||||
self._multiplierIndex = mult
|
||||
#self.select.setText(str(pow(10,mult)))
|
||||
print('right',t-self._multiplierIndex-1,mult)
|
||||
self.entry.setSelection (t-self._multiplierIndex-1,1)
|
||||
|
||||
def text(self):
|
||||
return self.entry.text()
|
||||
|
||||
def setText(self, text):
|
||||
self.entry.setText(text)
|
||||
self._value = int(text)
|
||||
|
||||
def value(self):
|
||||
return int(self.entry.text())
|
||||
|
||||
def setValue(self, value):
|
||||
self._value = int(value)
|
||||
self.entry.setText(str(self._value))
|
||||
|
||||
# class patch or should we call a dialog from here too?
|
||||
def callDialog(self,widget):
|
||||
pass
|
||||
|
||||
class TouchDoubleSpinBox(TouchSpinBox):
|
||||
def __init__(self, parent=None):
|
||||
super(TouchDoubleSpinBox, self).__init__(parent)
|
||||
|
||||
def init_settings(self):
|
||||
self._value = 10.001
|
||||
self.validDouble = QDoubleValidator(-999.999, 999.999, 3)
|
||||
self.entry.setText(str('10.001'))
|
||||
self.entry.setValidator(self.validDouble)
|
||||
self.entry.returnPressed.connect(lambda :self.entryUpdate())
|
||||
|
||||
def updateValue(self, state):
|
||||
def convert(x):
|
||||
return ['0','1','2','3','4','5','6','7','8','9','-',' ','end'][x]
|
||||
def indexof(x):
|
||||
return ['0','1','2','3','4','5','6','7','8','9','-',' ','end'].index(x)
|
||||
if self.entry.text() == '':
|
||||
self.entry.setText('0')
|
||||
pos = self.getPosition(self._multiplierIndex)
|
||||
x = self.entry.text()[pos]
|
||||
print('update txt:',x,'pos',pos)
|
||||
if state:
|
||||
next = convert(indexof(x)+1)
|
||||
if next in( '-',' ','end'):
|
||||
if pos == 0:
|
||||
if next != 'end':
|
||||
pass
|
||||
else:
|
||||
next = 0
|
||||
else:
|
||||
next = 0
|
||||
else:
|
||||
next = convert(indexof(x)-1)
|
||||
if next in( '-',' ','end'):
|
||||
if pos == 0:
|
||||
if next != 'end':
|
||||
pass
|
||||
else:
|
||||
next = 0
|
||||
else:
|
||||
next = 0
|
||||
self.entry.setText( self.replace_at_index(self.entry.text(),pos,str(next)))
|
||||
self.entry.setSelection (pos,1)
|
||||
|
||||
def replace_at_index(self,text,index=0,replacement=''):
|
||||
return '%s%s%s'%(text[:index],replacement,text[index+1:])
|
||||
|
||||
def getPosition(self, index):
|
||||
t = len(self.entry.text())-1
|
||||
print('T:',t,'Index:',index)
|
||||
if t < 0:t=0
|
||||
if index > t:
|
||||
self.entry.setText('0'+ self.entry.text())
|
||||
t = len(self.entry.text())-1
|
||||
#index = 0
|
||||
|
||||
if self.entry.text()[t-index] in ('.',','):
|
||||
index+=1
|
||||
pos = t-index
|
||||
self._multiplierIndex = index
|
||||
return pos
|
||||
|
||||
def moveLeft(self):
|
||||
index = self._multiplierIndex +1
|
||||
t = len(self.entry.text())-1
|
||||
print('T:',t,'Index:',index)
|
||||
if t < 0:t=0
|
||||
if index == -1:
|
||||
if '.' in self.entry.text():
|
||||
self.entry.setText(self.entry.text()+'0')
|
||||
t = len(self.entry.text())-1
|
||||
index = 0
|
||||
else:
|
||||
self.entry.setText(self.entry.text()+'.0')
|
||||
t = len(self.entry.text())-1
|
||||
index = 0
|
||||
|
||||
|
||||
if self.entry.text()[t-index] in ('.',','):
|
||||
index-=1
|
||||
pos = t-index
|
||||
self._multiplierIndex = index
|
||||
|
||||
try:
|
||||
print('text;',self.entry.text()[pos])
|
||||
except:
|
||||
pass
|
||||
#self.select.setText(str(pos))
|
||||
self.entry.setSelection (pos,1)
|
||||
|
||||
def moveRight(self):
|
||||
index = self._multiplierIndex -1
|
||||
t = len(self.entry.text())-1
|
||||
print('T:',t,'Index:',index)
|
||||
if t < 0:t=0
|
||||
if index == -1:
|
||||
if '.' in self.entry.text():
|
||||
self.entry.setText(self.entry.text()+'0')
|
||||
t = len(self.entry.text())-1
|
||||
index = 0
|
||||
else:
|
||||
self.entry.setText(self.entry.text()+'.0')
|
||||
t = len(self.entry.text())-1
|
||||
index = 0
|
||||
|
||||
|
||||
if self.entry.text()[t-index] in ('.',','):
|
||||
index-=1
|
||||
pos = t-index
|
||||
self._multiplierIndex = index
|
||||
|
||||
try:
|
||||
print('text;',self.entry.text()[pos])
|
||||
except:
|
||||
pass
|
||||
#self.select.setText(str(pos))
|
||||
self.entry.setSelection (pos,1)
|
||||
|
||||
def moveLeft(self):
|
||||
pos = self.getPosition(self._multiplierIndex +1)
|
||||
|
||||
try:
|
||||
print('text;',self.entry.text()[pos])
|
||||
except:
|
||||
pass
|
||||
|
||||
#self.select.setText(str(pos))
|
||||
self.entry.setSelection (pos,1)
|
||||
|
||||
def setValue(self, value):
|
||||
self.entry.setText('{:4.3f}'.format(value))
|
||||
|
||||
def setText(self, text):
|
||||
self.entry.setText('{:4.3f}'.format(float(text)))
|
||||
|
||||
def entryUpdate(self):
|
||||
print('Update:',self.entry.text())
|
||||
if self.entry.text() == '':
|
||||
self.setValue(0)
|
||||
|
||||
# for direct testing
|
||||
if __name__ == "__main__":
|
||||
from qtpy.QtWidgets import *
|
||||
from qtpy.QtCore import *
|
||||
from qtpy.QtGui import *
|
||||
import sys
|
||||
|
||||
app = QApplication(sys.argv)
|
||||
w = TouchSpinBox()
|
||||
w.show()
|
||||
w = TouchDoubleSpinBox()
|
||||
w.show()
|
||||
sys.exit( app.exec() )
|
||||
Reference in New Issue
Block a user