Browse Source

Finalised changes to have nested layouts

pull/4/head
Eugenio Parodi 5 years ago
parent
commit
4a51867094
  1. 8
      TermTk/TTkCore/canvas.py
  2. 25
      TermTk/TTkLayouts/gridlayout.py
  3. 14
      TermTk/TTkLayouts/layout.py
  4. 35
      TermTk/TTkWidgets/widget.py
  5. 6
      tests/showcase/layoutnested.py
  6. 22
      tests/test.showcase.001.py

8
TermTk/TTkCore/canvas.py

@ -422,6 +422,14 @@ class TTkCanvas:
'''
geom = (x,y,w,h)
bound = (x,y,w,h)
x x+w
canvas: |xxxxxxxxxxxxxxxxxxxxxxx|
slice: |-----------|
bx bx+bw
bound: |--------|
0 self._width
self._canvas: |----|xxxxxx|----------|
'''
def paintCanvas(self, canvas, geom, slice, bound):
# TTkLog.debug(f"PaintCanvas:{(x,y,w,h)}")

25
TermTk/TTkLayouts/gridlayout.py

@ -62,7 +62,7 @@ class TTkGridLayout(TTkLayout):
# remove extra cols
for gridRow in range(len(self._gridItems)):
if self._gridItems[gridRow] is None:
self._gridItems[gridRow] = [None]*(cols+1)
self._gridItems[gridRow] = [None]*(cols)
continue
sizeRow = len(self._gridItems[gridRow])
if cols < sizeRow:
@ -74,12 +74,15 @@ class TTkGridLayout(TTkLayout):
def addWidget(self, *args, **kwargs):
widget = args[0]
self.removeWidget(widget)
widget._parent = self.parentWidget()
item = TTkWidgetItem(widget=widget)
self.addItem(*[item], **kwargs)
widget.update(updateParent=True)
if len(args) == 3:
TTkGridLayout.addItem(self, item, args[1], args[2])
else:
TTkGridLayout.addItem(self, item)
widget.update()
def replaceItem(self, item, index): pass
def addItem(self, *args, **kwargs):
item = args[0]
self.removeItem(item)
@ -100,18 +103,18 @@ class TTkGridLayout(TTkLayout):
# reshape the gridItems
maxrow += 1
maxcol += 1
self._reshapeGrid(size=(maxrow,maxcol))
# TODO: This is RUBBISH!!!
self._reshapeGrid(size=(maxrow,maxcol))
if self._gridItems[row][col] is not None:
# TODO: Handle the LayoutItem
self.removeItem(self._gridItems[row][col])
self._reshapeGrid(size=(maxrow,maxcol))
item._row = row
item._col = col
self._gridItems[row][col] = item
TTkLayout.addItem(self, item)
if self.parentWidget():
self.parentWidget().update()
def removeItem(self, item):
TTkLayout.removeItem(self, item)
@ -228,7 +231,7 @@ class TTkGridLayout(TTkLayout):
return maxh
def update(self):
def update(self, *args, **kwargs):
x, y, w, h = self.geometry()
newx, newy = x, y
@ -303,8 +306,10 @@ class TTkGridLayout(TTkLayout):
item.setGeometry(
horSizes[col][0], vertSizes[row][0] ,
horSizes[col][1], vertSizes[row][1] )
#TTkLog.debug(f"Children: {item.geometry()}")
if item.layoutItemType == TTkK.WidgetItem and not item.isEmpty():
item.widget().update()
#TTkLog.debug(f"Children name: {item.widget()._name}")
item.widget().update(*args, **kwargs)
elif item.layoutItemType == TTkK.LayoutItem:
item.update()
item.update(*args, **kwargs)
return True

14
TermTk/TTkLayouts/layout.py

@ -98,6 +98,11 @@ class TTkLayout(TTkLayoutItem):
self._parent = parent
else:
self._parent = TTkWidgetItem(widget=parent)
for item in self._items:
if item.layoutItemType == TTkK.LayoutItem:
item.setParent(self)
else:
item.widget().setParent(self.parentWidget())
def parentWidget(self):
if self._parent is None: return None
@ -119,6 +124,13 @@ class TTkLayout(TTkLayoutItem):
def addItem(self, item):
self._items.append(item)
self._zSortItems()
self.update()
if item.layoutItemType == TTkK.LayoutItem:
item.setParent(self)
else:
item.widget().setParent(self.parentWidget())
if self.parentWidget():
self.parentWidget().update(repaint=True, updateLayout=True)
def addWidget(self, widget):
if widget.parentWidget() is not None:
@ -170,7 +182,7 @@ class TTkLayout(TTkLayoutItem):
ax, ay, aw, ah = self.geometry()
if ax==x and ay==y and aw==w and ah==h: return
TTkLayoutItem.setGeometry(self, x, y, w, h)
self.update()
self.update(repaint=True, updateLayout=True)
def groupMoveTo(self, x, y):
ox,oy,_,_ = self.fullWidgetAreaGeometry()

35
TermTk/TTkWidgets/widget.py

@ -117,18 +117,31 @@ class TTkWidget:
def paintEvent(self): pass
@staticmethod
def _paintChildCanvas(canvas, item, geometry):
lx,ly,lw,lh = geometry
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
else:
for child in item.zSortedItems:
ix, iy, iw, ih = item.geometry()
# child outside the bound
if ix+iw < lx and ix > lx+lw and iy+ih < ly and y > ly+lh: continue
# Reduce the bound to the minimum visible
bx = max(ix,lx)
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))
def paintChildCanvas(self):
# paint over child canvas
lx,ly,lw,lh = self.layout().geometry()
for item in self.layout().zSortedItems:
if item.layoutItemType == TTkK.WidgetItem and not item.isEmpty():
child = item.widget()
cx,cy,cw,ch = child.geometry()
self._canvas.paintCanvas(
child.getCanvas(),
(cx, cy, cw, ch),
(0,0,cw,ch),
(lx, ly, lw, lh))
TTkWidget._paintChildCanvas(self._canvas, self.layout(), self.layout().geometry())
def paintNotifyParent(self):
parent = self._parent

6
tests/showcase/layoutnested.py

@ -36,6 +36,9 @@ def demoLayoutNested(root=None):
gridLayout = ttk.TTkGridLayout()
mainLayout.addItem(gridLayout)
nestedLayout = ttk.TTkGridLayout()
gridLayout.addItem(nestedLayout,1,2)
mainLayout.addWidget(ttk.TTkFrame(border=True,title="Frame1"))
mainLayout.addWidget(ttk.TTkFrame(border=True,title="Frame2"))
@ -46,6 +49,9 @@ def demoLayoutNested(root=None):
gridLayout.addWidget(ttk.TTkFrame(border=True,title="Frame3"),0,1)
gridLayout.addWidget(ttk.TTkFrame(border=True,title="Frame4"),2,3)
nestedLayout.addWidget(ttk.TTkButton(border=True, text="Button4"),0,1)
nestedLayout.addWidget(ttk.TTkButton(border=True, text="Button5"),1,0)
return frame

22
tests/test.showcase.001.py

@ -28,22 +28,24 @@ import random
sys.path.append(os.path.join(sys.path[0],'..'))
import TermTk as ttk
from showcase.layout import demoLayout
from showcase.table import demoTable
from showcase.tab import demoTab
from showcase.tree import demoTree
from showcase.graph import demoGraph
from showcase.splitter import demoSplitter
from showcase.windows import demoWindows
from showcase.formwidgets import demoFormWidgets
from showcase.scrollarea import demoScrollArea
from showcase.list import demoList
from showcase.layout import demoLayout
from showcase.layoutnested import demoLayoutNested
from showcase.table import demoTable
from showcase.tab import demoTab
from showcase.tree import demoTree
from showcase.graph import demoGraph
from showcase.splitter import demoSplitter
from showcase.windows import demoWindows
from showcase.formwidgets import demoFormWidgets
from showcase.scrollarea import demoScrollArea
from showcase.list import demoList
def demoShowcase(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.TTkTestWidget(border=True, title="Frame1.2"), " Label Test 1.2 ")
tabWidget1.addTab(demoLayout(), " Layout Test ")
tabWidget1.addTab(demoLayoutNested()," Nested Layout Test ")
tabWidget1.addTab(demoFormWidgets(), " Form Test ")
tabWidget1.addTab(demoList(), " List Test ")
tabWidget1.addTab(demoGraph(), " Graph Test ")

Loading…
Cancel
Save