import maya.cmds as cmds import maya.mel as mel from functools import partial import os, cPickle class ART_Settings(): def __init__(self): #get access to our maya tools toolsPath = cmds.internalVar(usd = True) + "mayaTools.txt" if os.path.exists(toolsPath): f = open(toolsPath, 'r') self.mayaToolsDir = f.readline() f.close() #check to see if window exists, if so, delete if cmds.window("AnimationRiggingTool_SettingsUI", exists = True): cmds.deleteUI("AnimationRiggingTool_SettingsUI") self.path = self.mayaToolsDir self.widgets = {} #create the window self.widgets["window"] = cmds.window("AnimationRiggingTool_SettingsUI", w = 400, h = 300, titleBarMenu = False, title = "Settings", sizeable = False) #main layout self.widgets["main"] = cmds.formLayout(w = 400, h = 300) #background image image = self.mayaToolsDir + "/General/Icons/ART/settings.jpg" self.widgets["background"] = cmds.image(w = 400, h = 300, parent = self.widgets["main"], image = image) #close button self.widgets["closeButton"] = cmds.symbolButton(w = 26, h = 20, parent = self.widgets["main"], image = self.mayaToolsDir + "/General/Icons/ART/xbutton.bmp", c = self.close) cmds.formLayout(self.widgets["main"], edit = True, af = [(self.widgets["closeButton"], "top", 2), (self.widgets["closeButton"], "right", 2)]) #tools path self.widgets["toolsPathLabel"] = cmds.text(h = 40, w = 100, label = "Tools Path: ", font = "boldLabelFont", parent = self.widgets["main"]) self.widgets["toolsPathField"] = cmds.textField(h = 40, w = 225, text = "", parent = self.widgets["main"], editable = False) self.widgets["toolsPathBrowseButton"] = cmds.symbolButton(w = 40, h = 40, parent = self.widgets["main"], image = self.mayaToolsDir + "/General/Icons/ART/browse.bmp", c = self.browseNewToolsPath) cmds.formLayout(self.widgets["main"], edit = True, af = [(self.widgets["toolsPathLabel"], "top", 40), (self.widgets["toolsPathLabel"], "left", 10)]) cmds.formLayout(self.widgets["main"], edit = True, af = [(self.widgets["toolsPathField"], "top", 40), (self.widgets["toolsPathField"], "right", 50)]) cmds.formLayout(self.widgets["main"], edit = True, af = [(self.widgets["toolsPathBrowseButton"], "top", 40), (self.widgets["toolsPathBrowseButton"], "right", 5)]) #Source control settings divider = cmds.separator(w = 400, h = 10, style = "out") self.widgets["useSourceControl"] = cmds.checkBox( h = 40, label = "Use Source Control", v = False, parent = self.widgets["main"], onc = partial(self.useSourceControl, True), ofc = partial(self.useSourceControl, False)) cmds.formLayout(self.widgets["main"], edit = True, af = [(divider, "top", 95), (divider, "left", 0)]) cmds.formLayout(self.widgets["main"], edit = True, af = [(self.widgets["useSourceControl"], "top", 105), (self.widgets["useSourceControl"], "left", 10)]) #source control test button self.widgets["testConnection"] = cmds.button(w = 225, h = 40, label = "Test Perforce Connection", parent = self.widgets["main"], enable = False, c = self.testConnection) cmds.formLayout(self.widgets["main"], edit = True, af = [(self.widgets["testConnection"], "top", 105), (self.widgets["testConnection"], "right", 25)]) #favorite project option favoriteProjLabel = cmds.text(label = "Set Favorite Project: ", parent = self.widgets["main"]) cmds.formLayout(self.widgets["main"], edit = True, af = [(favoriteProjLabel, "top", 170), (favoriteProjLabel, "left", 10)]) self.widgets["favoriteProject_OM"] = cmds.optionMenu(w = 225, h = 40, label = "", parent = self.widgets["main"]) cmds.menuItem(label = "None", parent = self.widgets["favoriteProject_OM"]) cmds.formLayout(self.widgets["main"], edit = True, af = [(self.widgets["favoriteProject_OM"], "top", 160), (self.widgets["favoriteProject_OM"], "right", 25)]) #get projects and add to menu self.findProjects() #save settings button self.widgets["saveSettings"] = cmds.button(w = 380, h = 40, label = "Save Settings and Close", parent = self.widgets["main"], c = self.saveSettings) cmds.formLayout(self.widgets["main"], edit = True, af = [(self.widgets["saveSettings"], "bottom", 10), (self.widgets["saveSettings"], "right", 10)]) #show window cmds.showWindow(self.widgets["window"]) #get tools path self.getToolsPath() #load settings from disk settingsLocation = self.mayaToolsDir + "/General/Scripts/projectSettings.txt" if os.path.exists(settingsLocation): f = open(settingsLocation, 'r') settings = cPickle.load(f) useSource = settings.get("UseSourceControl") favoriteProject = settings.get("FavoriteProject") f.close() try: #set the checkbox to the settings value cmds.checkBox(self.widgets["useSourceControl"], edit = True, v = useSource) self.useSourceControl(useSource) except: pass try: #set the optionMenu to favorite project cmds.optionMenu(self.widgets["favoriteProject_OM"], edit = True, v = favoriteProject) except: pass # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # def close(self, *args): cmds.deleteUI("AnimationRiggingTool_SettingsUI") # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # def getToolsPath(self, *args): toolsPath = cmds.internalVar(usd = True) + "mayaTools.txt" if os.path.exists(toolsPath): f = open(toolsPath, 'r') self.mayaToolsDir = f.readline() f.close() #edit text field cmds.textField(self.widgets["toolsPathField"], edit = True, text = self.mayaToolsDir) # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # def browseNewToolsPath(self, *args): newPath = cmds.fileDialog2(fm = 3) if newPath != None: newPath = newPath[0] if newPath.rpartition("/")[2] != "MayaTools": cmds.warning("Selected directory is not valid. Please locate the MayaTools directory.") return else: #create file that contains this path path = cmds.internalVar(usd = True) + "mayaTools.txt" f = open(path, 'w') f.write(newPath) f.close() self.getToolsPath() self.close() cmds.confirmDialog(title = "Settings", icon = "warning", message = "New tools path will not be used until Maya has been restarted.") # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # def useSourceControl(self, state, *args): if state: cmds.button(self.widgets["testConnection"], edit = True, enable = True) cmds.menuItem("perforceSubmitMenuItem", edit = True, enable = True) cmds.menuItem("perforceAddAndSubmitMenuItem", edit = True, enable = True) cmds.menuItem("perforceCheckOutMenuItem", edit = True, enable = True) cmds.menuItem("perforceFileHistoryMenuItem", edit = True, enable = True) cmds.menuItem("perforceGetLatestMenuItem", edit = True, enable = True) cmds.menuItem("perforceProjectList", edit = True, enable = True) if state == False: cmds.button(self.widgets["testConnection"], edit = True, enable = False) cmds.menuItem("perforceSubmitMenuItem", edit = True, enable = False) cmds.menuItem("perforceAddAndSubmitMenuItem", edit = True, enable = False) cmds.menuItem("perforceCheckOutMenuItem", edit = True, enable = False) cmds.menuItem("perforceFileHistoryMenuItem", edit = True, enable = False) cmds.menuItem("perforceGetLatestMenuItem", edit = True, enable = False) cmds.menuItem("perforceProjectList", edit = True, enable = False) # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # def testConnection(self, *args): try: from P4 import P4, P4Exception except: cmds.confirmDialog(title = "Test Connection", icon = "critical", message = "Perforce Python modules not found.") return try: p4 = P4() p4.connect() #client info spec = p4.run( "client", "-o" )[0] client = spec.get("Client") owner = spec.get("Owner") host = spec.get("Host") p4.disconnect() cmds.confirmDialog(title = "Test Connection", message = "Connection Sucessful!\n\nUsername: " + owner + "\nClient: " + client + "\nHost: " + host + ".") except: cmds.confirmDialog(title = "Test Connection", message = "Unable to connect to Perforce server.") # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # def saveSettings(self, *args): #this function will save out the user's preferences they have set in the UI to disk settingsLocation = self.mayaToolsDir + "/General/Scripts/projectSettings.txt" try: f = open(settingsLocation, 'w') #create a dictionary with values settings = {} settings["UseSourceControl"] = cmds.checkBox(self.widgets["useSourceControl"], q = True, v = True) settings["FavoriteProject"] = cmds.optionMenu(self.widgets["favoriteProject_OM"], q = True, v = True) #write our dictionary to file cPickle.dump(settings, f) f.close() except: cmds.confirmDialog(title = "Error", icon = "critical", message = settingsLocation + " is not writeable. Please make sure this file is not set to read only.") #close the UI cmds.deleteUI("AnimationRiggingTool_SettingsUI") # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # def findProjects(self): projectPath = self.mayaToolsDir + "/General/ART/Projects/" try: projects = os.listdir(projectPath) if len(projects) > 0: for proj in sorted(projects): cmds.menuItem(label = proj, parent = self.widgets["favoriteProject_OM"]) except: pass