Source code for ansys.aedt.toolkits.common.ui.utils.widgets.py_left_column.py_left_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 QPushButton
[docs]
class PyLeftButton(QPushButton):
"""
Left button widget designed to function as a left-aligned button with various style and interaction options.
Parameters
----------
btn_id : str, optional
Button identifier.
width : int, optional
Button width.
height : int, optional
Button height.
radius : int, optional
Button corner radius.
bg_color : str, optional
Button background color.
bg_color_hover : str, optional
Button background color when hovered.
bg_color_pressed : str, optional
Button background color when pressed.
icon_color : str, optional
Icon color.
icon_color_hover : str, optional
Icon color when hovered.
icon_color_pressed : str, optional
Icon color when pressed.
icon_color_active : str, optional
Active icon color.
icon_path : str, optional
Path to icon file.
dark_one : str, optional
Dark color for theming.
context_color : str, optional
Context color for theming.
text_foreground : str, optional
Text foreground color.
is_active : bool, optional
Whether the button is active.
"""
def __init__(
self,
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",
icon_path="no_icon.svg",
dark_one="#1b1e23",
context_color="#568af2",
text_foreground="#8a95aa",
is_active=False,
):
super().__init__()
# SET DEFAULT PARAMETERS
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 = self.height() + 6
self._is_active = is_active
self._set_bg_color = bg_color
self._set_icon_path = icon_path
self._set_icon_color = icon_color
self._set_border_radius = radius
[docs]
def set_active(self, is_active):
"""
Set the active state of the button.
Parameters
----------
is_active : bool
Whether the button is active.
"""
self._is_active = is_active
self.repaint()
[docs]
def is_active(self):
"""
Check if the button is active.
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 = QBrush(QColor(self._bg_color_pressed))
else:
brush = QBrush(QColor(self._set_bg_color))
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)
self.icon_paint(paint, self._set_icon_path, rect)
paint.end()
[docs]
def change_style(self, event):
"""
Change the button style based on the event type.
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)
# SET FOCUS
self.setFocus()
# EMIT SIGNAL
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)
# EMIT SIGNAL
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.
rect : QRect
Rectangle to paint the icon within.
"""
icon = QPixmap(image)
painter = QPainter(icon)
painter.setCompositionMode(QPainter.CompositionMode_SourceIn)
if self._is_active:
painter.fillRect(icon.rect(), self._context_color)
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()