Connect/Disconnet UI

When you want to create a Maya UI, every modern Maya tutorial will chastise you if you don’t put that UI in a class. It makes sense… that way once you’ve initialized the UI class, you can access all of its methods and variables. It’s cleaner that way. You can also use a Python property to set, get, and delete variables if you need to access them from outside the script. I really wish I had known that last year… *

Here, you can gather any 2 lists you like to feed into the UI, and then throw them back and forth in the UI window as you please. The other functions connect or disconnect maps in a very specific way, so I’ll leave them out so as not to reveal any company secrets :).

I realize there is some redundancy here– I’ll come back and try using a decorator to consolidate the doConnect and doDisconnect functions!

*(I had to put together a huge info-gathering UI with fields and file dialogs and radio buttons, and then use all the info to perform specific actions involving that data. I did NOT know about using classes for this, so it’s one veeeery long Python script. While I did realize that using the UI command callbacks all over the place was going to be a pain in the ass or impossible due to scope, I didn’t have an elegant solution. So, I created a blank dictionary and bunch of functions that were called when certain buttons were pressed. I used partial in the buttons’ commands flag to pass the dictionary to the respective functions, got the data from the functions and stored it in that one big dictionary.  Then I could look up the values in said dictionary when I needed them later on. It definitely worked, but… not pretty. It’s still being used, but one day if I get the chance I’d like to revamp it. I might make a post about that later. I’ll call it “Don’t make the same mistakes I did!” I might need to make that a tag :/ Anyway, that’s in the past– Onwards! Upwards!)

 

import maya.cmds as cmds
 
 class connectListUI(object):
     
     def __init__(self, leftList, rightList): 
         self.leftList = leftList
         self.rightList = rightList
         self.winTitle = "Texture Connect"
     
         #check to see if our window exists
         if cmds.window(self.winTitle, exists = True):
             cmds.deleteUI(self.winTitle)
         
         self.winName = cmds.window(title = self.winTitle)
         cmds.rowColumnLayout(numberOfColumns = 2, columnWidth = [(1, 300), (2, 300), (3, 300)],
                     annotation = "Is this thing on?")
         
         cmds.text(label = 'Regular Maps - Disconnected', align = 'left', ebg = True, bgc = [0.4, 0.4, 0.4], font = 'obliqueLabelFont')
         cmds.text(label = 'Regular Maps - Connected', align = 'right', ebg = True, bgc = [0.4, 0.4, 0.4], font = 'obliqueLabelFont')
         
         cmds.separator( height=5, style='in' )
         cmds.separator( height=5, style='in' )
         self.regConnLST = cmds.textScrollList("tsRegConnList", numberOfRows=10, allowMultiSelection=True, height = 180, 
                     append=self.leftList, showIndexedItem=1 )            
                     
         self.regDisconnLST = cmds.textScrollList("tsRegDisconnList", numberOfRows=10, allowMultiSelection=True, height = 180,
                     append = self.rightList, showIndexedItem = 1)
         
         cmds.separator( height=15, style='none' )
         cmds.separator( height=15, style='none' )
         
         self.connectBTN = cmds.button(label = "CONNECT >>", command = self.doConnect)
         self.disconnectBTN = cmds.button(label = "<< DISCONNECT", command = self.doDisconnect)
         
         
         cmds.separator( height=20, style='in' )
         cmds.separator( height=20, style='in' )
         
         cmds.showWindow(self.winName) 
         
     def doConnect(self, _):
         print "Connecting..."
         self.checkList = cmds.textScrollList("tsRegConnList", query = True, selectItem = True)
         
         #if checklist is populated, do stuff. If not, that means the user has not made any selections. Tell them.
         if self.checkList != None:
             #grab the OTHER list, to see what's in it
             self.unsortedC = cmds.textScrollList("tsRegDisconnList", query = True, allItems = True)
             #if that list isn't empty
             if self.unsortedC != None:
                 print "List is not empty, adding to it..."
                 print self.unsortedC
                 #smash the 2 lists together (yay Python!), then sort them
                 self.sortedCList = self.unsortedC + self.checkList
                 self.sortedCList.sort()
                 print "Combined Sorted List: " 
                 print self.sortedCList 
                 
                 #remove everything from the disconnected list in the UI
                 self.currentDisconList = cmds.textScrollList("tsRegDisconnList", edit = True, removeAll = True)
 
                 #now repopulate it with the sorted list
                 for eachItem in self.sortedCList:
                     print "\tEach item: " + eachItem
                     cmds.textScrollList("tsRegDisconnList", edit = True, append = eachItem)
                 for eachDisconnItem in self.checkList:
                     print "\tEach Disconnected Item to remove: " + eachDisconnItem
                     cmds.textScrollList("tsRegConnList", edit = True, removeItem = eachDisconnItem)
                 
             else:
                 self.checkList.sort()
                 print "Destination List is empty..."
                 for eachItem in self.checkList:
                     print "\tAdd : " +  eachItem
                     cmds.textScrollList("tsRegConnList", edit = True, removeItem = eachItem)
                     cmds.textScrollList("tsRegDisconnList", edit = True, append = eachItem)  
             #now take the initial selected list and pass it to whatever function
             print "Sending list to Connect function!" 
             self.connectMaps(self.checkList)           
                     
         else:
             print "You haven't selected anything! Select something!"   
             
                         
         
     def doDisconnect(self, _): 
         print "Disconnecting..."
         self.checkDisList = cmds.textScrollList("tsRegDisconnList", query = True, selectItem = True)
        
         #if checklist is populated, do something. If not, that means the user has not made any selections. Tell them.
         if self.checkDisList != None:   
             #grab the other list
             self.unsortedD = cmds.textScrollList("tsRegConnList", query = True, allItems = True)
             if self.unsortedD != None:
                 print "List is not empty, adding to it.."
                 print self.unsortedD
                 #smash the 2 lists together (yay Python!), then sort them
                 self.sortedList = self.unsortedD + self.checkDisList
                 self.sortedList.sort()
                 print "Combined Sorted List: " 
                 print self.sortedList 
                 #remove everything from the connected list in the UI
                 self.currentConList = cmds.textScrollList("tsRegConnList", edit = True, removeAll = True)    
                 #now repopulate it with the sorted list
                 for eachDisItem in self.sortedList:
                     print "\tEach item: " + eachDisItem
                     #cmds.textScrollList("tsRegDisconnList", edit = True, removeItem = eachDisItem)
                     cmds.textScrollList("tsRegConnList", edit = True, append = eachDisItem)
                 for eachConnItem in self.checkDisList:
                     print "\tEach Connected item to remove: " + eachConnItem 
                     cmds.textScrollList("tsRegDisconnList", edit = True, removeItem = eachConnItem) 
             else:
                 self.checkDisList.sort()
                 print "Destination list is empty..."
                 for eachDItem in self.checkDisList:            
                     print "\tAdd : " + eachDItem
                     cmds.textScrollList("tsRegDisconnList", edit = True, removeItem = eachDItem)
                     cmds.textScrollList("tsRegConnList", edit = True, append = eachDItem) 
     
             #now take the initial selected list and pass it to whatever function   
             print "Sending list to disconnect function!"            
             self.disconnectMaps(self.checkList)
                  
         else:
             print "You haven't selected anything! Select something!"   
             
     #you'd write your connect (or whatever) functionality here             
     def connectMaps(self, _):  
         print "I reach here to connect!" 
         print self.checkList     
       
 
     #you'd write your disconnect (or whatever) functionality here            
     def disconnectMaps(self, _):  
         print "I reach here to disconnect!"  
         print self.checkDisList              
 
     
 
 #just some test lists
 toConnect = ["bump", "specColor", "opacity", "bump_var1", "specColor90_var2"]
 alreadyConnected = ["reflective", "incandescence"]
 basicMaps = ["incandescence", "specColor", "opacity", "bump"]
 
 #here you would pass 'connectListUI' 2 lists to initially populate the UI window        
 def doUI():            
     testUI = connectListUI(toConnect, alreadyConnected)
 
    
 doUI()

Leave a Reply

Your email address will not be published. Required fields are marked *