From 386c971ca1600ddbe5ca8deae71e3f8ed4342cb4 Mon Sep 17 00:00:00 2001 From: Eugenio Parodi Date: Sat, 8 May 2021 21:29:21 +0100 Subject: [PATCH 1/3] HAndle the layout position, aligned the positioning functions to the new design. --- TermTk/TTkCore/helper.py | 17 ++++----- TermTk/TTkLayouts/gridlayout.py | 6 +-- TermTk/TTkLayouts/layout.py | 42 +++++++++++---------- TermTk/TTkWidgets/TTkPickers/colorpicker.py | 22 +++++------ TermTk/TTkWidgets/widget.py | 29 +++++++++----- demo/showcase/colorpicker.py | 24 ++++++------ demo/showcase/formwidgets.py | 2 +- demo/showcase/scrollarea.py | 9 +++-- docs/images/Layout.HLD.001.svg | 3 ++ tests/test.ui.003.layout.position.py | 38 +++++++++++++++++++ 10 files changed, 124 insertions(+), 68 deletions(-) create mode 100644 docs/images/Layout.HLD.001.svg create mode 100755 tests/test.ui.003.layout.position.py diff --git a/TermTk/TTkCore/helper.py b/TermTk/TTkCore/helper.py index 49862e99..e9ac784b 100644 --- a/TermTk/TTkCore/helper.py +++ b/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(): diff --git a/TermTk/TTkLayouts/gridlayout.py b/TermTk/TTkLayouts/gridlayout.py index 8eed4399..78f74236 100644 --- a/TermTk/TTkLayouts/gridlayout.py +++ b/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 diff --git a/TermTk/TTkLayouts/layout.py b/TermTk/TTkLayouts/layout.py index 782b7ee6..09fadf0d 100644 --- a/TermTk/TTkLayouts/layout.py +++ b/TermTk/TTkLayouts/layout.py @@ -48,6 +48,7 @@ class TTkLayoutItem: '_rowspan', '_colspan', '_sMax', '_sMaxVal', '_sMin', '_sMinVal', + '_parent', '_alignment', '_layoutItemType') def __init__(self, *args, **kwargs): @@ -72,6 +73,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 +104,9 @@ class TTkLayoutItem: def maximumWidthSpan(self,pos) -> int: return TTkLayoutItem._calcSpanValue(self.maximumWidth(), pos,self._col,self._colspan) - - def geometry(self): - return self._x, self._y, self._w, self._h + 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 setGeometry(self, x, y, w, h): self._x = x @@ -112,6 +114,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 +149,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 +171,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 +194,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 +204,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 +213,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: @@ -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) diff --git a/TermTk/TTkWidgets/TTkPickers/colorpicker.py b/TermTk/TTkWidgets/TTkPickers/colorpicker.py index 8f5f8f89..f24fdfdb 100644 --- a/TermTk/TTkWidgets/TTkPickers/colorpicker.py +++ b/TermTk/TTkWidgets/TTkPickers/colorpicker.py @@ -265,17 +265,17 @@ 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 @@ -410,8 +410,8 @@ class TTkColorDialogPicker(TTkWindow,TColor): leftLayout.addItem(customLayout) leftLayout.addItem(controlLayout) # TODO: Get Rid of groupMove - leftLayout.groupMoveTo(1,3) - controlLayout.groupMoveTo(2, 18) + # leftLayout.groupMoveTo(1,3) + # controlLayout.groupMoveTo(2, 18) def paintEvent(self): diff --git a/TermTk/TTkWidgets/widget.py b/TermTk/TTkWidgets/widget.py index 404efe2f..cd44dd5b 100644 --- a/TermTk/TTkWidgets/widget.py +++ b/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) @@ -146,6 +150,8 @@ class TTkWidget(TMouseEvents,TKeyEvents): 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,23 @@ 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() + ix+=ox + iy+=oy # 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 +205,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''' @@ -275,8 +284,10 @@ class TTkWidget(TMouseEvents,TKeyEvents): x, y = evt.x, evt.y lx,ly,lw,lh =layout.geometry() # opt of bounds - if xlx+lw or ylh+ly: + if x=lx+lw 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(): diff --git a/demo/showcase/colorpicker.py b/demo/showcase/colorpicker.py index 7e47ef0d..6c551652 100755 --- a/demo/showcase/colorpicker.py +++ b/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) diff --git a/demo/showcase/formwidgets.py b/demo/showcase/formwidgets.py index 78793cae..49126f79 100755 --- a/demo/showcase/formwidgets.py +++ b/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() diff --git a/demo/showcase/scrollarea.py b/demo/showcase/scrollarea.py index dfff0f00..9f3364e9 100755 --- a/demo/showcase/scrollarea.py +++ b/demo/showcase/scrollarea.py @@ -37,9 +37,12 @@ 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) diff --git a/docs/images/Layout.HLD.001.svg b/docs/images/Layout.HLD.001.svg new file mode 100644 index 00000000..c3c13d5b --- /dev/null +++ b/docs/images/Layout.HLD.001.svg @@ -0,0 +1,3 @@ + + +
 Parent - Child 
 Parent - Child 
 Parent - Child 
 Parent - Child 
 Parent - Child 
 Parent - Child 
 Parent - Child 
 Parent - Child 
 Parent - Child 
 Parent - Child 
 Parent - Child 
 Parent - Child 
WidgetItem 1
WidgetItem 1
WidgetItem 2
WidgetItem 2
WidgetItem 3
WidgetItem 3
LayoutItem 1
LayoutItem 1
LayoutItem 2
LayoutItem 2
Widget 1
Widget 1
Widget 2
Widget 2
Widget 3
Widget 3
 TTkWidget 
TTkWidget
 TTkLayouts 
TTkLayouts
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/tests/test.ui.003.layout.position.py b/tests/test.ui.003.layout.position.py new file mode 100755 index 00000000..453c4b4a --- /dev/null +++ b/tests/test.ui.003.layout.position.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python3 + +# MIT License +# +# Copyright (c) 2021 Eugenio Parodi +# +# 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() \ No newline at end of file From b21a743b560d25dc6283431b52594956fda9dd5b Mon Sep 17 00:00:00 2001 From: Eugenio Parodi Date: Sat, 8 May 2021 21:35:15 +0100 Subject: [PATCH 2/3] added shadow to the picture --- docs/images/Layout.HLD.001.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/images/Layout.HLD.001.svg b/docs/images/Layout.HLD.001.svg index c3c13d5b..73a580e1 100644 --- a/docs/images/Layout.HLD.001.svg +++ b/docs/images/Layout.HLD.001.svg @@ -1,3 +1,3 @@ -
 Parent - Child 
 Parent - Child 
 Parent - Child 
 Parent - Child 
 Parent - Child 
 Parent - Child 
 Parent - Child 
 Parent - Child 
 Parent - Child 
 Parent - Child 
 Parent - Child 
 Parent - Child 
WidgetItem 1
WidgetItem 1
WidgetItem 2
WidgetItem 2
WidgetItem 3
WidgetItem 3
LayoutItem 1
LayoutItem 1
LayoutItem 2
LayoutItem 2
Widget 1
Widget 1
Widget 2
Widget 2
Widget 3
Widget 3
 TTkWidget 
TTkWidget
 TTkLayouts 
TTkLayouts
Viewer does not support full SVG 1.1
\ No newline at end of file +
 Parent - Child 
 Parent - Child 
 Parent - Child 
 Parent - Child 
 Parent - Child 
 Parent - Child 
 Parent - Child 
 Parent - Child 
 Parent - Child 
 Parent - Child 
 Parent - Child 
 Parent - Child 
WidgetItem 1
WidgetItem 1
WidgetItem 2
WidgetItem 2
WidgetItem 3
WidgetItem 3
LayoutItem 1
LayoutItem 1
LayoutItem 2
LayoutItem 2
Widget 1
Widget 1
Widget 2
Widget 2
Widget 3
Widget 3
 TTkWidget 
TTkWidget
 TTkLayouts 
TTkLayouts
Viewer does not support full SVG 1.1
\ No newline at end of file From 3a46709641354468cb06f5c02ea7e0666603db65 Mon Sep 17 00:00:00 2001 From: Eugenio Parodi Date: Mon, 10 May 2021 23:08:31 +0100 Subject: [PATCH 3/3] Added Layout Offset, Removed "groupMoveTo" --- TermTk/TTkLayouts/layout.py | 16 ++++++++-------- TermTk/TTkWidgets/TTkPickers/colorpicker.py | 11 ----------- TermTk/TTkWidgets/listwidget.py | 2 +- TermTk/TTkWidgets/menubar.py | 2 +- TermTk/TTkWidgets/scrollarea.py | 2 +- TermTk/TTkWidgets/widget.py | 13 +++++++++---- TermTk/libbpytop/colors.py | 5 ----- TermTk/libbpytop/term.py | 2 +- demo/showcase/scrollarea.py | 5 +++-- docs/MDNotes/TODO.md | 3 ++- 10 files changed, 26 insertions(+), 35 deletions(-) diff --git a/TermTk/TTkLayouts/layout.py b/TermTk/TTkLayouts/layout.py index 09fadf0d..dca6df99 100644 --- a/TermTk/TTkLayouts/layout.py +++ b/TermTk/TTkLayouts/layout.py @@ -43,6 +43,7 @@ class TTkLayoutItem: ''' __slots__ = ( '_x', '_y', '_z', '_w', '_h', + '_xOffset', '_yOffset', '_maxw', '_maxh', '_minw', '_minh', '_row','_col', '_rowspan', '_colspan', @@ -59,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) @@ -104,10 +107,15 @@ 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 setOffset(self, x, y): + self._xOffset = x + self._yOffset = y + def setGeometry(self, x, y, w, h): self._x = x self._y = y @@ -262,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 diff --git a/TermTk/TTkWidgets/TTkPickers/colorpicker.py b/TermTk/TTkWidgets/TTkPickers/colorpicker.py index f24fdfdb..4ea0cb88 100644 --- a/TermTk/TTkWidgets/TTkPickers/colorpicker.py +++ b/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)) @@ -278,8 +273,6 @@ class TTkColorDialogPicker(TTkWindow,TColor): 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) diff --git a/TermTk/TTkWidgets/listwidget.py b/TermTk/TTkWidgets/listwidget.py index 4b2f2a38..307dfe64 100644 --- a/TermTk/TTkWidgets/listwidget.py +++ b/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): diff --git a/TermTk/TTkWidgets/menubar.py b/TermTk/TTkWidgets/menubar.py index 7b4aefb3..276815f6 100644 --- a/TermTk/TTkWidgets/menubar.py +++ b/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]) diff --git a/TermTk/TTkWidgets/scrollarea.py b/TermTk/TTkWidgets/scrollarea.py index a011b30c..442e81e1 100644 --- a/TermTk/TTkWidgets/scrollarea.py +++ b/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() diff --git a/TermTk/TTkWidgets/widget.py b/TermTk/TTkWidgets/widget.py index cd44dd5b..45c5989a 100644 --- a/TermTk/TTkWidgets/widget.py +++ b/TermTk/TTkWidgets/widget.py @@ -145,7 +145,7 @@ 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 @@ -196,8 +196,11 @@ class TTkWidget(TMouseEvents,TKeyEvents): else: for child in item.zSortedItems: ix, iy, iw, ih = item.geometry() - ix+=ox - iy+=oy + 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 @@ -283,6 +286,8 @@ 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+lw or y=lh+ly: return False @@ -556,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: diff --git a/TermTk/libbpytop/colors.py b/TermTk/libbpytop/colors.py index d5b0464b..96253b78 100644 --- a/TermTk/libbpytop/colors.py +++ b/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 diff --git a/TermTk/libbpytop/term.py b/TermTk/libbpytop/term.py index 8f87b3e3..9bf91b32 100644 --- a/TermTk/libbpytop/term.py +++ b/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) diff --git a/demo/showcase/scrollarea.py b/demo/showcase/scrollarea.py index 9f3364e9..9aee2460 100755 --- a/demo/showcase/scrollarea.py +++ b/demo/showcase/scrollarea.py @@ -49,14 +49,15 @@ class graphTimerEvent(): 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 diff --git a/docs/MDNotes/TODO.md b/docs/MDNotes/TODO.md index 7fba9f86..2cee2620 100644 --- a/docs/MDNotes/TODO.md +++ b/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