From 7bb7f9c0fa4d96412f37ecd9e4b6864dc35e18f7 Mon Sep 17 00:00:00 2001 From: Eugenio Parodi Date: Fri, 7 Jul 2023 11:25:05 +0100 Subject: [PATCH] reworked the TTkMenuBarButton to be a subclass of TTkMenuButton --- TermTk/TTkWidgets/menubar.py | 83 ++++++++-------------------------- TermTk/TTkWidgets/tabwidget.py | 11 ++--- 2 files changed, 23 insertions(+), 71 deletions(-) diff --git a/TermTk/TTkWidgets/menubar.py b/TermTk/TTkWidgets/menubar.py index f446762f..64c3683e 100644 --- a/TermTk/TTkWidgets/menubar.py +++ b/TermTk/TTkWidgets/menubar.py @@ -27,25 +27,23 @@ from TermTk.TTkCore.helper import TTkHelper from TermTk.TTkCore.color import TTkColor from TermTk.TTkCore.log import TTkLog from TermTk.TTkCore.signal import pyTTkSignal, pyTTkSlot +from TermTk.TTkCore.string import TTkString from TermTk.TTkWidgets.button import TTkButton from TermTk.TTkWidgets.listwidget import TTkListWidget, TTkAbstractListItem from TermTk.TTkLayouts.layout import TTkLayout from TermTk.TTkLayouts.boxlayout import TTkHBoxLayout from TermTk.TTkWidgets.menu import TTkMenu, TTkMenuButton, _TTkMenuSpacer -class TTkMenuBarButton(TTkAbstractListItem): - '''TTkMenuButton''' - __slots__ = ('_border', '_borderColor', '_shortcut', '_menu', 'menuButtonClicked', '_menuOffset') - def __init__(self, *args, **kwargs): - TTkAbstractListItem.__init__(self, *args, **kwargs) - # signals - self.menuButtonClicked = pyTTkSignal(TTkMenuButton) - self._color = kwargs.get('color', TTkCfg.theme.menuButtonColor ) - self._border = kwargs.get('border', TTkCfg.theme.menuButtonColor ) - self._borderColor = kwargs.get('borderColor', TTkCfg.theme.menuButtonBorderColor ) - self._menuOffset = kwargs.get('menuOffset', (-1,0) ) +class TTkMenuBarButton(TTkMenuButton): + classStyle = TTkMenuButton.classStyle | { + 'default': TTkMenuButton.classStyle['default'] | {'borderColor':TTkColor.RST, 'shortcutColor': TTkColor.fg("#dddddd") + TTkColor.UNDERLINE}, + 'clicked': TTkMenuButton.classStyle['clicked'] | {'color': TTkColor.fg("#ffff88")}, + } + + __slots__=('_shortcut') + def __init__(self, *, text=..., data=None, checkable=False, checked=False, **kwargs): self._shortcut = [] - self._menu = [] + super().__init__(text=text, data=data, checkable=checkable, checked=checked, **kwargs) while self.text().find('&') != -1: index = self.text().find('&') shortcut = self.text().charAt(index+1) @@ -53,71 +51,30 @@ class TTkMenuBarButton(TTkAbstractListItem): self._shortcut.append(index) self.setText(self.text().substring(to=index)+self.text().substring(fr=index+1)) txtlen = self.text().termWidth() - self.resize(txtlen,1) + self.resize(txtlen+2,1) self.setMinimumSize(txtlen+2,1) self.setMaximumSize(txtlen+2,1) - self.listItemClicked.connect(self.menuButtonEvent) - - def addMenu(self, text, data:object=None, checkable:bool=False, checked:bool=False): - '''addMenu''' - button = TTkMenuButton(text=text, data=data, checkable=checkable, checked=checked) - self._menu.append(button) - return button - - def addSpacer(self): - '''addSpacer''' - self._menu.append(_TTkMenuSpacer()) - - def setColor(self, color): - self._color = color - self.update() def setBorderColor(self, color): - self._borderColor = color - self.update() - - def shortcutEvent(self): - self.menuButtonEvent() - - @pyTTkSlot(TTkAbstractListItem) - def menuButtonEvent(self, listItem=None): - if not self._menu: - self.menuButtonClicked.emit(self) - return - - width = 3+max((len(smb._text) + (2 if smb._submenu else 0)) for smb in self._menu if type(smb) is TTkMenuButton) - height = len(self._menu)+2 - subMenu = TTkMenu(pos=(8,6), size=(width,height), title=self.text(), titleAlign=TTkK.LEFT_ALIGN) - for smb in self._menu: - subMenu.addMenuItem(smb) - TTkHelper.overlay(self, subMenu, -1, 0) - self.update() + style = self.style() + style['default'] |= {'borderColor':color} + self.setStyle(style) def paintEvent(self, canvas): - if self._pressed: - borderColor = self._borderColor - textColor = TTkCfg.theme.menuButtonColorClicked - scColor = TTkCfg.theme.menuButtonShortcutColor - else: - borderColor = self._borderColor - textColor = self._color - scColor = TTkCfg.theme.menuButtonShortcutColor + style = self.currentStyle() + borderColor = style['borderColor'] + textColor = style['color'] + scColor = style['shortcutColor'] canvas.drawMenuBarButton( pos=(0,0),text=self.text(), width=self.width(), shortcuts=self._shortcut, - border=self._border, - submenu=len(self._menu)>0, + border=True, + submenu=len(self._submenu)>0, color=textColor, borderColor=borderColor, shortcutColor=scColor ) - def focusInEvent(self): - self.highlighted=True - - def focusOutEvent(self): - self.highlighted=False - class TTkMenuBarLayout(TTkHBoxLayout): '''TTkMenuBarLayout''' __slots__ = ('_borderColor', '_itemsLeft', '_itemsCenter', '_itemsRight', '_buttons') diff --git a/TermTk/TTkWidgets/tabwidget.py b/TermTk/TTkWidgets/tabwidget.py index 28f19ac8..077f46e8 100644 --- a/TermTk/TTkWidgets/tabwidget.py +++ b/TermTk/TTkWidgets/tabwidget.py @@ -135,14 +135,9 @@ class _TTkTabMenuButton(TTkMenuBarButton): super().__init__(*args, **kwargs) def paintEvent(self, canvas): - if self._pressed: - borderColor = self._borderColor - textColor = TTkCfg.theme.menuButtonColorClicked - # scColor = TTkCfg.theme.menuButtonShortcutColor - else: - borderColor = self._borderColor - textColor = self._color - # scColor = TTkCfg.theme.menuButtonShortcutColor + style = self.currentStyle() + borderColor = style['borderColor'] + textColor = style['color'] text = TTkString('[',borderColor) + TTkString(self.text(),textColor) + TTkString(']',borderColor) canvas.drawText(pos=(0,0),text=text)