from qtsalome import (QDialog, QSizePolicy, QFormLayout, QGridLayout, Qt,
QLabel, QLineEdit, QStyle, QComboBox, pyqtSlot,
QFileDialog, QCheckBox, QMessageBox, QDoubleSpinBox,
pyqtSignal, QDialogButtonBox, QTreeView,
QAbstractItemView, QStandardItemModel, QPlainTextEdit,
QProgressBar, QSpinBox)
import SalomePyQt
import salome
import os
class SObjectSelectEdit(QLineEdit):
objectSelected = pyqtSignal()
def __init__(self, parent=None, allowedIDs=[]):
super(SObjectSelectEdit, self).__init__(parent)
self.allowedIDs = allowedIDs
self.entry = ''
objectBrowser = SalomePyQt.SalomePyQt().getObjectBrowser()
if objectBrowser:
objectBrowser.selectionChanged.connect(self.setSObject)
# Force update
self.setSObject()
def setAllowedIDs(self, IDs):
self.allowedIDs = IDs
def setSelectedEntry(self, entry):
self.entry = entry
def getSelectedEntry(self):
return self.entry
@pyqtSlot()
def setSObject(self):
entry = salome.sg.getSelected(0)
if not entry:
return
obj = salome.myStudy.FindObjectID(entry)
if not self.allowedIDs:
# If there are not ID restrictions, select whatever object.
self.setSelectedEntry(entry)
self.setText(obj.GetName())
self.objectSelected.emit()
return
ok, persistentIDAttr = obj.FindAttribute('AttributeLocalID')
if not ok:
self.setSelectedEntry('')
self.clear()
return
ID = persistentIDAttr.Value()
# Select only allowed IDs or select all if there are no ID restrictions
if ID in self.allowedIDs:
self.setSelectedEntry(entry)
name = obj.GetName()
self.setText(name)
self.objectSelected.emit()
else:
self.setSelectedEntry('')
self.clear()
class MyPlainText(QPlainTextEdit):
def __init__(self, parent=None):
super(MyPlainText, self).__init__(parent)
@pyqtSlot()
def setSObjects(self):
entries = salome.sg.getAllSelected()
if not entries:
# No object selected
return
self.clear()
items = []
for entry in entries:
obj = salome.myStudy.FindObjectID(entry)
items.append(obj.GetName())
self.setPlainText('\n'.join(items))
[docs]class Dialog(QDialog):
"""A base widget for creating menu dialogs. It makes creating custom
widgets easier by having prepared widgets for basic widget types.
It uses ObjectBrowser signals for automatic selection of salome objects,
that are accepted by the dialog via it's localID.
"""
def __init__(self, parent=None):
super(Dialog, self).__init__(parent)
# self.setWindowTitle()
self.setAttribute(Qt.WA_DeleteOnClose, True)
layout = QGridLayout()
self.widgetLayout = QFormLayout()
layout.addLayout(self.widgetLayout, 0, 0, 1, -1)
# Standard widgets
self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok |
QDialogButtonBox.Cancel |
QDialogButtonBox.Help)
self.buttonBox.accepted.connect(self.onApply)
self.buttonBox.rejected.connect(self.onClose)
self.buttonBox.helpRequested.connect(self.onHelp)
layout.addWidget(self.buttonBox, 1, 0)
self.setLayout(layout)
self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
self.addSpecialWidgets()
[docs] def onApply(self):
"""Virtual function. Process input data from widgets after clicking
the apply button.
"""
pass
[docs] def onClose(self):
"""Closes the dialog.
"""
self.close()
[docs] def onHelp(self):
"""Virtual function. Prints help message for the user.
"""
pass
[docs] def addSelectEdit(self, labelText='', objectID=[], fileDialog=False,
dirDialog=False, saveToFileDialog=False, filter=''):
"""Function that adds a QLineEdit that shows the current selected
object.
Arguments:
labelText (str): Display text
objectID (list): A list of acceptable IDs Type int..
"""
edit = self.addLineEdit(labelText=labelText, fileDialog=fileDialog,
dirDialog=dirDialog,
saveToFileDialog=saveToFileDialog,
filter=filter, selectWidget=True)
edit.setAllowedIDs(objectID)
edit.setSObject()
return edit
[docs] def addSelectDropDown(self, labelText=''):
"""Function that adds a QComboBox, which shows all the selected objects
in the object browser.
Arguments:
labelText (str): Display text
"""
dropDown = MyPlainText()
objectBrowser = SalomePyQt.SalomePyQt().getObjectBrowser()
objectBrowser.selectionChanged.connect(dropDown.setSObjects)
# Force update
dropDown.setSObjects()
if labelText:
self.widgetLayout.addRow(QLabel(labelText), dropDown)
else:
self.widgetLayout.addWidget(dropDown)
return dropDown
[docs] def addLabel(self, text):
"""Adds a row with a QLabel to the dialog.
"""
label = QLabel(text)
self.widgetLayout.addWidget(label)
[docs] def addLineEdit(self, labelText='', editText='', fileDialog=False,
dirDialog=False, saveToFileDialog=False, filter='',
selectWidget=False):
""" This function adds a QLinEdit widget with the possibility of a tool
button for opening file/directory browsers.
Args:
text (str): Default string for QLineEdit.
fileDialog (bool): If True a QToolButton is along QLineEdit that
opens a file or directory browser.
dirDialog (bool): If true the browser is a directory browser,
else it's a file browser.
Returns:
edit (QLineEdit): Returns the QLineEdit to retrieve text, etc...
"""
if selectWidget:
edit = SObjectSelectEdit(editText)
else:
edit = QLineEdit(editText)
if fileDialog:
icon = edit.style().standardIcon(QStyle.SP_DirOpenIcon)
a = edit.addAction(icon, QLineEdit.TrailingPosition)
a.setData(filter)
if saveToFileDialog:
a.triggered.connect(self.saveToFile)
elif dirDialog:
a.triggered.connect(self.findDir)
else:
a.triggered.connect(self.findFile)
if labelText:
self.widgetLayout.addRow(QLabel(labelText), edit)
else:
self.widgetLayout.addWidget(edit)
return edit
def addSpinBox(self, value, min, max, step, labelText=''):
edit = QSpinBox()
edit.setRange(min, max)
edit.setSingleStep(step)
edit.setValue(value)
if labelText != '':
self.widgetLayout.addRow(QLabel(labelText), edit)
else:
self.widgetLayout.addWidget(edit)
return edit
def addDoubleSpinBox(self, value, min, max, step, dec=6, labelText=''):
edit = QDoubleSpinBox()
edit.setDecimals(dec)
edit.setRange(min, max)
edit.setSingleStep(step)
edit.setValue(value)
if labelText != '':
self.widgetLayout.addRow(QLabel(labelText), edit)
else:
self.widgetLayout.addWidget(edit)
return edit
[docs] def addCheckBox(self, checkBoxText=''):
"""Adds a row of only checkbox.
"""
check = QCheckBox(checkBoxText)
self.widgetLayout.addRow(check)
return check
[docs] def addDropDown(self, labelText, args=[]):
""" This function adds a drop down button of passed arguments.
If args contain list of pairs, it will set the first element as the
text and second as the data.
I.e.:
if args == ['text1', 'text2']: Populate QComboBox with strings
if args == [('text1', 'data1'), ('text2', 'data2')]:
Populate the QComboBox with text *as displayed text and data*
as data value
Args:
labelText (str): Labeling the widget
args (arr): Elements to show in the drop down button.
Returns:
dropDown (QComboBox): A dropdown widget.
"""
dropDown = QComboBox(self)
if len(args[0]) == 2:
for text, data in args:
dropDown.addItem(text, data)
else:
dropDown.addItems(args)
self.widgetLayout.addRow(QLabel(labelText), dropDown)
return dropDown
[docs] def addMultiSelectionTreeView(self, headers, items):
"""Creates a QTreeView with multi selection mode.
Arguments:
headers (list): List of strings serving as the headers
items (list): List of data to display
"""
treeView = QTreeView()
treeView.setSelectionMode(QAbstractItemView.MultiSelection)
treeView.setEditTriggers(QAbstractItemView.NoEditTriggers)
N_headers = len(headers)
model = QStandardItemModel(0, N_headers, treeView)
for i in range(N_headers):
model.setHeaderData(i, Qt.Horizontal, headers[i])
for item in items:
model.insertRow(0)
for i in range(len(item)):
model.setData(model.index(0, i), item[i])
treeView.setModel(model)
self.widgetLayout.addRow(treeView)
return treeView
[docs] def addProgressBar(self):
"""Adds a status bar on the bottom of the dialog.
"""
layout = self.layout()
self.progressBar = QProgressBar(self)
layout.addWidget(self.progressBar, 2, 0, 1, -1)
[docs] @pyqtSlot()
def findFile(self):
"""A pyqtSlot that opens a file browser.
"""
sender = self.sender()
filter = sender.data() + ';; All files (*)'
inputLine = sender.parent()
curr_file = inputLine.text()
if curr_file == '':
curr_file = os.path.expanduser('~')
new_file = QFileDialog.getOpenFileName(self, "Select input file",
curr_file, filter=filter)[0]
if new_file:
inputLine.setText(new_file)
[docs] @pyqtSlot()
def findDir(self):
"""A pyqtSlot that opens a directory browser.
"""
sender = self.sender()
inputLine = sender.parent()
curr_dir = inputLine.text()
if curr_dir == '':
curr_dir = os.path.expanduser('~')
new_dir = QFileDialog.getExistingDirectory(self,
"Select directory",
curr_dir)
if new_dir:
inputLine.setText(new_dir)
[docs] @pyqtSlot()
def saveToFile(self):
"""A pyqtSlot that opens a save to file dialog.
"""
sender = self.sender()
filter = sender.data() + ';; All files (*)'
inputLine = sender.parent()
curr_dir = inputLine.text()
if curr_dir == '':
curr_dir = os.path.expanduser('~')
fileName, ok = QFileDialog.getSaveFileName(self,
'Select a file to save',
curr_dir, filter=filter)
if fileName:
inputLine.setText(fileName)
def displayMessage(self, title, text):
msg = QMessageBox()
msg.setIcon(QMessageBox.Information)
# msg.about(None, title, text)
msg.setStandardButtons(QMessageBox.Ok)
msg.setWindowTitle(title)
msg.setTextFormat(1)
msg.setText(text)
msg.exec_()