-
Notifications
You must be signed in to change notification settings - Fork 21
Expand file tree
/
Copy pathlabeler.py
More file actions
112 lines (88 loc) · 3.52 KB
/
labeler.py
File metadata and controls
112 lines (88 loc) · 3.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
from __future__ import absolute_import
import nuke
if nuke.NUKE_VERSION_MAJOR < 11:
from PySide import QtCore, QtGui, QtGui as QtWidgets
elif nuke.NUKE_VERSION_MAJOR < 16:
from PySide2 import QtWidgets, QtGui, QtCore
else:
from PySide6 import QtWidgets, QtGui, QtCore
from .QtUtils import CodeTextEdit
nuke.menu('Nuke').addCommand('Edit/Node/Set Label', 'labeler.label(nodes=nuke.selectedNodes())', 'shift+a')
class LabelPanel(QtWidgets.QDialog):
# Show a text entry interface for entering text for a node label
def __init__(self, nodes, parent):
super(LabelPanel, self).__init__(parent)
if not nodes:
return
self.nodes = nodes
self.setup_ui()
def setup_ui(self):
# Set up the user interface
container = QtWidgets.QVBoxLayout()
# self.text = QtWidgets.QPlainTextEdit()
self.text = CodeTextEdit() # Use our souped-up code editor widget from Knob Scripter
self.text.textChanged.connect(self.set_label)
container.addWidget(self.text)
self.setLayout(container)
# Populate text with existing label
self.get_label()
# Invoke window
self.setWindowTitle('Set Label')
self.installEventFilter(self)
self.resize(250, 80)
self.move(QtGui.QCursor().pos() - QtCore.QPoint(32,74))
def get_label(self):
# Get label from last selected node. Populate the text field with it.
label = self.nodes[0]['label'].getValue()
if label:
self.text.setPlainText(label)
self.text.selectAll()
def set_label(self):
# Set label of all nodes with user text
label = self.text.document().toPlainText()
for node in self.nodes:
if node.Class() == 'Dot':
if not label.startswith(' '):
label = ' ' + label
node['label'].setValue(label)
def set_and_quit(self):
# Set label and close (for ok button)
self.set_label()
self.close()
def keyPressEvent(self, event):
# Handle keyboard events.
key = event.key()
# Use correct namespace for modifiers and keys
if nuke.NUKE_VERSION_MAJOR >= 16:
ctrl = bool(event.modifiers() & QtCore.Qt.ControlModifier)
alt = bool(event.modifiers() & QtCore.Qt.AltModifier)
if key == QtCore.Qt.Key_Escape:
self.close()
if (key == QtCore.Qt.Key_Return or key == QtCore.Qt.Key_Enter) and ctrl:
self.set_label()
self.close()
if ctrl and key == QtCore.Qt.Key_S:
self.set_label()
self.close()
else:
ctrl = bool(event.modifiers() & Qt.ControlModifier)
alt = bool(event.modifiers() & Qt.AltModifier)
if key == Qt.Key_Escape:
self.close()
if (key == Qt.Key_Return or key == Qt.Key_Enter) and ctrl:
self.set_label()
self.close()
if ctrl and key == Qt.Key_S:
self.set_label()
self.close()
def eventFilter(self, object, event):
if event.type() in [QtCore.QEvent.WindowDeactivate, QtCore.QEvent.FocusOut]:
self.close()
return True # Event handled
return False # Event not handled
def label(nodes=None):
# Prompt user for a new node label
if not nodes:
return
panel = LabelPanel(nodes, QtWidgets.QApplication.activeWindow())
panel.show()