Source code for taurus.qt.qtgui.dialog.taurusinputdialog
#!/usr/bin/env python
# ###########################################################################
#
# This file is part of Taurus
#
# http://taurus-scada.org
#
# Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
#
# Taurus is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Taurus is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with Taurus. If not, see <http://www.gnu.org/licenses/>.
#
# ###########################################################################
"""This module provides a set of dialog based widgets
"""
from taurus.external.qt import Qt
__docformat__ = "restructuredtext"
[docs]
def get_input(input_data, parent=None, input_panel_klass=None):
"""Static convenience function to get an input from the user using a
dialog. The dialog will be modal.
The input_data is a dictionary which contains information on how to build
the input dialog. It **must** contains the following keys:
- *prompt* <str>: message to be displayed
The following are optional keys (and their corresponding default values):
- *title* <str> (doesn't have default value)
- *key* <str> (doesn't have default value):
a label to be presented left to the input box represeting the label
- *unit* <str> (doesn't have default value):
a label to be presented right to the input box representing the units
- *data_type* <str or sequence> ('String'):
type of data to be requested. Standard
accepted data types are 'String', 'Integer', 'Float', 'Boolean',
'Text'. A list of elements will be interpreted as a selection.
Default TaurusInputPanel class will interpret any custom data types
as 'String' and will display input widget accordingly. Custom
data types can be handled differently by supplying a different
input_panel_klass.
- *minimum* <int/float> (-sys.maxint):
minimum value (makes sence when data_type is 'Integer' or 'Float')
- *maximum* <int/float> (sys.maxint):
maximum value (makes sence when data_type is 'Integer' or 'Float')
- *step* <int/float> (1):
step size value (makes sence when data_type is 'Integer' or 'Float')
- *decimals* <int> (1):
number of decimal places to show (makes sence when data_type is
'Float')
- *default_value* <obj> (doesn't have default value):
default value
- *allow_multiple* <bool> (False):
allow more than one value to be selected (makes sence when data_type
is a sequence of possibilities)
:param input_data: a dictionary with information on how to build the input
dialog
:type input_data: :py:obj:`dict`
:param parent: parent widget
:type parent: PyQt5.Qt.QWidget
:param input_panel_klass: python class to be used as input panel [default:
:class:`~taurus.qt.qtgui.panel.TaurusInputPanel`]
:type input_panel_klass: :class:`~taurus.qt.qtgui.panel.TaurusInputPanel`
:return: a tuple containing value selected and boolean which is true if
user accepted the dialog (pressed Ok) or false otherwise
:rtype: tuple< obj, bool >
Examples::
d1 = dict(prompt="What's your name?", data_type="String")
d2 = dict(
prompt="What's your age?",
data_type="Integer",
default_value=4,
maximum=100,
key="Age",
unit="years"
)
d3 = dict(
prompt="What's your favourite number?",
data_type="Float",
default_value=0.1,
maximum=88.8,
key="Number"
)
d4 = dict(
prompt="What's your favourite car brand?",
data_type=["Mazda", "Skoda", "Citroen", "Mercedes", "Audi"],
default_value="Mercedes"
)
d5 = dict(
prompt="Select some car brands", allow_multiple=True,
data_type=["Mazda", "Skoda", "Citroen", "Mercedes", "Audi"],
default_value=["Mercedes", "Citroen"]
)
d6 = dict(
prompt="What's your favourite color?",
key="Color",
data_type=["blue", "red", "green"],
default_value="red"
)
d7 = dict(prompt="Do you like bears?",
data_type='Boolean',
key="Yes/No",
default_value=True
)
d8 = dict(
prompt="Please write your memo",
data_type='Text',
key="Memo",
default_value="By default a memo is a long thing"
)
for d in [d1, d2, d3, d4, d5, d6, d7, d8]:
get_input(input_data=d, title=d['prompt'])
"""
if input_panel_klass is None:
from taurus.qt.qtgui.panel import TaurusInputPanel
input_panel_klass = TaurusInputPanel
dialog = TaurusInputDialog(
input_data=input_data,
parent=parent,
input_panel_klass=input_panel_klass,
)
dialog.exec_()
return dialog.value(), dialog.result()
[docs]
class TaurusInputDialog(Qt.QDialog):
"""The TaurusInputDialog class provides a simple convenience dialog to get
a single value from the user.
"""
def __init__(
self,
input_data=None,
parent=None,
input_panel_klass=None,
designMode=False,
):
if input_panel_klass is None:
from taurus.qt.qtgui.panel import TaurusInputPanel
input_panel_klass = TaurusInputPanel
self.input_data = input_data
self.input_panel_klass = input_panel_klass
Qt.QDialog.__init__(self, parent)
if input_data and "title" in input_data:
self.setWindowTitle(input_data["title"])
layout = Qt.QVBoxLayout()
self.setLayout(layout)
self._panel = panel = input_panel_klass(input_data, self)
layout.setContentsMargins(0, 0, 0, 0)
layout.addWidget(self._panel)
panel.buttonBox().accepted.connect(self.accept)
panel.buttonBox().rejected.connect(self.reject)
self._panel.setInputFocus()
[docs]
def panel(self):
"""Returns the :class:`taurus.qt.qtgui.panel.TaurusInputPanel`.
:return: the internal panel
:rtype: taurus.qt.qtgui.panel.TaurusInputPanel
"""
return self._panel
[docs]
def value(self):
"""Returns the value selected by the user.
:return: the value selected by the user
"""
return self.panel().value()
def demo():
"""Input Dialog"""
input_data = dict(
prompt="What's your favourite car brand?",
data_type=["Mazda", "Skoda", "Citroen", "Mercedes", "Audi", "Ferrari"],
default_value="Mercedes",
)
w = TaurusInputDialog(input_data=input_data)
w.show()
return w
def main():
import taurus.qt.qtgui.application
Application = taurus.qt.qtgui.application.TaurusApplication
app = Application.instance()
owns_app = app is None
if owns_app:
app = Qt.QApplication([])
app.setApplicationName("Taurus input dialog demo")
app.setApplicationVersion("1.0")
d1 = dict(prompt="What's your name?", data_type="String")
d2 = dict(
prompt="What's your age?",
data_type="Integer",
default_value=4,
maximum=100,
key="Age",
unit="years",
)
d3 = dict(
prompt="What's your favourite number?",
data_type="Float",
default_value=0.1,
maximum=88.8,
key="Number",
)
d4 = dict(
prompt="What's your favourite car brand?",
data_type=["Mazda", "Skoda", "Citroen", "Mercedes", "Audi", "Ferrari"],
default_value="Mercedes",
)
d5 = dict(
prompt="Select some car brands",
allow_multiple=True,
data_type=["Mazda", "Skoda", "Citroen", "Mercedes", "Audi", "Ferrari"],
default_value=["Mercedes", "Citroen"],
)
d6 = dict(
prompt="What's your favourite color?",
key="Color",
data_type=["blue", "red", "green"],
default_value="red",
)
d7 = dict(
prompt="Do you like bears?",
data_type="Boolean",
key="Yes/No",
default_value=True,
)
d8 = dict(
prompt="Please write your memo",
data_type="Text",
key="Memo",
default_value="By default a memo is\na long thing",
)
for d in [d1, d2, d3, d4, d5, d6, d7, d8]:
print(get_input(input_data=d, title=d["prompt"]))
if __name__ == "__main__":
main()