Skip to content

Commit d62d4bd

Browse files
committed
implement storage class for pickers data
1 parent a097dae commit d62d4bd

3 files changed

Lines changed: 72 additions & 71 deletions

File tree

dwpicker/__init__.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@
77
_dwpicker = None
88

99

10-
def show(editable=True, pickers=None, ignore_scene_pickers=False):
10+
def show(
11+
editable=True, pickers=None, ignore_scene_pickers=False,
12+
storage_class=None):
1113
ensure_optionvars_exists()
1214
global _dwpicker
1315
if not _dwpicker:
14-
_dwpicker = DwPicker()
16+
_dwpicker = DwPicker(storage_class=storage_class)
1517

1618
try:
1719
_dwpicker.show(dockable=True)

dwpicker/main.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,7 @@
3131
from dwpicker.qtutils import set_shortcut, icon, maya_main_window, DockableBase
3232
from dwpicker.quick import QuickOptions
3333
from dwpicker.references import ensure_images_path_exists
34-
from dwpicker.scenedata import (
35-
load_local_picker_data, store_local_picker_data,
36-
clean_stray_picker_holder_nodes)
34+
from dwpicker.scenedata import DefaultSceneStorage
3735
from dwpicker.templates import BUTTON, PICKER, BACKGROUND
3836
from dwpicker.undo import UndoManager
3937

@@ -77,7 +75,7 @@ def build_multiple_shapes(targets, override):
7775

7876

7977
class DwPicker(DockableBase, QtWidgets.QWidget):
80-
def __init__(self):
78+
def __init__(self, storage_class=None):
8179
super(DwPicker, self).__init__(control_name=WINDOW_CONTROL_NAME)
8280
self.setWindowTitle(WINDOW_TITLE)
8381
shortcut_context = QtCore.Qt.WidgetWithChildrenShortcut
@@ -99,6 +97,8 @@ def __init__(self):
9997
self.pickers = []
10098
self.filenames = []
10199
self.modified_states = []
100+
self.storage = (storage_class or DefaultSceneStorage)()
101+
102102
self.preferences_window = PreferencesWindow(
103103
callback=self.load_ui_states, parent=maya_main_window())
104104
self.preferences_window.disable_import_callbacks.released.connect(
@@ -325,23 +325,23 @@ def auto_switch_tab(self, *_, **__):
325325

326326
def load_saved_pickers(self, *_, **__):
327327
self.clear()
328-
pickers = load_local_picker_data()
328+
pickers = self.storage.load()
329329
if cmds.optionVar(query=CHECK_IMAGES_PATHS):
330330
picker = ensure_images_path_exists(pickers)
331331
for picker in pickers:
332332
self.add_picker(picker)
333-
clean_stray_picker_holder_nodes()
333+
self.storage.cleanup()
334334

335335
def store_local_pickers_data(self):
336336
if not self.editable:
337337
return
338338

339339
if not self.tab.count():
340-
store_local_picker_data([])
340+
self.storage.store([])
341341
return
342342

343343
pickers = [self.picker_data(i) for i in range(self.tab.count())]
344-
store_local_picker_data(pickers)
344+
self.storage.store(pickers)
345345

346346
def save_tab(self, index):
347347
msg = (

dwpicker/scenedata.py

Lines changed: 60 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -9,42 +9,6 @@
99
from dwpicker.namespace import maya_namespace
1010

1111

12-
PICKER_HOLDER_NODE = '_dwpicker_data'
13-
PICKER_HOLDER_ATTRIBUTE = '_dwpicker_data'
14-
LS_EXP = ["*." + PICKER_HOLDER_ATTRIBUTE, "*:*." + PICKER_HOLDER_ATTRIBUTE]
15-
16-
17-
def get_picker_holder_node():
18-
if cmds.objExists(PICKER_HOLDER_NODE):
19-
return PICKER_HOLDER_NODE
20-
return create_picker_holder_node()
21-
22-
23-
def create_picker_holder_node():
24-
with maya_namespace(":"):
25-
node = cmds.createNode('script', name=PICKER_HOLDER_NODE)
26-
cmds.setAttr(node + '.nodeState', 1)
27-
cmds.addAttr(node, longName=PICKER_HOLDER_ATTRIBUTE, dataType='string')
28-
return node
29-
30-
31-
def store_local_picker_data(pickers):
32-
data = encode_data(pickers)
33-
node = get_picker_holder_node()
34-
cmds.setAttr(node + '.' + PICKER_HOLDER_ATTRIBUTE, data, type='string')
35-
clean_stray_picker_holder_nodes()
36-
37-
38-
def load_local_picker_data():
39-
nodes = list_picker_holder_nodes()
40-
pickers = []
41-
for node in nodes:
42-
data = cmds.getAttr(node + '.' + PICKER_HOLDER_ATTRIBUTE)
43-
data = decode_data(data)
44-
pickers.extend(ensure_retro_compatibility(p) for p in data)
45-
return pickers
46-
47-
4812
def encode_data(pickers):
4913
data = json.dumps(pickers)
5014
if not cmds.optionVar(query=USE_BASE64_DATA_ENCODING):
@@ -62,28 +26,63 @@ def decode_data(data):
6226
return json.loads(base64.b64decode(data))
6327

6428

65-
def list_picker_holder_nodes():
66-
"""
67-
Look up in the scene all the nodes holding an attribute named
68-
"_dwpicker_holder" which are not set on the "_dwpicker_holder" node.
69-
This mignt happed if a node node is imported (creating a namespace or a
70-
incrementation).
71-
"""
72-
return [node.split(".")[0] for node in cmds.ls(LS_EXP)]
73-
74-
75-
def clean_stray_picker_holder_nodes():
76-
"""
77-
If the scene contains multiple picker holder nodes, we remove them
78-
automatically to avoid repeated pickers.
79-
"""
80-
for node in list_picker_holder_nodes():
81-
if node == PICKER_HOLDER_NODE:
82-
continue
83-
try:
84-
cmds.delete(node)
85-
except:
86-
# Node is locked or in reference and cannot be removed.
87-
# As we cant remove it, we reset his data to avoid double pickers.
88-
cmds.setAttr(
89-
node + "." + PICKER_HOLDER_ATTRIBUTE, "", dataType="string")
29+
class DefaultSceneStorage:
30+
PICKER_HOLDER_NODE = '_dwpicker_data'
31+
PICKER_HOLDER_ATTRIBUTE = '_dwpicker_data'
32+
LS_EXP = ["*." + PICKER_HOLDER_ATTRIBUTE, "*:*." + PICKER_HOLDER_ATTRIBUTE]
33+
34+
def _get_picker_holder_node(self):
35+
if cmds.objExists(self.PICKER_HOLDER_NODE):
36+
return self.PICKER_HOLDER_NODE
37+
return self._create_picker_holder_node()
38+
39+
def _create_picker_holder_node(self):
40+
with maya_namespace(":"):
41+
node = cmds.createNode('script', name=self.PICKER_HOLDER_NODE)
42+
cmds.setAttr(node + '.nodeState', 1)
43+
cmds.addAttr(
44+
node, longName=self.PICKER_HOLDER_ATTRIBUTE, dataType='string')
45+
return node
46+
47+
def _list_picker_holder_nodes(self):
48+
"""
49+
Look up in the scene all the nodes holding an attribute named
50+
"_dwpicker_holder" which are not set on the "_dwpicker_holder" node.
51+
This mignt happed if a node node is imported (creating a namespace or a
52+
incrementation).
53+
"""
54+
return [node.split(".")[0] for node in cmds.ls(self.LS_EXP)]
55+
56+
def load(self):
57+
nodes = self._list_picker_holder_nodes()
58+
pickers = []
59+
for node in nodes:
60+
data = cmds.getAttr(node + '.' + self.PICKER_HOLDER_ATTRIBUTE)
61+
data = decode_data(data)
62+
pickers.extend(ensure_retro_compatibility(p) for p in data)
63+
return pickers
64+
65+
def store(self, pickers):
66+
data = encode_data(pickers)
67+
node = self._get_picker_holder_node()
68+
cmds.setAttr(
69+
node + '.' + self.PICKER_HOLDER_ATTRIBUTE, data, type='string')
70+
self.cleanup()
71+
72+
def cleanup(self):
73+
"""
74+
If the scene contains multiple picker holder nodes, we remove them
75+
automatically to avoid repeated pickers.
76+
"""
77+
for node in self._list_picker_holder_nodes():
78+
if node == self.PICKER_HOLDER_NODE:
79+
continue
80+
try:
81+
cmds.delete(node)
82+
except:
83+
# Node is locked or in reference and cannot be removed.
84+
# As we cant remove it, we reset his data to avoid double
85+
# pickers.
86+
cmds.setAttr(
87+
node + "." + self.PICKER_HOLDER_ATTRIBUTE, "",
88+
dataType="string")

0 commit comments

Comments
 (0)