Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
[processing] Add useCheckBoxes option to SelectionWidgetWrapper
This allow to show checkboxes or radioboxes intead of line edit with button. This is configurable for each algorithm thought ParameterSelection metadata parameter. It is also possible to choose the number of columns. This is not applied in case of the BatchDialog.
- Loading branch information
Showing
with
103 additions
and 3 deletions.
@@ -0,0 +1,89 @@ | ||
# -*- coding: utf-8 -*- | ||
|
||
""" | ||
*************************************************************************** | ||
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. * | ||
* * | ||
*************************************************************************** | ||
""" | ||
from builtins import range | ||
|
||
__author__ = 'Arnaud Morvan' | ||
__date__ = 'January 2015' | ||
__copyright__ = '(C) 2015, Arnaud Morvan' | ||
|
||
# This will get replaced with a git SHA1 when you do a git archive | ||
__revision__ = '$Format:%H$' | ||
|
||
|
||
from qgis.PyQt.QtWidgets import ( | ||
QCheckBox, | ||
QRadioButton, | ||
QGridLayout, | ||
QButtonGroup, | ||
QSizePolicy, | ||
QSpacerItem, | ||
QWidget, | ||
) | ||
|
||
|
||
class CheckboxesPanel(QWidget): | ||
|
||
def __init__(self, options, multiple, columns=2, parent=None): | ||
super(CheckboxesPanel, self).__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() | ||
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) | ||
|
||
def value(self): | ||
if self._multiple: | ||
value = [] | ||
for (v, checkbox) in self._buttons: | ||
if checkbox.isChecked(): | ||
value.append(v) | ||
return value | ||
else: | ||
return self._options[self._buttonGroup.checkedId()][0] | ||
|
||
def setValue(self, value): | ||
if self._multiple: | ||
for (v, button) in self._buttons: | ||
if v in value: | ||
button.setChecked(True) | ||
else: | ||
for v, button in self._buttons: | ||
if v == value: | ||
button.setChecked(True) |