123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- """
- ***************************************************************************
- CheckBoxesPanel.py
- ---------------------
- Date : January 2015
- Copyright : (C) 2015 by Arnaud Morvan
- Email : arnaud dot morvan at camptocamp dot com
- Contributors : Arnaud Morvan
- ***************************************************************************
- * *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- ***************************************************************************
- """
- __author__ = 'Arnaud Morvan'
- __date__ = 'January 2015'
- __copyright__ = '(C) 2015, Arnaud Morvan'
- from qgis.PyQt.QtCore import Qt
- from qgis.PyQt.QtWidgets import (
- QCheckBox,
- QRadioButton,
- QGridLayout,
- QButtonGroup,
- QSizePolicy,
- QSpacerItem,
- QWidget,
- QMenu,
- QAction
- )
- from qgis.PyQt.QtGui import QCursor
- class CheckboxesPanel(QWidget):
- def __init__(self, options, multiple, columns=2, parent=None):
- super().__init__(parent)
- self._options = []
- for i, option in enumerate(options):
- if isinstance(option, str):
- self._options.append((i, option))
- else:
- self.options.append(option)
- self._multiple = multiple
- self._buttons = []
- rows = len(options) / columns
- self._buttonGroup = QButtonGroup()
- self._buttonGroup.setExclusive(not multiple)
- layout = QGridLayout()
- layout.setContentsMargins(0, 0, 0, 0)
- layout.setMargin(0)
- for i, (v, t) in enumerate(self._options):
- if multiple:
- button = QCheckBox(t)
- else:
- button = QRadioButton(t)
- self._buttons.append((v, button))
- self._buttonGroup.addButton(button, i)
- layout.addWidget(button, i % rows, i / rows)
- layout.addItem(QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Minimum),
- 0, columns)
- self.setLayout(layout)
- if multiple:
- self.setContextMenuPolicy(Qt.CustomContextMenu)
- self.customContextMenuRequested.connect(self.showPopupMenu)
- def showPopupMenu(self):
- popup_menu = QMenu()
- select_all_action = QAction(self.tr('Select All'), popup_menu)
- select_all_action.triggered.connect(self.selectAll)
- clear_all_action = QAction(self.tr('Clear Selection'), popup_menu)
- clear_all_action.triggered.connect(self.deselectAll)
- popup_menu.addAction(select_all_action)
- popup_menu.addAction(clear_all_action)
- popup_menu.exec_(QCursor.pos())
- def selectAll(self):
- for (v, button) in self._buttons:
- button.setChecked(True)
- def deselectAll(self):
- for (v, button) in self._buttons:
- button.setChecked(False)
- def value(self):
- if self._multiple:
- return [
- v
- for (v, checkbox) in self._buttons
- if checkbox.isChecked()
- ]
- else:
- return self._options[self._buttonGroup.checkedId()][0]
- def setValue(self, value):
- for (v, button) in self._buttons:
- if self._multiple:
- button.setChecked(v in value)
- else:
- button.setChecked(v == value)
|