From 9a76d0b3ee35a0787d37521631efa84410f85d5f Mon Sep 17 00:00:00 2001 From: Olivier Keshavjee Date: Wed, 17 Jun 2015 09:33:25 +0200 Subject: [PATCH] Settings: app style and auto save (though autosave is not implemented yet) --- src/main.py | 7 +- src/mainWindow.py | 27 ++++---- src/settings.py | 23 ++++++- src/settingsWindow.py | 29 ++++++++- src/ui/mainWindow.py | 16 +++-- src/ui/mainWindow.ui | 9 +++ src/ui/settings.py | 71 +++++++++++++++++++-- src/ui/settings.ui | 120 +++++++++++++++++++++++++++++++++++ test_project/settings.pickle | Bin 416 -> 469 bytes 9 files changed, 273 insertions(+), 29 deletions(-) diff --git a/src/main.py b/src/main.py index 0a7f8797..42a94d26 100644 --- a/src/main.py +++ b/src/main.py @@ -27,8 +27,13 @@ def run(): else: print(app.tr("Failed to load translator for {}...").format(locale)) - from mainWindow import MainWindow + # Load style from QSettings + settings = QSettings(app.organizationName(), app.applicationName()) + if settings.contains("applicationStyle"): + style = settings.value("applicationStyle") + app.setStyle(style) + from mainWindow import MainWindow main = MainWindow() main.show() diff --git a/src/mainWindow.py b/src/mainWindow.py index fd6894f1..88cac3da 100644 --- a/src/mainWindow.py +++ b/src/mainWindow.py @@ -209,6 +209,8 @@ class MainWindow(QMainWindow, Ui_MainWindow): # Main Menu self.actLabels.triggered.connect(self.settingsLabel) self.actStatus.triggered.connect(self.settingsStatus) + self.actSettings.triggered.connect(self.settingsWindow) + self.actQuit.triggered.connect(self.close) self.generateViewMenu() @@ -221,12 +223,6 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.lstDebugLabels.setModel(self.mdlLabels) self.lstDebugStatus.setModel(self.mdlStatus) - - # Playing with qStyle - self.cmbStyle.addItems(list(QStyleFactory.keys())) - self.cmbStyle.setCurrentIndex([i.lower() for i in list(QStyleFactory.keys())].index(qApp.style().objectName())) - self.cmbStyle.currentIndexChanged[str].connect(qApp.setStyle) - self.loadProject("test_project") #################################################################################################### @@ -422,12 +418,15 @@ class MainWindow(QMainWindow, Ui_MainWindow): settings.lastIndex = self.mdlOutline.pathToIndex(sel) # Save data from models - saveStandardItemModelXML(self.mdlFlatData, "{}/flatModel.xml".format(self.currentProject)) - saveStandardItemModelXML(self.mdlPersos, "{}/perso.xml".format(self.currentProject)) - saveStandardItemModelXML(self.mdlPersosInfos, "{}/persoInfos.xml".format(self.currentProject)) - saveStandardItemModelXML(self.mdlLabels, "{}/labels.xml".format(self.currentProject)) - saveStandardItemModelXML(self.mdlStatus, "{}/status.xml".format(self.currentProject)) - self.mdlOutline.saveToXML("{}/outline.xml".format(self.currentProject)) + if settings.saveOnQuit: + saveStandardItemModelXML(self.mdlFlatData, "{}/flatModel.xml".format(self.currentProject)) + saveStandardItemModelXML(self.mdlPersos, "{}/perso.xml".format(self.currentProject)) + saveStandardItemModelXML(self.mdlPersosInfos, "{}/persoInfos.xml".format(self.currentProject)) + saveStandardItemModelXML(self.mdlLabels, "{}/labels.xml".format(self.currentProject)) + saveStandardItemModelXML(self.mdlStatus, "{}/status.xml".format(self.currentProject)) + self.mdlOutline.saveToXML("{}/outline.xml".format(self.currentProject)) + + # Save settings settings.save("{}/settings.pickle".format(self.currentProject)) # closeEvent @@ -583,10 +582,10 @@ class MainWindow(QMainWindow, Ui_MainWindow): #################################################################################################### def settingsLabel(self): - self.settingsWindow(0) + self.settingsWindow(1) def settingsStatus(self): - self.settingsWindow(1) + self.settingsWindow(2) def settingsWindow(self, tab=None): self.sw = settingsWindow(self) diff --git a/src/settings.py b/src/settings.py index f077e678..b69ab15d 100644 --- a/src/settings.py +++ b/src/settings.py @@ -29,10 +29,14 @@ corkSizeFactor = 100 folderView = "cork" lastTab = 0 lastIndex = "" +autoSave = True +autoSaveDelay = 5 +saveOnQuit = True def save(filename): - global spellcheck, dict, corkSliderFactor, viewSettings, corkSizeFactor, folderView, lastTab, lastIndex + global spellcheck, dict, corkSliderFactor, viewSettings, corkSizeFactor, folderView, lastTab, lastIndex, \ + autoSave, autoSaveDelay, saveOnQuit allSettings = { "viewSettings": viewSettings, @@ -41,7 +45,10 @@ def save(filename): "corkSizeFactor": corkSizeFactor, "folderView": folderView, "lastTab": lastTab, - "lastIndex": lastIndex + "lastIndex": lastIndex, + "autoSave":autoSave, + "autoSaveDelay":autoSaveDelay, + "saveOnQuit":saveOnQuit, } #pp=pprint.PrettyPrinter(indent=4, compact=False) @@ -94,5 +101,17 @@ def load(filename): global lastIndex lastIndex = allSettings["lastIndex"] + if "autoSave" in allSettings: + global autoSave + autoSave = allSettings["autoSave"] + + if "autoSaveDelay" in allSettings: + global autoSaveDelay + autoSaveDelay = allSettings["autoSaveDelay"] + + if "saveOnQuit" in allSettings: + global saveOnQuit + saveOnQuit = allSettings["saveOnQuit"] + \ No newline at end of file diff --git a/src/settingsWindow.py b/src/settingsWindow.py index 62ced753..9ef54515 100644 --- a/src/settingsWindow.py +++ b/src/settingsWindow.py @@ -6,7 +6,7 @@ from qt import * from ui.settings import * from enums import * from functions import * - +import settings # Spell checker support try: import enchant @@ -21,6 +21,19 @@ class settingsWindow(QWidget, Ui_Settings): self.mw = mainWindow + # General + self.cmbStyle.addItems(list(QStyleFactory.keys())) + self.cmbStyle.setCurrentIndex([i.lower() for i in list(QStyleFactory.keys())].index(qApp.style().objectName())) + self.cmbStyle.currentIndexChanged[str].connect(self.setStyle) + + self.txtAutoSave.setValidator(QIntValidator(0, 999, self)) + self.chkAutoSave.setChecked(settings.autoSave) + self.txtAutoSave.setText(str(settings.autoSaveDelay)) + self.chkSaveOnQuit.setChecked(settings.saveOnQuit) + self.chkAutoSave.stateChanged.connect(self.saveSettingsChanged) + self.chkSaveOnQuit.stateChanged.connect(self.saveSettingsChanged) + self.txtAutoSave.textEdited.connect(self.saveSettingsChanged) + # Labels self.lstLabels.setModel(self.mw.mdlLabels) self.lstLabels.setRowHidden(0, True) @@ -35,6 +48,20 @@ class settingsWindow(QWidget, Ui_Settings): self.btnStatusAdd.clicked.connect(self.addStatus) self.btnStatusRemove.clicked.connect(self.removeStatus) + def setStyle(self, style): + #Save style to Qt Settings + settings = QSettings(qApp.organizationName(), qApp.applicationName()) + settings.setValue("applicationStyle", style) + qApp.setStyle(style) + + def saveSettingsChanged(self): + if self.txtAutoSave.text() in ["", "0"]: + self.txtAutoSave.setText("1") + settings.autoSave = True if self.chkAutoSave.checkState() else False + settings.saveOnQuit = True if self.chkSaveOnQuit.checkState() else False + settings.autoSaveDelay = int(self.txtAutoSave.text()) + + def addStatus(self): self.mw.mdlStatus.appendRow(QStandardItem(self.tr("New status"))) diff --git a/src/ui/mainWindow.py b/src/ui/mainWindow.py index dc443898..6bc109b2 100644 --- a/src/ui/mainWindow.py +++ b/src/ui/mainWindow.py @@ -1044,6 +1044,10 @@ class Ui_MainWindow(object): self.actViewCork.setObjectName("actViewCork") self.actViewOutline = QtWidgets.QAction(MainWindow) self.actViewOutline.setObjectName("actViewOutline") + self.actSettings = QtWidgets.QAction(MainWindow) + icon = QtGui.QIcon.fromTheme("preferences-system") + self.actSettings.setIcon(icon) + self.actSettings.setObjectName("actSettings") self.menuFile.addAction(self.actNew) self.menuFile.addAction(self.actOpen) self.menuFile.addAction(self.actRecents) @@ -1058,6 +1062,7 @@ class Ui_MainWindow(object): self.menuTools.addAction(self.actSpellcheck) self.menuEdit.addAction(self.actLabels) self.menuEdit.addAction(self.actStatus) + self.menuEdit.addAction(self.actSettings) self.menubar.addAction(self.menuFile.menuAction()) self.menubar.addAction(self.menuEdit.menuAction()) self.menubar.addAction(self.menuMode.menuAction()) @@ -1240,12 +1245,13 @@ class Ui_MainWindow(object): self.actModeFractal.setText(_translate("MainWindow", "Fractal")) self.actViewCork.setText(_translate("MainWindow", "Index cards")) self.actViewOutline.setText(_translate("MainWindow", "Outline")) + self.actSettings.setText(_translate("MainWindow", "Settings")) -from ui.views.basicItemView import basicItemView -from ui.views.textEditView import textEditView from ui.editors.editorWidget import editorWidget -from ui.sldImportance import sldImportance +from ui.views.basicItemView import basicItemView from ui.views.lineEditView import lineEditView -from ui.views.metadataView import metadataView -from ui.views.outlineView import outlineView from ui.views.treeView import treeView +from ui.views.textEditView import textEditView +from ui.views.outlineView import outlineView +from ui.views.metadataView import metadataView +from ui.sldImportance import sldImportance diff --git a/src/ui/mainWindow.ui b/src/ui/mainWindow.ui index 71de40d9..0926172a 100644 --- a/src/ui/mainWindow.ui +++ b/src/ui/mainWindow.ui @@ -1915,6 +1915,7 @@ + @@ -2097,6 +2098,14 @@ Outline + + + + + + Settings + + diff --git a/src/ui/settings.py b/src/ui/settings.py index 0272f7bb..14b49e27 100644 --- a/src/ui/settings.py +++ b/src/ui/settings.py @@ -15,7 +15,59 @@ class Ui_Settings(object): self.verticalLayout = QtWidgets.QVBoxLayout(Settings) self.verticalLayout.setObjectName("verticalLayout") self.tabWidget = QtWidgets.QTabWidget(Settings) + self.tabWidget.setDocumentMode(True) self.tabWidget.setObjectName("tabWidget") + self.tab_3 = QtWidgets.QWidget() + self.tab_3.setObjectName("tab_3") + self.verticalLayout_7 = QtWidgets.QVBoxLayout(self.tab_3) + self.verticalLayout_7.setObjectName("verticalLayout_7") + self.groupBox_2 = QtWidgets.QGroupBox(self.tab_3) + self.groupBox_2.setObjectName("groupBox_2") + self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.groupBox_2) + self.verticalLayout_5.setObjectName("verticalLayout_5") + self.label_2 = QtWidgets.QLabel(self.groupBox_2) + self.label_2.setObjectName("label_2") + self.verticalLayout_5.addWidget(self.label_2) + self.cmbStyle = QtWidgets.QComboBox(self.groupBox_2) + self.cmbStyle.setObjectName("cmbStyle") + self.verticalLayout_5.addWidget(self.cmbStyle) + self.verticalLayout_7.addWidget(self.groupBox_2) + self.groupBox = QtWidgets.QGroupBox(self.tab_3) + self.groupBox.setObjectName("groupBox") + self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.groupBox) + self.verticalLayout_6.setObjectName("verticalLayout_6") + self.horizontalLayout_5 = QtWidgets.QHBoxLayout() + self.horizontalLayout_5.setObjectName("horizontalLayout_5") + self.chkAutoSave = QtWidgets.QCheckBox(self.groupBox) + self.chkAutoSave.setChecked(True) + self.chkAutoSave.setObjectName("chkAutoSave") + self.horizontalLayout_5.addWidget(self.chkAutoSave) + self.txtAutoSave = QtWidgets.QLineEdit(self.groupBox) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.txtAutoSave.sizePolicy().hasHeightForWidth()) + self.txtAutoSave.setSizePolicy(sizePolicy) + self.txtAutoSave.setMaximumSize(QtCore.QSize(50, 16777215)) + self.txtAutoSave.setStyleSheet("border-radius: 6px;") + self.txtAutoSave.setMaxLength(3) + self.txtAutoSave.setAlignment(QtCore.Qt.AlignCenter) + self.txtAutoSave.setObjectName("txtAutoSave") + self.horizontalLayout_5.addWidget(self.txtAutoSave) + self.label = QtWidgets.QLabel(self.groupBox) + self.label.setObjectName("label") + self.horizontalLayout_5.addWidget(self.label) + spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.horizontalLayout_5.addItem(spacerItem) + self.verticalLayout_6.addLayout(self.horizontalLayout_5) + self.chkSaveOnQuit = QtWidgets.QCheckBox(self.groupBox) + self.chkSaveOnQuit.setChecked(True) + self.chkSaveOnQuit.setObjectName("chkSaveOnQuit") + self.verticalLayout_6.addWidget(self.chkSaveOnQuit) + self.verticalLayout_7.addWidget(self.groupBox) + spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.verticalLayout_7.addItem(spacerItem1) + self.tabWidget.addTab(self.tab_3, "") self.tab = QtWidgets.QWidget() self.tab.setObjectName("tab") self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.tab) @@ -40,8 +92,8 @@ class Ui_Settings(object): self.btnLabelColor.setIconSize(QtCore.QSize(64, 64)) self.btnLabelColor.setObjectName("btnLabelColor") self.verticalLayout_2.addWidget(self.btnLabelColor) - spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) - self.verticalLayout_2.addItem(spacerItem) + spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.verticalLayout_2.addItem(spacerItem2) self.horizontalLayout_2.addLayout(self.verticalLayout_2) self.verticalLayout_3.addLayout(self.horizontalLayout_2) self.horizontalLayout = QtWidgets.QHBoxLayout() @@ -58,8 +110,8 @@ class Ui_Settings(object): self.btnLabelRemove.setIcon(icon) self.btnLabelRemove.setObjectName("btnLabelRemove") self.horizontalLayout.addWidget(self.btnLabelRemove) - spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) - self.horizontalLayout.addItem(spacerItem1) + spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.horizontalLayout.addItem(spacerItem3) self.verticalLayout_3.addLayout(self.horizontalLayout) self.tabWidget.addTab(self.tab, "") self.tab_2 = QtWidgets.QWidget() @@ -83,8 +135,8 @@ class Ui_Settings(object): self.btnStatusRemove.setIcon(icon) self.btnStatusRemove.setObjectName("btnStatusRemove") self.horizontalLayout_3.addWidget(self.btnStatusRemove) - spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) - self.horizontalLayout_3.addItem(spacerItem2) + spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.horizontalLayout_3.addItem(spacerItem4) self.verticalLayout_4.addLayout(self.horizontalLayout_3) self.tabWidget.addTab(self.tab_2, "") self.verticalLayout.addWidget(self.tabWidget) @@ -96,6 +148,13 @@ class Ui_Settings(object): def retranslateUi(self, Settings): _translate = QtCore.QCoreApplication.translate Settings.setWindowTitle(_translate("Settings", "Form")) + self.groupBox_2.setTitle(_translate("Settings", "Application style")) + self.label_2.setText(_translate("Settings", "You might need to restart the app in order to avoid some visual issues.")) + self.groupBox.setTitle(_translate("Settings", "Saving")) + self.chkAutoSave.setText(_translate("Settings", "Automatically save every")) + self.label.setText(_translate("Settings", "minutes.")) + self.chkSaveOnQuit.setText(_translate("Settings", "Save on quit")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _translate("Settings", "General")) self.btnLabelColor.setShortcut(_translate("Settings", "Ctrl+S")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("Settings", "Labels")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("Settings", "Status")) diff --git a/src/ui/settings.ui b/src/ui/settings.ui index 07d04c27..8e781265 100644 --- a/src/ui/settings.ui +++ b/src/ui/settings.ui @@ -19,6 +19,126 @@ 0 + + true + + + + General + + + + + + Application style + + + + + + You might need to restart the app in order to avoid some visual issues. + + + + + + + + + + + + + Saving + + + + + + + + Automatically save every + + + true + + + + + + + + 0 + 0 + + + + + 50 + 16777215 + + + + border-radius: 6px; + + + 3 + + + Qt::AlignCenter + + + + + + + minutes. + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Save on quit + + + true + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + Labels diff --git a/test_project/settings.pickle b/test_project/settings.pickle index 4ec8c34eae02fcb830b75fc093e26585647272b7..4c5562748d2a271ba386b69d82d48ec56163eab1 100644 GIT binary patch literal 469 zcmY*WO-}+b5M5oq1yod2{Px7j9|4AhU_^zG-b~pY*bQ~dlorus6OZ_>oh^9SQ|HaR zzIl1`4d z+-q7!J7JV#tTb7USOgtis56(`zVt_UVK!n4054;_ zO87}q8}rv&c9M2me#}Dwcw-DJ5dOaj-mY1da1z!a{Duzqv{ZQ4gH6nH5W)+_ Ywf};*%qP0~&p{T$3hx+=4&E0JKS2&`*8l(j