Browse Source

Keyboard control on many widgets

pull/11/head
Eugenio Parodi 5 years ago
parent
commit
0d2fe0197d
  1. 6
      TermTk/TTkCore/canvas.py
  2. 32
      TermTk/TTkCore/ttk.py
  3. 11
      TermTk/TTkGui/theme.py
  4. 5
      TermTk/TTkWidgets/lineedit.py
  5. 15
      TermTk/TTkWidgets/spinbox.py
  6. 44
      TermTk/TTkWidgets/tabwidget.py

6
TermTk/TTkCore/canvas.py

@ -333,7 +333,7 @@ class TTkCanvas:
self, pos, size,
labels, labelsPos, selected,
offset, leftScroller, rightScroller, slim=False, menu=False,
color=TTkColor.RST, borderColor=TTkColor.RST, selectColor=TTkColor.RST):
color=TTkColor.RST, borderColor=TTkColor.RST, selectColor=TTkColor.RST, offsetColor=TTkColor.RST):
x,y = pos
w,h = size
tt = TTkCfg.theme.tab
@ -344,7 +344,7 @@ class TTkCanvas:
else:
bottomBar = tt[11]+tt[12]*(w-2)+tt[15]
bottomPos = y+2
self.drawText(pos=(x,bottomPos),text=bottomBar)
self.drawText(pos=(x,bottomPos),text=bottomBar, color=borderColor)
# phase 1 - Draw From left to 'Selected'
# phase 2 - Draw From right to 'Selected'
def _drawTabSlim(x,y,a,b,c,d,e,txt,txtColor,borderColor):
@ -380,7 +380,7 @@ class TTkCanvas:
i = offset
text = labels[i]
posx = labelsPos[i]
_drawTab(x+posx,y,tt[0],tt[1],tt[3],tt[9],tt[9],tt[13],tt[12],tt[13],tt[9],tt[9],tt[18],tt[19],tt[20], text, color, borderColor, slim)
_drawTab(x+posx,y,tt[0],tt[1],tt[3],tt[9],tt[9],tt[13],tt[12],tt[13],tt[9],tt[9],tt[18],tt[19],tt[20], text, offsetColor, borderColor, slim)
# phase 4 - Draw left right tilt
if leftScroller:
top = tt[7]+tt[1]

32
TermTk/TTkCore/ttk.py

@ -119,38 +119,30 @@ class TTk(TTkWidget):
x,y = TTkHelper.absPos(focusWidget)
nmevt = mevt.clone(pos=(mevt.x-x, mevt.y-y))
focusWidget.mouseEvent(nmevt)
elif overlayWidget is not None:
x,y,w,h=overlayWidget.geometry()
if x <= mevt.x < x+w and y <= mevt.y < y+h:
px,py = TTkHelper.absPos(overlayWidget)
nmevt = mevt.clone(pos=(mevt.x-px, mevt.y-py))
overlayWidget.mouseEvent(nmevt)
else:
self.mouseEvent(mevt)
else:
self.mouseEvent(mevt)
elif evt is TTkK.KEY_EVENT:
keyHandled = False
kevt = self.key_events.get()
TTkLog.debug(f"Key: {kevt}")
focusWidget = TTkHelper.getFocus()
overlayWidget = TTkHelper.getOverlay()
TTkLog.debug(f"{focusWidget}")
if kevt.key == TTkK.Key_Tab:
# TODO: Handle here if the widget accept the Tab input
if kevt.mod == TTkK.NoModifier:
TTkHelper.nextFocus(focusWidget if focusWidget else self)
if kevt.mod == TTkK.ShiftModifier:
TTkHelper.prevFocus(focusWidget if focusWidget else self)
continue
if focusWidget is not None:
TTkHelper.execShortcut(kevt.key,focusWidget)
focusWidget.keyEvent(kevt)
elif overlayWidget is not None:
TTkHelper.execShortcut(kevt.key,overlayWidget)
overlayWidget.keyEvent(kevt)
keyHandled = focusWidget.keyEvent(kevt)
else:
TTkHelper.execShortcut(kevt.key)
pass
# Handle Next Focus Key Binding
if not keyHandled and \
((kevt.key == TTkK.Key_Tab and kevt.mod == TTkK.NoModifier) or
( kevt.key == TTkK.Key_Right )):
TTkHelper.nextFocus(focusWidget if focusWidget else self)
# Handle Prev Focus Key Binding
if not keyHandled and \
((kevt.key == TTkK.Key_Tab and kevt.mod == TTkK.ShiftModifier) or
( kevt.key == TTkK.Key_Left )):
TTkHelper.prevFocus(focusWidget if focusWidget else self)
elif evt is TTkK.TIME_EVENT:
size = os.get_terminal_size()
self.setGeometry(0,0,size.columns,size.lines)

11
TermTk/TTkGui/theme.py

@ -222,7 +222,7 @@ class TTkTheme():
comboboxContentColor = TTkColor.fg("#dddd88")+TTkColor.bg("#111111")
comboboxBorderColor = buttonBorderColor
comboboxContentColorFocus = TTkColor.fg("#dddd88")+TTkColor.bg("#111111")
comboboxContentColorFocus = TTkColor.fg("#ffff88")+TTkColor.bg("#111111")
comboboxBorderColorFocus = buttonBorderColorFocus
checkboxContentColor = buttonTextColor
@ -235,6 +235,11 @@ class TTkTheme():
radioButtonContentColorFocus = buttonTextColorFocus
radioButtonBorderColorFocus = buttonBorderColorFocus
tabColor = TTkColor.fg("#aaaaaa")
tabColor = TTkColor.fg("#aaaaaa")
tabOffsetColor = TTkColor.RST
tabBorderColor = frameBorderColor
tabSelectColor = TTkColor.fg("#ffff88")+TTkColor.bg("#000066")+TTkColor.BOLD
tabSelectColor = TTkColor.fg("#ffff88")+TTkColor.bg("#000066")+TTkColor.BOLD
tabColorFocus = TTkColor.fg("#aaaaaa")
tabOffsetColorFocus = tabOffsetColor
tabBorderColorFocus = TTkColor.fg("#ffff88")
tabSelectColorFocus = TTkColor.fg("#ffff88")+TTkColor.bg("#000066")+TTkColor.BOLD

5
TermTk/TTkWidgets/lineedit.py

@ -64,6 +64,7 @@ class TTkLineEdit(TTkWidget):
if text != self._text:
self.textChanged.emit(text)
self._text = text
self._cursorPos = min(len(text)-1,self._cursorPos)
self.update()
def text(self):
@ -103,6 +104,9 @@ class TTkLineEdit(TTkWidget):
def keyEvent(self, evt):
w = self.width()
if evt.type == TTkK.SpecialKey:
# Don't Handle the special tab key
if evt.key == TTkK.Key_Tab:
return False
if evt.key == TTkK.Key_Up: pass
elif evt.key == TTkK.Key_Down: pass
elif evt.key == TTkK.Key_Left:
@ -153,6 +157,7 @@ class TTkLineEdit(TTkWidget):
self._offset += 1
self._pushCursor()
self.textEdited.emit(self._text)
return True
def focusInEvent(self):
self._pushCursor()

15
TermTk/TTkWidgets/spinbox.py

@ -32,6 +32,7 @@ from TermTk.TTkLayouts import TTkGridLayout
from TermTk.TTkWidgets.widget import TTkWidget
from TermTk.TTkWidgets.lineedit import TTkLineEdit
class TTkSpinBox(TTkWidget):
__slots__= (
'_lineEdit', '_value', '_maximum', '_minimum',
@ -53,7 +54,8 @@ class TTkSpinBox(TTkWidget):
self._valueDelta = 0
self._draggable = False
self._lineEdit = TTkLineEdit(parent=self, text=str(self._value), inputType=TTkK.Input_Number)
self.setFocusPolicy(TTkK.ClickFocus + TTkK.TabFocus)
self._lineEdit.keyEvent = self.keyEvent
self.setFocusPolicy(TTkK.ClickFocus)
self._lineEdit.textEdited.connect(self._textEdited)
def value(self):
@ -71,6 +73,17 @@ class TTkSpinBox(TTkWidget):
@pyTTkSlot(str)
def _textEdited(self, text):
self.setValue(int(text))
self._lineEdit.setText(str(self._value))
def keyEvent(self, evt):
if evt.type == TTkK.SpecialKey:
if evt.key == TTkK.Key_Up:
self.setValue(self._value+1)
return True
elif evt.key == TTkK.Key_Down:
self.setValue(self._value-1)
return True
return TTkLineEdit.keyEvent(self._lineEdit, evt)
def mousePressEvent(self, evt):
x,y = evt.x, evt.y

44
TermTk/TTkWidgets/tabwidget.py

@ -43,7 +43,8 @@ _labels= │◀│La│Label1║Label2║Label3│Label4│▶│
class TTkTabWidget(TTkFrame):
__slots__ = (
'_viewport',
'_tabColor', '_tabBorderColor', '_tabSelectColor',
'_tabColor', '_tabBorderColor', '_tabSelectColor', '_tabOffsetColor',
'_tabColorFocus', '_tabBorderColorFocus', '_tabSelectColorFocus', '_tabOffsetColorFocus',
'_tabWidgets', '_labels', '_labelsPos',
'_offset', '_currentIndex',
'_leftScroller', '_rightScroller',
@ -59,9 +60,14 @@ class TTkTabWidget(TTkFrame):
self._tabClosable = False
self._leftScroller = False
self._rightScroller = False
self._tabColor = TTkCfg.theme.tabColor
self._tabColor = TTkCfg.theme.tabColor
self._tabBorderColor = TTkCfg.theme.tabBorderColor
self._tabSelectColor = TTkCfg.theme.tabSelectColor
self._tabOffsetColor = TTkCfg.theme.tabOffsetColor
self._tabColorFocus = TTkCfg.theme.tabColorFocus
self._tabBorderColorFocus = TTkCfg.theme.tabBorderColorFocus
self._tabSelectColorFocus = TTkCfg.theme.tabSelectColorFocus
self._tabOffsetColorFocus = TTkCfg.theme.tabOffsetColorFocus
TTkFrame.__init__(self, *args, **kwargs)
self._name = kwargs.get('name' , 'TTkTabWidget')
self.setLayout(TTkGridLayout())
@ -69,13 +75,11 @@ class TTkTabWidget(TTkFrame):
self.layout().addWidget(self._viewport,0,0)
#self.layout().addWidget(TTkSpacer(),0,1)
#self.layout().addWidget(TTkSpacer(),1,0)
if self.border():
self.setPadding(3,1,1,1)
else:
self.setPadding(2,0,0,0)
self.setFocusPolicy(TTkK.ClickFocus)
self.setFocusPolicy(TTkK.ClickFocus + TTkK.TabFocus)
def addTab(self, widget, label):
@ -165,13 +169,39 @@ class TTkTabWidget(TTkFrame):
self._updateTabs()
return True
def keyEvent(self, evt):
if evt.type == TTkK.SpecialKey and evt.key == TTkK.Key_Right:
self._offset = min(self._offset+1,len(self._labels)-1)
self._updateTabs()
return True
if evt.type == TTkK.SpecialKey and evt.key == TTkK.Key_Left:
self._offset = max(self._offset-1,0)
self._updateTabs()
return True
if ( evt.type == TTkK.Character and evt.key==" " ) or \
( evt.type == TTkK.SpecialKey and evt.key == TTkK.Key_Enter ):
self._currentIndex = self._offset
self._updateTabs()
return True
return False
def paintEvent(self):
if self.hasFocus():
tabColor = self._tabColorFocus
tabBorderColor = self._tabBorderColorFocus
tabSelectColor = self._tabSelectColorFocus
tabOffsetColor = self._tabOffsetColorFocus
else:
tabColor = self._tabColor
tabBorderColor = self._tabBorderColor
tabSelectColor = self._tabSelectColor
tabOffsetColor = self._tabOffsetColor
if self.border():
self._canvas.drawBox(pos=(0,2),size=(self._width,self._height-2), color=self._borderColor, grid=9)
self._canvas.drawBox(pos=(0,2),size=(self._width,self._height-2), color=tabBorderColor, grid=9)
self._canvas.drawTab(
pos=(0,0), size=self.size(), slim=not self.border(),
labels=self._labels, labelsPos=self._labelsPos,
selected=self._currentIndex, offset=self._offset,
leftScroller=self._leftScroller, rightScroller=self._rightScroller,
color=self._tabColor, borderColor=self._tabBorderColor, selectColor=self._tabSelectColor)
color=tabColor, borderColor=tabBorderColor, selectColor=tabSelectColor, offsetColor=tabOffsetColor)

Loading…
Cancel
Save