diff --git a/README.md b/README.md index 9a908ced..f03a289b 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ and inspired by a mix of [Qt5](https://www.riverbankcomputing.com/static/Docs/Py - Specialized widgets to improve the usability (Windows, Frames, Tables, ...) - QT Like Layout system to help arrange the widgets in the terminal - True color support -- Fullsize/Halfsize UTF-8 characters 😎 +- Ful/Half/Zero sized Unicode characters 😎 ## Limitations - The native **Windows** porting is not ready yet but it works with [Cygwin](https://www.cygwin.com) or **WSL**. diff --git a/TermTk/TTkGui/__init__.py b/TermTk/TTkGui/__init__.py index 549f27e6..8ba6988a 100644 --- a/TermTk/TTkGui/__init__.py +++ b/TermTk/TTkGui/__init__.py @@ -1,5 +1,5 @@ -from .drag import * -from .textwrap import TTkTextWrap +from .drag import TTkDrag, TTkDropEvent +from .textwrap1 import TTkTextWrap from .textcursor import TTkTextCursor from .textdocument import TTkTextDocument from .clipboard import TTkClipboard \ No newline at end of file diff --git a/TermTk/TTkGui/textwrap.py b/TermTk/TTkGui/textwrap1.py similarity index 100% rename from TermTk/TTkGui/textwrap.py rename to TermTk/TTkGui/textwrap1.py diff --git a/TermTk/TTkWidgets/tabwidget.py b/TermTk/TTkWidgets/tabwidget.py index 80cef680..19c2061a 100644 --- a/TermTk/TTkWidgets/tabwidget.py +++ b/TermTk/TTkWidgets/tabwidget.py @@ -61,7 +61,6 @@ class TTkTabButton(TTkButton): self._closable = kwargs.get('closable', False) self.closeClicked = pyTTkSignal() TTkButton.__init__(self, *args, **kwargs) - self._name = kwargs.get('name' , 'TTkTabButton' ) size = len(self.text) + 2 if self._closable: size += 3 @@ -128,7 +127,6 @@ class TTkTabButton(TTkButton): class _TTkTabMenuButton(TTkMenuButton): def __init__(self, *args, **kwargs): TTkMenuButton.__init__(self, *args, **kwargs) - self._name = kwargs.get('name' , '_TTkTabMenuButton') def paintEvent(self): if self._pressed: @@ -148,7 +146,6 @@ class _TTkTabScrollerButton(TTkButton): self._side = kwargs.get('side',TTkK.LEFT) self._sideEnd = self._side TTkButton.__init__(self, *args, **kwargs) - self._name = kwargs.get('name' , '_TTkTabScrollerButton' ) if self._border: self.resize(2, 3) self.setMinimumSize(2, 3) @@ -243,7 +240,6 @@ class TTkTabBar(TTkWidget): self._rightScroller.clicked.connect(self._andMoveToTheRight) TTkWidget.__init__(self, *args, **kwargs) - self._name = kwargs.get('name' , '_TTkTabs') self.setFocusPolicy(TTkK.ClickFocus + TTkK.TabFocus) self.focusChanged.connect(self._focusChanged) @@ -482,7 +478,6 @@ class TTkTabWidget(TTkFrame): self._borderColor = TTkCfg.theme.tabBorderColor TTkFrame.__init__(self, *args, **kwargs) - self._name = kwargs.get('name' , 'TTkTabWidget') self._tabBar = TTkTabBar(small = not self.border(), closable=kwargs.get('closable', False)) self._topLeftLayout = None diff --git a/TermTk/TTkWidgets/texedit.py b/TermTk/TTkWidgets/texedit.py index 505d8e74..c179cfd6 100644 --- a/TermTk/TTkWidgets/texedit.py +++ b/TermTk/TTkWidgets/texedit.py @@ -32,7 +32,7 @@ from TermTk.TTkCore.string import TTkString from TermTk.TTkCore.signal import pyTTkSignal, pyTTkSlot from TermTk.TTkCore.helper import TTkHelper from TermTk.TTkGui.clipboard import TTkClipboard -from TermTk.TTkGui.textwrap import TTkTextWrap +from TermTk.TTkGui.textwrap1 import TTkTextWrap from TermTk.TTkGui.textcursor import TTkTextCursor from TermTk.TTkGui.textdocument import TTkTextDocument from TermTk.TTkLayouts.gridlayout import TTkGridLayout diff --git a/tests/test.generic.001.py b/tests/test.generic.001.py new file mode 100644 index 00000000..c96dfb8e --- /dev/null +++ b/tests/test.generic.001.py @@ -0,0 +1,35 @@ +#!/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. + +def func1(*args, **kwargs): + print(f"{args=} {kwargs=}") + +def func2(a=0,b=0,c=0,d=0, *args, **kwargs): + print(f"{a=} {b=} {c=} {d=} {args=} {kwargs=}") + +func1(1,2,3,4,aa=5,bb=6) +func2(1,2,3,4,aa=5,bb=6) +func2(1,2,aa=5,bb=6) +func2(c=1,d=2,aa=5,bb=6) +func2(1,2,3,4,5,6,7,8,9,aa=5,bb=6) diff --git a/tests/timeit/07.null.comparison.py b/tests/timeit/07.null.comparison.py new file mode 100644 index 00000000..9c277671 --- /dev/null +++ b/tests/timeit/07.null.comparison.py @@ -0,0 +1,75 @@ +#!/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 timeit + +a = 0 +b = 1 +c = None + +def test1(x): + if x: return 0 + else: return 1 +def test2(x): + if not x: return 10 + else: return 11 +def test3(x): + if x is None: return 110 + else: return 111 +def test4(x): + if x is not None: return 1110 + else: return 1111 + + + + +loop = 1000000 + +result = timeit.timeit('test1(a)', globals=globals(), number=loop) +print(f"1a {result / loop:.10f} - {result / loop} {test1(a)}") +result = timeit.timeit('test2(a)', globals=globals(), number=loop) +print(f"2a {result / loop:.10f} - {result / loop} {test2(a)}") +result = timeit.timeit('test3(a)', globals=globals(), number=loop) +print(f"3a {result / loop:.10f} - {result / loop} {test3(a)}") +result = timeit.timeit('test4(a)', globals=globals(), number=loop) +print(f"4a {result / loop:.10f} - {result / loop} {test4(a)}") + +result = timeit.timeit('test1(b)', globals=globals(), number=loop) +print(f"1b {result / loop:.10f} - {result / loop} {test1(b)}") +result = timeit.timeit('test2(b)', globals=globals(), number=loop) +print(f"2b {result / loop:.10f} - {result / loop} {test2(b)}") +result = timeit.timeit('test3(b)', globals=globals(), number=loop) +print(f"3b {result / loop:.10f} - {result / loop} {test3(b)}") +result = timeit.timeit('test4(b)', globals=globals(), number=loop) +print(f"4b {result / loop:.10f} - {result / loop} {test4(b)}") + +result = timeit.timeit('test1(c)', globals=globals(), number=loop) +print(f"1c {result / loop:.10f} - {result / loop} {test1(c)}") +result = timeit.timeit('test2(c)', globals=globals(), number=loop) +print(f"2c {result / loop:.10f} - {result / loop} {test2(c)}") +result = timeit.timeit('test3(c)', globals=globals(), number=loop) +print(f"3c {result / loop:.10f} - {result / loop} {test3(c)}") +result = timeit.timeit('test4(c)', globals=globals(), number=loop) +print(f"4c {result / loop:.10f} - {result / loop} {test4(c)}") + diff --git a/tests/timeit/08.properties.setter.getter.py b/tests/timeit/08.properties.setter.getter.py new file mode 100644 index 00000000..0a6233db --- /dev/null +++ b/tests/timeit/08.properties.setter.getter.py @@ -0,0 +1,104 @@ +#!/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 timeit + +class A(): + __slots__ = ('_value') + def __init__(self): + self._value = 123 + @property + def value(self):return self._value + @value.setter + def value(self, value): self._value = value + +class B(): + __slots__ = ('_value') + def __init__(self): + self._value = 123 + + def value(self): + return self._value + + def setValue(self, value): + self._value = value + +a = A() +b = B() + +def test1(x): + ret = 0 + for v in range(10,100): + a.value = v + ret += a.value + return ret + +def test2(x): + ret = 0 + for v in range(10,100): + b.setValue(v) + ret += b.value() + return ret + +def test3(x): + ret = 0 + for v in range(10,100): + a.value = v + return ret + +def test4(x): + ret = 0 + for v in range(10,100): + b.setValue(v) + return ret + +def test5(x): + ret = 0 + for v in range(10,100): + ret += a.value + return ret + +def test6(x): + ret = 0 + for v in range(10,100): + ret += b.value() + return ret + + +loop = 10000 + +result = timeit.timeit('test1(a)', globals=globals(), number=loop) +print(f"1a {result / loop:.10f} - {result / loop} {test1(a)}") +result = timeit.timeit('test2(a)', globals=globals(), number=loop) +print(f"2a {result / loop:.10f} - {result / loop} {test2(a)}") +result = timeit.timeit('test3(a)', globals=globals(), number=loop) +print(f"3a {result / loop:.10f} - {result / loop} {test3(a)}") +result = timeit.timeit('test4(a)', globals=globals(), number=loop) +print(f"4a {result / loop:.10f} - {result / loop} {test4(a)}") +result = timeit.timeit('test5(a)', globals=globals(), number=loop) +print(f"5a {result / loop:.10f} - {result / loop} {test5(a)}") +result = timeit.timeit('test6(a)', globals=globals(), number=loop) +print(f"6a {result / loop:.10f} - {result / loop} {test6(a)}") + + diff --git a/tests/utf-8/test.txt b/tests/utf-8/test.txt new file mode 100644 index 00000000..9265be33 --- /dev/null +++ b/tests/utf-8/test.txt @@ -0,0 +1,36 @@ + + 🭇🬼 + 🭃🭌🬿 + 🭥🭒█🭏🬼 + 🭋🭍🭑🬽🭢🭕█🭌🬿 + 🭅███🭀 🭥🭒█🭏🬼 +🭋████🭐 🭢🭕█🭌🬿 +🭅██🭞🭜🭘 🭈🭆🭂███🭏🬼 +🭣🭧🭚 🭈🭆🭂██████🭠🭗 + 🭥🭒██🭝🭚 + 🭢🭕🭠🭗 + +🬼 🭇 🭗 🭢 +🬽 🭈 🭘 🭣 +🬾 🭉 🭙 🭤 +🬿 🭊 🭚 🭥 +🭀 🭋 🭛 🭦 +🭌 🭁 🭝 🭒 +🭍 🭂 🭞 🭓 +🭎 🭃 🭟 🭔 +🭏 🭄 🭠 🭕 +🭐 🭅 🭡 🭖 +🭑 🭆 🭜 🭧 + + + + + + + + + + + + +