Files
Nexus/2025/scripts/modeling_tools/ModIt/Class/Collapsible.py
2025-12-05 08:08:44 +08:00

128 lines
3.8 KiB
Python

##--------------------------------------------------------------------------
try:
from PySide6 import QtWidgets, QtCore, QtGui
from PySide6.QtWidgets import *
from PySide6.QtGui import *
from PySide6.QtCore import *
from shiboken6 import wrapInstance
except ImportError:
from PySide2 import QtWidgets, QtCore, QtGui
from shiboken2 import wrapInstance
from PySide2.QtGui import QIcon
from PySide2.QtWidgets import QWidget
import shiboken2
import json
from .. import ModIt_Global
##______________________GLOBAL VAR
##PATH_SET
IconPath = ModIt_Global.IconsPathThemeClassic
PreferencePath = ModIt_Global.PreferencePath
WIN_DISPLAY_SIZE =(json.load(open(PreferencePath + 'WinSize.json',"r"))['VALUE'])
class CollapsibleHeader(QtWidgets.QWidget):
COLLAPSED_PIXMAP = QtGui.QPixmap(IconPath + "Arrow_Collapse")
EXPANDED_PIXMAP = QtGui.QPixmap(IconPath + "Arrow_Down")
clicked = QtCore.Signal()
def __init__(self, text, parent=None):
super(CollapsibleHeader, self).__init__(parent)
self.setAutoFillBackground(True)
self.set_background_color(True)
self.icon_label = QtWidgets.QLabel()
self.icon_label.setFixedWidth(self.COLLAPSED_PIXMAP.width())
self.text_label = QtWidgets.QLabel()
self.text_label.setAttribute(QtCore.Qt.WA_TransparentForMouseEvents)
self.main_layout = QtWidgets.QHBoxLayout(self)
self.main_layout.setContentsMargins(4, 4, 4, 0)
self.main_layout.setSpacing(12) # DISTANCE du TITRE de la FLECHE
self.main_layout.addWidget(self.icon_label)
self.main_layout.addWidget(self.text_label)
self.set_text(text)
self.set_expanded(False)
def set_text(self, text):
self.text_label.setText("<b>{0}</b>".format(text))
if WIN_DISPLAY_SIZE == 1: #150%
self.text_label.setFont(QtGui.QFont('Candara', 6))
def set_background_color(self, color):
if not color:
color = QtWidgets.QPushButton().palette().color(QtGui.QPalette.Button)
palette = self.palette()
palette.setColor(QtGui.QPalette.Window, color)
self.setPalette(palette)
def is_expanded(self):
return self._expanded
def set_expanded(self, expanded):
self._expanded = expanded
if (self._expanded):
self.icon_label.setPixmap(self.EXPANDED_PIXMAP)
else:
self.icon_label.setPixmap(self.COLLAPSED_PIXMAP)
def mousePressEvent(self, event):
self.clicked.emit() # pylint: disable=E1101
class CollapsibleWidget(QtWidgets.QWidget):
collapsed_signal = QtCore.Signal(bool)
def __init__(self, text, parent=None):
super(CollapsibleWidget, self).__init__(parent)
self.header_wdg = CollapsibleHeader(text)
self.header_wdg.clicked.connect(self.on_header_clicked) # pylint: disable=E1101
self.Body_wdg = QtWidgets.QWidget()
self.Body_wdg.setContentsMargins(0, 0, 0, 0)
self.MAIN_lyt = QtWidgets.QVBoxLayout(self.Body_wdg)
self.MAIN_lyt.setContentsMargins(0, 0, 0, 0)
self.main_layout = QtWidgets.QVBoxLayout(self)
self.main_layout.setContentsMargins(0, 0, 0, 0)
self.main_layout.addWidget(self.header_wdg)
self.main_layout.addWidget(self.Body_wdg)
self.set_expanded(False)
def add_widget(self, widget):
self.MAIN_lyt.addWidget(widget)
def add_layout(self, layout):
self.MAIN_lyt.addLayout(layout)
def set_expanded(self, expanded):
self.header_wdg.set_expanded(expanded)
self.Body_wdg.setVisible(expanded)
self.collapsed_signal.emit(expanded)
def set_header_background_color(self, color):
self.header_wdg.set_background_color(color)
def on_header_clicked(self):
self.set_expanded(not self.header_wdg.is_expanded())
# TestDialog.btnAction(self)