diff --git a/TermTk/TTkCore/canvas.py b/TermTk/TTkCore/canvas.py index d7a50cbe..24a1ac1d 100644 --- a/TermTk/TTkCore/canvas.py +++ b/TermTk/TTkCore/canvas.py @@ -342,11 +342,29 @@ class TTkCanvas: self._set(y+size-1,x, TTkCfg.theme.vscroll[3], color) # Down Arrow pass + def drawTabMenuButton( + self, pos, size, text, slim=False, + color=TTkColor.RST, borderColor=TTkColor.RST, + sideBorder=TTkK.LEFT|TTkK.RIGHT): + x,y = pos + w,h = size + textPos = pos + tt = TTkCfg.theme.tab + # phase 0 - Draw the Bottom bar + if not slim: + borderLeft = tt[27] if sideBorder & TTkK.LEFT else tt[12] + borderRight = tt[28] if sideBorder & TTkK.RIGHT else tt[12] + bottomBar = borderLeft+tt[12]*(w-2)+borderRight + self.drawText(pos=(x,y+2), text=bottomBar, color=borderColor) + textPos = (x,y+1) + self.drawText(pos=textPos, text=text, color=color) + def drawTab( self, pos, size, labels, labelsPos, selected, offset, leftScroller, rightScroller, slim=False, menu=False, - color=TTkColor.RST, borderColor=TTkColor.RST, selectColor=TTkColor.RST, offsetColor=TTkColor.RST): + color=TTkColor.RST, borderColor=TTkColor.RST, selectColor=TTkColor.RST, offsetColor=TTkColor.RST, + sideBorder=TTkK.LEFT|TTkK.RIGHT): x,y = pos w,h = size tt = TTkCfg.theme.tab @@ -355,7 +373,9 @@ class TTkCanvas: bottomBar = tt[18]+tt[19]*(w-2)+tt[20] bottomPos = y+1 else: - bottomBar = tt[11]+tt[12]*(w-2)+tt[15] + borderLeft = tt[11] if sideBorder & TTkK.LEFT else tt[13] if leftScroller else tt[12] + borderRight = tt[15] if sideBorder & TTkK.RIGHT else tt[13] if rightScroller else tt[12] + bottomBar = borderLeft+tt[12]*(w-2)+borderRight bottomPos = y+2 self.drawText(pos=(x,bottomPos),text=bottomBar, color=borderColor) # phase 1 - Draw From left to 'Selected' diff --git a/TermTk/TTkCore/helper.py b/TermTk/TTkCore/helper.py index 54284606..2b776c04 100644 --- a/TermTk/TTkCore/helper.py +++ b/TermTk/TTkCore/helper.py @@ -229,15 +229,6 @@ class TTkHelper: layout = layout.parent() return (wx, wy) - def _iterWidgets(item): - for child in item.children(): - if child.layoutItemType == TTkK.WidgetItem: - if not child.widget().isVisible(): continue - yield child.widget() - yield from TTkHelper._iterWidgets(child.widget().rootLayout()) - if child.layoutItemType == TTkK.LayoutItem: - yield from TTkHelper._iterWidgets(child) - def nextFocus(widget): rootWidget = TTkHelper.rootOverlay(widget) if not rootWidget: @@ -245,7 +236,7 @@ class TTkHelper: if widget == rootWidget: widget = None first = None - for w in TTkHelper._iterWidgets(rootWidget.rootLayout()): + for w in rootWidget.rootLayout().iterWidgets(): if not first and w.focusPolicy() & TTkK.TabFocus == TTkK.TabFocus: first = w # TTkLog.debug(f"{w._name} {widget}") @@ -268,7 +259,7 @@ class TTkHelper: if widget == rootWidget: widget = None prev = None - for w in TTkHelper._iterWidgets(rootWidget.rootLayout()): + for w in rootWidget.rootLayout().iterWidgets(): # TTkLog.debug(f"{w._name} {widget}") if w == widget: widget=None diff --git a/TermTk/TTkGui/theme.py b/TermTk/TTkGui/theme.py index fe778604..b63e8e42 100644 --- a/TermTk/TTkGui/theme.py +++ b/TermTk/TTkGui/theme.py @@ -148,7 +148,7 @@ class TTkTheme(): #11 12 13 14 15 16 17 18 19 20 '╞','═','╧','╩','╡','╘','╛','└','─','┘', #21 22 23 24 25 26 27 28 29 30 - '╚','╝','╰','╯','⣿','⣿','X','X','X','X', + '╚','╝','╰','╯','⣿','⣿','╒','╕','X','X', #31 32 '◀','▶' ) @@ -156,16 +156,19 @@ class TTkTheme(): :: - ┌──────╔══════╗──────┬──────┐ ┌─┌──────╔══════╗──────┬──────┐─┐ - │Label1║Label2║Label3│Label4│ │◀│Label1║Label2║Label3│Label4│▶│ - ╞═╧══════╩══════╩══════╧══════╧════╡ ╞═╧══════╩══════╩══════╧══════╧═╡ - ┌──────╔══════╗──────┬──────┐ ╭─┌──────╔══════╗──────┬──────┐─╮ - │Label1║Label2║Label3│Label4│ │◀│Label1║Label2║Label3│Label4│▶│ - ╞════════╩══════╩══════════════════╡ ╞════════╩══════╩═══════════════╡ + ┌──────╔══════╗──────┬──────┐ ┌─┌──────╔══════╗──────┬──────┐─┐ + │Label1║Label2║Label3│Label4│ │◀│Label1║Label2║Label3│Label4│▶│ + ╞═╧══════╩══════╩══════╧══════╧════╡ ╞═╧══════╩══════╩══════╧══════╧═╡ + ┌──────╔══════╗──────┬──────┐ ╭─┌──────╔══════╗──────┬──────┐─╮ + │Label1║Label2║Label3│Label4│ │◀│Label1║Label2║Label3│Label4│▶│ + ╞════════╩══════╩══════════════════╡ ╞════════╩══════╩═══════════════╡ # Menu Prototype: - ╭──┌──────╔══════╗──────┬──────┐ ╭──┬─┌──────╔══════╗──────┬──────┐─╮ - │⣿⣿│Label1║Label2║Label3│Label4│ │⣿⣿│◀│Label1║Label2║Label3│Label4│▶│ - ╞═════════╩══════╩═══════════════╡ ╞══╧════════╩══════╩═══════════════╡ + ╭──┌──────╔══════╗──────┬──────┐ ╭──┬─┌──────╔══════╗──────┬──────┐─╮ + │XX│Label1║Label2║Label3│Label4│ │XX│◀│Label1║Label2║Label3│Label4│▶│ + ╞═════════╩══════╩═══════════════╡ ╞══╧════════╩══════╩═══════════════╡ + ┌──────╔══════╗──────┬──────┐ ╭─┌──────╔══════╗──────┬──────┐─╮ + XX YY│Label1║Label2║Label3│Label4│JJ KK XX YY│◀│Label1║Label2║Label3│Label4│▶│JJ KK + ╞════════════╩══════╩═══════════════════╡ ╞═════╧════════╩══════╩═══════════════╧═════╡ ┌──────┲━━━━━━┱──────┬──────┐ │Label1┃Label2┃Label3│Label4│ ┝━┷━━━━━━┻━━━━━━┻━━━━━━┷━━━━━━┷━━━━┥ diff --git a/TermTk/TTkLayouts/layout.py b/TermTk/TTkLayouts/layout.py index dca6df99..18bb8ec4 100644 --- a/TermTk/TTkLayouts/layout.py +++ b/TermTk/TTkLayouts/layout.py @@ -192,6 +192,15 @@ class TTkLayout(TTkLayoutItem): else: return self._parent.parentWidget() + def iterWidgets(self, onlyVisible=True): + for child in self._items: + if child.layoutItemType == TTkK.WidgetItem: + if onlyVisible and not child.widget().isVisible(): continue + yield child.widget() + yield from child.widget().rootLayout().iterWidgets() + if child.layoutItemType == TTkK.LayoutItem: + yield from child.iterWidgets() + def _zSortItems(self): self._zSortedItems = sorted(self._items, key=lambda item: item.z) diff --git a/TermTk/TTkWidgets/menubar.py b/TermTk/TTkWidgets/menubar.py index 276815f6..6f4389dc 100644 --- a/TermTk/TTkWidgets/menubar.py +++ b/TermTk/TTkWidgets/menubar.py @@ -49,7 +49,7 @@ class _TTkMenuListWidget(TTkListWidget): return True elif evt.key == TTkK.Key_Right: if self._highlighted and \ - isinstance(self._highlighted,_TTkMenuButton) and \ + isinstance(self._highlighted,TTkMenuButton) and \ self._highlighted._menu: self._highlighted.menuButtonEvent() return True @@ -65,32 +65,33 @@ class _TTkMenuSpacer(TTkAbstractListItem): def paintEvent(self): self._canvas.drawText(pos=(0,0), text="-"*self.width()) -class _TTkMenuButton(TTkAbstractListItem): - __slots__ = ('_border', '_borderColor', '_shortcut', '_menu', 'menuButtonClicked') +class TTkMenuButton(TTkAbstractListItem): + __slots__ = ('_border', '_borderColor', '_shortcut', '_menu', 'menuButtonClicked', '_menuOffset') def __init__(self, *args, **kwargs): TTkAbstractListItem.__init__(self, *args, **kwargs) - self._name = kwargs.get('name' , '_TTkMenuButton' ) + self._name = kwargs.get('name' , 'TTkMenuButton' ) # signals self.menuButtonClicked = pyTTkSignal(TTkButton) 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: - index = self._text.find('&') - shortcut = self._text[index+1] + while self.text.find('&') != -1: + index = self.text.find('&') + shortcut = self.text[index+1] TTkHelper.addShortcut(self, shortcut) self._shortcut.append(index) - self._text = self._text[:index]+self._text[index+1:] - txtlen = len(self._text) + self.text = self.text[:index]+self.text[index+1:] + txtlen = len(self.text) self.resize(txtlen,1) self.setMinimumSize(txtlen+2,1) self.setMaximumSize(txtlen+2,1) self.listItemClicked.connect(self.menuButtonEvent) def addMenu(self, text): - button = _TTkMenuButton(text=text, borderColor=self._borderColor, border=False) + button = TTkMenuButton(text=text, borderColor=self._borderColor, border=False) button.menuButtonClicked.connect(self._menuCallback) self._menu.append(button) return button @@ -112,7 +113,7 @@ class _TTkMenuButton(TTkAbstractListItem): @pyTTkSlot(TTkButton) def _menuCallback(self, button): #self._id = self._list.index(label) - TTkLog.debug(f"Bind Clicked {button._text}") + TTkLog.debug(f"Bind Clicked {button.text}") self.menuButtonClicked.emit(button) TTkHelper.removeOverlay() self.update() @@ -136,8 +137,8 @@ class _TTkMenuButton(TTkAbstractListItem): frame = TTkResizableFrame(layout=TTkHBoxLayout(), size=(frameWidth,frameHeight)) pos = (self.width(), -1) else: - frame = TTkResizableFrame(layout=TTkHBoxLayout(), size=(frameWidth,frameHeight), title=self._text, titleAlign=TTkK.LEFT_ALIGN) - pos = (-1, 0) + frame = TTkResizableFrame(layout=TTkHBoxLayout(), size=(frameWidth,frameHeight), title=self.text, titleAlign=TTkK.LEFT_ALIGN) + pos = self._menuOffset menuListWidget = _TTkMenuListWidget() listw = TTkList(parent=frame, listWidget = menuListWidget) # listw.textClicked.connect(self._menuCallback) @@ -159,7 +160,7 @@ class _TTkMenuButton(TTkAbstractListItem): textColor = self._color scColor = TTkCfg.theme.menuButtonShortcutColor self._canvas.drawMenuBarButton( - pos=(0,0),text=self._text, + pos=(0,0),text=self.text, width=self.width(), shortcuts=self._shortcut, border=self._border, @@ -196,7 +197,7 @@ class TTkMenuLayout(TTkHBoxLayout): self.update() def addMenu(self, text, alignment=TTkK.LEFT_ALIGN): - button = _TTkMenuButton(text=text, borderColor=self._borderColor, border=True) + button = TTkMenuButton(text=text, borderColor=self._borderColor, border=True) if alignment == TTkK.LEFT_ALIGN: self._itemsLeft.addWidget(button) elif alignment == TTkK.CENTER_ALIGN: diff --git a/TermTk/TTkWidgets/tabwidget.py b/TermTk/TTkWidgets/tabwidget.py index 772ba9c7..08e9aa06 100644 --- a/TermTk/TTkWidgets/tabwidget.py +++ b/TermTk/TTkWidgets/tabwidget.py @@ -29,9 +29,49 @@ 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): + __slots__ = ('_sideBorder', '_tabPosition') + + def __init__(self, *args, **kwargs): + self._sideBorder = TTkK.NONE + self._tabPosition = kwargs.get('tabPosition', TTkK.LEFT) + TTkMenuButton.__init__(self, *args, **kwargs) + self._name = kwargs.get('name' , '_TTkTabMenuButton') + txtlen = len(self.text) + self.setMinimumSize(txtlen+1,0x1000) + self.setMaximumSize(txtlen+1,0x1000) + + def setSideBorder(self, border): + self._sideBorder |= border + + def unsetSideBorder(self, border): + self._sideBorder &= ~border + + 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 + if self._tabPosition == TTkK.LEFT: + text = f" {self.text}" + else: + text = f"{self.text} " + self._canvas.drawTabMenuButton( + pos=(0,0),text=text, + size=self.size(), + color=textColor, + borderColor=borderColor, + sideBorder = self._sideBorder) + ''' _curentIndex = 2 _labelPos = [0],[1], [2], [3], [4], @@ -40,26 +80,29 @@ _labels= │◀│La│Label1║Label2║Label3│Label4│▶│ ╞═══════════╩══════╩═══════════════╡ leftscroller rightScroller ''' -class TTkTabWidget(TTkFrame): +class _TTkTabs(TTkWidget): __slots__ = ( - '_viewport', '_tabColor', '_tabBorderColor', '_tabSelectColor', '_tabOffsetColor', '_tabColorFocus', '_tabBorderColorFocus', '_tabSelectColorFocus', '_tabOffsetColorFocus', - '_tabWidgets', '_labels', '_labelsPos', - '_offset', '_currentIndex', + '_labels', '_labelsPos', + '_offset', '_currentIndex','_lastIndex', '_leftScroller', '_rightScroller', - '_tabMovable', '_tabClosable') + '_tabMovable', '_tabClosable', + '_sideBorder', + #Signals + 'currentChanged') def __init__(self, *args, **kwargs): - self._tabWidgets = [] self._labels = [] self._labelsPos = [] - self._currentIndex = 0 - self._offset = 0 + self._currentIndex = -1 + self._lastIndex = -1 + self._offset = -1 self._tabMovable = False self._tabClosable = False self._leftScroller = False self._rightScroller = False + self._sideBorder = TTkK.LEFT | TTkK.RIGHT self._tabColor = TTkCfg.theme.tabColor self._tabBorderColor = TTkCfg.theme.tabBorderColor self._tabSelectColor = TTkCfg.theme.tabSelectColor @@ -68,34 +111,31 @@ class TTkTabWidget(TTkFrame): 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()) - self._viewport = TTkWidget(layout=TTkGridLayout()) - 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) + # Signals + self.currentChanged = pyTTkSignal(int) + TTkWidget.__init__(self, *args, **kwargs) + self._name = kwargs.get('name' , '_TTkTabs') self.setFocusPolicy(TTkK.ClickFocus + TTkK.TabFocus) - - def addTab(self, widget, label): - widget.hide() - self._tabWidgets.append(widget) + def addTab(self, label): self._labels.append(label) - self._viewport.addWidget(widget) self._updateTabs() - def insertTab(self, index, widget, label): - widget.hide() - self._tabWidgets.insert(index, widget) + def insertTab(self, index, label): self._labels.insert(index, label) - self._viewport.addWidget(widget) self._updateTabs() + def setSideBorder(self, border): + self._sideBorder |= border + + def unsetSideBorder(self, border): + self._sideBorder &= ~border + + + def setBorderColor(self, color): + self._tabBorderColor = color + self._tabBorderColorFocus = color + def _updateTabs(self): xpos = 0+2 w = self.width()-4 @@ -115,24 +155,22 @@ class TTkTabWidget(TTkFrame): minLabelLen = labelLen self.setMinimumWidth(minLabelLen+2+4) - for i, widget in enumerate(self._tabWidgets): - if self._currentIndex == i: - widget.show() - else: - widget.hide() + if self._currentIndex == -1: + self._currentIndex = len(self._labels) -1 + + if self._lastIndex != self._currentIndex: + self._lastIndex = self._currentIndex + self.currentChanged.emit(self._currentIndex) + self.update() def resizeEvent(self, w, h): self._updateTabs() def mousePressEvent(self, evt): - x,y = evt.x, evt.y + x = evt.x w = self.width() offset = self._offset - if self.border(): - if y>2: return False - else: - if y>1: return False # Check from the selected to the left and from selected+1 to the right if self._leftScroller and x<2 and offset>0: self._offset -= 1 @@ -196,12 +234,131 @@ class TTkTabWidget(TTkFrame): 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=tabBorderColor, grid=9) self._canvas.drawTab( - pos=(0,0), size=self.size(), slim=not self.border(), + pos=(0,0), size=self.size(), slim=(self._height==2), labels=self._labels, labelsPos=self._labelsPos, selected=self._currentIndex, offset=self._offset, leftScroller=self._leftScroller, rightScroller=self._rightScroller, - color=tabColor, borderColor=tabBorderColor, selectColor=tabSelectColor, offsetColor=tabOffsetColor) + color=tabColor, borderColor=tabBorderColor, selectColor=tabSelectColor, + offsetColor=tabOffsetColor, sideBorder = self._sideBorder) + +''' + ┌────────────────────────────┐ + │ Root Layout │ + │┌────────┬────────┬────────┐│ + ││ Left M │ TABS │ RightM ││ + │└────────┴────────┴────────┘│ + │┌──────────────────────────┐│ + ││ Layout ││ + ││ ││ + │└──────────────────────────┘│ + └────────────────────────────┘ +''' + +class TTkTabWidget(TTkFrame): + __slots__ = ( + '_tabBarTopLayout', '_tabBar', '_topLeftLayout', '_topRightLayout', + '_tabColor', '_tabBorderColor', '_tabSelectColor', '_tabOffsetColor', + '_tabColorFocus', '_tabBorderColorFocus', '_tabSelectColorFocus', '_tabOffsetColorFocus', + '_tabWidgets', '_labels', '_labelsPos', + '_offset', '_currentIndex', + '_leftScroller', '_rightScroller', + '_tabMovable', '_tabClosable') + + def __init__(self, *args, **kwargs): + self._tabWidgets = [] + self._labels = [] + self._labelsPos = [] + self._currentIndex = 0 + self._offset = 0 + self._tabMovable = False + self._tabClosable = False + self._leftScroller = False + self._rightScroller = False + 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 + self._tabBar = _TTkTabs() + self._tabBar.currentChanged.connect(self._tabChanged) + 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()) + if self.border(): + self.setPadding(3,1,1,1) + else: + self.setPadding(2,0,0,0) + self.rootLayout().addItem(self._tabBarTopLayout) + self._tabBarTopLayout.setGeometry(0,0,self._width,self._padt) + @pyTTkSlot(int) + def _tabChanged(self, index): + for i, widget in enumerate(self._tabWidgets): + if index == i: + 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), tabPosition=position) + button.focusChanged.connect(self._focusChanged) + if position==TTkK.LEFT: + if not self._topLeftLayout: + self._topLeftLayout = TTkHBoxLayout() + self._tabBarTopLayout.addItem(self._topLeftLayout,0,0) + button.setSideBorder(TTkK.LEFT) + layout = self._topLeftLayout + else: + if not self._topRightLayout: + self._topRightLayout = TTkHBoxLayout() + self._tabBarTopLayout.addItem(self._topRightLayout,0,2) + layout = self._topRightLayout + button.setSideBorder(TTkK.RIGHT) + for b in self._topRightLayout.iterWidgets(onlyVisible=False): + b.unsetSideBorder(TTkK.RIGHT) + self._tabBar.unsetSideBorder(position) + layout.addWidget(button) + return button + + def addTab(self, widget, label): + widget.hide() + self._tabWidgets.append(widget) + self.layout().addWidget(widget) + self._tabBar.addTab(label) + + def insertTab(self, index, widget, label): + widget.hide() + self._tabWidgets.insert(index, widget) + self.layout().addWidget(widget) + self._tabBar.insertTab(index, label) + + def resizeEvent(self, w, h): + self._tabBarTopLayout.setGeometry(0,0,w,self._padt) + + def paintEvent(self): + if any(w.hasFocus() for w in self._tabBarTopLayout.iterWidgets()): + tabBorderColor = self._tabBorderColorFocus + else: + tabBorderColor = self._tabBorderColor + if self.border(): + self._canvas.drawBox(pos=(0,2),size=(self._width,self._height-2), color=tabBorderColor, grid=9) diff --git a/TermTk/TTkWidgets/widget.py b/TermTk/TTkWidgets/widget.py index 62d891f8..ca994017 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) @@ -570,6 +531,7 @@ class TTkWidget(TMouseEvents,TKeyEvents): TTkHelper.removeOverlay(refocus=False) TTkHelper.setFocus(self) self._focus = True + self.focusChanged.emit(self._focus) self.focusInEvent() def clearFocus(self): @@ -577,6 +539,7 @@ class TTkWidget(TMouseEvents,TKeyEvents): if not self._focus: return TTkHelper.clearFocus() self._focus = False + self.focusChanged.emit(self._focus) self.focusOutEvent() self.update(repaint=True, updateLayout=False) diff --git a/demo/demo.py b/demo/demo.py index 2620890a..90219ae6 100755 --- a/demo/demo.py +++ b/demo/demo.py @@ -58,6 +58,7 @@ def demoShowcase(root=None, border=True): listMenu.addItem(f"Test") tabTest = ttk.TTkTabWidget(parent=mainFrame, border=False, visible=False) + tabTest.addTab(ttk.TTkLogViewer(), " LogViewer ") tabTest.addTab(ttk.TTkTestWidgetSizes(border=True, title="Frame1.1"), " Label 1.1 ") tabTest.addTab(ttk.TTkTestWidget(border=True, title="Frame1.2"), " Label Test 1.2 ") @@ -116,7 +117,7 @@ def demoShowcase(root=None, border=True): listMenu.textClicked.connect(_listCallback) - listMenu.setCurrentRow(1) + listMenu.setCurrentRow(0) return splitter diff --git a/demo/showcase/tab.py b/demo/showcase/tab.py index e662dc64..63e6c960 100755 --- a/demo/showcase/tab.py +++ b/demo/showcase/tab.py @@ -22,33 +22,55 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -import sys, os +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) - 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") - tabWidget1.addTab(ttk.TTkTestWidgetSizes(border=True, title="Frame1.4"), "Label 1.4") - tabWidget1.addTab(ttk.TTkTestWidget(border=True, title="Frame1.5"), "Label Test 1.5") - tabWidget1.addTab(ttk.TTkTestWidgetSizes(border=True, title="Frame1.6"), "Label 1.6") +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") + tabWidget1.addTab(ttk.TTkTestWidgetSizes(border=True, title="Frame1.4"), "Label 1.4") + tabWidget1.addTab(ttk.TTkTestWidget( border=True, title="Frame1.5"), "Label Test 1.5") + tabWidget1.addTab(ttk.TTkTestWidgetSizes(border=True, title="Frame1.6"), "Label 1.6") + tabWidget1.addTab(ttk.TTkTestWidget( border=True, title="Frame1.7"), "Label Test 1.7") + 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") + + fileMenu1 = tabWidget1.addMenu("XX") + fileMenu1.addMenu("Open") + fileMenu1.addMenu("Close") + fileMenu1.addMenu("Exit") + + fileMenu2 = tabWidget1.addMenu("YY") + fileMenu2.addMenu("Open") + fileMenu2.addMenu("Close") + fileMenu2.addMenu("Exit") + + tabWidget1.addMenu("ZZ", ttk.TTkK.RIGHT) + tabWidget1.addMenu("KK", ttk.TTkK.RIGHT) + return tabWidget1 def main(): - ttk.TTkLog.use_default_file_logging() + parser = argparse.ArgumentParser() + parser.add_argument('-f', help='Full Screen', action='store_true') + args = parser.parse_args() - fullscreen = False + ttk.TTkLog.use_default_file_logging() root = ttk.TTk() - if fullscreen: + 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__":