Source code for base_dialog

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 addSpecialWidgets(self): """Virtual function. Adds additional widgets. """ pass
[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_()