Source code for ansys.aedt.toolkits.common.ui.utils.widgets.py_icon_button.py_icon_button

from PySide6.QtCore import QEvent
from PySide6.QtCore import QRect
from PySide6.QtCore import Qt
from PySide6.QtGui import QBrush
from PySide6.QtGui import QColor
from PySide6.QtGui import QPainter
from PySide6.QtGui import QPixmap
from PySide6.QtWidgets import QGraphicsDropShadowEffect
from PySide6.QtWidgets import QLabel
from PySide6.QtWidgets import QPushButton


[docs] class PyIconButton(QPushButton): """ Icon button widget that can be used as a colored icon. The icon and color can be customized during initialization. Parameters ---------- icon_path : str Path to the icon image file. tooltip_text : str, optional Text for tooltip. btn_id : str, optional Identifier for the button. width : int, optional Width of the button. height : int, optional Height of the button. radius : int, optional Radius for rounded corners. bg_color : str, optional Background color in hex color code. bg_color_hover : str, optional Background color when hovered in hex color code. bg_color_pressed : str, optional Background color when being pressed in hex color code. icon_color : str, optional Icon color in hex color code. icon_color_hover : str, optional Icon color when hovered in hex color code. icon_color_pressed : str, optional Icon color when being pressed in hex color code. icon_color_active : str, optional Active icon color in hex color code. dark_one : str, optional Color for dark theme in hex color code. text_foreground : str, optional Text color in hex color code. context_color : str, optional Context color in hex color code. top_margin : int, optional Top margin for tooltip. is_active : bool, optional Whether the button is currently active. The rest of the parameters customize the look and emit signals for different user interactions. Examples -------- >>> import sys >>> from PySide6.QtWidgets import QApplication, QVBoxLayout, QPushButton >>> from ansys.aedt.toolkits.common.ui.utils.widgets import * >>> class Example(QWidget): >>> def __init__(self): >>> super().__init__() >>> layout = QVBoxLayout(self) >>> layout.addWidget(QPushButton("Button 1")) >>> layout.addWidget(PyIconButton('icon_signal.svg', "#FF0000", tooltip_text="Example") >>> ) >>> layout.addWidget(QPushButton("Button 2")) >>> if __name__ == "__main__": >>> app = QApplication([]) >>> window = Example() >>> window.show() >>> app.exec() """ def __init__( self, icon_path=None, tooltip_text="", btn_id=None, width=30, height=30, radius=8, bg_color="#343b48", bg_color_hover="#3c4454", bg_color_pressed="#2c313c", icon_color="#c3ccdf", icon_color_hover="#dce1ec", icon_color_pressed="#edf0f5", icon_color_active="#f5f6f9", dark_one="#1b1e23", text_foreground="#8a95aa", context_color="#568af2", top_margin=40, is_active=False, ): super().__init__() self.setFixedSize(width, height) self.setCursor(Qt.PointingHandCursor) self.setObjectName(btn_id) self._bg_color = bg_color self._bg_color_hover = bg_color_hover self._bg_color_pressed = bg_color_pressed self._icon_color = icon_color self._icon_color_hover = icon_color_hover self._icon_color_pressed = icon_color_pressed self._icon_color_active = icon_color_active self._context_color = context_color self._top_margin = top_margin self._is_active = is_active # Set Parameters self._set_bg_color = bg_color self._set_icon_path = icon_path self._set_icon_color = icon_color self._set_border_radius = radius # TOOLTIP if tooltip_text: self._tooltip_text = tooltip_text self._tooltip = Tooltip(tooltip_text, dark_one, text_foreground) self._tooltip.hide()
[docs] def set_active(self, is_active): """ Set the active state of the button. Parameters ---------- is_active : bool Whether the button is active or not. """ self._is_active = is_active self.repaint()
[docs] def is_active(self): """ Check if the button is in an active state. Returns ------- bool True if the button is active, False otherwise. """ return self._is_active
[docs] def paintEvent(self, event): """ Paint the button. Parameters ---------- event : QEvent Paint event. """ # PAINTER paint = QPainter() paint.begin(self) paint.setRenderHint(QPainter.RenderHint.Antialiasing) if self._is_active: # BRUSH brush = QBrush(QColor(self._context_color)) else: # BRUSH brush = QBrush(QColor(self._set_bg_color)) # CREATE RECTANGLE rect = QRect(0, 0, self.width(), self.height()) paint.setPen(Qt.NoPen) paint.setBrush(brush) paint.drawRoundedRect(rect, self._set_border_radius, self._set_border_radius) # DRAW ICONS self.icon_paint(paint, self._set_icon_path, rect) # END PAINTER paint.end()
[docs] def change_style(self, event): """ Change the style of the button based on the given event. Parameters ---------- event : QEvent Event triggering the style change. """ if event == QEvent.Enter: self._set_bg_color = self._bg_color_hover self._set_icon_color = self._icon_color_hover self.repaint() elif event == QEvent.Leave: self._set_bg_color = self._bg_color self._set_icon_color = self._icon_color self.repaint() elif event == QEvent.MouseButtonPress: self._set_bg_color = self._bg_color_pressed self._set_icon_color = self._icon_color_pressed self.repaint() elif event == QEvent.MouseButtonRelease: self._set_bg_color = self._bg_color_hover self._set_icon_color = self._icon_color_hover self.repaint()
[docs] def enterEvent(self, event): """ Handle the enter event. Parameters ---------- event : QEvent Enter event. """ self.change_style(QEvent.Enter)
[docs] def leaveEvent(self, event): """ Handle the leave event. Parameters ---------- event : QEvent Leave event. """ self.change_style(QEvent.Leave)
[docs] def mousePressEvent(self, event): """ Handle the mouse press event. Parameters ---------- event : QEvent Mouse press event. """ if event.button() == Qt.LeftButton: self.change_style(QEvent.MouseButtonPress) self.setFocus() return self.clicked.emit()
[docs] def mouseReleaseEvent(self, event): """ Handle the mouse release event. Parameters ---------- event : QEvent Mouse release event. """ if event.button() == Qt.LeftButton: self.change_style(QEvent.MouseButtonRelease) return self.released.emit()
[docs] def icon_paint(self, qp, image, rect): """ Paint the icon on the button. Parameters ---------- qp : QPainter QPainter object. image : str Path to the icon image file. rect : QRect Rectangle for the icon placement. """ icon = QPixmap(image) painter = QPainter(icon) painter.setCompositionMode(QPainter.CompositionMode_SourceIn) if self._is_active: painter.fillRect(icon.rect(), self._icon_color_active) else: painter.fillRect(icon.rect(), self._set_icon_color) qp.drawPixmap((rect.width() - icon.width()) / 2, (rect.height() - icon.height()) / 2, icon) painter.end()
[docs] def set_icon(self, icon_path): """ Set the icon for the button. Parameters ---------- icon_path : str Path to the icon image file. """ self._set_icon_path = icon_path self.repaint()
class Tooltip(QLabel): """ Tooltip class to display tooltip for the PyIconButton. Parameters ---------- tooltip : str Text to be displayed in the tooltip. dark_one : str Dark color for theming. text_foreground : str Text foreground color. """ style_tooltip = """ QLabel {{ background-color: {_dark_one}; color: {_text_foreground}; padding-left: 10px; padding-right: 10px; border-radius: 17px; border: 0px solid transparent; font: 800 9pt "Segoe UI"; }} """ def __init__(self, tooltip, dark_one, text_foreground): QLabel.__init__(self) style = self.style_tooltip.format(_dark_one=dark_one, _text_foreground=text_foreground) self.setObjectName("label_tooltip") self.setStyleSheet(style) self.setMinimumHeight(34) self.setText(tooltip) self.adjustSize() self.shadow = QGraphicsDropShadowEffect(self) self.shadow.setBlurRadius(30) self.shadow.setXOffset(0) self.shadow.setYOffset(0) self.shadow.setColor(QColor(0, 0, 0, 80)) self.setGraphicsEffect(self.shadow)