You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

258 lines
8.0 KiB

__all__ = ['TTkAppTemplate']
from dataclasses import dataclass
from TermTk.TTkCore.constant import TTkK
from TermTk.TTkLayouts import TTkLayout, TTkGridLayout
from TermTk.TTkWidgets.container import TTkContainer
class TTkAppTemplate(TTkContainer):
''' TTkAppTemplate Layout sizes:
::
App Template Layout
┌─────────────────────────────────┐
│ Header │
├─────────┬──────────────┬────────┤ A (1,2,3)
│ │ Top │ │
│ ├──────────────┤ │ B
│ │ │ │
│ Right │ Main │ Left │
│ │ Center │ │
│ │ │ │
│ ├──────────────┤ │ C
│ │ Bottom │ │
├─────────┴──────────────┴────────┤ D (1,2,3)
│ Footer │
└─────────────────────────────────┘
E F
'''
MAIN = TTkK.CENTER
TOP = TTkK.TOP
BOTTOM = TTkK.BOTTOM
LEFT = TTkK.LEFT
RIGHT = TTkK.RIGHT
CENTER = TTkK.CENTER
HEADER = TTkK.HEADER
FOOTER = TTkK.FOOTER
@dataclass(frozen=False)
class _Panel:
# It's either item or widget
item = None
widget = None
size = 0
border = True
fixed = False
def isVisible(self):
if self.widget:
return self.widget.isVisible()
return True
def minimumWidth(self):
if it := self.item:
return it.minimumWidth()
if wid := self.widget:
return wid.minimumWidth()
return 0
def minimumHeight(self):
if it := self.item:
return it.minimumHeight()
if wid := self.widget:
return wid.minimumHeight()
return 0
def maximumWidth(self):
if it := self.item:
return it.maximumWidth()
if wid := self.widget:
return wid.maximumWidth()
return 0x10000
def maximumHeight(self):
if it := self.item:
return it.maximumWidth()
if wid := self.widget:
return wid.maximumWidth()
return 0x10000
__slots__ = ('_panels',
#Signals
)
def __init__(self, **kwargs):
self._panels = {
TTkAppTemplate.MAIN : TTkAppTemplate._Panel(item=TTkLayout()) ,
TTkAppTemplate.TOP : None ,
TTkAppTemplate.BOTTOM : None ,
TTkAppTemplate.LEFT : None ,
TTkAppTemplate.RIGHT : None ,
TTkAppTemplate.HEADER : None ,
TTkAppTemplate.FOOTER : None }
super().__init__( **kwargs)
self.layout().addItem(self._panels[TTkAppTemplate.MAIN].item)
self._updateGeometries()
def setWidget(self, widget, location):
self._panels[location].widget = widget
if it:=self._panels[location].item:
self.layout().removeItem(it)
self._panels[location].item = None
if widget:
self.layout().addWidget(widget)
self._updateGeometries()
def setItem(self, item, location):
self._panels[location].item = item
if wid:=self._panels[location].widget:
self.layout().removeWdget(wid)
self._panels[location].widget = None
if item:
self.layout().addItem(item)
self._updateGeometries()
def minimumWidth(self):
pns = self._panels
# Header and Footer sizes
mh=mf=0
if p:=pns[TTkAppTemplate.HEADER]:
mh = p.minimumWidth()
if p:=pns[TTkAppTemplate.FOOTER]:
mf = p.minimumWidth()
# Center Right,Left sizes
mcr=mcl=0
if p:=pns[TTkAppTemplate.RIGHT]:
mcr = p.minimumWidth() + ( 1 if p.border else 0 )
if p:=pns[TTkAppTemplate.LEFT]:
mcl = p.minimumWidth() + ( 1 if p.border else 0 )
# Center Top,Bottom sizes
mct=mcb=0
if p:=pns[TTkAppTemplate.TOP]:
mct = p.minimumWidth()
if p:=pns[TTkAppTemplate.BOTTOM]:
mcb = p.minimumWidth()
mcm = (p:=pns[TTkAppTemplate.MAIN]).minimumWidth()
return max(mh, mf, mcr+mcl+max(mct, mcb, mcm)) + (2 if p.border else 0)
def maximumWidth(self):
pns = self._panels
# Header and Footer sizes
mh=mf=0
if p:=pns[TTkAppTemplate.HEADER]:
mh = p.maximumWidth()
if p:=pns[TTkAppTemplate.FOOTER]:
mf = p.maximumWidth()
# Center Right,Left sizes
mcr=mcl=0
if p:=pns[TTkAppTemplate.RIGHT]:
mcr = p.maximumWidth() + ( 1 if p.border else 0 )
if p:=pns[TTkAppTemplate.LEFT]:
mcl = p.maximumWidth() + ( 1 if p.border else 0 )
# Center Top,Bottom sizes
mct=mcb=0x10000
if p:=pns[TTkAppTemplate.TOP]:
mct = p.maximumWidth()
if p:=pns[TTkAppTemplate.BOTTOM]:
mcb = p.maximumWidth()
mcm = (p:=pns[TTkAppTemplate.MAIN]).minimumWidth()
return min(mh, mf, mcr+mcl+min(mct, mcb, mcm)) + (2 if p.border else 0)
def minimumHeight(self):
pns = self._panels
# Header and Footer border and minHeight
mh=mf=0
# Header Footer
if p:=pns[TTkAppTemplate.HEADER]:
mh = p.minimumHeight() + ( 1 if p.border else 0 )
if p:=pns[TTkAppTemplate.FOOTER]:
mf = p.minimumHeight() + ( 1 if p.border else 0 )
# Center Left,Right:
mcr=mcl=0
if p:=pns[TTkAppTemplate.LEFT]:
mcl = p.minimumHeight()
if p:=pns[TTkAppTemplate.RIGHT]:
mcr = p.minimumHeight()
# Center Top,Bottom
mct=mcb=0
if p:=pns[TTkAppTemplate.TOP]:
mct = p.minimumHeight() + ( 1 if p.border else 0 )
if p:=pns[TTkAppTemplate.BOTTOM]:
mcb = p.minimumHeight() + ( 1 if p.border else 0 )
mcm = (p:=pns[TTkAppTemplate.MAIN]).minimumHeight()
return mh+mf+max(mcr ,mcl, mcm+mct+mcb ) + ( 2 if p.border else 0 )
def maximumHeight(self):
pns = self._panels
# Header and Footer border and minHeight
mh=mf=0
# Header Footer
if p:=pns[TTkAppTemplate.HEADER]:
mh = p.maximumHeight() + ( 1 if p.border else 0 )
if p:=pns[TTkAppTemplate.FOOTER]:
mf = p.maximumHeight() + ( 1 if p.border else 0 )
# Center Left,Right:
mcr=mcl=0x10000
if p:=pns[TTkAppTemplate.LEFT]:
mcl = p.maximumHeight()
if p:=pns[TTkAppTemplate.RIGHT]:
mcr = p.maximumHeight()
# Center Top,Bottom
mct=mcb=0
if p:=pns[TTkAppTemplate.TOP]:
mct = p.maximumHeight() + ( 1 if p.border else 0 )
if p:=pns[TTkAppTemplate.BOTTOM]:
mcb = p.maximumHeight() + ( 1 if p.border else 0 )
mcm = (p:=pns[TTkAppTemplate.MAIN]).maximumHeight()
return mh+mf+min(mcr ,mcl, mcm+mct+mcb ) + ( 2 if p.border else 0 )
def _updateGeometries(self):
w,h = self.size()
pns = self._panels
# E,F Splitters
p = pns[TTkAppTemplate.RIGHT]
if ( not p or not p.isVisible() ):
pass
p = pns[TTkAppTemplate.LEFT]
if ( not p or not p.isVisible() ):
pass
self.update()
#def layout(self):
# return self._panels[TTkAppTemplate.MAIN].item
#def setLayout(self, layout):
# self._panels[TTkAppTemplate.MAIN].item = layout