From f65a4f77656098ec4e4357d94b16455bbcf45e1e Mon Sep 17 00:00:00 2001 From: Eugenio Parodi Date: Thu, 25 Feb 2021 17:01:17 +0000 Subject: [PATCH] Added eyecandies, frame title and fixed boxlayout wrong size --- .gitignore | 1 + TermTk/TTkCore/canvas.py | 36 +++++++++++++++++++++++++++++++++ TermTk/TTkCore/helper.py | 1 + TermTk/TTkCore/ttk.py | 2 +- TermTk/TTkGui/theme.py | 27 +++++++++++++++++++++---- TermTk/TTkLayouts/gridlayout.py | 2 ++ TermTk/TTkWidgets/button.py | 19 +++++++++-------- TermTk/TTkWidgets/frame.py | 15 ++++++++++++-- TermTk/TTkWidgets/widget.py | 1 + docs/TODO.md | 2 ++ tests/test.ui.003.layout.py | 18 +++++++++-------- 11 files changed, 99 insertions(+), 25 deletions(-) diff --git a/.gitignore b/.gitignore index 51652eca..ede3637d 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ __pycache__/ *$py.class # other +*.swp tmp profiler.txt .vscode diff --git a/TermTk/TTkCore/canvas.py b/TermTk/TTkCore/canvas.py index a09cd71a..e9bfe160 100644 --- a/TermTk/TTkCore/canvas.py +++ b/TermTk/TTkCore/canvas.py @@ -108,10 +108,46 @@ class TTkCanvas: for i in range(0, len(arr)): self._set(y, x+i, arr[i], color) + def drawBoxTitle(self, pos, size, text, color=TTkColor.RST, colorText=TTkColor.RST, grid=0): + if not self._visible: return + x,y = pos + w,h = size + if w < 4: return + gg = self._theme.grid[grid] + + if len(text) > w-4: + text = text[:w-4] + l = (w-2-len(text))//2 + r = l+len(text)+1 + + self._set(y,l, gg[7], color) + self._set(y,r, gg[6], color) + self.drawText((l+1,y),text,colorText) + + def drawBox(self, pos, size, color=TTkColor.RST): self.drawGrid(pos=pos, size=size, color=color) + def drawButtonBox(self, pos, size, color=TTkColor.RST, grid=0): + if not self._visible: return + x,y = pos + w,h = size + gg = self._theme.buttonBox[grid] + # 4 corners + self._set(y, x, gg[0], color) + self._set(y, x+w-1, gg[2], color) + self._set(y+h-1, x, gg[6], color) + self._set(y+h-1, x+w-1, gg[8], color) + if w > 2: + for i in range(x+1,x+w-1): + self._set(y, i, gg[1], color) + self._set(y+h-1, i, gg[7], color) + if h > 2: + for i in range(y+1,y+h-1): + self._set(i, x, gg[3], color) + self._set(i, x+w-1, gg[5], color) + def drawGrid(self, pos, size, hlines=[], vlines=[], color=TTkColor.RST, grid=0): if not self._visible: return x,y = pos diff --git a/TermTk/TTkCore/helper.py b/TermTk/TTkCore/helper.py index cb1d8f12..4950df6f 100644 --- a/TermTk/TTkCore/helper.py +++ b/TermTk/TTkCore/helper.py @@ -62,6 +62,7 @@ class TTkHelper: updateBuffers = [w for w in TTkHelper._updateBuffer] updateWidgets = [w for w in TTkHelper._updateWidget] + # TTkLog.debug(f"{len(TTkHelper._updateBuffer)} {len(TTkHelper._updateWidget)}") for widget in TTkHelper._updateWidget: parent = widget.parentWidget() while parent is not None: diff --git a/TermTk/TTkCore/ttk.py b/TermTk/TTkCore/ttk.py index 4bba3f9a..00e513e4 100644 --- a/TermTk/TTkCore/ttk.py +++ b/TermTk/TTkCore/ttk.py @@ -74,7 +74,7 @@ class TTk(TTkWidget): curtime = time.time() self.frame+=1 delta = curtime - self.time - if delta > 3: + if delta > 5: TTkLog.debug(f"fps: {int(self.frame/delta)}") self.frame = 0 self.time = curtime diff --git a/TermTk/TTkGui/theme.py b/TermTk/TTkGui/theme.py index 07fb17e0..05b28c2f 100644 --- a/TermTk/TTkGui/theme.py +++ b/TermTk/TTkGui/theme.py @@ -43,10 +43,15 @@ class TTkTheme(): '╚','╝') ''' grid0 grid1 grid2 grid3 - ┌─┬┐ ╔═╦╗ ╔═╤╗ ┌─╥┐ ╓─╥╖ ╒═╤╕ - │ ││ ║ ║║ ║ │║ │ ║│ ║ ║║ │ ││ - ├─┼┤ ╠═╬╣ ╟─┼╢ ╞═╬╡ ╟─╫╢ ╞═╪╡ - └─┴┘ ╚═╩╝ ╚═╧╝ └─╨┘ ╙─╨╜ ╘═╧╛ + ┌─┬┐ ╔═╦╗ ╔═╤╗ ┌─╥┐ + │ ││ ║ ║║ ║ │║ │ ║│ + ├─┼┤ ╠═╬╣ ╟─┼╢ ╞═╬╡ + └─┴┘ ╚═╩╝ ╚═╧╝ └─╨┘ + grid4 grid5 grid6 grid7 grid8 + ╓─╥╖ ╒═╤╕ ╓─┬┐ ┌─┬╖ ┌─┬┐ + ║ ║║ │ ││ ║ ││ │ │║ │ ││ + ╟─╫╢ ╞═╪╡ ╟─┼┤ ├─┼╢ ├─┼┤ + ╙─╨╜ ╘═╧╛ ╚═╧╛ ╘═╧╝ ╘═╧╛ ''' grid = ( ( '─','│', # Grid 0 @@ -66,5 +71,19 @@ class TTkTheme(): '╞','╡','╥','╨', '═','║','╬',)) + ''' + grid0 grid1 + ┌─┐ ┌─┐ + │ │ │ │ + └─┘ ╘═╛ + ''' + buttonBox = ( + ('┌','─','┐', + '│',' ','│', + '└','─','┘'), + ('┌','─','┐', + '│',' ','│', + '╘','═','╛')) + hscroll = ('◀','┄','▓','▶') vscroll = ('▲','┊','▓','▼') \ No newline at end of file diff --git a/TermTk/TTkLayouts/gridlayout.py b/TermTk/TTkLayouts/gridlayout.py index 617f768d..1f2669e5 100644 --- a/TermTk/TTkLayouts/gridlayout.py +++ b/TermTk/TTkLayouts/gridlayout.py @@ -79,6 +79,8 @@ class TTkGridLayout(TTkLayout): # addWidget(self, widget, row, col) def addWidget(self, *args, **kwargs): widget = args[0] + self.removeWidget(widget) + widget._parent = self.parentWidget() if len(args) == 3: row = args[1] col = args[2] diff --git a/TermTk/TTkWidgets/button.py b/TermTk/TTkWidgets/button.py index bcc9ee4e..bf2198d3 100644 --- a/TermTk/TTkWidgets/button.py +++ b/TermTk/TTkWidgets/button.py @@ -46,26 +46,25 @@ class TTkButton(TTkWidget): def paintEvent(self): if self._pressed: - # borderColor = TTkColor.fg("#00ffff") - # textColor = TTkColor.fg("#0000ff") - borderColor = TTkColor.fg("#ffff88")+TTkColor.BOLD - textColor = TTkColor.fg("#00ff00")+TTkColor.BOLD - else: - # borderColor = TTkColor.fg("#ffff00") borderColor = TTkColor.RST - textColor = TTkColor.fg("#00ff00") + textColor = TTkColor.RST + grid = 0 + else: + borderColor = TTkColor.RST+TTkColor.BOLD + textColor = TTkColor.RST+TTkColor.BOLD + grid = 1 self._canvas.drawText(pos=(1,1), color=textColor ,text=self.text) if self._border: - self._canvas.drawBox(pos=(0,0),size=(self._width,self._height),color=borderColor) + self._canvas.drawButtonBox(pos=(0,0),size=(self._width,self._height),color=borderColor, grid=grid) def mousePressEvent(self, evt): - TTkLog.debug(f"{self._name} Test Mouse {evt}") + TTkLog.debug(f"{self._text} Test Mouse {evt}") self._pressed = True self.update() return True def mouseReleaseEvent(self, evt): - TTkLog.debug(f"{self._name} Test Mouse {evt}") + TTkLog.debug(f"{self._text} Test Mouse {evt}") self._pressed = False self.update() self.clicked.emit() diff --git a/TermTk/TTkWidgets/frame.py b/TermTk/TTkWidgets/frame.py index 77afd4c1..d579dc81 100644 --- a/TermTk/TTkWidgets/frame.py +++ b/TermTk/TTkWidgets/frame.py @@ -26,14 +26,25 @@ from TermTk.TTkCore.log import TTkLog from .widget import * class TTkFrame(TTkWidget): - __slots__ = ('_border') + __slots__ = ('_border','_title', '_titleColor', '_borderColor') def __init__(self, *args, **kwargs): TTkWidget.__init__(self, *args, **kwargs) self._name = kwargs.get('name' , 'TTkFrame' ) + self._title = kwargs.get('title' , '' ) self._border = kwargs.get('border', True ) + self._borderColor = kwargs.get('borderColor', TTkColor.RST ) + self._titleColor = kwargs.get('titleColor', TTkColor.RST ) if self._border: self.setPadding(1,1,1,1) def paintEvent(self): if self._border: - self._canvas.drawBox(pos=(0,0),size=(self._width,self._height)) \ No newline at end of file + self._canvas.drawBox(pos=(0,0),size=(self._width,self._height), color=self._borderColor) + if self._title != '': + self._canvas.drawBoxTitle( + pos=(0,0), + size=(self._width,self._height), + text=self._title, + color=self._borderColor, + colorText=self._titleColor) + diff --git a/TermTk/TTkWidgets/widget.py b/TermTk/TTkWidgets/widget.py index f747151a..dd794d31 100644 --- a/TermTk/TTkWidgets/widget.py +++ b/TermTk/TTkWidgets/widget.py @@ -106,6 +106,7 @@ class TTkWidget: self.update(repaint=True, updateLayout=True) def addWidget(self, widget): + widget._parent = self if self._layout is not None: self._layout.addWidget(widget) self.update(repaint=True, updateLayout=True) diff --git a/docs/TODO.md b/docs/TODO.md index 2342bb8a..88a04972 100644 --- a/docs/TODO.md +++ b/docs/TODO.md @@ -43,6 +43,8 @@ ## Widgets - [ ] Add Size Policy (fixed minimum maximum expanding) - [x] Add Show/Hide +- [ ] Clean the way the parent is assigned, propagated + *Widget \[setParent, addWidget, . . ], GridLayout \[addWidget]* ### Layout - [ ] Add Weight in V and H Layout - [ ] Add addLayout method diff --git a/tests/test.ui.003.layout.py b/tests/test.ui.003.layout.py index a73f0ffc..d449cdc9 100755 --- a/tests/test.ui.003.layout.py +++ b/tests/test.ui.003.layout.py @@ -33,28 +33,30 @@ root = ttk.TTk() root.setLayout(ttk.TTkHBoxLayout()) ttk.TTkTestWidget(parent=root,border=True, maxWidth=52) -rightframe = ttk.TTkFrame(parent=root) +rightframe = ttk.TTkFrame(parent=root, border=True, title="V Box Layout", titleColor=ttk.TTkColor.BOLD+ttk.TTkColor.fg('#8888dd')) rightframe.setLayout(ttk.TTkVBoxLayout()) -gridFrame = ttk.TTkFrame(parent=rightframe, border=False) +gridFrame = ttk.TTkFrame(parent=rightframe, border=True, title="Grid Layout", titleColor=ttk.TTkColor.fg('#88dd88')) gridFrame.setLayout(ttk.TTkGridLayout()) ttk.TTkButton(parent=gridFrame, text="Button1") ttk.TTkButton(parent=gridFrame, text="Button2") gridFrame.layout().addWidget(ttk.TTkButton(text="Button (1,0)"),1,0) ttk.TTkButton(parent=gridFrame, text="Button4") +gridFrame.layout().addWidget(ttk.TTkButton(text="Button (0,3)"),0,3) gridFrame.layout().addWidget(ttk.TTkButton(text="Button (1,2)"),1,2) # Test (add a widget to the same parent with a different layout params than the default) gridFrame.layout().addWidget(ttk.TTkButton(parent=gridFrame, text="Button (2,1)"),2,1) gridFrame.layout().addWidget(ttk.TTkButton(text="Button (5,5)"),5,5) -gridFrame.layout().addWidget(ttk.TTkFrame(border=True),0,5) -gridFrame.layout().addWidget(ttk.TTkFrame(border=True),2,3) -gridFrame.layout().addWidget(ttk.TTkFrame(border=True),5,3) -gridFrame.layout().addWidget(ttk.TTkFrame(border=True),5,1) +gridFrame.layout().addWidget(ttk.TTkFrame(border=True,title="Frame1"),0,5) +gridFrame.layout().addWidget(ttk.TTkFrame(border=True,title="Frame2"),2,3) +gridFrame.layout().addWidget(ttk.TTkFrame(border=True,title="Frame3"),5,3) +gridFrame.layout().addWidget(ttk.TTkFrame(border=True,title="Frame4"),5,1) -centerrightframe=ttk.TTkFrame(parent=rightframe, border=True) + +centerrightframe=ttk.TTkFrame(parent=rightframe, border=True, title="H Box Layout", titleColor=ttk.TTkColor.fg('#dd88dd')) centerrightframe.setLayout(ttk.TTkHBoxLayout()) -ttk.TTkTestWidget(parent=rightframe, border=True) +ttk.TTkTestWidget(parent=rightframe, border=True, title="Test Widget", titleColor=ttk.TTkColor.fg('#dddddd')) smallframe = ttk.TTkFrame(parent=centerrightframe, border=True)