settingsmixin.py
1 #!/usr/bin/python2.7 2 """ 3 src/settingsmixin.py 4 ==================== 5 6 """ 7 8 from PyQt4 import QtCore, QtGui 9 10 11 class SettingsMixin(object): 12 """Mixin for adding geometry and state saving between restarts.""" 13 def warnIfNoObjectName(self): 14 """ 15 Handle objects which don't have a name. Currently it ignores them. Objects without a name can't have their 16 state/geometry saved as they don't have an identifier. 17 """ 18 if self.objectName() == "": 19 # .. todo:: logger 20 pass 21 22 def writeState(self, source): 23 """Save object state (e.g. relative position of a splitter)""" 24 self.warnIfNoObjectName() 25 settings = QtCore.QSettings() 26 settings.beginGroup(self.objectName()) 27 settings.setValue("state", source.saveState()) 28 settings.endGroup() 29 30 def writeGeometry(self, source): 31 """Save object geometry (e.g. window size and position)""" 32 self.warnIfNoObjectName() 33 settings = QtCore.QSettings() 34 settings.beginGroup(self.objectName()) 35 settings.setValue("geometry", source.saveGeometry()) 36 settings.endGroup() 37 38 def readGeometry(self, target): 39 """Load object geometry""" 40 self.warnIfNoObjectName() 41 settings = QtCore.QSettings() 42 try: 43 geom = settings.value("/".join([str(self.objectName()), "geometry"])) 44 target.restoreGeometry(geom.toByteArray() if hasattr(geom, 'toByteArray') else geom) 45 except Exception: 46 pass 47 48 def readState(self, target): 49 """Load object state""" 50 self.warnIfNoObjectName() 51 settings = QtCore.QSettings() 52 try: 53 state = settings.value("/".join([str(self.objectName()), "state"])) 54 target.restoreState(state.toByteArray() if hasattr(state, 'toByteArray') else state) 55 except Exception: 56 pass 57 58 59 class SMainWindow(QtGui.QMainWindow, SettingsMixin): 60 """Main window with Settings functionality.""" 61 def loadSettings(self): 62 """Load main window settings.""" 63 self.readGeometry(self) 64 self.readState(self) 65 66 def saveSettings(self): 67 """Save main window settings""" 68 self.writeState(self) 69 self.writeGeometry(self) 70 71 72 class STableWidget(QtGui.QTableWidget, SettingsMixin): 73 """Table widget with Settings functionality""" 74 # pylint: disable=too-many-ancestors 75 def loadSettings(self): 76 """Load table settings.""" 77 self.readState(self.horizontalHeader()) 78 79 def saveSettings(self): 80 """Save table settings.""" 81 self.writeState(self.horizontalHeader()) 82 83 84 class SSplitter(QtGui.QSplitter, SettingsMixin): 85 """Splitter with Settings functionality.""" 86 def loadSettings(self): 87 """Load splitter settings""" 88 self.readState(self) 89 90 def saveSettings(self): 91 """Save splitter settings.""" 92 self.writeState(self) 93 94 95 class STreeWidget(QtGui.QTreeWidget, SettingsMixin): 96 """Tree widget with settings functionality.""" 97 # pylint: disable=too-many-ancestors 98 def loadSettings(self): 99 """Load tree settings.""" 100 # recurse children 101 # self.readState(self) 102 pass 103 104 def saveSettings(self): 105 """Save tree settings""" 106 # recurse children 107 # self.writeState(self) 108 pass