def initSubWidgets(self):
     # Set up model and view
     self.storedSettingsModel = StoredSettingsModel(self._widgetName)
     self.getChild('storedSettingsView').setModel(self.storedSettingsModel)
class QStoredSettingsWidget(QFrame):

    def __init__(self, propertyWidget, parentButton, *args):
        """
        propertyWidget is the specific widget that the properties will be applied to.
        So when a user selects a set of properties from the list, they will be applied
        to the widget defined in propertyWidget.
        """
        QFrame.__init__(self, *args)
        self._app = QApplication.instance().window
        self.setPropertyWidget(propertyWidget)
        self._parentButton = parentButton

    def initSubWidgets(self):
        # Set up model and view
        self.storedSettingsModel = StoredSettingsModel(self._widgetName)
        self.getChild('storedSettingsView').setModel(self.storedSettingsModel)

    def getChild(self, name):
        return self.findChild(QWidget, name)

    def propertyWidget(self):
        return self._propertyWidget

    def setPropertyWidget(self, propertyWidget):
        self._propertyWidget = propertyWidget
        self._widgetName = propertyWidget.__class__.__name__

    def saveClicked(self):
        properties = self.propertyWidget().getCurrentUi()
        if self._widgetName not in self._app.storedSettings().keys():
            self._app.storedSettings()[self._widgetName] = []

        # Get the name the user wants to use
        nameDialog = QDialog(self)
        nameUi = Ui_StoredSettingsName()
        nameUi.setupUi(nameDialog)

        def saveSettings():
            name = Util.getWidgetValue(nameUi.name)
            name = name.strip()
            if name == "":
                failedMessage = QMessageBox(nameDialog)
                failedMessage.setText("Cannot use a blank name.")
                failedMessage.exec_()
            else:
                self._app.storedSettings()[self._widgetName].append([name, properties])
                nameDialog.close()

        def cancelSettings():
            nameDialog.close()

        nameUi.buttons.accepted.connect(saveSettings)
        nameUi.buttons.rejected.connect(cancelSettings)

        nameDialog.exec_()

        self.storedSettingsModel.doReset()
        
    def loadClicked(self):
        try:
            properties = self.getChild('storedSettingsView').selectedIndexes()[0].internalPointer()[1]
            self.propertyWidget().setCurrentUi(properties)
        except IndexError:
            pass

        self._parentButton.toggleWidget(False)

    def deleteClicked(self):
        try:
            self._app.storedSettings()[self._widgetName].remove(self.getChild('storedSettingsView').selectedIndexes()[0].internalPointer())
        except IndexError:
            pass

        self.storedSettingsModel.doReset()

    def resetGeometry(self):
        self.setGeometry(self._parentButton.x() - self.width(), self._parentButton.y(), self.width(), self._parentButton.height())