13 changed files with 149 additions and 92 deletions
@ -1,2 +1,2 @@ |
|||||||
# py-ttk |
# pyTermTk |
||||||
Python Terminal Toolkit |
Python Terminal Toolkit |
||||||
|
|||||||
@ -0,0 +1,86 @@ |
|||||||
|
#!/usr/bin/env python3 |
||||||
|
|
||||||
|
# MIT License |
||||||
|
# |
||||||
|
# Copyright (c) 2021 Eugenio Parodi <ceccopierangiolieugenio AT googlemail DOT com> |
||||||
|
# |
||||||
|
# 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. |
||||||
|
|
||||||
|
# This code is inspired by |
||||||
|
# https://github.com/ceccopierangiolieugenio/pyCuT/blob/master/cupy/CuTCore/CuDebug.py |
||||||
|
|
||||||
|
import inspect |
||||||
|
from collections.abc import Callable |
||||||
|
|
||||||
|
class _TTkContext: |
||||||
|
__slots__ = ['file', 'line', 'function'] |
||||||
|
def __init__(self, cf): |
||||||
|
self.file = cf[1] |
||||||
|
self.line = cf[2] |
||||||
|
self.function = cf[3] |
||||||
|
def __str__(self): |
||||||
|
return f"{self.file}:{self.line} [{self.function}]" |
||||||
|
|
||||||
|
class TTkLog: |
||||||
|
DebugMsg = 0x0001 |
||||||
|
InfoMsg = 0x0002 |
||||||
|
ErrorMsg = 0x0004 |
||||||
|
WarningMsg = 0x0008 |
||||||
|
CriticalMsg = 0x0010 |
||||||
|
FatalMsg = 0x0020 |
||||||
|
SystemMsg = CriticalMsg |
||||||
|
|
||||||
|
_messageHandler: Callable = None |
||||||
|
|
||||||
|
@staticmethod |
||||||
|
def _process_msg(mode: int, msg: str): |
||||||
|
if TTkLog._messageHandler is not None: |
||||||
|
curframe = inspect.currentframe() |
||||||
|
calframe = inspect.getouterframes(curframe,1) |
||||||
|
if len(calframe) > 2: |
||||||
|
ctx = _TTkContext(calframe[2]) |
||||||
|
TTkLog._messageHandler(mode, ctx, msg) |
||||||
|
|
||||||
|
@staticmethod |
||||||
|
def debug(msg): |
||||||
|
TTkLog._process_msg(TTkLog.DebugMsg, msg) |
||||||
|
|
||||||
|
@staticmethod |
||||||
|
def info(msg): |
||||||
|
TTkLog._process_msg(TTkLog.InfoMsg, msg) |
||||||
|
|
||||||
|
@staticmethod |
||||||
|
def error(msg): |
||||||
|
TTkLog._process_msg(TTkLog.ErrorMsg, msg) |
||||||
|
|
||||||
|
@staticmethod |
||||||
|
def warn(msg): |
||||||
|
TTkLog._process_msg(TTkLog.WarningMsg, msg) |
||||||
|
|
||||||
|
@staticmethod |
||||||
|
def critical(msg): |
||||||
|
TTkLog._process_msg(TTkLog.CriticalMsg, msg) |
||||||
|
|
||||||
|
@staticmethod |
||||||
|
def fatal(msg): |
||||||
|
TTkLog._process_msg(TTkLog.FatalMsg, msg) |
||||||
|
|
||||||
|
@staticmethod |
||||||
|
def installMessageHandler(mh: Callable): |
||||||
|
TTkLog._messageHandler = mh |
||||||
@ -0,0 +1,16 @@ |
|||||||
|
#!/usr/bin/env python3 |
||||||
|
|
||||||
|
# Copyright 2021 Eugenio Parodi <ceccopierangiolieugenio AT googlemail DOT com> |
||||||
|
# Copyright 2020 Aristocratos (https://github.com/aristocratos/bpytop) |
||||||
|
# |
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
# you may not use this file except in compliance with the License. |
||||||
|
# You may obtain a copy of the License at |
||||||
|
# |
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
# |
||||||
|
# Unless required by applicable law or agreed to in writing, software |
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
# See the License for the specific language governing permissions and |
||||||
|
# limitations under the License. |
||||||
@ -1,15 +1,22 @@ |
|||||||
- [ ] Handle Logs |
# TODO |
||||||
|
- [ ] Follow [PEP 8](https://www.python.org/dev/peps/pep-0008/) coding style |
||||||
- [ ] Terminal Helper |
- [ ] Terminal Helper |
||||||
- [ ] Events |
- [ ] Events |
||||||
- [x] Window : SIGWINCH triggered when the terminal is resized |
- [x] Window : SIGWINCH triggered when the terminal is resized |
||||||
- [ ] Input Class |
- [ ] Input Class |
||||||
- [ ] Return Error if Mouse RE does not match |
- [ ] Return Error if Mouse RE does not match |
||||||
- [x] Handle the Paste Buffer |
- [x] Handle the Paste Buffer |
||||||
- [ ] Handle the middle button mouse paste |
- [ ] Investigate the middle mouse button paste |
||||||
|
*note: It works only in "INSERT" mode on Vim* |
||||||
- [ ] Handle Special Keys (UP, Down, . . .) |
- [ ] Handle Special Keys (UP, Down, . . .) |
||||||
- [ ] Events |
- [ ] Events |
||||||
https://tkinterexamples.com/events/events.html |
https://tkinterexamples.com/events/events.html |
||||||
https://www.pythontutorial.net/tkinter/tkinter-event-binding/ |
https://www.pythontutorial.net/tkinter/tkinter-event-binding/ |
||||||
- [x] Keyboard |
- [x] Keyboard |
||||||
- [x] Mouse |
- [x] Mouse |
||||||
- [ ] Canvas Class |
- [ ] Canvas Class |
||||||
|
- [ ] Logs |
||||||
|
- [x] Log Class |
||||||
|
- [ ] Log helpers |
||||||
|
- [ ] logger auto integration |
||||||
|
- [ ] stdout until mainLoop |
||||||
@ -1,72 +0,0 @@ |
|||||||
#!/usr/bin/env python3 |
|
||||||
|
|
||||||
# MIT License |
|
||||||
# |
|
||||||
# Copyright (c) 2021 Eugenio Parodi <ceccopierangiolieugenio AT googlemail DOT com> |
|
||||||
# |
|
||||||
# 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. |
|
||||||
|
|
||||||
# This code is inspired by |
|
||||||
# https://github.com/ceccopierangiolieugenio/pyCuT/blob/master/cupy/CuTCore/CuDebug.py |
|
||||||
|
|
||||||
import inspect |
|
||||||
|
|
||||||
DebugMsg = 0 # A message generated by the Debug() function. |
|
||||||
InfoMsg = 4 # A message generated by the Info() function. |
|
||||||
WarningMsg = 1 # A message generated by the Warning() function. |
|
||||||
CriticalMsg = 2 # A message generated by the Critical() function. |
|
||||||
FatalMsg = 3 # A message generated by the Fatal() function. |
|
||||||
SystemMsg = CriticalMsg |
|
||||||
|
|
||||||
_MessageHandler = None |
|
||||||
|
|
||||||
def _process_msg(mode, msg): |
|
||||||
global _MessageHandler |
|
||||||
if _MessageHandler is not None: |
|
||||||
curframe = inspect.currentframe() |
|
||||||
calframe = inspect.getouterframes(curframe,1) |
|
||||||
if len(calframe) > 2: |
|
||||||
class context: |
|
||||||
__slots__ = ('file', 'line', 'function') |
|
||||||
def __str__(self): |
|
||||||
return f"{self.file}:{self.line} [{self.function}]" |
|
||||||
ctx = context() |
|
||||||
ctx.file = calframe[2][1] |
|
||||||
ctx.line = calframe[2][2] |
|
||||||
ctx.function = calframe[2][3] |
|
||||||
_MessageHandler(mode, ctx, msg) |
|
||||||
|
|
||||||
def debug(msg): |
|
||||||
_process_msg(DebugMsg, msg) |
|
||||||
|
|
||||||
def info(msg): |
|
||||||
_process_msg(InfoMsg, msg) |
|
||||||
|
|
||||||
def warn(msg): |
|
||||||
_process_msg(WarningMsg, msg) |
|
||||||
|
|
||||||
def critical(msg): |
|
||||||
_process_msg(CriticalMsg, msg) |
|
||||||
|
|
||||||
def fatal(msg): |
|
||||||
_process_msg(FatalMsg, msg) |
|
||||||
|
|
||||||
def installMessageHandler(mh): |
|
||||||
global _MessageHandler |
|
||||||
_MessageHandler = mh |
|
||||||
Loading…
Reference in new issue