Source code for psy_view.utils
"""Utility functions for psy-view."""
# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht
# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH
#
# SPDX-License-Identifier: LGPL-3.0-only
from __future__ import annotations
import os.path as osp
from typing import TYPE_CHECKING, Callable, List, Optional, Union, cast
from PyQt5 import QtCore, QtGui, QtWidgets
if TYPE_CHECKING:
    from PyQt5.QtCore import QEvent  # pylint: disable=no-name-in-module
[docs]
def get_icon(name: str, ending: str = ".png") -> str:
    return osp.join(osp.dirname(__file__), "icons", name + ending)
[docs]
def add_pushbutton(
    label: str,
    connections: Optional[Union[List[Callable], Callable]] = None,
    tooltip: Optional[str] = None,
    layout: Optional[QtWidgets.QLayout] = None,
    icon: bool = False,
    toolbutton: bool = False,
    *args,
    **kwargs,
) -> Union[QtWidgets.QPushButton, QtWidgets.QToolButton]:
    if icon or toolbutton:
        btn = QtWidgets.QToolButton(*args, **kwargs)
        if icon:
            btn.setIcon(QtGui.QIcon(label))
        else:
            btn.setText(label)
    else:
        btn = QtWidgets.QPushButton(label, *args, **kwargs)
    if tooltip is not None:
        btn.setToolTip(tooltip)
    if connections is not None:
        try:
            iter(connections)  # type: ignore
        except TypeError:
            connections = [connections]  # type: ignore
        connections = cast(List[Callable], connections)
        for con in connections:
            btn.clicked.connect(con)
    if layout is not None:
        layout.addWidget(btn)
    return btn
[docs]
class QRightPushButton(QtWidgets.QPushButton):
    """A push button that acts differently when right-clicked"""
    rightclicked = QtCore.pyqtSignal()
[docs]
    def mousePressEvent(self, event: QEvent):
        if event.button() == QtCore.Qt.RightButton:
            self.rightclicked.emit()
            event.accept()
        else:
            return super().mousePressEvent(event)