home *** CD-ROM | disk | FTP | other *** search
/ Xentax forum attachments archive / xentax.7z / 14707 / Spellforce050818_2.7z / collapsible.py < prev    next >
Encoding:
Python Source  |  2018-08-03  |  2.6 KB  |  87 lines

  1. """
  2.  
  3. CollapsibleListWidget is a container that stores a vertical
  4. stack of widgets, each of which can be collapsed or expanded.
  5.  
  6. The contained widgets are not owned.
  7.  
  8.     w = CollapsibleListWidget(parent)
  9.     w.add_widget('title button text', widget)
  10.     w.collapse_all()
  11.     w.expand_all()
  12.  
  13. """
  14.  
  15. import logging
  16.  
  17. from PyQt5.QtCore import Qt, pyqtSignal
  18. from PyQt5.QtWidgets import QPushButton, QStyle
  19. from PyQt5.QtWidgets import QTreeWidget, QTreeWidgetItem
  20.  
  21.  
  22. logger = logging.getLogger(__name__)
  23.  
  24.  
  25. class _CollapseButton(QPushButton):
  26.     expand_requested_signal = pyqtSignal(str)
  27.  
  28.     def __init__(self, text, parent, item):
  29.         super().__init__(text, parent)
  30.         self.pressed.connect(self.button_pressed)
  31.         self.tree_widget_item = item
  32.         self.expanded_icon = self.style().standardIcon(
  33.             QStyle.SP_TitleBarShadeButton)
  34.         self.collapsed_icon = self.style().standardIcon(
  35.             QStyle.SP_TitleBarUnshadeButton)
  36.         self.setIcon(self.collapsed_icon)
  37.         self.setStyleSheet("Text-align:left")
  38.         # Prevent button from retaining highlight:
  39.         self.setFocusPolicy(Qt.NoFocus)
  40.  
  41.     def button_pressed(self):
  42.         item = self.tree_widget_item
  43.         item.setExpanded(not item.isExpanded())
  44.         if item.isExpanded():
  45.             self.setIcon(self.expanded_icon)
  46.             self.expand_requested_signal.emit(self.text())
  47.         else:
  48.             self.setIcon(self.collapsed_icon)
  49.  
  50.  
  51. class CollapsibleListWidget(QTreeWidget):
  52.     expanded_signal = pyqtSignal(str)
  53.  
  54.     def __init__(self, parent):
  55.         super().__init__(parent)
  56.  
  57.         self.setRootIsDecorated(False)
  58.         self.setHeaderHidden(True)
  59.         self.setIndentation(0)
  60.  
  61.     def clear(self):
  62.         logger.info('todo: clear')
  63.  
  64.     def add_widget(self, name, widget):
  65.         item = QTreeWidgetItem()
  66.         self.addTopLevelItem(item)
  67.         button = _CollapseButton(name, self, item)
  68.         button.expand_requested_signal.connect(self.do_expand_signal)
  69.         self.setItemWidget(item, 0, button)
  70.  
  71.         container = QTreeWidgetItem()
  72.         container.setDisabled(True)
  73.         item.addChild(container)
  74.         self.setItemWidget(container, 0, widget)
  75.  
  76.     def do_expand_signal(self, string):
  77.         self.expanded_signal.emit(string)
  78.  
  79.     def collapse_all(self):
  80.         for i in range(self.topLevelItemCount()):
  81.             self.topLevelItem(i).setExpanded(False)
  82.             item.setExpanded(False)
  83.  
  84.     def expand_all(self):
  85.         for i in range(self.topLevelItemCount()):
  86.             self.topLevelItem(i).setExpanded(True)
  87.