From f4eec6b1dd317ef10f448d9e29be2fe0f5168ded Mon Sep 17 00:00:00 2001 From: Eugenio Parodi Date: Tue, 29 Aug 2023 21:55:26 +0100 Subject: [PATCH] Adapted ListWidget to the new style format --- TermTk/TTkWidgets/listwidget.py | 132 ++++++++++++++++---------------- demo/showcase/list.py | 18 +++-- 2 files changed, 76 insertions(+), 74 deletions(-) diff --git a/TermTk/TTkWidgets/listwidget.py b/TermTk/TTkWidgets/listwidget.py index 1bd1912f..e0ff71f6 100644 --- a/TermTk/TTkWidgets/listwidget.py +++ b/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) diff --git a/demo/showcase/list.py b/demo/showcase/list.py index 01de91c0..c72b060d 100755 --- a/demo/showcase/list.py +++ b/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__":