diff --git a/TermTk/TTkCore/canvas.py b/TermTk/TTkCore/canvas.py index 78fd0295..46af4c99 100644 --- a/TermTk/TTkCore/canvas.py +++ b/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)}") diff --git a/TermTk/TTkLayouts/gridlayout.py b/TermTk/TTkLayouts/gridlayout.py index d8d2d49c..8e2fdcaa 100644 --- a/TermTk/TTkLayouts/gridlayout.py +++ b/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 diff --git a/TermTk/TTkLayouts/layout.py b/TermTk/TTkLayouts/layout.py index fb5bfc9b..28b494d5 100644 --- a/TermTk/TTkLayouts/layout.py +++ b/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() diff --git a/TermTk/TTkWidgets/widget.py b/TermTk/TTkWidgets/widget.py index 4c8d1515..62d51f00 100644 --- a/TermTk/TTkWidgets/widget.py +++ b/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 diff --git a/tests/showcase/layoutnested.py b/tests/showcase/layoutnested.py index 1c75a25b..2caefaac 100755 --- a/tests/showcase/layoutnested.py +++ b/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 diff --git a/tests/test.showcase.001.py b/tests/test.showcase.001.py index 36bd0101..7cd43894 100755 --- a/tests/test.showcase.001.py +++ b/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 ")