# -*- coding: utf-8 -*-
from PySide2 import QtWidgets
from PySide2 import QtCore
from shiboken2 import getCppPointer
import maya.OpenMayaUI as omui
import maya.cmds as cmds
class WorkspaceControl(object):
def __init__(self, name):
self.name = name
self.widget = None
def create(self, label, widget, ui_script=None):
cmds.workspaceControl(self.name, label=label)
if ui_script:
cmds.workspaceControl(self.name, e=True, uiScript=ui_script)
self.add_widget_to_layout(widget)
self.set_visible(True)
def restore(self, widget):
self.add_widget_to_layout(widget)
def add_widget_to_layout(self, widget):
if widget:
self.widget = widget
self.widget.setAttribute(QtCore.Qt.WA_DontCreateNativeAncestors)
workspace_control_ptr = long(omui.MQtUtil.findControl(self.name))
widget_ptr = long(getCppPointer(self.widget)[0])
omui.MQtUtil.addWidgetToMayaLayout(widget_ptr, workspace_control_ptr)
def exists(self):
return cmds.workspaceControl(self.name, q=True, exists=True)
def is_visible(self):
return cmds.workspaceControl(self.name, q=True, visible=True)
def set_visible(self, visible):
if visible:
cmds.workspaceControl(self.name, e=True, restore=True)
else:
cmds.workspaceControl(self.name, e=True, visible=False)
def set_label(self, label):
cmds.workspaceControl(self.name, e=True, label=label)
def is_floating(self):
return cmds.workspaceControl(self.name, q=True, floating=True)
def is_collapsed(self):
return cmds.workspaceControl(self.name, q=True, collapse=True)
class DockableUI(QtWidgets.QWidget):
WINDOW_TITLE = "Dockable UI"
ui_instance = None
@classmethod
def display(cls):
if cls.ui_instance:
cls.ui_instance.show_workspace_control()
else:
cls.ui_instance = cls()
@classmethod
def get_workspace_control_name(cls):
return "{0}WorkspaceControl".format(cls.__name__)
@classmethod
def get_ui_script(cls):
module_name = cls.__module__
if module_name == "__main__":
module_name = cls.module_name_override
ui_script = "from {0} import {1}\n{1}.display()".format(module_name, cls.__name__)
return ui_script
def __init__(self):
super(DockableUI, self).__init__()
self.setObjectName(self.__class__.__name__)
self.create_widgets()
self.create_layout()
self.create_connections()
self.create_workspace_control()
def create_widgets(self):
self.apply_bttn = QtWidgets.QPushButton("Apply")
def create_layout(self):
main_layout = QtWidgets.QVBoxLayout(self)
main_layout.setContentsMargins(5, 5, 5, 5)
main_layout.addStretch()
main_layout.addWidget(self.apply_bttn)
def create_connections(self):
self.apply_bttn.clicked.connect(self.on_clicked)
def create_workspace_control(self):
self.workspace_control_instance = WorkspaceControl(self.get_workspace_control_name())
if self.workspace_control_instance.exists():
self.workspace_control_instance.restore(self)
else:
self.workspace_control_instance.create(self.WINDOW_TITLE, self, ui_script=self.get_ui_script())
def show_workspace_control(self):
self.workspace_control_instance.set_visible(True)
def on_clicked(self):
print("Button Clicked!")
def showEvent(self, event):
if self.workspace_control_instance.is_floating():
self.workspace_control_instance.set_label("Floating Window")
else:
self.workspace_control_instance.set_label("Docked Window")
if __name__ == '__main__':
workspace_control_name = DockableUI.get_workspace_control_name()
if cmds.window(workspace_control_name, exists=True):
cmds.deleteUI(workspace_control_name)
try:
sample_ui.setParent(None)
sample_ui.deleteLater()
except:
pass
DockableUI.module_name_override = "Dockable"
sample_ui = DockableUI()
Dockable UI
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.