CheckboxesPanel.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. """
  2. ***************************************************************************
  3. CheckBoxesPanel.py
  4. ---------------------
  5. Date : January 2015
  6. Copyright : (C) 2015 by Arnaud Morvan
  7. Email : arnaud dot morvan at camptocamp dot com
  8. Contributors : Arnaud Morvan
  9. ***************************************************************************
  10. * *
  11. * This program is free software; you can redistribute it and/or modify *
  12. * it under the terms of the GNU General Public License as published by *
  13. * the Free Software Foundation; either version 2 of the License, or *
  14. * (at your option) any later version. *
  15. * *
  16. ***************************************************************************
  17. """
  18. __author__ = 'Arnaud Morvan'
  19. __date__ = 'January 2015'
  20. __copyright__ = '(C) 2015, Arnaud Morvan'
  21. from qgis.PyQt.QtCore import Qt
  22. from qgis.PyQt.QtWidgets import (
  23. QCheckBox,
  24. QRadioButton,
  25. QGridLayout,
  26. QButtonGroup,
  27. QSizePolicy,
  28. QSpacerItem,
  29. QWidget,
  30. QMenu,
  31. QAction
  32. )
  33. from qgis.PyQt.QtGui import QCursor
  34. class CheckboxesPanel(QWidget):
  35. def __init__(self, options, multiple, columns=2, parent=None):
  36. super().__init__(parent)
  37. self._options = []
  38. for i, option in enumerate(options):
  39. if isinstance(option, str):
  40. self._options.append((i, option))
  41. else:
  42. self.options.append(option)
  43. self._multiple = multiple
  44. self._buttons = []
  45. rows = len(options) / columns
  46. self._buttonGroup = QButtonGroup()
  47. self._buttonGroup.setExclusive(not multiple)
  48. layout = QGridLayout()
  49. layout.setContentsMargins(0, 0, 0, 0)
  50. layout.setMargin(0)
  51. for i, (v, t) in enumerate(self._options):
  52. if multiple:
  53. button = QCheckBox(t)
  54. else:
  55. button = QRadioButton(t)
  56. self._buttons.append((v, button))
  57. self._buttonGroup.addButton(button, i)
  58. layout.addWidget(button, i % rows, i / rows)
  59. layout.addItem(QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Minimum),
  60. 0, columns)
  61. self.setLayout(layout)
  62. if multiple:
  63. self.setContextMenuPolicy(Qt.CustomContextMenu)
  64. self.customContextMenuRequested.connect(self.showPopupMenu)
  65. def showPopupMenu(self):
  66. popup_menu = QMenu()
  67. select_all_action = QAction(self.tr('Select All'), popup_menu)
  68. select_all_action.triggered.connect(self.selectAll)
  69. clear_all_action = QAction(self.tr('Clear Selection'), popup_menu)
  70. clear_all_action.triggered.connect(self.deselectAll)
  71. popup_menu.addAction(select_all_action)
  72. popup_menu.addAction(clear_all_action)
  73. popup_menu.exec_(QCursor.pos())
  74. def selectAll(self):
  75. for (v, button) in self._buttons:
  76. button.setChecked(True)
  77. def deselectAll(self):
  78. for (v, button) in self._buttons:
  79. button.setChecked(False)
  80. def value(self):
  81. if self._multiple:
  82. return [
  83. v
  84. for (v, checkbox) in self._buttons
  85. if checkbox.isChecked()
  86. ]
  87. else:
  88. return self._options[self._buttonGroup.checkedId()][0]
  89. def setValue(self, value):
  90. for (v, button) in self._buttons:
  91. if self._multiple:
  92. button.setChecked(v in value)
  93. else:
  94. button.setChecked(v == value)