Files
bec_widgets/bec_widgets/widgets/utility/bec_term/qtermwidget_wrapper.py
T

242 lines
8.7 KiB
Python

"""A wrapper for the optional external dependency pyside6_qtermwidget.
Simply displays a message in a QLabel if the dependency is not installed."""
import os
from functools import wraps
from typing import Sequence
from qtpy.QtCore import QIODevice, QPoint, QSize, QUrl, Signal # type: ignore
from qtpy.QtGui import QAction, QFont, QKeyEvent, QResizeEvent, Qt # type: ignore
from qtpy.QtWidgets import QLabel, QVBoxLayout, QWidget
try:
from pyside6_qtermwidget import QTermWidget
except ImportError:
QTermWidget = None
def _forward(func):
"""Apply to a private method to forward the call to the method on QTermWidget with the same name,
(with leading '_' removed) if it is defined, otherwise do nothing."""
@wraps(func)
def wrapper(self, *args, **kwargs):
target = getattr(self, "_main_widget")
if QTermWidget:
method = getattr(target, func.__name__[1:])
return method(*args, **kwargs)
else:
...
return wrapper
class BecQTerm(QWidget):
activity = Signal()
bell = Signal(str)
copy_available = Signal(bool)
current_directory_changed = Signal(str)
finished = Signal()
profile_changed = Signal(str)
received_data = Signal(str)
silence = Signal()
term_got_focus = Signal()
term_key_pressed = Signal(QKeyEvent)
term_lost_focus = Signal()
title_changed = Signal()
url_activated = Signal(QUrl, bool)
def __init__(self, /, parent: QWidget | None = None, **kwargs) -> None:
super().__init__(parent)
self._layout = QVBoxLayout()
self.setLayout(self._layout)
if QTermWidget:
self._main_widget = QTermWidget(parent=self)
self._main_widget.activity.connect(self.activity)
self._main_widget.bell.connect(self.bell)
self._main_widget.copyAvailable.connect(self.copy_available)
self._main_widget.currentDirectoryChanged.connect(self.current_directory_changed)
self._main_widget.finished.connect(self.finished)
self._main_widget.profileChanged.connect(self.profile_changed)
self._main_widget.receivedData.connect(self.received_data)
self._main_widget.silence.connect(self.silence)
self._main_widget.termGetFocus.connect(self.term_got_focus)
self._main_widget.termKeyPressed.connect(self.term_key_pressed)
self._main_widget.termLostFocus.connect(self.term_lost_focus)
self._main_widget.titleChanged.connect(self.title_changed)
self._main_widget.urlActivated.connect(self.url_activated)
self._setEnvironment([f"{k}={v}" for k, v in os.environ.items()])
self._setColorScheme("Solarized")
else:
self._layout.setAlignment(Qt.AlignmentFlag.AlignCenter)
self._main_widget = QLabel("pyside6_qterminal is not installed!")
self._layout.addWidget(self._main_widget)
def write(self, text: str, add_newline: bool = True):
if add_newline:
text += "\n"
self._sendText(text)
# automatically forwarded to the widget only if it exists
@_forward
def _addCustomColorSchemeDir(self, custom_dir: str, /) -> None: ...
@_forward
def _autoHideMouseAfter(self, delay: int, /) -> None: ...
@_forward
def _availableColorSchemes(self) -> list[str]: ...
@_forward
def _availableKeyBindings(self) -> list[str]: ...
@_forward
def _bracketText(self, text: str, /) -> None: ...
@_forward
def _bracketedPasteModeIsDisabled(self, /) -> bool: ...
@_forward
def _changeDir(self, dir: str, /) -> None: ...
@_forward
def _clear(self, /) -> None: ...
@_forward
def _clearCustomKeyBindingsDir(self, /) -> None: ...
@_forward
def _copyClipboard(self, /) -> None: ...
@_forward
def _disableBracketedPasteMode(self, disable: bool, /) -> None: ...
@_forward
def _filterActions(self, position: QPoint, /) -> list[QAction]: ...
@_forward
def _flowControlEnabled(self, /) -> bool: ...
@_forward
def _getAvailableColorSchemes(self, /) -> list[str]: ...
@_forward
def _getForegroundProcessId(self, /) -> int: ...
@_forward
def _getMargin(self, /) -> int: ...
@_forward
def _getPtySlaveFd(self, /) -> int: ...
@_forward
def _getSelectionEnd(self, row: int, column: int, /) -> None: ...
@_forward
def _getSelectionStart(self, row: int, column: int, /) -> None: ...
@_forward
def _getShellPID(self, /) -> int: ...
@_forward
def _getTerminalFont(self, /) -> QFont: ...
@_forward
def _historyLinesCount(self, /) -> int: ...
@_forward
def _historySize(self, /) -> int: ...
@_forward
def _icon(self, /) -> str: ...
@_forward
def _isBidiEnabled(self, /) -> bool: ...
@_forward
def _isTitleChanged(self, /) -> bool: ...
@_forward
def _keyBindings(self, /) -> str: ...
@_forward
def _pasteClipboard(self, /) -> None: ...
@_forward
def _pasteSelection(self, /) -> None: ...
@_forward
def _resizeEvent(self, arg__1: QResizeEvent, /) -> None: ...
@_forward
def _saveHistory(self, device: QIODevice, /) -> None: ...
@_forward
def _screenColumnsCount(self, /) -> int: ...
@_forward
def _screenLinesCount(self, /) -> int: ...
@_forward
def _scrollToEnd(self, /) -> None: ...
@_forward
def _selectedText(self, /, preserveLineBreaks: bool = ...) -> str: ...
@_forward
def _selectionChanged(self, textSelected: bool, /) -> None: ...
@_forward
def _sendKeyEvent(self, e: QKeyEvent, /) -> None: ...
@_forward
def _sendText(self, text: str, /) -> None: ...
@_forward
def _sessionFinished(self, /) -> None: ...
@_forward
def _setArgs(self, args: Sequence[str], /) -> None: ...
@_forward
def _setAutoClose(self, arg__1: bool, /) -> None: ...
@_forward
def _setBidiEnabled(self, enabled: bool, /) -> None: ...
@_forward
def _setBlinkingCursor(self, blink: bool, /) -> None: ...
@_forward
def _setBoldIntense(self, boldIntense: bool, /) -> None: ...
@_forward
def _setColorScheme(self, name: str, /) -> None: ...
@_forward
def _setConfirmMultilinePaste(self, confirmMultilinePaste: bool, /) -> None: ...
@_forward
def _setCustomKeyBindingsDir(self, custom_dir: str, /) -> None: ...
@_forward
def _setDrawLineChars(self, drawLineChars: bool, /) -> None: ...
@_forward
def _setEnvironment(self, environment: Sequence[str], /) -> None: ...
@_forward
def _setFlowControlEnabled(self, enabled: bool, /) -> None: ...
@_forward
def _setFlowControlWarningEnabled(self, enabled: bool, /) -> None: ...
@_forward
def _setHistorySize(self, lines: int, /) -> None: ...
@_forward
def _setKeyBindings(self, kb: str, /) -> None: ...
@_forward
def _setMargin(self, arg__1: int, /) -> None: ...
@_forward
def _setMonitorActivity(self, arg__1: bool, /) -> None: ...
@_forward
def _setMonitorSilence(self, arg__1: bool, /) -> None: ...
@_forward
def _setMotionAfterPasting(self, arg__1: int, /) -> None: ...
@_forward
def _setSelectionEnd(self, row: int, column: int, /) -> None: ...
@_forward
def _setSelectionStart(self, row: int, column: int, /) -> None: ...
@_forward
def _setShellProgram(self, program: str, /) -> None: ...
@_forward
def _setSilenceTimeout(self, seconds: int, /) -> None: ...
@_forward
def _setSize(self, arg__1: QSize, /) -> None: ...
@_forward
def _setTerminalBackgroundImage(self, backgroundImage: str, /) -> None: ...
@_forward
def _setTerminalBackgroundMode(self, mode: int, /) -> None: ...
@_forward
def _setTerminalFont(self, font: QFont | str | Sequence[str], /) -> None: ...
@_forward
def _setTerminalOpacity(self, level: float, /) -> None: ...
@_forward
def _setTerminalSizeHint(self, enabled: bool, /) -> None: ...
@_forward
def _setTrimPastedTrailingNewlines(self, trimPastedTrailingNewlines: bool, /) -> None: ...
@_forward
def _setWordCharacters(self, chars: str, /) -> None: ...
@_forward
def _setWorkingDirectory(self, dir: str, /) -> None: ...
@_forward
def _sizeHint(self, /) -> QSize: ...
@_forward
def _startShellProgram(self, /) -> None: ...
@_forward
def _startTerminalTeletype(self, /) -> None: ...
@_forward
def _terminalSizeHint(self, /) -> bool: ...
@_forward
def _title(self, /) -> str: ...
@_forward
def _toggleShowSearchBar(self, /) -> None: ...
@_forward
def _wordCharacters(self, /) -> str: ...
@_forward
def _workingDirectory(self, /) -> str: ...
@_forward
def _zoomIn(self, /) -> None: ...
@_forward
def _zoomOut(self, /) -> None: ...