PrefSaver

PrefSaver simplifies your process of saving UI component’s various states (control values, selected items, collapse states for Tree controls, active tabs for Tab controls and so on) and serializing them to different destinations (binary files, json text files, Maya optionVars). It is suitable for standalone applications and for apps run within Maya.

Currently supported UI frameworks

  • PyQt
  • PySide
  • Maya PyMel UI
  • Maya UI

Installation

PrefSaver is a part of FX Python Tools. Download fxpt from Github and place it in your PYTHONPATH directory.

Getting Help

Just import PrefSaver and run help()

from fxpt.fx_prefsaver import PrefSaver
help(PrefSaver)

Typical usage

1. Create Serializer

from fxpt.fx_prefsaver import Serializers
mySerializer = Serializers.SerializerFileJson('path/to/pref/file/prefs.cfg')

2. Create PrefSaver instance

from fxpt.fx_prefsaver import PrefSaver
myPrefSaver = PrefSaver(mySerializer)

3. Add some controls to PrefSaver providing their types and OPTIONAL default value

myPrefSaver.addControl(myPyQtLineEdit, PrefSaver.UIType.PYQTLineEdit)
myPrefSaver.addControl(myPySideChkBox, PrefSaver.UIType.PYSIDECheckBox, QtCore.Qt.Unchecked)
myPrefSaver.addControl(myPyMelFloatField, PrefSaver.UIType.PMFloatField, 4.568)
myPrefSaver.addControl(myMayaCheckBoxGroup2, PrefSaver.UIType.MCheckBoxGrp2, [False, False])

4. Also you can add a variable instead of control

You will need to provide variable name, getter callable, setter callable and default value:

def variableGetter():
    return myVariable
def variableSetter(arg):
    myVariable = arg
myPrefSaver.addVariable('myVariable', variableGetter, variableSetter, defaultVariableValue)

5. Use your PrefSaver

To save control states:

myPrefSaver.savePrefs()

To load control states:

myPrefSaver.loadPrefs()

To reset control states to defaults (even if you did not supply them – there are global defaults for each control):

myPrefSaver.resetPrefs()

IMPORTANT NOTE #1

When creating PyMel or Maya Controls always provide your own custom name. In that case control name always be the same and will not change from run to run. For example:

myPyMelCheckBox = pymel.core.checkBox('myPyMelCheckBox', label='My PyMel Check Box')
myMelCheckBox = maya.cmds.checkBox('myMelCheckBox', label='My Mel Check Box')

When you create Qt controls BY CODE, also do not forget to setup control name:

myPyQtCheckBox = PyQt4.QtGui.QCheckBox()
myPyQtCheckBox.setObjectName('myPyQtCheckBox')
myPySideCheckBox = PySide.QtGui.QCheckBox()
myPySideCheckBox.setObjectName('myPySideCheckBox')

IMPORTANT NOTE #2

Make sure that all your control names are unique.

Available serializers

SerializerFilePickle('path/to/pref/file/prefs.cfg')

serializes data to binary file using pickle

SerializerFileJson('path/to/pref/file/prefs.cfg')

serializes data to text JSON file

SerializerOptVar('mayaOptionVarName')

serializes data to Maya optionVar (available only within Maya)

Available control types and their acceptable defaults

PyQt Types

PYQTCheckAction   bool
PYQTCheckBox   QtCore.Qt.CheckState
PYQTCheckButton   bool
PYQTComboBox   int: current item index (0-based)
PYQTComboBoxEditable   int: current item index (0-based)
PYQTDateEdit   str in format 'yyyy.MM.dd' or QDate object
PYQTDateTimeEdit   str in format 'yyyy.MM.dd HH:mm:ss.zzz' (24 hours) or QDateTime object
PYQTDial   int or float
PYQTDoubleSpinBox   int or float
PYQTLineEdit   str
PYQTListView   anything: no default value, ignored
PYQTListWidget   anything: no default value, ignored
PYQTPlainTextEdit   str
PYQTRadioButton   bool
PYQTScrollArea   [int, int]: tuple or list with horizontal and vertical scroll values
PYQTScrollBar   int
PYQTSlider   int or float
PYQTSpinBox   int or float
PYQTSplitter   [int, int, ...]: tuple or list with section sizes
PYQTStackedWidget   int: current widget index (0-based)
PYQTTabWidget   int: current tab index (0-based)
PYQTTableView   anything: no default value, ignored
PYQTTableWidget   anything: no default value, ignored
PYQTTextEdit   str
PYQTTimeEdit   str in format 'HH:mm:ss.zzz' (24 hours) or QTime object
PYQTToolBox   int: current tab index (0-based)
PYQTTreeView   anything: no default value, ignored
PYQTTreeWidget   anything: no default value, ignored
PYQTWindow    [int, int, int, int]: tuple or list with top and left corner coordinates, width and height

PySide Types

PYSIDECheckAction   bool
PYSIDECheckBox   QtCore.Qt.CheckState
PYSIDECheckButton   bool
PYSIDEComboBox   int: current item index (0-based)
PYSIDEComboBoxEditable   int: current item index (0-based)
PYSIDEDateEdit   str in format 'yyyy.MM.dd' or QDate object
PYSIDEDateTimeEdit   str in format 'yyyy.MM.dd HH:mm:ss.zzz' (24 hours) or QDateTime object
PYSIDEDial   int or float
PYSIDEDoubleSpinBox   int or float
PYSIDELineEdit   str
PYSIDEListView   anything: no default value, ignored
PYSIDEListWidget   anything: no default value, ignored
PYSIDEPlainTextEdit   str
PYSIDERadioButton   bool
PYSIDEScrollArea   [int, int]: tuple or list with horizontal and vertical scroll values
PYSIDEScrollBar   int
PYSIDESlider   int or float
PYSIDESpinBox   int or float
PYSIDESplitter   [int, int, ...]: tuple or list with section sizes
PYSIDEStackedWidget   int: current widget index (0-based)
PYSIDETabWidget   int: current tab index (0-based)
PYSIDETableView   anything: no default value, ignored
PYSIDETableWidget   anything: no default value, ignored
PYSIDETextEdit   str
PYSIDETimeEdit   str in format 'HH:mm:ss.zzz' (24 hours) or QTime object
PYSIDEToolBox   int: current tab index (0-based)
PYSIDETreeView   anything: no default value, ignored
PYSIDETreeWidget   anything: no default value, ignored
PYSIDEWindow   [int, int, int, int]: tuple or list with top and left corner coordinates, width and height

Maya Types

MCheckBox   bool
MCheckBoxGrp1   [bool]: tuple or list
MCheckBoxGrp2   [bool, bool]: tuple or list
MCheckBoxGrp3   [bool, bool, bool]: tuple or list
MCheckBoxGrp4   [bool, bool, bool, bool]: tuple or list
MColorSliderGrp   [float, float, float]: tuple or list with Red, Green and Blue values (0-1 range)
MFloatField   float
MFloatFieldGrp1   [float]: tuple or list
MFloatFieldGrp2   [float, float]: tuple or list
MFloatFieldGrp3   [float, float, float]: tuple or list
MFloatFieldGrp4   [float, float, float, float]: tuple or list
MFloatScrollBar   float
MFloatSlider   float
MFloatSliderGrp   float
MFrameLayout   bool: collapse state
MIconTextCheckBox   bool
MIconTextRadioButton   bool
MIconTextScrollList   [int, int, ...]: tuple or list with selected indexes
MIntField   int
MIntFieldGrp1   [int]: tuple or list
MIntFieldGrp2   [int, int]: tuple or list
MIntFieldGrp3   [int, int, int]: tuple or list
MIntFieldGrp4   [int, int, int, int]: tuple or list
MIntScrollBar   int
MIntSlider   int
MIntSliderGrp   int
MOptionMenu   int: current item index (1-based)
MOptionMenuGrp   int: current item index (1-based)
MRadioButton   bool
MRadioButtonGrp1   int: current item index (1-based)
MRadioButtonGrp2   int: current item index (1-based)
MRadioButtonGrp3   int: current item index (1-based)
MRadioButtonGrp4   int: current item index (1-based)
MScriptTable   anything: no default value, ignored
MScrollField   str
MScrollLayout   [int, int]: tuple or list with horizontal and vertical scroll values
MShelfTabLayout   int: current tab index (1-based)
MSymbolCheckBox   bool
MTabLayout   int: current tab index (1-based)
MTextField   str
MTextFieldButtonGrp   str
MTextFieldGrp   str
MTextScrollList   [int, int, ...]: tuple or list with selected indexes

PyMel Types

PMCheckBox   bool
PMCheckBoxGrp1   [bool]: tuple or list
PMCheckBoxGrp2   [bool, bool]: tuple or list
PMCheckBoxGrp3   [bool, bool, bool]: tuple or list
PMCheckBoxGrp4   [bool, bool, bool, bool]: tuple or list
PMColorSliderGrp   [float, float, float]: tuple or list with Red, Green and Blue values (0-1 range)
PMFloatField   float
PMFloatFieldGrp1   [float]: tuple or list
PMFloatFieldGrp2   [float, float]: tuple or list
PMFloatFieldGrp3   [float, float, float]: tuple or list
PMFloatFieldGrp4   [float, float, float, float]: tuple or list
PMFloatScrollBar   float
PMFloatSlider   float
PMFloatSliderGrp   float
PMFrameLayout   bool: collapse state
PMIconTextCheckBox   bool
PMIconTextRadioButton   bool
PMIconTextScrollList   [int, int, ...]: tuple or list with selected indexes
PMIntField   int
PMIntFieldGrp1   [int]: tuple or list
PMIntFieldGrp2   [int, int]: tuple or list
PMIntFieldGrp3   [int, int, int]: tuple or list
PMIntFieldGrp4   [int, int, int, int]: tuple or list
PMIntScrollBar   int
PMIntSlider   int
PMIntSliderGrp   int
PMOptionMenu   int: current item index (1-based)
PMOptionMenuGrp   int: current item index (1-based)
PMRadioButton   bool
PMRadioButtonGrp1   int: current item index (1-based)
PMRadioButtonGrp2   int: current item index (1-based)
PMRadioButtonGrp3   int: current item index (1-based)
PMRadioButtonGrp4   int: current item index (1-based)
PMScriptTable   anything: no default value, ignored
PMScrollField   str
PMScrollLayout   [int, int]: tuple or list with horizontal and vertical scroll values
PMShelfTabLayout   int: current tab index (1-based)
PMSymbolCheckBox   bool
PMTabLayout   int: current tab index (1-based)
PMTextField   str
PMTextFieldButtonGrp   str
PMTextFieldGrp   str
PMTextScrollList   [int, int, ...]: tuple or list with selected indexes

Comments are closed.