I’ve been making a few Maya scripts here and there. Cobbling together code from various google searches and figuring things out on my own. There were a number of aspects to Docking windows I never found online and had to figure out myself. So I’ve made a template to get started.

There are a few tricks in here. Such as keeping windows from doubling up, and ensuring the docked window closes itself like a regular window. But you don’t have to worry about that. :)

Just chuck the below code into your script and play around.

Quick Start Template

You can find the most up to date code here…

##############################################
# Dockable window template
# Created: 15/4/15
# Jason Dixon (jason.dixon.email[AT]gmail.com)
##############################################
import maya.cmds as cmds
from functools import wraps
import sys


def unique(item):
    """
    Only keep one window open at a time
    """
    items = {}
    
    @wraps(item)
    def UniqueItem(*args, **kwargs):
        if (item in items and sys.getrefcount(items[item]) < 3) or item not in items:
            items[item] = item(*args, **kwargs)
        return items[item]
    return UniqueItem


@unique
class MainWindow(object):
    """
    Main GUI Window
    """
    def __init__(self):
        self.GUI = {}  # Store GUI elements
        title = "My Window"

        self.GUI['window'] = cmds.window(title=title, rtf=True, s=False)
        self.GUI['layout1'] = cmds.columnLayout(adjustableColumn=True)
        self.GUI['button1'] = cmds.button(l='Click Me', h=25, c=self.ButtonClick)
        allowed_areas = ['right', 'left']
        self.GUI['dock'] = cmds.dockControl(a='left', content=self.GUI['window'], aa=allowed_areas, fl=True, l=title, fcc=self.moveDock, vcc=self.closeDock)

        self.getLocation()
        if self.location == 'float':
            cmds.dockControl(self.GUI['dock'], e=True, fl=True)
        elif self.location in allowed_areas:
            cmds.dockControl(self.GUI['dock'], e=True, a=self.location)

    def ButtonClick(self, button):  # Button Test
        if cmds.confirmDialog(title='How Amazing!', message="Did you click the button?") == 'Confirm':
            print "Button Clicked"

    def moveDock(self):  # Update dock location information
        if cmds.dockControl(self.GUI['dock'], q=True, fl=True):
            self.setLocation("float")
            print "Floating Dock."
        else:
            area = cmds.dockControl(self.GUI['dock'], q=True, a=True)
            self.setLocation(area)
            print "Docking %s." % area

    def closeDock(self, *loop):
        visible = cmds.dockControl(self.GUI['dock'], q=True, vis=True)
        if not visible and loop:
            cmds.scriptJob(ie=self.closeDock, p=self.GUI['dock'], ro=True)
        elif not visible:
            cmds.deleteUI(self.GUI['dock'], control=True)
            print "Window closed."

    def getLocation(self):
        self.location = "float"  # You can replace this with code that loads persistant data

    def setLocation(self, location):
        self.location = location  # You can replace this with code that saves persistant data

MainWindow()

There we have it. Hope it helps! :)