Browse Source

Adapted ListWidget to the new style format

pull/165/head
Eugenio Parodi 3 years ago
parent
commit
f4eec6b1dd
  1. 132
      TermTk/TTkWidgets/listwidget.py
  2. 18
      demo/showcase/list.py

132
TermTk/TTkWidgets/listwidget.py

@ -32,29 +32,39 @@ from TermTk.TTkWidgets.widget import TTkWidget
from TermTk.TTkWidgets.label import TTkLabel
from TermTk.TTkAbstract.abstractscrollview import TTkAbstractScrollView
class TTkAbstractListItem(TTkLabel):
class TTkAbstractListItem(TTkWidget):
'''TTkAbstractListItem'''
__slots__ = ('_pressed', '_selected', '_highlighted', 'listItemClicked', '_data')
def __init__(self, *args, **kwargs):
TTkLabel.__init__(self, *args, **kwargs)
self._data = kwargs.get('data', "" )
# Define Signals
classStyle = TTkWidget.classStyle | {
'default': {'color': TTkColor.RST},
'highlighted': {'color': TTkColor.fg('#00FF00')+TTkColor.bg('#0055FF')+TTkColor.UNDERLINE},
'hover': {'color': TTkColor.fg('#00FF00')+TTkColor.bg('#0088FF')},
'selected': {'color': TTkColor.fg('#00FF00')+TTkColor.bg('#0055FF')},
'clicked': {'color': TTkColor.fg('#FFFF00')},
'disabled': {'color': TTkColor.fg('#888888')},
}
__slots__ = ('_text', '_selected', '_highlighted', '_data',
'listItemClicked')
def __init__(self, *, text='', data=None, **kwargs):
self.listItemClicked = pyTTkSignal(TTkAbstractListItem)
self._selected = False
self._pressed = False
self._highlighted = False
self.setFocusPolicy(TTkK.ClickFocus)
def _updateColor(self):
if self._highlighted:
if self._selected:
self.setColor(TTkCfg.theme.listColorHighlighted + TTkColor.UNDERLINE)
else:
self.setColor(TTkCfg.theme.listColorHighlighted)
elif self._selected:
self.setColor(TTkCfg.theme.listColorSelected)
else:
self.setColor(TTkCfg.theme.listColor)
self._text = TTkString(text)
self._data = data
super().__init__(**kwargs)
self.setFocusPolicy(TTkK.ParentFocus)
def text(self):
return self._text
def setText(self, text):
self._text = TTkString(text)
self.update()
def data(self):
'''data'''
@ -62,57 +72,47 @@ class TTkAbstractListItem(TTkLabel):
def setData(self, data):
'''setData'''
if self._data != data:
self._data = data
self.update()
def keyEvent(self, evt):
return self.parentWidget().keyEvent(evt)
def mousePressEvent(self, evt):
self._pressed = True
self.highlighted = True
if self._data == data: return
self._data = data
self.update()
return True
def mouseReleaseEvent(self, evt):
self._pressed = False
def mousePressEvent(self, evt) -> bool:
self.listItemClicked.emit(self)
self.update()
return True
@property
def selected(self):
return self._selected
def _setSelected(self, selected):
if self._selected == selected: return
self._selected = selected
self._highlighted = not selected
self.update()
@selected.setter
def selected(self, selected):
if self._selected != selected:
self._selected = selected
self._updateColor()
def _setHighlighted(self, highlighted):
if self._highlighted == highlighted: return
self._highlighted = highlighted
self.update()
@property
def highlighted(self):
return self._highlighted
def paintEvent(self, canvas):
style = self.currentStyle()
if style == self.classStyle['hover']:
pass
elif self._highlighted:
style = self.style()['highlighted']
elif self._selected:
style = self.style()['selected']
@highlighted.setter
def highlighted(self, highlighted):
if self._highlighted != highlighted:
self._highlighted = highlighted
self._updateColor()
w = self.width()
canvas.drawTTkString(pos=(0,0), width=w, color=style['color'] ,text=self._text)
class TTkListWidget(TTkAbstractScrollView):
'''TTkListWidget'''
__slots__ = ('itemClicked', 'textClicked', '_color', '_selectedColor', '_selectedItems', '_selectionMode', '_highlighted', '_items')
__slots__ = ('itemClicked', 'textClicked', '_selectedItems', '_selectionMode', '_highlighted', '_items')
def __init__(self, *args, **kwargs):
# Default Class Specific Values
self._selectionMode = kwargs.get("selectionMode", TTkK.SingleSelection)
self._selectedItems = []
self._items = []
self._highlighted = None
self._color = TTkCfg.theme.listColor
self._selectedColor = TTkCfg.theme.listColorSelected
# Signals
self.itemClicked = pyTTkSignal(TTkWidget)
self.textClicked = pyTTkSignal(str)
@ -127,26 +127,25 @@ class TTkListWidget(TTkAbstractScrollView):
self.layout().setOffset(-x,-y)
@pyTTkSlot(TTkAbstractListItem)
def _labelSelectedHandler(self, label):
def _labelSelectedHandler(self, label:TTkAbstractListItem):
if self._selectionMode == TTkK.SingleSelection:
for item in self._selectedItems:
item.selected = False
item.highlighted = False
item._setSelected(False)
item._setHighlighted(False)
self._selectedItems = [label]
label.selected = True
label._setSelected(True)
elif self._selectionMode == TTkK.MultiSelection:
for item in self._selectedItems:
item.highlighted = False
label.selected = not label.selected
if label.selected:
item._setHighlighted(False)
label._setSelected(not label._selected)
if label._selected:
self._selectedItems.append(label)
else:
self._selectedItems.remove(label)
if self._highlighted:
self._highlighted.highlighted = False
label.highlighted = True
self._highlighted._setHighlighted(False)
label._setHighlighted(True)
self._highlighted = label
self.setFocus()
self.itemClicked.emit(label)
self.textClicked.emit(label.text())
@ -200,9 +199,8 @@ class TTkListWidget(TTkAbstractScrollView):
if isinstance(item, str) or isinstance(item, TTkString):
#label = TTkAbstractListItem(text=item, width=max(len(item),self.width()))
label = TTkAbstractListItem(text=item, data=data)
label.listItemClicked.connect(self._labelSelectedHandler)
return self.addItemAt(label,pos)
# item.listItemClicked.connect(self._labelSelectedHandler)
item.listItemClicked.connect(self._labelSelectedHandler)
self._items.insert(pos,item)
self.layout().addWidget(item)
self._placeItems()
@ -289,9 +287,9 @@ class TTkListWidget(TTkAbstractScrollView):
elif evt.key == TTkK.Key_End:
self.viewMoveTo(0x10000, offy)
self._highlighted.highlighted = False
self._highlighted._setHighlighted(False)
self._highlighted = self._items[index]
self._highlighted.highlighted = True
self._highlighted._setHighlighted(True)
self._moveToHighlighted()
return True
return False
@ -300,9 +298,9 @@ class TTkListWidget(TTkAbstractScrollView):
if not self._items: return
if not self._highlighted:
self._highlighted = self._items[0]
self._highlighted.highlighted=True
self._highlighted._setHighlighted(True)
self._moveToHighlighted()
def focusOutEvent(self):
if self._highlighted:
self._highlighted.highlighted=False
self._highlighted._setHighlighted(False)

18
demo/showcase/list.py

@ -74,16 +74,20 @@ def demoList(root= None):
def main():
parser = argparse.ArgumentParser()
parser.add_argument('-f', help='Full Screen', action='store_true')
parser.add_argument('-f', help='Full Screen (default)', action='store_true')
parser.add_argument('-w', help='Windowed', action='store_true')
parser.add_argument('-t', help='Track Mouse', action='store_true')
args = parser.parse_args()
windowed = args.w
mouseTrack = args.t
root = ttk.TTk()
if args.f:
rootGraph = root
root.setLayout(ttk.TTkGridLayout())
root = ttk.TTk(title="pyTermTk List Demo", mouseTrack=mouseTrack)
if windowed:
rootTab = ttk.TTkWindow(parent=root,pos=(1,1), size=(100,40), title="Test Tab", border=True, layout=ttk.TTkGridLayout())
else:
rootGraph = ttk.TTkWindow(parent=root,pos=(1,1), size=(100,40), title="Test List", border=True, layout=ttk.TTkGridLayout())
demoList(rootGraph)
rootTab = root
root.setLayout(ttk.TTkGridLayout())
demoList(rootTab)
root.mainloop()
if __name__ == "__main__":

Loading…
Cancel
Save