Browse Source

Merge pull request #14 from ceccopierangiolieugenio/Remove_groupMoveTo

Remove group move to
pull/15/head
Ceccopierangiolieugenio 5 years ago committed by GitHub
parent
commit
66bea65f46
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 17
      TermTk/TTkCore/helper.py
  2. 6
      TermTk/TTkLayouts/gridlayout.py
  3. 56
      TermTk/TTkLayouts/layout.py
  4. 29
      TermTk/TTkWidgets/TTkPickers/colorpicker.py
  5. 2
      TermTk/TTkWidgets/listwidget.py
  6. 2
      TermTk/TTkWidgets/menubar.py
  7. 2
      TermTk/TTkWidgets/scrollarea.py
  8. 38
      TermTk/TTkWidgets/widget.py
  9. 5
      TermTk/libbpytop/colors.py
  10. 2
      TermTk/libbpytop/term.py
  11. 24
      demo/showcase/colorpicker.py
  12. 2
      demo/showcase/formwidgets.py
  13. 14
      demo/showcase/scrollarea.py
  14. 3
      docs/MDNotes/TODO.md
  15. 3
      docs/images/Layout.HLD.001.svg
  16. 38
      tests/test.ui.003.layout.position.py

17
TermTk/TTkCore/helper.py

@ -220,16 +220,13 @@ class TTkHelper:
@staticmethod
def absPos(widget) -> (int,int):
ppos = TTkHelper.absParentPos(widget)
wpos = widget.pos()
return (wpos[0]+ppos[0], wpos[1]+ppos[1])
@staticmethod
def absParentPos(widget) -> (int,int):
if widget is None or widget.parentWidget() is None:
return (0, 0)
return TTkHelper.absPos(widget.parentWidget())
wx, wy = 0,0
layout = widget.widgetItem()
while layout:
px, py = layout.pos()
wx, wy = wx+px, wy+py
layout = layout.parent()
return (wx, wy)
def _iterWidgets(item):
for child in item.children():

6
TermTk/TTkLayouts/gridlayout.py

@ -106,7 +106,7 @@ class TTkGridLayout(TTkLayout):
:param int colspan: the cols used by the widget, optional, defaults to 1
'''
self.removeWidget(widget)
item = TTkWidgetItem(widget=widget)
item = widget.widgetItem()
TTkGridLayout.addItem(self, item, row, col, rowspan, colspan)
widget.update()
@ -275,8 +275,8 @@ class TTkGridLayout(TTkLayout):
def update(self, *args, **kwargs):
x, y, w, h = self.geometry()
newx, newy = x, y
_, _, w, h = self.geometry()
newx, newy = 0, 0
# Sorted List of minimum heights
# min max val

56
TermTk/TTkLayouts/layout.py

@ -43,11 +43,13 @@ class TTkLayoutItem:
'''
__slots__ = (
'_x', '_y', '_z', '_w', '_h',
'_xOffset', '_yOffset',
'_maxw', '_maxh', '_minw', '_minh',
'_row','_col',
'_rowspan', '_colspan',
'_sMax', '_sMaxVal',
'_sMin', '_sMinVal',
'_parent',
'_alignment',
'_layoutItemType')
def __init__(self, *args, **kwargs):
@ -58,6 +60,8 @@ class TTkLayoutItem:
self._h = kwargs.get('height', 0 )
self._w, self._h = kwargs.get('size', (self._w, self._h))
self._z = kwargs.get('z',0)
self._xOffset = 0
self._yOffset = 0
self._row = kwargs.get('row', 0)
self._col = kwargs.get('col', 0)
self._rowspan = kwargs.get('rowspan', 1)
@ -72,6 +76,7 @@ class TTkLayoutItem:
self._minw = kwargs.get('minWidth', 0x00000)
self._minh = kwargs.get('minHeight', 0x00000)
self._minw, self._minh = kwargs.get('minSize', (self._minw, self._minh))
self._parent = None
def minimumSize(self):
@ -102,9 +107,14 @@ class TTkLayoutItem:
def maximumWidthSpan(self,pos) -> int:
return TTkLayoutItem._calcSpanValue(self.maximumWidth(), pos,self._col,self._colspan)
def offset(self): return self._xOffset, self._yOffset
def pos(self): return self._x, self._y
def size(self): return self._w, self._h
def geometry(self): return self._x, self._y, self._w, self._h
def geometry(self):
return self._x, self._y, self._w, self._h
def setOffset(self, x, y):
self._xOffset = x
self._yOffset = y
def setGeometry(self, x, y, w, h):
self._x = x
@ -112,6 +122,11 @@ class TTkLayoutItem:
self._w = w
self._h = h
def parent(self): return self._parent
def setParent(self, parent):
self._parent = parent
@property
def z(self): return self._z
@z.setter
@ -142,12 +157,11 @@ class TTkLayout(TTkLayoutItem):
'''
__slots__ = ('_items', '_zSortedItems', '_parent')
__slots__ = ('_items', '_zSortedItems')
def __init__(self, *args, **kwargs):
TTkLayoutItem.__init__(self, *args, **kwargs)
self._items = []
self._zSortedItems = []
self._parent = None
self.layoutItemType = TTkK.LayoutItem
def children(self):
@ -165,11 +179,10 @@ class TTkLayout(TTkLayoutItem):
if isinstance(parent, TTkLayoutItem):
self._parent = parent
else:
self._parent = TTkWidgetItem(widget=parent)
self._parent = parent.widgetItem()
for item in self._items:
if item.layoutItemType == TTkK.LayoutItem:
item.setParent(self)
else:
item.setParent(self)
if item.layoutItemType == TTkK.WidgetItem:
item.widget().setParent(self.parentWidget())
def parentWidget(self):
@ -189,9 +202,8 @@ class TTkLayout(TTkLayoutItem):
self._items[index] = item
self._zSortItems()
self.update()
if item.layoutItemType == TTkK.LayoutItem:
item.setParent(self)
else:
item.setParent(self)
if item.layoutItemType == TTkK.WidgetItem:
item.widget().setParent(self.parentWidget())
if self.parentWidget():
self.parentWidget().update(repaint=True, updateLayout=True)
@ -200,9 +212,8 @@ class TTkLayout(TTkLayoutItem):
self._items.append(item)
self._zSortItems()
self.update()
if item.layoutItemType == TTkK.LayoutItem:
item.setParent(self)
else:
item.setParent(self)
if item.layoutItemType == TTkK.WidgetItem:
item.widget().setParent(self.parentWidget())
if self.parentWidget():
self.parentWidget().update(repaint=True, updateLayout=True)
@ -210,7 +221,7 @@ class TTkLayout(TTkLayoutItem):
def addWidget(self, widget):
if widget.parentWidget() is not None:
widget.parentWidget().removeWidget(self)
self.addItem(TTkWidgetItem(widget=widget))
self.addItem(widget.widgetItem())
def removeItem(self, item):
if item in self._items:
@ -259,14 +270,6 @@ class TTkLayout(TTkLayoutItem):
TTkLayoutItem.setGeometry(self, x, y, w, h)
self.update(repaint=True, updateLayout=True)
def groupMoveTo(self, x, y):
ox,oy,_,_ = self.fullWidgetAreaGeometry()
dx = x-ox
dy = y-oy
for item in self._items:
x,y,w,h = item.geometry()
item.setGeometry(x+dx,y+dy,w,h)
def fullWidgetAreaGeometry(self):
if not self._items: return 0,0,0,0
minx,miny,maxx,maxy = 0x10000,0x10000,-0x10000,-0x10000
@ -296,8 +299,7 @@ class TTkWidgetItem(TTkLayoutItem):
self._widget = kwargs.get('widget', None)
self.layoutItemType = TTkK.WidgetItem
def widget(self):
return self._widget
def widget(self): return self._widget
def isVisible(self): return self._widget.isVisible()
@ -312,7 +314,9 @@ class TTkWidgetItem(TTkLayoutItem):
def maximumHeight(self) -> int: return self._widget.maximumHeight()
def maximumWidth(self) -> int: return self._widget.maximumWidth()
def geometry(self): return self._widget.geometry()
def pos(self): return self._widget.pos()
def size(self): return self._widget.size()
def geometry(self): return self._widget.geometry()
def setGeometry(self, x, y, w, h):
self._widget.setGeometry(x, y, w, h)

29
TermTk/TTkWidgets/TTkPickers/colorpicker.py

@ -246,13 +246,8 @@ class TTkColorDialogPicker(TTkWindow,TColor):
self.setLayout(TTkGridLayout())
colorLayout = TTkGridLayout() # Right
# leftLayout = TTkFrame(border=False, transparent=True, minSize=(25,20), maxWidth=25) # Left
leftLayout = TTkLayout(minSize=(25,20), maxWidth=25) # Left
#paletteLayout = TTkFrame(border=True, layout=TTkGridLayout(), title="Basic colors")
#customLayout = TTkFrame(border=True, layout=TTkGridLayout(), title="Custom colors")
#controlLayout = TTkFrame(border=True, minSize=(26,7) , title="Conrols")
paletteLayout = TTkGridLayout(pos=(0,0), size=(24,9))
customLayout = TTkGridLayout(pos=(0,10), size=(24,4))
controlLayout = TTkLayout( pos=(0,15), size=(24,30))
@ -265,21 +260,19 @@ class TTkColorDialogPicker(TTkWindow,TColor):
self._hueCanvas.colorPicked.connect(self._colorCanvas.setHue)
# Control
controlLayout.addWidget( sc := _TTkShowColor(pos=(1,2), size=(5,4), color=TTkColor.bg('#ffffff')) )
controlLayout.addWidget( TTkLabel(pos=(2,1), text="rgb:") )
controlLayout.addWidget( TTkLabel(pos=(7,2), text="HTML:") )
controlLayout.addWidget( leR := TTkSpinBox(pos=(7,1), size=(5,1), value=255, minimum=0, maximum=255) )
controlLayout.addWidget( leG := TTkSpinBox(pos=(13,1), size=(5,1), value=255, minimum=0, maximum=255) )
controlLayout.addWidget( leB := TTkSpinBox(pos=(19,1), size=(5,1), value=255, minimum=0, maximum=255) )
controlLayout.addWidget( sc := _TTkShowColor(pos=(1,1), size=(4,4), color=TTkColor.bg('#ffffff')) )
controlLayout.addWidget( TTkLabel(pos=(1,0), text="rgb:") )
controlLayout.addWidget( TTkLabel(pos=(6,1), text="HTML:") )
controlLayout.addWidget( leR := TTkSpinBox(pos=(7,0), size=(5,1), value=255, minimum=0, maximum=255) )
controlLayout.addWidget( leG := TTkSpinBox(pos=(12,0), size=(5,1), value=255, minimum=0, maximum=255) )
controlLayout.addWidget( leB := TTkSpinBox(pos=(18,0), size=(5,1), value=255, minimum=0, maximum=255) )
controlLayout.addWidget( leHTML := TTkLineEdit(pos=(13,2), size=(8,1), text="#FFFFFF") )
controlLayout.addWidget( leHTML := TTkLineEdit(pos=(12,1), size=(8,1), text="#FFFFFF") )
controlLayout.addWidget( okButton := TTkButton(pos=(7,3), size=(6,3), text="OK", border=True) )
controlLayout.addWidget( cancelButton := TTkButton(pos=(14,3), size=(10,3), text="CANCEL", border=True) )
controlLayout.addWidget( okButton := TTkButton(pos=(6,2), size=(6,3), text="OK", border=True) )
controlLayout.addWidget( cancelButton := TTkButton(pos=(13,2), size=(10,3), text="CANCEL", border=True) )
controlLayout.addWidget( TTkLabel(pos=(3,20), text="Seriously?") )
# TODO: Get Rid of groupMove
#controlLayout.groupMoveTo(1, 15)
@pyTTkSlot()
def _okPressed():
@ -409,10 +402,6 @@ class TTkColorDialogPicker(TTkWindow,TColor):
leftLayout.addItem(paletteLayout)
leftLayout.addItem(customLayout)
leftLayout.addItem(controlLayout)
# TODO: Get Rid of groupMove
leftLayout.groupMoveTo(1,3)
controlLayout.groupMoveTo(2, 18)
def paintEvent(self):
TTkWindow.paintEvent(self)

2
TermTk/TTkWidgets/listwidget.py

@ -112,7 +112,7 @@ class TTkListWidget(TTkAbstractScrollView):
@pyTTkSlot()
def _viewChangedHandler(self):
x,y = self.getViewOffsets()
self.layout().groupMoveTo(-x,-y)
self.layout().setOffset(-x,-y)
@pyTTkSlot(TTkAbstractListItem)
def _labelSelectedHandler(self, label):

2
TermTk/TTkWidgets/menubar.py

@ -142,7 +142,7 @@ class _TTkMenuButton(TTkAbstractListItem):
listw = TTkList(parent=frame, listWidget = menuListWidget)
# listw.textClicked.connect(self._menuCallback)
# listw.textClicked.connect(self._menuCallback)
TTkLog.debug(f"{self._menu}")
# TTkLog.debug(f"{self._menu}")
for item in self._menu:
listw.addItem(item)
TTkHelper.overlay(self, frame, pos[0], pos[1])

2
TermTk/TTkWidgets/scrollarea.py

@ -38,7 +38,7 @@ class _TTkAreaWidget(TTkAbstractScrollView):
@pyTTkSlot()
def _viewChangedHandler(self):
x,y = self.getViewOffsets()
self.layout().groupMoveTo(-x,-y)
self.layout().setOffset(-x,-y)
def viewFullAreaSize(self) -> (int, int):
_,_,w,h = self.layout().fullWidgetAreaGeometry()

38
TermTk/TTkWidgets/widget.py

@ -89,7 +89,8 @@ class TTkWidget(TMouseEvents,TKeyEvents):
'_padt', '_padb', '_padl', '_padr',
'_maxw', '_maxh', '_minw', '_minh',
'_focus','_focus_policy',
'_layout', '_canvas', '_visible', '_transparent',
'_layout', '_canvas', '_widgetItem',
'_visible', '_transparent',
'_pendingMouseRelease')
def __init__(self, *args, **kwargs):
@ -124,6 +125,8 @@ class TTkWidget(TMouseEvents,TKeyEvents):
self._focus = False
self._focus_policy = TTkK.NoFocus
self._widgetItem = TTkWidgetItem(widget=self)
self._layout = TTkLayout() # root layout
self._layout.setParent(self)
self._layout.addItem(kwargs.get('layout',TTkLayout())) # main layout
@ -133,6 +136,7 @@ class TTkWidget(TMouseEvents,TKeyEvents):
width = self._width ,
height = self._height )
if self._parent is not None:
self._parent.addWidget(self)
self._parent.update(repaint=True, updateLayout=True)
@ -141,11 +145,13 @@ class TTkWidget(TMouseEvents,TKeyEvents):
def __del__(self):
''' .. caution:: Don't touch this! '''
TTkLog.debug("DESTRUCTOR")
# TTkLog.debug("DESTRUCTOR")
if self._parent is not None:
self._parent.removeWidget(self)
self._parent = None
def widgetItem(self): return self._widgetItem
def addWidget(self, widget):
''' Add a child widget to the layout
@ -153,7 +159,7 @@ class TTkWidget(TMouseEvents,TKeyEvents):
:type widget: :class:`~TermTk.TTkWidgets.widget.TTkWidget`
'''
widget._parent = self
if self.layout() is not None:
if self.layout():
self.layout().addWidget(widget)
self.update(repaint=True, updateLayout=True)
# widget.show()
@ -175,20 +181,26 @@ class TTkWidget(TMouseEvents,TKeyEvents):
pass
@staticmethod
def _paintChildCanvas(canvas, item, geometry):
def _paintChildCanvas(canvas, item, geometry, offset):
''' .. caution:: Don't touch this! '''
lx,ly,lw,lh = geometry
ox, oy = offset
if item.layoutItemType == TTkK.WidgetItem and not item.isEmpty():
child = item.widget()
cx,cy,cw,ch = child.geometry()
canvas.paintCanvas(
child.getCanvas(),
(cx, cy, cw, ch), # geometry
(0,0,cw,ch), # slice
(lx, ly, lw, lh)) # bound
(cx+ox, cy+oy, cw, ch), # geometry
( 0, 0, cw, ch), # slice
( lx, ly, lw, lh)) # bound
else:
for child in item.zSortedItems:
ix, iy, iw, ih = item.geometry()
iox, ioy = item.offset()
ix+=ox+iox
iy+=oy+ioy
iw-=iox
ih-=ioy
# child outside the bound
if ix+iw < lx and ix > lx+lw and iy+ih < ly and iy > ly+lh: continue
# Reduce the bound to the minimum visible
@ -196,11 +208,11 @@ class TTkWidget(TMouseEvents,TKeyEvents):
by = max(iy,ly)
bw = min(ix+iw,lx+lw)-bx
bh = min(iy+ih,ly+lh)-by
TTkWidget._paintChildCanvas(canvas, child, (bx,by,bw,bh))
TTkWidget._paintChildCanvas(canvas, child, (bx,by,bw,bh), (ix,iy))
def paintChildCanvas(self):
''' .. caution:: Don't touch this! '''
TTkWidget._paintChildCanvas(self._canvas, self.rootLayout(), self.rootLayout().geometry())
TTkWidget._paintChildCanvas(self._canvas, self.rootLayout(), self.rootLayout().geometry(), self.rootLayout().pos())
def moveEvent(self, x: int, y: int):
''' Event Callback triggered after a successful move'''
@ -274,9 +286,13 @@ class TTkWidget(TMouseEvents,TKeyEvents):
''' .. caution:: Don't touch this! '''
x, y = evt.x, evt.y
lx,ly,lw,lh =layout.geometry()
lox, loy = layout.offset()
lx,ly,lw,lh = lx+lox, ly+loy, lw-lox, lh-loy
# opt of bounds
if x<lx or x>lx+lw or y<ly or y>lh+ly:
if x<lx or x>=lx+lw or y<ly or y>=lh+ly:
return False
x-=lx
y-=ly
for item in reversed(layout.zSortedItems):
# for item in layout.zSortedItems:
if item.layoutItemType == TTkK.WidgetItem and not item.isEmpty():
@ -545,7 +561,7 @@ class TTkWidget(TMouseEvents,TKeyEvents):
def setFocus(self):
if self._focus: return
TTkLog.debug(self._name)
# TTkLog.debug(self._name)
tmp = TTkHelper.getFocus()
if tmp == self: return
if tmp is not None:

5
TermTk/libbpytop/colors.py

@ -21,11 +21,6 @@ from select import select
from time import time, sleep, strftime, localtime
from typing import List, Set, Dict, Tuple, Optional, Union, Any, Callable, ContextManager, Iterable, Type, NamedTuple
try: import fcntl, termios, tty, pwd
except Exception as e:
print(f'ERROR: {e}')
exit(1)
from TermTk.libbpytop.term import Term
from TermTk.TTkCore.constant import TTkK
from TermTk.TTkCore.cfg import TTkCfg

2
TermTk/libbpytop/term.py

@ -21,7 +21,7 @@ from select import select
from time import time, sleep, strftime, localtime
from typing import List, Set, Dict, Tuple, Optional, Union, Any, Callable, ContextManager, Iterable, Type, NamedTuple
try: import fcntl, termios, tty, pwd
try: import termios
except Exception as e:
print(f'ERROR: {e}')
exit(1)

24
demo/showcase/colorpicker.py

@ -32,18 +32,18 @@ def demoColorPicker(root=None):
frame = ttk.TTkFrame(parent=root, border=False)
winCP = ttk.TTkWindow(parent=frame,pos = (0,0), size=(30,16), title="Test Color Pickers", border=True)
ttk.TTkColorButtonPicker(parent=winCP, pos=(1,3), size=(8,3), border=True, color=ttk.TTkColor.bg('#88ffff') )
ttk.TTkColorButtonPicker(parent=winCP, pos=(1,6), size=(8,3), border=True, color=ttk.TTkColor.bg('#ff88ff') )
ttk.TTkColorButtonPicker(parent=winCP, pos=(1,9), size=(8,3), border=True, color=ttk.TTkColor.bg('#ffff88') )
ttk.TTkColorButtonPicker(parent=winCP, pos=(1,12), size=(8,3), border=True, color=ttk.TTkColor.bg('#8888ff') )
ttk.TTkColorButtonPicker(parent=winCP, pos=(11,3), size=(8,3), border=True, color=ttk.TTkColor.fg('#00ffff') )
ttk.TTkColorButtonPicker(parent=winCP, pos=(11,6), size=(8,3), border=True, color=ttk.TTkColor.fg('#ff00ff') )
ttk.TTkColorButtonPicker(parent=winCP, pos=(11,9), size=(8,3), border=True, color=ttk.TTkColor.fg('#ffff00') )
ttk.TTkColorButtonPicker(parent=winCP, pos=(11,12),size=(8,3), border=True, color=ttk.TTkColor.fg('#0000ff') )
ttk.TTkColorButtonPicker(parent=winCP, pos=(21,3), size=(8,3), border=True, color=ttk.TTkColor.bg('#ffffff') )
ttk.TTkColorButtonPicker(parent=winCP, pos=(21,6), size=(8,3), border=True, color=ttk.TTkColor.bg('#ffffff') )
ttk.TTkColorButtonPicker(parent=winCP, pos=(21,9), size=(8,3), border=True, color=ttk.TTkColor.bg('#ffffff') )
ttk.TTkColorButtonPicker(parent=winCP, pos=(21,12),size=(8,3), border=True, color=ttk.TTkColor.bg('#ffffff') )
ttk.TTkColorButtonPicker(parent=winCP, pos=( 0,0), size=(8,3), border=True, color=ttk.TTkColor.bg('#88ffff') )
ttk.TTkColorButtonPicker(parent=winCP, pos=( 0,3), size=(8,3), border=True, color=ttk.TTkColor.bg('#ff88ff') )
ttk.TTkColorButtonPicker(parent=winCP, pos=( 0,6), size=(8,3), border=True, color=ttk.TTkColor.bg('#ffff88') )
ttk.TTkColorButtonPicker(parent=winCP, pos=( 0,9), size=(8,3), border=True, color=ttk.TTkColor.bg('#8888ff') )
ttk.TTkColorButtonPicker(parent=winCP, pos=(10,0), size=(8,3), border=True, color=ttk.TTkColor.fg('#00ffff') )
ttk.TTkColorButtonPicker(parent=winCP, pos=(10,3), size=(8,3), border=True, color=ttk.TTkColor.fg('#ff00ff') )
ttk.TTkColorButtonPicker(parent=winCP, pos=(10,6), size=(8,3), border=True, color=ttk.TTkColor.fg('#ffff00') )
ttk.TTkColorButtonPicker(parent=winCP, pos=(10,9), size=(8,3), border=True, color=ttk.TTkColor.fg('#0000ff') )
ttk.TTkColorButtonPicker(parent=winCP, pos=(20,0), size=(8,3), border=True, color=ttk.TTkColor.bg('#ffffff') )
ttk.TTkColorButtonPicker(parent=winCP, pos=(20,3), size=(8,3), border=True, color=ttk.TTkColor.bg('#ffffff') )
ttk.TTkColorButtonPicker(parent=winCP, pos=(20,6), size=(8,3), border=True, color=ttk.TTkColor.bg('#ffffff') )
ttk.TTkColorButtonPicker(parent=winCP, pos=(20,9), size=(8,3), border=True, color=ttk.TTkColor.bg('#ffffff') )
# win2_1 = ttk.TTkColorDialogPicker(parent=frame,pos = (3,3), size=(110,40), title="Test Color Picker", border=True)

2
demo/showcase/formwidgets.py

@ -106,7 +106,7 @@ def main():
ttk.TTkLog.use_default_file_logging()
root = ttk.TTk()
winForm = ttk.TTkWindow(parent=root,pos=(1,1), size=(60,40), title="Test Window 1", layout=ttk.TTkVBoxLayout(), border=True)
winForm = ttk.TTkWindow(parent=root,pos=(1,2), size=(60,40), title="Test Window 1", layout=ttk.TTkVBoxLayout(), border=True)
demoFormWidgets(winForm)
root.mainloop()

14
demo/showcase/scrollarea.py

@ -37,23 +37,27 @@ class graphTimerEvent():
self.timer.start(1)
@ttk.pyTTkSlot()
def timerEvent(self):
plot = [ math.sin( self.val *math.pi/40)*4*10 ,
math.sin((self.val+15)*math.pi/40)*4*7,
math.sin((self.val+20)*math.pi/30)*4*5,]
plot = [
math.sin((self.val+10)*math.pi/30)*
math.sin((self.val+15)*math.pi/40)*4*7,
math.sin( self.val *math.pi/40)*4*10 ,
math.sin((self.val+20)*math.pi/30)*4*5,
]
self.val+=1
self.w.addValue(plot)
self.timer.start(self.delay)
def demoScrollArea(root= None):
scrollArea = ttk.TTkScrollArea(parent=root)
ttk.TTkTestWidgetSizes(pos=(0,0) , size=(50,25), parent=scrollArea.viewport(), border=True)
ttk.TTkTestWidget(pos=(0,0) , size=(50,25), parent=scrollArea.viewport(), border=True)
ttk.TTkTestWidgetSizes(pos=(10,25) , size=(40,20), parent=scrollArea.viewport(), border=True)
ttk.TTkTestWidgetSizes(pos=(20,50) , size=(60,10), parent=scrollArea.viewport(), border=True)
ttk.TTkTestWidgetSizes(pos=(50,0) , size=(40,10), parent=scrollArea.viewport(), border=True)
ttk.TTkTestWidgetSizes(pos=(100,0) , size=(40,10), parent=scrollArea.viewport(), border=True)
ttk.TTkTestWidgetSizes(pos=(150,0) , size=(40,10), parent=scrollArea.viewport(), border=True)
ttk.TTkTestWidgetSizes(pos=(50,31) , size=(60,10), parent=scrollArea.viewport(), border=True)
graph = ttk.TTkGraph( pos=(50,11) , size=(150,20), parent=scrollArea.viewport(), color=ttk.TTkColor.fg('#ff8800', modifier=ttk.TTkColorGradient(increment= 40)))
ttk.TTkTestWidget(pos=(110,15) , size=(60,40), parent=scrollArea.viewport(), border=True)
graph = ttk.TTkGraph( pos=(50,11) , size=(60,20), parent=scrollArea.viewport(), color=ttk.TTkColor.fg('#ff8800', modifier=ttk.TTkColorGradient(increment= 40)))
graphTimerEvent(graph, 0.1)
return scrollArea

3
docs/MDNotes/TODO.md

@ -60,7 +60,8 @@
- [x] Add addLayout (adDItem) method - Nested layouts
- [x] Add Grid Layout
- [x] Add ColSpan / RowSpan
- [ ] Get rid of groupMoveTo
- [x] Get rid of groupMoveTo
- [ ] Get rid of addWidget
### AbstractScrollArea
- [x] Implement something that mimic the QAbstactScrollArea

3
docs/images/Layout.HLD.001.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 31 KiB

38
tests/test.ui.003.layout.position.py

@ -0,0 +1,38 @@
#!/usr/bin/env python3
# MIT License
#
# Copyright (c) 2021 Eugenio Parodi <ceccopierangiolieugenio AT googlemail DOT com>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
import sys, os
sys.path.append(os.path.join(sys.path[0],'..'))
import TermTk as ttk
ttk.TTkLog.use_default_file_logging()
root = ttk.TTk()
f1 = ttk.TTkFrame(parent=root, border=True, pos=(10,10), size=(50,10))
f2 = ttk.TTkFrame(parent=f1, border=True, pos=(3,3), size=(20,5))
root.mainloop()
Loading…
Cancel
Save