Browse Source

Separate tab element in the TtkTabWidget

pull/15/head
Eugenio Parodi 5 years ago
parent
commit
53b286bdfd
  1. 154
      TermTk/TTkWidgets/tabwidget.py
  2. 12
      demo/showcase/tab.py

154
TermTk/TTkWidgets/tabwidget.py

@ -29,6 +29,7 @@ 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.TTkLayouts.boxlayout import TTkHBoxLayout
from TermTk.TTkLayouts.gridlayout import TTkGridLayout
@ -40,22 +41,24 @@ _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',
#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
@ -68,32 +71,18 @@ 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 _updateTabs(self):
@ -115,24 +104,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 +183,97 @@ 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)
'''
Root Layout
Right M TABS Left M
Layout
'''
class TTkTabWidget(TTkFrame):
__slots__ = (
'_tabBarTopLayout', '_tabBar',
'_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._tabBarTopLayout = TTkHBoxLayout()
self._tabBarTopLayout.addWidget(self._tabBar)
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)
self.setFocusPolicy(TTkK.ClickFocus + TTkK.TabFocus)
@pyTTkSlot(int)
def _tabChanged(self, index):
for i, widget in enumerate(self._tabWidgets):
if index == i:
widget.show()
else:
widget.hide()
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 self.hasFocus():
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)

12
demo/showcase/tab.py

@ -22,12 +22,12 @@
# 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):
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")
@ -42,12 +42,14 @@ def demoTab(root= None):
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())
else:

Loading…
Cancel
Save