Improved console

This commit is contained in:
Sven Heidemann 2021-03-10 17:04:28 +01:00
parent 9a713129dc
commit d9d2003087
2 changed files with 32 additions and 7 deletions

View File

@ -1,5 +1,4 @@
import os import os
import sys
from collections import Callable from collections import Callable
from typing import Union, Optional from typing import Union, Optional
@ -253,18 +252,28 @@ class Console:
cls._output(string, x, y, end='') cls._output(string, x, y, end='')
@classmethod @classmethod
def spinner(cls, message: str, call: Callable, *args) -> any: def spinner(cls, message: str, call: Callable, *args, text_foreground_color: ForegroundColor = None, spinner_foreground_color: ForegroundColor = None, text_background_color: BackgroundColor = None, spinner_background_color: BackgroundColor = None) -> any:
if cls._hold_back: if cls._hold_back:
cls._hold_back_calls.append(ConsoleCall(cls.spinner, message, call, *args)) cls._hold_back_calls.append(ConsoleCall(cls.spinner, message, call, *args))
return return
if text_foreground_color is not None:
cls.set_foreground_color(text_foreground_color)
if text_background_color is not None:
cls.set_background_color(text_background_color)
cls.write_line(message) cls.write_line(message)
cls.set_hold_back(True) cls.set_hold_back(True)
spinner = SpinnerThread() spinner = SpinnerThread(spinner_foreground_color, spinner_background_color)
spinner.start() spinner.start()
return_value = call(*args) return_value = call(*args)
spinner.stop_spinning() spinner.stop_spinning()
cls.set_hold_back(False) cls.set_hold_back(False)
cls.set_foreground_color(ForegroundColor.default)
cls.set_background_color(BackgroundColor.default)
for call in cls._hold_back_calls: for call in cls._hold_back_calls:
call.function(*call.args) call.function(*call.args)

View File

@ -2,13 +2,20 @@ import sys
import threading import threading
import time import time
from termcolor import colored
from cpl.console.background_color import BackgroundColor
from cpl.console.foreground_color import ForegroundColor
class SpinnerThread(threading.Thread): class SpinnerThread(threading.Thread):
def __init__(self): def __init__(self, foreground_color: ForegroundColor, background_color: BackgroundColor):
threading.Thread.__init__(self) threading.Thread.__init__(self)
self._is_spinning = True self._is_spinning = True
self._foreground_color = foreground_color
self._background_color = background_color
@staticmethod @staticmethod
def _spinner(): def _spinner():
@ -16,17 +23,26 @@ class SpinnerThread(threading.Thread):
for cursor in '|/-\\': for cursor in '|/-\\':
yield cursor yield cursor
def _get_color_args(self) -> list[str]:
color_args = []
if self._foreground_color is not None:
color_args.append(str(self._foreground_color.value))
if self._background_color is not None:
color_args.append(str(self._background_color.value))
return color_args
def run(self) -> None: def run(self) -> None:
print('\t', end='') print('\t', end='')
spinner = self._spinner() spinner = self._spinner()
while self._is_spinning: while self._is_spinning:
print(next(spinner), end='') print(colored(next(spinner), *self._get_color_args()), end='')
time.sleep(0.1) time.sleep(0.1)
print('\b', end='') print('\b', end='')
sys.stdout.flush() sys.stdout.flush()
print('done', end='') print(colored('done', *self._get_color_args()), end='')
def stop_spinning(self): def stop_spinning(self):
self._is_spinning = False self._is_spinning = False