Skip to content

Commit a097dae

Browse files
committed
Add optional close tab warning / Fix base64 encoding for python2
1 parent d0613da commit a097dae

4 files changed

Lines changed: 35 additions & 12 deletions

File tree

dwpicker/main.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424
AUTO_FOCUS_BEHAVIOR, AUTO_SWITCH_TAB, CHECK_IMAGES_PATHS,
2525
DISABLE_IMPORT_CALLBACKS, DISPLAY_QUICK_OPTIONS, INSERT_TAB_AFTER_CURRENT,
2626
LAST_OPEN_DIRECTORY, LAST_IMPORT_DIRECTORY, LAST_SAVE_DIRECTORY,
27-
NAMESPACE_TOOLBAR, USE_ICON_FOR_UNSAVED_TAB, save_optionvar,
28-
append_recent_filename, save_opened_filenames)
27+
NAMESPACE_TOOLBAR, USE_ICON_FOR_UNSAVED_TAB, WARN_ON_TAB_CLOSED,
28+
save_optionvar, append_recent_filename, save_opened_filenames)
2929
from dwpicker.picker import PickerView, list_targets
3030
from dwpicker.preference import PreferencesWindow
3131
from dwpicker.qtutils import set_shortcut, icon, maya_main_window, DockableBase
@@ -62,6 +62,9 @@
6262
WINDOW_TITLE = "DreamWall - Picker"
6363
WINDOW_CONTROL_NAME = "dwPickerWindow"
6464
CLOSE_CALLBACK_COMMAND = "import dwpicker;dwpicker._dwpicker.close_event()"
65+
CLOSE_TAB_WARNING = """\
66+
Close the tab will remove completely the picker data from the scene.
67+
Are you sure to continue ?"""
6568

6669

6770
def build_multiple_shapes(targets, override):
@@ -368,11 +371,11 @@ def clear(self):
368371
self.close_tab(i, force=True)
369372

370373
def close_tab(self, index, force=False, store=False):
371-
conditions = (
372-
self.modified_states[index]
373-
and force is False
374-
and not self.save_tab(index))
375-
if conditions:
374+
if self.modified_states[index] and force is False:
375+
if not self.save_tab(index):
376+
return
377+
elif (cmds.optionVar(query=WARN_ON_TAB_CLOSED) and
378+
not question('Warning', CLOSE_TAB_WARNING)):
376379
return
377380

378381
editor = self.editors.pop(index)
@@ -469,7 +472,7 @@ def call_save(self, index=None):
469472
filename = self.filenames[index]
470473
if not filename:
471474
return self.call_save_as(index=index)
472-
self.save_picker(index, filename)
475+
return self.save_picker(index, filename)
473476

474477
def call_save_as(self, index=None):
475478
index = self.tab.currentIndex() if type(index) is not int else index

dwpicker/optionvar.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
USE_BASE64_DATA_ENCODING = 'dwpicker_use_base64_data_encoding'
3838
USE_ICON_FOR_UNSAVED_TAB = 'dwpicker_use_icon_for_unsaved_tab'
3939
ZOOM_BUTTON = 'dwpicker_picker_zoom_mouse_button'
40+
WARN_ON_TAB_CLOSED = 'dwpicker_warn_on_tab_closed'
4041
ZOOM_SENSITIVITY = 'dwpicker_zoom_sensitivity'
4142

4243

@@ -70,6 +71,7 @@
7071
TRIGGER_REPLACE_ON_MIRROR: 0,
7172
USE_BASE64_DATA_ENCODING: 0,
7273
USE_ICON_FOR_UNSAVED_TAB: 1,
74+
WARN_ON_TAB_CLOSED: 0,
7375
ZOOM_BUTTON: ZOOM_BUTTONS[2],
7476
ZOOM_SENSITIVITY: 50
7577
}

dwpicker/preference.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
CHECK_IMAGES_PATHS, DISPLAY_QUICK_OPTIONS, DISABLE_IMPORT_CALLBACKS,
77
INSERT_TAB_AFTER_CURRENT, NAMESPACE_TOOLBAR, SYNCHRONYZE_SELECTION,
88
TRIGGER_REPLACE_ON_MIRROR, USE_BASE64_DATA_ENCODING,
9-
USE_ICON_FOR_UNSAVED_TAB, ZOOM_SENSITIVITY, ZOOM_BUTTON, ZOOM_BUTTONS)
9+
USE_ICON_FOR_UNSAVED_TAB, WARN_ON_TAB_CLOSED, ZOOM_SENSITIVITY,
10+
ZOOM_BUTTON, ZOOM_BUTTONS)
1011

1112

1213
MAX_SENSITIVITY = 500
@@ -37,6 +38,8 @@ def __init__(self, callback=None, parent=None):
3738
self.unsaved_tab_icon = QtWidgets.QCheckBox(text)
3839
text = "Insert new tab after current tab."
3940
self.insert_after_current = QtWidgets.QCheckBox(text)
41+
text = "Warning before closing a tab."
42+
self.warn_on_tab_close = QtWidgets.QCheckBox(text)
4043
self.ui_group = QtWidgets.QGroupBox("Ui")
4144
self.ui_layout = QtWidgets.QVBoxLayout(self.ui_group)
4245
self.ui_layout.addWidget(self.namespace_toolbar)
@@ -47,6 +50,7 @@ def __init__(self, callback=None, parent=None):
4750
self.ui_layout.addWidget(self.check_images_paths)
4851
self.ui_layout.addWidget(self.unsaved_tab_icon)
4952
self.ui_layout.addWidget(self.insert_after_current)
53+
self.ui_layout.addWidget(self.warn_on_tab_close)
5054

5155
text = "Encode in-scene data as base64."
5256
self.use_base64_encoding = QtWidgets.QCheckBox(text)
@@ -101,6 +105,7 @@ def __init__(self, callback=None, parent=None):
101105
self.unsaved_tab_icon.released.connect(self.save_ui_states)
102106
self.sychronize.released.connect(self.save_ui_states)
103107
self.search_on_mirror.released.connect(self.save_ui_states)
108+
self.warn_on_tab_close.released.connect(self.save_ui_states)
104109
self.zoom_sensitivity.valueChanged.connect(self.save_ui_states)
105110
self.zoom_button.currentIndexChanged.connect(self.save_ui_states)
106111

@@ -121,6 +126,8 @@ def load_ui_states(self):
121126
self.use_base64_encoding.setChecked(state)
122127
state = bool(cmds.optionVar(query=USE_ICON_FOR_UNSAVED_TAB))
123128
self.unsaved_tab_icon.setChecked(state)
129+
state = bool(cmds.optionVar(query=WARN_ON_TAB_CLOSED))
130+
self.warn_on_tab_close.setChecked(state)
124131
state = bool(cmds.optionVar(query=INSERT_TAB_AFTER_CURRENT))
125132
self.insert_after_current.setChecked(state)
126133
value = cmds.optionVar(query=AUTO_FOCUS_BEHAVIOR)
@@ -155,6 +162,8 @@ def save_ui_states(self, *_):
155162
save_optionvar(AUTO_FOCUS_BEHAVIOR, value)
156163
value = int(self.search_on_mirror.isChecked())
157164
save_optionvar(TRIGGER_REPLACE_ON_MIRROR, value)
165+
value = int(self.warn_on_tab_close.isChecked())
166+
save_optionvar(WARN_ON_TAB_CLOSED, value)
158167
save_optionvar(ZOOM_BUTTON, self.zoom_button.currentText())
159168
value = MAX_SENSITIVITY - int(self.zoom_sensitivity.value()) + 1
160169
save_optionvar(ZOOM_SENSITIVITY, value)

dwpicker/scenedata.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import sys
12
import json
23
import base64
34

@@ -28,9 +29,7 @@ def create_picker_holder_node():
2829

2930

3031
def store_local_picker_data(pickers):
31-
data = json.dumps(pickers)
32-
if cmds.optionVar(query=USE_BASE64_DATA_ENCODING):
33-
data = base64.b64encode(bytes(data, "utf-8"))
32+
data = encode_data(pickers)
3433
node = get_picker_holder_node()
3534
cmds.setAttr(node + '.' + PICKER_HOLDER_ATTRIBUTE, data, type='string')
3635
clean_stray_picker_holder_nodes()
@@ -46,6 +45,16 @@ def load_local_picker_data():
4645
return pickers
4746

4847

48+
def encode_data(pickers):
49+
data = json.dumps(pickers)
50+
if not cmds.optionVar(query=USE_BASE64_DATA_ENCODING):
51+
return data
52+
# Ensure backward compatibility.
53+
if sys.version_info[0] == 2:
54+
return base64.b64encode(bytes(data))
55+
return base64.b64encode(bytes(data, "utf-8"))
56+
57+
4958
def decode_data(data):
5059
try:
5160
return json.loads(data)

0 commit comments

Comments
 (0)