From 5492e1e748f298727c5f86d8a93088610243e3ea Mon Sep 17 00:00:00 2001 From: Pier CeccoPierangioliEugenio Date: Mon, 10 Nov 2025 08:53:43 +0000 Subject: [PATCH 1/2] feat(table): add support for time,date,datetime (#522) --- demo/showcase/table.py | 33 ++- .../TermTk/TTkAbstract/abstracttablemodel.py | 4 +- .../TTkModelView/table_edit_proxy.py | 275 ++++++++++++++++-- .../TermTk/TTkWidgets/datetime_datetime.py | 3 + 4 files changed, 296 insertions(+), 19 deletions(-) diff --git a/demo/showcase/table.py b/demo/showcase/table.py index 564bdbb3..cb32e6ec 100755 --- a/demo/showcase/table.py +++ b/demo/showcase/table.py @@ -23,6 +23,8 @@ # SOFTWARE. import sys, os, argparse +import datetime +import random sys.path.append(os.path.join(sys.path[0],'../../libs/pyTermTk')) import TermTk as ttk @@ -30,11 +32,40 @@ import TermTk as ttk sys.path.append(os.path.join(sys.path[0],'..')) from showcase._showcasehelper import getUtfWord +# Random date between two dates +def random_date(start_date, end_date): + time_between = end_date - start_date + days_between = time_between.days + random_days = random.randrange(days_between) + return start_date + datetime.timedelta(days=random_days) + +# Random time +def random_time(): + hour = random.randint(0, 23) + minute = random.randint(0, 59) + second = random.randint(0, 59) + return datetime.time(hour, minute, second) + +# Random datetime +def random_datetime(start_datetime, end_datetime): + time_between = end_datetime - start_datetime + total_seconds = int(time_between.total_seconds()) + random_seconds = random.randrange(total_seconds) + return start_datetime + datetime.timedelta(seconds=random_seconds) + def demoTTkTable(root= None): # Basic Table Demo # Setup a model using a 2d list of random values - dataList = [[f"0x{i:04X}"] + [int(i*100),float(i*100),ttk.TTkString(getUtfWord(),ttk.TTkColor.YELLOW)] + [getUtfWord() for _ in range(10)] for i in range(101)] + dataList = [ + [f"0x{i:04X}"] + + [int(i*100), float(i*100), ttk.TTkString(getUtfWord(),ttk.TTkColor.YELLOW)] + + [random_time()] + + [random_date(datetime.date(2020,1,1), datetime.date(2025,12,31))] + + [random_datetime(datetime.datetime(2020,1,1), datetime.datetime(2025,12,31))] + + [getUtfWord() for _ in range(10)] + for i in range(101) + ] tableModel = ttk.TTkTableModelList(data=dataList) # Init the table with the model defilned diff --git a/libs/pyTermTk/TermTk/TTkAbstract/abstracttablemodel.py b/libs/pyTermTk/TermTk/TTkAbstract/abstracttablemodel.py index 8235093b..e4610d07 100644 --- a/libs/pyTermTk/TermTk/TTkAbstract/abstracttablemodel.py +++ b/libs/pyTermTk/TermTk/TTkAbstract/abstracttablemodel.py @@ -24,6 +24,8 @@ __all__ = ['TTkAbstractTableModel','TTkModelIndex'] from typing import Tuple,Any +import datetime + from TermTk.TTkCore.constant import TTkK from TermTk.TTkCore.string import TTkString from TermTk.TTkCore.signal import pyTTkSignal, pyTTkSlot @@ -288,7 +290,7 @@ class TTkAbstractTableModel(): ''' data = self.data(row,col) retData = TTkAbstractTableModel._dataToTTkString(data) - if isinstance(data, (int,float)): + if isinstance(data, (int,float,datetime.time, datetime.date, datetime.datetime)): return retData, TTkK.Alignment.RIGHT_ALIGN return retData, TTkK.Alignment.LEFT_ALIGN diff --git a/libs/pyTermTk/TermTk/TTkWidgets/TTkModelView/table_edit_proxy.py b/libs/pyTermTk/TermTk/TTkWidgets/TTkModelView/table_edit_proxy.py index 1e6a6941..850c9e08 100644 --- a/libs/pyTermTk/TermTk/TTkWidgets/TTkModelView/table_edit_proxy.py +++ b/libs/pyTermTk/TermTk/TTkWidgets/TTkModelView/table_edit_proxy.py @@ -24,9 +24,11 @@ from __future__ import annotations __all__ = ['TTkTableProxyEdit', 'TTkTableEditLeaving', 'TTkTableProxyEditWidget'] + +import datetime from dataclasses import dataclass from enum import Enum, auto -from typing import Union, Tuple, Type, List, Optional, Any +from typing import Union, Tuple, Type, List, Optional, Any, Callable from TermTk.TTkCore.constant import TTkK from TermTk.TTkCore.string import TTkString, TTkStringType @@ -36,6 +38,9 @@ from TermTk.TTkCore.TTkTerm.inputkey import TTkKeyEvent from TermTk.TTkWidgets.widget import TTkWidget from TermTk.TTkWidgets.texedit import TTkTextEdit, TTkTextEditView from TermTk.TTkWidgets.spinbox import TTkSpinBox +from TermTk.TTkWidgets.datetime_time import TTkTime +from TermTk.TTkWidgets.datetime_date import TTkDate +from TermTk.TTkWidgets.datetime_datetime import TTkDateTime from TermTk.TTkWidgets.TTkPickers.textpicker import TTkTextPicker class TTkTableEditLeaving(Enum): @@ -91,7 +96,7 @@ class TTkTableProxyEditWidget(TTkWidget): :param data: The initial data value for the editor :type data: object :return: A new editor widget instance - :rtype: TTkTableProxyEditWidget + :rtype: :py:class:`TTkTableProxyEditWidget` :raises NotImplementedError: Must be implemented by subclasses ''' raise NotImplementedError() @@ -138,9 +143,6 @@ class _TextEditViewProxy(TTkTextEditView, TTkTableProxyEditWidget): def __init__(self, **kwargs): ''' Initialize the text edit view proxy - - :param kwargs: Additional keyword arguments passed to parent - :type kwargs: dict ''' self.leavingTriggered = pyTTkSignal(TTkTableEditLeaving) self.dataChanged = pyTTkSignal(object) @@ -222,9 +224,6 @@ class _TextEditProxy(TTkTextEdit, TTkTableProxyEditWidget): def __init__(self, **kwargs): ''' Initialize the text edit proxy - - :param kwargs: Additional keyword arguments passed to parent - :type kwargs: dict ''' self.leavingTriggered = pyTTkSignal(TTkTableEditLeaving) self.dataChanged = pyTTkSignal(object) @@ -240,7 +239,7 @@ class _TextEditProxy(TTkTextEdit, TTkTableProxyEditWidget): :param data: The initial text value :type data: Union[str, TTkString] :return: A new text editor instance - :rtype: TTkTableProxyEditWidget + :rtype: :py:class:`TTkTableProxyEditWidget` :raises ValueError: If data is not a string or TTkString ''' if not isinstance(data, (TTkString, str)): @@ -285,9 +284,6 @@ class _SpinBoxProxy(TTkSpinBox, TTkTableProxyEditWidget): def __init__(self, **kwargs): ''' Initialize the spin box proxy - - :param kwargs: Additional keyword arguments passed to parent - :type kwargs: dict ''' self.leavingTriggered = pyTTkSignal(TTkTableEditLeaving) self.dataChanged = pyTTkSignal(object) @@ -301,7 +297,7 @@ class _SpinBoxProxy(TTkSpinBox, TTkTableProxyEditWidget): :param data: The initial numeric value :type data: Union[int, float] :return: A new spin box instance - :rtype: TTkTableProxyEditWidget + :rtype: :py:class:`TTkTableProxyEditWidget` :raises ValueError: If data is not an int or float ''' if not isinstance(data, (int, float)): @@ -336,6 +332,249 @@ class _SpinBoxProxy(TTkSpinBox, TTkTableProxyEditWidget): return super().keyEvent(evt) +class _DateTime_KeyGeneric(): + ''' Mixin class for datetime widget keyboard navigation + + Provides common keyboard event handling for datetime-based editors, + including arrow key navigation and Enter key handling. + ''' + + leavingTriggered: pyTTkSignal + dataChanged: pyTTkSignal + + def newKeyEvent(self, evt: TTkKeyEvent, cb:Callable[[TTkKeyEvent],bool]) -> bool: + ''' Handle keyboard events with custom callback and navigation + + :param evt: The keyboard event + :type evt: TTkKeyEvent + :param cb: Callback function for additional key handling + :type cb: Callable[[TTkKeyEvent], bool] + :return: True if event was handled, False otherwise + :rtype: bool + ''' + if (evt.type == TTkK.SpecialKey): + if evt.mod == TTkK.NoModifier: + if evt.key == TTkK.Key_Enter: + self.leavingTriggered.emit(TTkTableEditLeaving.RIGHT) + return True + if cb(evt): + return True + if (evt.type == TTkK.SpecialKey): + if evt.mod == TTkK.NoModifier: + if evt.key == TTkK.Key_Up: + self.leavingTriggered.emit(TTkTableEditLeaving.TOP) + return True + elif evt.key == TTkK.Key_Down: + self.leavingTriggered.emit(TTkTableEditLeaving.BOTTOM) + return True + elif evt.key == TTkK.Key_Left: + self.leavingTriggered.emit(TTkTableEditLeaving.LEFT) + return True + elif evt.key == TTkK.Key_Right: + self.leavingTriggered.emit(TTkTableEditLeaving.RIGHT) + return True + return False + +class _DateTime_TimeProxy(TTkTime, TTkTableProxyEditWidget, _DateTime_KeyGeneric): + ''' Time editor for table cells + + Extends :py:class:`TTkTime` with table-specific signals + for navigation and data change notification. + ''' + __slots__ = ('leavingTriggered', 'dataChanged') + + leavingTriggered: pyTTkSignal + ''' + This signal is emitted when the user navigates out of the editor + + :param direction: The direction of navigation + :type direction: TTkTableEditLeaving + ''' + + dataChanged: pyTTkSignal + ''' + This signal is emitted when the time value changes + + :param data: The new time value + :type data: datetime.time + ''' + + def __init__(self, **kwargs): + ''' Initialize the time editor proxy + ''' + self.leavingTriggered = pyTTkSignal(TTkTableEditLeaving) + self.dataChanged = pyTTkSignal(object) + super().__init__(**kwargs) + self.timeChanged.connect(self.dataChanged.emit) + + @staticmethod + def editWidgetFactory(data: Any) -> TTkTableProxyEditWidget: + ''' Factory method to create a time editor from time data + + :param data: The initial time value + :type data: datetime.time + :return: A new time editor instance + :rtype: :py:class:`TTkTableProxyEditWidget` + :raises ValueError: If data is not a datetime.time + ''' + if not isinstance(data, datetime.time): + raise ValueError(f"{data} is not a int or float") + tp = _DateTime_TimeProxy(time=data) + return tp + + def getCellData(self) -> datetime.time: + ''' Get the current time value from the editor + + :return: The current time + :rtype: datetime.time + ''' + return self.time() + + def keyEvent(self, evt: TTkKeyEvent) -> bool: + ''' Handle keyboard events for navigation + + :param evt: The keyboard event + :type evt: TTkKeyEvent + :return: True if event was handled, False otherwise + :rtype: bool + ''' + return self.newKeyEvent(evt,super().keyEvent) + + +class _DateTime_DateProxy(TTkDate, TTkTableProxyEditWidget, _DateTime_KeyGeneric): + ''' Date editor for table cells + + Extends :py:class:`TTkDate` with table-specific signals + for navigation and data change notification. + ''' + __slots__ = ('leavingTriggered', 'dataChanged') + + leavingTriggered: pyTTkSignal + ''' + This signal is emitted when the user navigates out of the editor + + :param direction: The direction of navigation + :type direction: TTkTableEditLeaving + ''' + + dataChanged: pyTTkSignal + ''' + This signal is emitted when the date value changes + + :param data: The new date value + :type data: datetime.date + ''' + + def __init__(self, **kwargs): + ''' Initialize the date editor proxy + ''' + self.leavingTriggered = pyTTkSignal(TTkTableEditLeaving) + self.dataChanged = pyTTkSignal(object) + super().__init__(**kwargs) + self.dataChanged.connect(self.dataChanged.emit) + + @staticmethod + def editWidgetFactory(data: Any) -> TTkTableProxyEditWidget: + ''' Factory method to create a date editor from date data + + :param data: The initial date value + :type data: datetime.date + :return: A new date editor instance + :rtype: :py:class:`TTkTableProxyEditWidget` + :raises ValueError: If data is not a datetime.date + ''' + if not isinstance(data, datetime.date): + raise ValueError(f"{data} is not a int or float") + dp = _DateTime_DateProxy(date=data) + return dp + + def getCellData(self) -> datetime.date: + ''' Get the current date value from the editor + + :return: The current date + :rtype: datetime.date + ''' + return self.date() + + def keyEvent(self, evt: TTkKeyEvent) -> bool: + ''' Handle keyboard events for navigation + + :param evt: The keyboard event + :type evt: TTkKeyEvent + :return: True if event was handled, False otherwise + :rtype: bool + ''' + return self.newKeyEvent(evt,super().keyEvent) + + +class _DateTime_DateTimeProxy(TTkDateTime, TTkTableProxyEditWidget): + ''' DateTime editor for table cells + + Extends :py:class:`TTkDateTime` with table-specific signals + for navigation and data change notification. + ''' + __slots__ = ('leavingTriggered', 'dataChanged') + + leavingTriggered: pyTTkSignal + ''' + This signal is emitted when the user navigates out of the editor + + :param direction: The direction of navigation + :type direction: TTkTableEditLeaving + ''' + + dataChanged: pyTTkSignal + ''' + This signal is emitted when the datetime value changes + + :param data: The new datetime value + :type data: datetime.datetime + ''' + + def __init__(self, **kwargs): + ''' Initialize the datetime editor proxy + ''' + self.leavingTriggered = pyTTkSignal(TTkTableEditLeaving) + self.dataChanged = pyTTkSignal(object) + super().__init__(**kwargs) + self.datetimeChanged.connect(self.dataChanged.emit) + + @staticmethod + def editWidgetFactory(data: Any) -> TTkTableProxyEditWidget: + ''' Factory method to create a datetime editor from datetime data + + :param data: The initial datetime value + :type data: datetime.datetime + :return: A new datetime editor instance + :rtype: :py:class:`TTkTableProxyEditWidget` + :raises ValueError: If data is not a datetime.datetime + ''' + if not isinstance(data, datetime.datetime): + raise ValueError(f"{data} is not a int or float") + dtp = _DateTime_DateTimeProxy(datetime=data) + return dtp + + def getCellData(self) -> datetime.datetime: + ''' Get the current datetime value from the editor + + :return: The current datetime + :rtype: datetime.datetime + ''' + return self.datetime() + + def keyEvent(self, evt: TTkKeyEvent) -> bool: + ''' Handle keyboard events for navigation + + Always triggers right navigation on any key event. + + :param evt: The keyboard event + :type evt: TTkKeyEvent + :return: Always returns True + :rtype: bool + ''' + self.leavingTriggered.emit(TTkTableEditLeaving.RIGHT) + return True + class _TextPickerProxy(TTkTextPicker, TTkTableProxyEditWidget): ''' Rich text editor for table cells @@ -362,9 +601,6 @@ class _TextPickerProxy(TTkTextPicker, TTkTableProxyEditWidget): def __init__(self, **kwargs): ''' Initialize the text picker proxy - - :param kwargs: Additional keyword arguments passed to parent - :type kwargs: dict ''' self.leavingTriggered = pyTTkSignal(TTkTableEditLeaving) self.dataChanged = pyTTkSignal(object) @@ -384,7 +620,7 @@ class _TextPickerProxy(TTkTextPicker, TTkTableProxyEditWidget): :param data: The initial text value :type data: Union[str, TTkString] :return: A new text picker instance - :rtype: TTkTableProxyEditWidget + :rtype: :py:class:`TTkTableProxyEditWidget` :raises ValueError: If data is not a string or TTkString ''' if not isinstance(data, (TTkString, str)): @@ -463,6 +699,11 @@ class TTkTableProxyEdit(): TTkProxyEditDef(class_def=_TextEditProxy, types=(str, TTkString)), TTkProxyEditDef(class_def=_TextEditProxy, types=(str,), rich=True), TTkProxyEditDef(class_def=_TextPickerProxy, types=(TTkString,), rich=True), + # Datetime go first because + # datetime is instance of date as well + TTkProxyEditDef(class_def=_DateTime_DateTimeProxy, types=(datetime.datetime)), + TTkProxyEditDef(class_def=_DateTime_TimeProxy, types=(datetime.time)), + TTkProxyEditDef(class_def=_DateTime_DateProxy, types=(datetime.date)), ] def getProxyWidget(self, data, rich: bool = False) -> Optional[TTkTableProxyEditWidget]: diff --git a/libs/pyTermTk/TermTk/TTkWidgets/datetime_datetime.py b/libs/pyTermTk/TermTk/TTkWidgets/datetime_datetime.py index 5acbcc9a..9d161edc 100644 --- a/libs/pyTermTk/TermTk/TTkWidgets/datetime_datetime.py +++ b/libs/pyTermTk/TermTk/TTkWidgets/datetime_datetime.py @@ -95,6 +95,9 @@ class TTkDateTime(TTkContainer): self._dateWidget.dateChanged.connect(self._somethingChanged) self._timeWidget.timeChanged.connect(self._somethingChanged) + def setFocus(self) -> None: + return self._dateWidget.setFocus() + @pyTTkSlot() def _somethingChanged(self) -> None: ''' From cf48cfdfdbc1e30ce56eec9f3bd70b7b54c79e61 Mon Sep 17 00:00:00 2001 From: Pier CeccoPierangioliEugenio Date: Mon, 10 Nov 2025 09:28:20 +0000 Subject: [PATCH 2/2] chore: release main (#480) Co-authored-by: Eugenio Parodi - Action --- .release-please-manifest.json | 6 ++-- CHANGELOG.md | 32 ++++++++++++++++++++ apps/dumbPaintTool/CHANGELOG.md | 7 +++++ apps/dumbPaintTool/dumbPaintTool/__init__.py | 2 +- apps/dumbPaintTool/pyproject.toml | 2 +- apps/ttkDesigner/CHANGELOG.md | 7 +++++ apps/ttkDesigner/pyproject.toml | 2 +- apps/ttkDesigner/ttkDesigner/__init__.py | 2 +- libs/pyTermTk/CHANGELOG.md | 32 ++++++++++++++++++++ libs/pyTermTk/TermTk/__init__.py | 2 +- 10 files changed, 86 insertions(+), 8 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 9d3bba05..8b2129be 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,7 +1,7 @@ { - "libs/pyTermTk": "0.47.2-a.0", + "libs/pyTermTk": "0.48.0-a.0", "apps/ttkode": "0.5.3-a.2", "apps/tlogg": "0.7.1-a.0", - "apps/ttkDesigner": "0.41.4-a.54", - "apps/dumbPaintTool": "0.41.9-a.54" + "apps/ttkDesigner": "0.41.5-a.54", + "apps/dumbPaintTool": "0.41.10-a.54" } diff --git a/CHANGELOG.md b/CHANGELOG.md index b9592e1e..6210e037 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,37 @@ # Changelog +## [0.48.0-a.0](https://github.com/ceccopierangiolieugenio/pyTermTk/compare/pyTermTk-v0.47.2-a.0...pyTermTk-v0.48.0-a.0) (2025-11-10) + + +### Fixes + +* **menu:** don't prevent setting the text color of an item ([#513](https://github.com/ceccopierangiolieugenio/pyTermTk/issues/513)) ([370684e](https://github.com/ceccopierangiolieugenio/pyTermTk/commit/370684ebc68b95665c60a08ce2e47b1313fd19e9)) +* **textcursor:** correct number of Up/Down movements ([#512](https://github.com/ceccopierangiolieugenio/pyTermTk/issues/512)) ([6410b77](https://github.com/ceccopierangiolieugenio/pyTermTk/commit/6410b77f51d34ee251508f5856273af0e894cbcf)) +* **textedit:** trigger update when wrap size change ([#508](https://github.com/ceccopierangiolieugenio/pyTermTk/issues/508)) ([6b1d58e](https://github.com/ceccopierangiolieugenio/pyTermTk/commit/6b1d58e6e1aa377c9a9a8dc1fd1c9e59c8611c4e)) + + +### Features + +* add Date and Time widgets ([#501](https://github.com/ceccopierangiolieugenio/pyTermTk/issues/501)) ([bdfc130](https://github.com/ceccopierangiolieugenio/pyTermTk/commit/bdfc130f877435194650c476146fca67c33e5bc6)) +* **table:** add edit proxy widget to allow a common extensible interface for the cell editing ([#517](https://github.com/ceccopierangiolieugenio/pyTermTk/issues/517)) ([9331c03](https://github.com/ceccopierangiolieugenio/pyTermTk/commit/9331c036892e8cb81154e5d06e1d30f02110d7fe)) +* **table:** add support for time,date,datetime ([#522](https://github.com/ceccopierangiolieugenio/pyTermTk/issues/522)) ([5492e1e](https://github.com/ceccopierangiolieugenio/pyTermTk/commit/5492e1e748f298727c5f86d8a93088610243e3ea)) +* **textcursor:** Move to the start of the document ([#500](https://github.com/ceccopierangiolieugenio/pyTermTk/issues/500)) ([70ddd9a](https://github.com/ceccopierangiolieugenio/pyTermTk/commit/70ddd9a1bce201c61cbf2ea063a8a28d89372f10)) +* **theme:** implement UTF-8 checkbox and radiobox ([#514](https://github.com/ceccopierangiolieugenio/pyTermTk/issues/514)) ([a02f62c](https://github.com/ceccopierangiolieugenio/pyTermTk/commit/a02f62c7060bab9c8812f1a80e03fcd316e0d23b)) +* **TTkTerminal:** add getBuffer ([#496](https://github.com/ceccopierangiolieugenio/pyTermTk/issues/496)) ([997d0f6](https://github.com/ceccopierangiolieugenio/pyTermTk/commit/997d0f6d7278ba6e09777bbfdd45ba8e359d33ef)) + + +### Chores + +* fix typo in terminal screen ([b262f80](https://github.com/ceccopierangiolieugenio/pyTermTk/commit/b262f80d871e986fa9f8d4c86c80144e371b66cf)) +* improve the error handling and the quit routine ([#494](https://github.com/ceccopierangiolieugenio/pyTermTk/issues/494)) ([d644604](https://github.com/ceccopierangiolieugenio/pyTermTk/commit/d644604e377cd15ae420fa3e05758eff84922270)) +* improve typing ([#504](https://github.com/ceccopierangiolieugenio/pyTermTk/issues/504)) ([cae23b1](https://github.com/ceccopierangiolieugenio/pyTermTk/commit/cae23b16bc6cd7e064c72eb0b0a6503bf19fad11)) +* use TextIOBase for the stderr handler ([#499](https://github.com/ceccopierangiolieugenio/pyTermTk/issues/499)) ([26b127f](https://github.com/ceccopierangiolieugenio/pyTermTk/commit/26b127fe4cfcdd6c13d63b639013884f96a69e49)) + + +### Refactors + +* None checks anti patterns ([e744d97](https://github.com/ceccopierangiolieugenio/pyTermTk/commit/e744d97d01e4644eccb9f9ac7bd3f5549eefb3b8)) + ## [0.47.2-a.0](https://github.com/ceccopierangiolieugenio/pyTermTk/compare/pyTermTk-v0.47.1-a.0...pyTermTk-v0.47.2-a.0) (2025-10-13) diff --git a/apps/dumbPaintTool/CHANGELOG.md b/apps/dumbPaintTool/CHANGELOG.md index 9f7147a9..b3d459a1 100644 --- a/apps/dumbPaintTool/CHANGELOG.md +++ b/apps/dumbPaintTool/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [0.41.10-a.54](https://github.com/ceccopierangiolieugenio/pyTermTk/compare/theDumbPaintTool-v0.41.9-a.54...theDumbPaintTool-v0.41.10-a.54) (2025-11-10) + + +### Refactors + +* None checks anti patterns ([e744d97](https://github.com/ceccopierangiolieugenio/pyTermTk/commit/e744d97d01e4644eccb9f9ac7bd3f5549eefb3b8)) + ## [0.41.9-a.54](https://github.com/ceccopierangiolieugenio/pyTermTk/compare/theDumbPaintTool-v0.41.8-a.54...theDumbPaintTool-v0.41.9-a.54) (2025-04-04) diff --git a/apps/dumbPaintTool/dumbPaintTool/__init__.py b/apps/dumbPaintTool/dumbPaintTool/__init__.py index c1d29fbe..1e2c273b 100755 --- a/apps/dumbPaintTool/dumbPaintTool/__init__.py +++ b/apps/dumbPaintTool/dumbPaintTool/__init__.py @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -__version__:str = '0.41.8-a.54' +__version__:str = '0.41.10-a.54' from .app import main diff --git a/apps/dumbPaintTool/pyproject.toml b/apps/dumbPaintTool/pyproject.toml index 7bde9556..64208670 100644 --- a/apps/dumbPaintTool/pyproject.toml +++ b/apps/dumbPaintTool/pyproject.toml @@ -12,7 +12,7 @@ authors = [ ] requires-python = ">=3.9" dependencies = [ - 'pyTermTk>=0.41.18-a.0', + 'pyTermTk>=0.48.0-a.0', 'pyperclip', 'Pillow', ] diff --git a/apps/ttkDesigner/CHANGELOG.md b/apps/ttkDesigner/CHANGELOG.md index be495b9f..d12b749b 100644 --- a/apps/ttkDesigner/CHANGELOG.md +++ b/apps/ttkDesigner/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [0.41.5-a.54](https://github.com/ceccopierangiolieugenio/pyTermTk/compare/ttkDesigner-v0.41.4-a.54...ttkDesigner-v0.41.5-a.54) (2025-11-10) + + +### Refactors + +* None checks anti patterns ([e744d97](https://github.com/ceccopierangiolieugenio/pyTermTk/commit/e744d97d01e4644eccb9f9ac7bd3f5549eefb3b8)) + ## [0.41.4-a.54](https://github.com/ceccopierangiolieugenio/pyTermTk/compare/ttkDesigner-v0.41.3-a.54...ttkDesigner-v0.41.4-a.54) (2025-04-03) diff --git a/apps/ttkDesigner/pyproject.toml b/apps/ttkDesigner/pyproject.toml index c46d6eb9..40bb21b4 100644 --- a/apps/ttkDesigner/pyproject.toml +++ b/apps/ttkDesigner/pyproject.toml @@ -29,7 +29,7 @@ classifiers = [ "Topic :: Software Development :: Libraries :: Application Frameworks", ] dependencies = [ - 'pyTermTk>=0.41.17-a.0', + 'pyTermTk>=0.48.0-a.0', 'pyperclip', 'Pillow', ] diff --git a/apps/ttkDesigner/ttkDesigner/__init__.py b/apps/ttkDesigner/ttkDesigner/__init__.py index c9bb6d68..b3aa33f4 100755 --- a/apps/ttkDesigner/ttkDesigner/__init__.py +++ b/apps/ttkDesigner/ttkDesigner/__init__.py @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -__version__:str = '0.41.4-a.54' +__version__:str = '0.41.5-a.54' from .app import * diff --git a/libs/pyTermTk/CHANGELOG.md b/libs/pyTermTk/CHANGELOG.md index b9592e1e..6210e037 100644 --- a/libs/pyTermTk/CHANGELOG.md +++ b/libs/pyTermTk/CHANGELOG.md @@ -1,5 +1,37 @@ # Changelog +## [0.48.0-a.0](https://github.com/ceccopierangiolieugenio/pyTermTk/compare/pyTermTk-v0.47.2-a.0...pyTermTk-v0.48.0-a.0) (2025-11-10) + + +### Fixes + +* **menu:** don't prevent setting the text color of an item ([#513](https://github.com/ceccopierangiolieugenio/pyTermTk/issues/513)) ([370684e](https://github.com/ceccopierangiolieugenio/pyTermTk/commit/370684ebc68b95665c60a08ce2e47b1313fd19e9)) +* **textcursor:** correct number of Up/Down movements ([#512](https://github.com/ceccopierangiolieugenio/pyTermTk/issues/512)) ([6410b77](https://github.com/ceccopierangiolieugenio/pyTermTk/commit/6410b77f51d34ee251508f5856273af0e894cbcf)) +* **textedit:** trigger update when wrap size change ([#508](https://github.com/ceccopierangiolieugenio/pyTermTk/issues/508)) ([6b1d58e](https://github.com/ceccopierangiolieugenio/pyTermTk/commit/6b1d58e6e1aa377c9a9a8dc1fd1c9e59c8611c4e)) + + +### Features + +* add Date and Time widgets ([#501](https://github.com/ceccopierangiolieugenio/pyTermTk/issues/501)) ([bdfc130](https://github.com/ceccopierangiolieugenio/pyTermTk/commit/bdfc130f877435194650c476146fca67c33e5bc6)) +* **table:** add edit proxy widget to allow a common extensible interface for the cell editing ([#517](https://github.com/ceccopierangiolieugenio/pyTermTk/issues/517)) ([9331c03](https://github.com/ceccopierangiolieugenio/pyTermTk/commit/9331c036892e8cb81154e5d06e1d30f02110d7fe)) +* **table:** add support for time,date,datetime ([#522](https://github.com/ceccopierangiolieugenio/pyTermTk/issues/522)) ([5492e1e](https://github.com/ceccopierangiolieugenio/pyTermTk/commit/5492e1e748f298727c5f86d8a93088610243e3ea)) +* **textcursor:** Move to the start of the document ([#500](https://github.com/ceccopierangiolieugenio/pyTermTk/issues/500)) ([70ddd9a](https://github.com/ceccopierangiolieugenio/pyTermTk/commit/70ddd9a1bce201c61cbf2ea063a8a28d89372f10)) +* **theme:** implement UTF-8 checkbox and radiobox ([#514](https://github.com/ceccopierangiolieugenio/pyTermTk/issues/514)) ([a02f62c](https://github.com/ceccopierangiolieugenio/pyTermTk/commit/a02f62c7060bab9c8812f1a80e03fcd316e0d23b)) +* **TTkTerminal:** add getBuffer ([#496](https://github.com/ceccopierangiolieugenio/pyTermTk/issues/496)) ([997d0f6](https://github.com/ceccopierangiolieugenio/pyTermTk/commit/997d0f6d7278ba6e09777bbfdd45ba8e359d33ef)) + + +### Chores + +* fix typo in terminal screen ([b262f80](https://github.com/ceccopierangiolieugenio/pyTermTk/commit/b262f80d871e986fa9f8d4c86c80144e371b66cf)) +* improve the error handling and the quit routine ([#494](https://github.com/ceccopierangiolieugenio/pyTermTk/issues/494)) ([d644604](https://github.com/ceccopierangiolieugenio/pyTermTk/commit/d644604e377cd15ae420fa3e05758eff84922270)) +* improve typing ([#504](https://github.com/ceccopierangiolieugenio/pyTermTk/issues/504)) ([cae23b1](https://github.com/ceccopierangiolieugenio/pyTermTk/commit/cae23b16bc6cd7e064c72eb0b0a6503bf19fad11)) +* use TextIOBase for the stderr handler ([#499](https://github.com/ceccopierangiolieugenio/pyTermTk/issues/499)) ([26b127f](https://github.com/ceccopierangiolieugenio/pyTermTk/commit/26b127fe4cfcdd6c13d63b639013884f96a69e49)) + + +### Refactors + +* None checks anti patterns ([e744d97](https://github.com/ceccopierangiolieugenio/pyTermTk/commit/e744d97d01e4644eccb9f9ac7bd3f5549eefb3b8)) + ## [0.47.2-a.0](https://github.com/ceccopierangiolieugenio/pyTermTk/compare/pyTermTk-v0.47.1-a.0...pyTermTk-v0.47.2-a.0) (2025-10-13) diff --git a/libs/pyTermTk/TermTk/__init__.py b/libs/pyTermTk/TermTk/__init__.py index a021c1c7..73489e88 100644 --- a/libs/pyTermTk/TermTk/__init__.py +++ b/libs/pyTermTk/TermTk/__init__.py @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -__version__:str = '0.47.2-a.0' +__version__:str = '0.48.0-a.0' from .TTkTheme import * from .TTkCore import *