From 30887287849786df07d9597631e37f3994e9359b Mon Sep 17 00:00:00 2001 From: Eugenio Parodi Date: Sun, 23 May 2021 22:53:40 +0100 Subject: [PATCH] Added focusChanged Event, propagate the border color to the tab widgets --- TermTk/TTkWidgets/menubar.py | 5 ++- TermTk/TTkWidgets/tabwidget.py | 72 +++++++++++++++++++++++++++++++--- TermTk/TTkWidgets/widget.py | 53 ++++--------------------- demo/showcase/tab.py | 16 ++++++-- 4 files changed, 90 insertions(+), 56 deletions(-) diff --git a/TermTk/TTkWidgets/menubar.py b/TermTk/TTkWidgets/menubar.py index 7c0b29d3..d750a652 100644 --- a/TermTk/TTkWidgets/menubar.py +++ b/TermTk/TTkWidgets/menubar.py @@ -66,7 +66,7 @@ class _TTkMenuSpacer(TTkAbstractListItem): self._canvas.drawText(pos=(0,0), text="-"*self.width()) class TTkMenuButton(TTkAbstractListItem): - __slots__ = ('_border', '_borderColor', '_shortcut', '_menu', 'menuButtonClicked') + __slots__ = ('_border', '_borderColor', '_shortcut', '_menu', 'menuButtonClicked', '_menuOffset') def __init__(self, *args, **kwargs): TTkAbstractListItem.__init__(self, *args, **kwargs) self._name = kwargs.get('name' , 'TTkMenuButton' ) @@ -75,6 +75,7 @@ class TTkMenuButton(TTkAbstractListItem): 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) ) self._shortcut = [] self._menu = [] while self._text.find('&') != -1: @@ -137,7 +138,7 @@ class TTkMenuButton(TTkAbstractListItem): pos = (self.width(), -1) else: frame = TTkResizableFrame(layout=TTkHBoxLayout(), size=(frameWidth,frameHeight), title=self._text, titleAlign=TTkK.LEFT_ALIGN) - pos = (-1, 0) + pos = self._menuOffset menuListWidget = _TTkMenuListWidget() listw = TTkList(parent=frame, listWidget = menuListWidget) # listw.textClicked.connect(self._menuCallback) diff --git a/TermTk/TTkWidgets/tabwidget.py b/TermTk/TTkWidgets/tabwidget.py index d7f22c1e..e41dad9f 100644 --- a/TermTk/TTkWidgets/tabwidget.py +++ b/TermTk/TTkWidgets/tabwidget.py @@ -29,10 +29,36 @@ from TermTk.TTkCore.signal import pyTTkSlot, pyTTkSignal from TermTk.TTkWidgets.widget import TTkWidget from TermTk.TTkWidgets.spacer import TTkSpacer from TermTk.TTkWidgets.frame import TTkFrame +from TermTk.TTkWidgets.menubar import TTkMenuButton from TermTk.TTkLayouts.boxlayout import TTkHBoxLayout from TermTk.TTkLayouts.gridlayout import TTkGridLayout +class _TTkTabMenuButton(TTkMenuButton): + def __init__(self, *args, **kwargs): + TTkMenuButton.__init__(self, *args, **kwargs) + self._name = kwargs.get('name' , '_TTkTabMenuButton') + self.setMaximumHeight(0x1000) + + def paintEvent(self): + 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 + self._canvas.drawMenuBarButton( + pos=(0,1),text=self._text, + width=self.width(), + shortcuts=self._shortcut, + border=self._border, + submenu=len(self._menu)>0, + color=textColor, + borderColor=borderColor, + shortcutColor=scColor ) + ''' _curentIndex = 2 _labelPos = [0],[1], [2], [3], [4], @@ -41,7 +67,6 @@ _labels= │◀│La│Label1║Label2║Label3│Label4│▶│ ╞═══════════╩══════╩═══════════════╡ leftscroller rightScroller ''' - class _TTkTabs(TTkWidget): __slots__ = ( '_tabColor', '_tabBorderColor', '_tabSelectColor', '_tabOffsetColor', @@ -84,6 +109,10 @@ class _TTkTabs(TTkWidget): def insertTab(self, index, label): self._labels.insert(index, label) self._updateTabs() + + def setBorderColor(self, color): + self._tabBorderColor = color + self._tabBorderColorFocus = color def _updateTabs(self): xpos = 0+2 @@ -194,7 +223,7 @@ class _TTkTabs(TTkWidget): ┌────────────────────────────┐ │ Root Layout │ │┌────────┬────────┬────────┐│ - ││Right M │ TABS │ Left M ││ + ││ Left M │ TABS │ RightM ││ │└────────┴────────┴────────┘│ │┌──────────────────────────┐│ ││ Layout ││ @@ -205,7 +234,7 @@ class _TTkTabs(TTkWidget): class TTkTabWidget(TTkFrame): __slots__ = ( - '_tabBarTopLayout', '_tabBar', + '_tabBarTopLayout', '_tabBar', '_topLeftLayout', '_topRightLayout', '_tabColor', '_tabBorderColor', '_tabSelectColor', '_tabOffsetColor', '_tabColorFocus', '_tabBorderColorFocus', '_tabSelectColorFocus', '_tabOffsetColorFocus', '_tabWidgets', '_labels', '_labelsPos', @@ -233,8 +262,11 @@ class TTkTabWidget(TTkFrame): self._tabOffsetColorFocus = TTkCfg.theme.tabOffsetColorFocus self._tabBar = _TTkTabs() self._tabBar.currentChanged.connect(self._tabChanged) - self._tabBarTopLayout = TTkHBoxLayout() - self._tabBarTopLayout.addWidget(self._tabBar) + self._tabBar.focusChanged.connect(self._focusChanged) + self._tabBarTopLayout = TTkGridLayout() + self._topLeftLayout = None + self._topRightLayout = None + self._tabBarTopLayout.addWidget(self._tabBar,0,1) TTkFrame.__init__(self, *args, **kwargs) self._name = kwargs.get('name' , 'TTkTabWidget') self.setLayout(TTkGridLayout()) @@ -252,6 +284,34 @@ class TTkTabWidget(TTkFrame): widget.show() else: widget.hide() + + @pyTTkSlot(bool) + def _focusChanged(self, focus): + if focus: + tabBorderColor = self._tabBorderColorFocus + else: + tabBorderColor = self._tabBorderColor + + for widget in self._tabBarTopLayout.iterWidgets(): + widget.setBorderColor(tabBorderColor) + widget.update() + + + def addMenu(self, text, position=TTkK.LEFT): + button = _TTkTabMenuButton(text=text, borderColor=self._tabBorderColor, menuOffset=(-1,1)) + button.focusChanged.connect(self._focusChanged) + if position==TTkK.LEFT: + if not self._topLeftLayout: + self._topLeftLayout = TTkHBoxLayout() + self._tabBarTopLayout.addItem(self._topLeftLayout,0,0) + layout = self._topLeftLayout + else: + if not self._topRightLayout: + self._topRightLayout = TTkHBoxLayout() + self._tabBarTopLayout.addItem(self._topRightLayout,0,2) + layout = self._topRightLayout + layout.addWidget(button) + return button def addTab(self, widget, label): widget.hide() @@ -269,7 +329,7 @@ class TTkTabWidget(TTkFrame): self._tabBarTopLayout.setGeometry(0,0,w,self._padt) def paintEvent(self): - if self.hasFocus(): + if any(w.hasFocus() for w in self._tabBarTopLayout.iterWidgets()): tabBorderColor = self._tabBorderColorFocus else: tabBorderColor = self._tabBorderColor diff --git a/TermTk/TTkWidgets/widget.py b/TermTk/TTkWidgets/widget.py index 45c5989a..d937b2f6 100644 --- a/TermTk/TTkWidgets/widget.py +++ b/TermTk/TTkWidgets/widget.py @@ -91,9 +91,13 @@ class TTkWidget(TMouseEvents,TKeyEvents): '_focus','_focus_policy', '_layout', '_canvas', '_widgetItem', '_visible', '_transparent', - '_pendingMouseRelease') + '_pendingMouseRelease', + #Signals + 'focusChanged') def __init__(self, *args, **kwargs): + #Signals + self.focusChanged = pyTTkSignal(bool) self._name = kwargs.get('name', 'TTkWidget' ) self._parent = kwargs.get('parent', None ) @@ -308,21 +312,10 @@ class TTkWidget(TMouseEvents,TKeyEvents): wevt = evt.clone(pos=(x-wx, y-wy)) if mouseEvent: if wevt is not None: - #if not widget._data['mouse']['underMouse']: - # widget._data['mouse']['underMouse'] = True - # widget.enterEvent(wevt) if widget.mouseEvent(wevt): return True - #else: - # if widget._data['mouse']['underMouse']: - # widget._data['mouse']['underMouse'] = False - # widget.leaveEvent(evt) - # if widget._data['layout'] is not None: - # CuWidget._broadcastLeaveEvent(evt, widget._data['layout']) continue - #if widget.event(evt): - # return True elif item.layoutItemType == TTkK.LayoutItem: levt = evt.clone(pos=(x, y)) if TTkWidget._mouseEventLayoutHandle(levt, item): @@ -347,8 +340,6 @@ class TTkWidget(TMouseEvents,TKeyEvents): return True if evt.evt == TTkK.Release: - #if self.hasFocus(): - # self.clearFocus() self._pendingMouseRelease = False if self.mouseReleaseEvent(evt): return True @@ -365,38 +356,8 @@ class TTkWidget(TMouseEvents,TKeyEvents): if evt.key == TTkK.Wheel: if self.wheelEvent(evt): return True - #if self.focusPolicy() & CuT.WheelFocus == CuT.WheelFocus: - # self.setFocus() - #elif evt.type() == CuEvent.KeyPress: - # self.keyPressEvent(evt) - #elif evt.type() == CuEvent.KeyRelease: - # self.keyReleaseEvent(evt) - # Trigger this event to the childs - return False - #def event(self, evt): - # pass -# # handle own events -# if evt.type() == CuEvent.MouseMove: -# if evt.button() == CuT.NoButton: -# self.mouseMoveEvent(evt) -# elif evt.type() == CuEvent.MouseButtonRelease: -# self.mouseReleaseEvent(evt) -# elif evt.type() == CuEvent.MouseButtonPress: -# self.mousePressEvent(evt) -# if self.focusPolicy() & CuT.ClickFocus == CuT.ClickFocus: -# self.setFocus() -# elif evt.type() == CuEvent.Wheel: -# self.wheelEvent(evt) -# if self.focusPolicy() & CuT.WheelFocus == CuT.WheelFocus: -# self.setFocus() -# elif evt.type() == CuEvent.KeyPress: -# self.keyPressEvent(evt) -# elif evt.type() == CuEvent.KeyRelease: -# self.keyReleaseEvent(evt) -# # Trigger this event to the childs -# if self.layout() is not None: -# return CuWidget._eventLayoutHandle(evt, self.layout()) + return False def setLayout(self, layout): self._layout.replaceItem(layout, 0) @@ -572,12 +533,14 @@ class TTkWidget(TMouseEvents,TKeyEvents): TTkHelper.removeOverlay() TTkHelper.setFocus(self) self._focus = True + self.focusChanged.emit(self._focus) self.focusInEvent() def clearFocus(self): if not self._focus: return TTkHelper.clearFocus() self._focus = False + self.focusChanged.emit(self._focus) self.focusOutEvent() def hasFocus(self): diff --git a/demo/showcase/tab.py b/demo/showcase/tab.py index a3fbd286..3f663191 100755 --- a/demo/showcase/tab.py +++ b/demo/showcase/tab.py @@ -27,8 +27,8 @@ import sys, os, argparse sys.path.append(os.path.join(sys.path[0],'../..')) import TermTk as ttk -def demoTab(root=None): - tabWidget1 = ttk.TTkTabWidget(parent=root, border=True) +def demoTab(root=None, border=True): + tabWidget1 = ttk.TTkTabWidget(parent=root, border=border) tabWidget1.addTab(ttk.TTkTestWidgetSizes(border=True, title="Frame1.1"), "Label 1.1") tabWidget1.addTab(ttk.TTkTestWidgetSizes(border=True, title="Frame1.2"), "Label 1.2") tabWidget1.addTab(ttk.TTkTestWidget( border=True, title="Frame1.3"), "Label Test 1.3") @@ -39,6 +39,14 @@ def demoTab(root=None): tabWidget1.addTab(ttk.TTkTestWidgetSizes(border=True, title="Frame1.8"), "Label 1.8") #tabWidget1.addTab(ttk.TTkTestWidget( border=True, title="Frame1.9"), "Label Test 1.9") #tabWidget1.addTab(ttk.TTkTestWidgetSizes(border=True, title="Frame1.10"), "Label 1.10") + + fileMenu = tabWidget1.addMenu("XX") + fileMenu.addMenu("Open") + fileMenu.addMenu("Close") + fileMenu.addMenu("Exit") + + tabWidget1.addMenu("RIGHT", ttk.TTkK.RIGHT) + return tabWidget1 def main(): @@ -52,9 +60,11 @@ def main(): if args.f: rootTab = root root.setLayout(ttk.TTkGridLayout()) + border=False else: rootTab = ttk.TTkWindow(parent=root,pos=(1,1), size=(100,40), title="Test Tab", border=True, layout=ttk.TTkGridLayout()) - demoTab(rootTab) + border=True + demoTab(rootTab, border) root.mainloop() if __name__ == "__main__":