Ejemplo n.º 1
0
class PreferencesDialog(QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.setMinimumSize(800, 600)
        self.setWindowTitle(self.tr("Preferences"))

        self._preferences = Preferences()

        #
        # Content

        self._generalPage = PreferencesGeneralPage()
        self._generalPage.setZeroMargins()
        self._generalPage.preferencesChanged.connect(
            self._onPreferencesChanged)

        self._documentsPage = PreferencesDocumentsPage()
        self._documentsPage.setZeroMargins()
        self._documentsPage.preferencesChanged.connect(
            self._onPreferencesChanged)

        self._documentPresetsPage = PreferencesDocumentPresetsPage()
        self._documentPresetsPage.setZeroMargins()
        self._documentPresetsPage.preferencesChanged.connect(
            self._onPreferencesChanged)

        stackedBox = QStackedWidget()
        stackedBox.addWidget(self._generalPage)
        stackedBox.addWidget(self._documentsPage)
        stackedBox.addWidget(self._documentPresetsPage)
        stackedBox.setCurrentIndex(0)

        listBox = QListWidget()
        listBox.addItem(self._generalPage.title())
        listBox.addItem(self._documentsPage.title())
        listBox.addItem(self._documentPresetsPage.title())
        listBox.setCurrentRow(stackedBox.currentIndex())
        listBox.currentRowChanged.connect(stackedBox.setCurrentIndex)

        preferencesBox = QHBoxLayout()
        preferencesBox.addWidget(listBox, 1)
        preferencesBox.addWidget(stackedBox, 3)

        # Button box
        buttonBox = QDialogButtonBox(QDialogButtonBox.RestoreDefaults
                                     | QDialogButtonBox.Ok
                                     | QDialogButtonBox.Apply
                                     | QDialogButtonBox.Cancel)
        self._buttonApply = buttonBox.button(QDialogButtonBox.Apply)
        buttonBox.button(QDialogButtonBox.RestoreDefaults).clicked.connect(
            self._onButtonDefaultsClicked)
        buttonBox.accepted.connect(self._onButtonOkClicked)
        buttonBox.button(QDialogButtonBox.Apply).clicked.connect(
            self._onButtonApplyClicked)
        buttonBox.rejected.connect(self.close)

        # Main layout
        layout = QVBoxLayout(self)
        layout.addLayout(preferencesBox)
        layout.addWidget(buttonBox)

        self._updatePreferences()
        self._buttonApply.setEnabled(False)

    def setPreferences(self, preferences):

        self._preferences = preferences

        self._updatePreferences()
        self._buttonApply.setEnabled(False)

    def preferences(self):

        return self._preferences

    def _onPreferencesChanged(self):

        self._buttonApply.setEnabled(True)

    def _onButtonDefaultsClicked(self):

        self._updatePreferences(True)

    def _onButtonOkClicked(self):

        self._savePreferences()
        self.close()

    def _onButtonApplyClicked(self):

        self._savePreferences()
        self._buttonApply.setEnabled(False)

    def _updatePreferences(self, isDefault=False):

        # General: Geometry & State
        self._generalPage.setRestoreApplicationGeometry(
            self._preferences.restoreApplicationGeometry(isDefault))
        self._generalPage.setRestoreApplicationState(
            self._preferences.restoreApplicationState(isDefault))

        # General: Recently Opened Documents
        self._generalPage.setMaximumRecentDocuments(
            self._preferences.maximumRecentDocuments(isDefault))
        self._generalPage.setRestoreRecentDocuments(
            self._preferences.restoreRecentDocuments(isDefault))

        # Document Presets: Header Labels
        self._documentPresetsPage.setDefaultHeaderLabelHorizontal(
            self._preferences.defaultHeaderLabelHorizontal(isDefault))
        self._documentPresetsPage.setDefaultHeaderLabelVertical(
            self._preferences.defaultHeaderLabelVertical(isDefault))

        # Document Presets: Cell Counts
        self._documentPresetsPage.setDefaultCellCountColumn(
            self._preferences.defaultCellCountColumn(isDefault))
        self._documentPresetsPage.setDefaultCellCountRow(
            self._preferences.defaultCellCountRow(isDefault))

    def _savePreferences(self):

        # General: Geometry & State
        self._preferences.setRestoreApplicationGeometry(
            self._generalPage.restoreApplicationGeometry())
        self._preferences.setRestoreApplicationState(
            self._generalPage.restoreApplicationState())

        # General: Recently Opened Documents
        self._preferences.setMaximumRecentDocuments(
            self._generalPage.maximumRecentDocuments())
        self._preferences.setRestoreRecentDocuments(
            self._generalPage.restoreRecentDocuments())

        # Document Presets: Header Labels
        self._preferences.setDefaultHeaderLabelHorizontal(
            self._documentPresetsPage.defaultHeaderLabelHorizontal())
        self._preferences.setDefaultHeaderLabelVertical(
            self._documentPresetsPage.defaultHeaderLabelVertical())

        # Document Presets: Cell Counts
        self._preferences.setDefaultCellCountColumn(
            self._documentPresetsPage.defaultCellCountColumn())
        self._preferences.setDefaultCellCountRow(
            self._documentPresetsPage.defaultCellCountRow())