152 lines
5.9 KiB
Python
152 lines
5.9 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
Maya Icon Viewer
|
|
A utility tool to browse, search, and manage Maya icons.
|
|
Compatible with Maya 2017+ and Python 2.7/3.x
|
|
"""
|
|
|
|
from __future__ import print_function, division, absolute_import
|
|
import os
|
|
import sys
|
|
import maya.cmds as cmds
|
|
|
|
# Global variables
|
|
favorites = [] # Store favorite icons
|
|
MAX_FAVORITES = 15 # Maximum capacity of favorites
|
|
ICON_SIZE = 50 # Icon size in pixels
|
|
COLUMNS = 15 # Number of columns in icon grid
|
|
ROWS = 10 # Number of visible rows in icon grid
|
|
WINDOW_NAME = "mayaIconViewer" # Window name
|
|
|
|
def create_icon_viewer():
|
|
"""Create and display the icon viewer window"""
|
|
window_width = COLUMNS * ICON_SIZE
|
|
|
|
# Delete window if it already exists
|
|
if cmds.window(WINDOW_NAME, exists=True):
|
|
cmds.deleteUI(WINDOW_NAME)
|
|
|
|
# Create main window
|
|
cmds.window(WINDOW_NAME, title="Maya Icon Viewer", width=window_width)
|
|
main_layout = cmds.columnLayout(adjustableColumn=True)
|
|
|
|
# Add UI elements
|
|
create_ui_elements(window_width)
|
|
update_icons()
|
|
cmds.showWindow(WINDOW_NAME)
|
|
|
|
def create_ui_elements(width):
|
|
"""Create UI elements including search field and icon areas"""
|
|
cmds.text(label="Click icon to copy name and add to favorites - Note: Search may be slow, please be patient",
|
|
align="center", font="boldLabelFont", width=width)
|
|
cmds.textFieldGrp("searchField", label="Search:",
|
|
columnWidth=[(1, 50), (2, width-70)],
|
|
changeCommand=update_icons)
|
|
create_favorites_area()
|
|
create_icon_grid()
|
|
|
|
def create_favorites_area():
|
|
"""Create favorites area for quick access to frequently used icons"""
|
|
cmds.separator(height=10, style='none') # Add spacing
|
|
cmds.text(label="Favorites", align='left', font="boldLabelFont")
|
|
cmds.separator(height=5, style='none') # Add more spacing
|
|
|
|
global favorites_layout
|
|
favorites_layout = cmds.rowLayout(numberOfColumns=MAX_FAVORITES+1,
|
|
columnWidth1=45,
|
|
adjustableColumn=2,
|
|
columnAttach=[(1, 'left', 0), (2, 'left', 0)],
|
|
height=50,
|
|
backgroundColor=[0.2, 0.2, 0.2])
|
|
|
|
# Add star icon (non-clickable)
|
|
cmds.symbolButton(image="SE_FavoriteStar.png", width=45, height=45,
|
|
enable=False, annotation="Favorites: Click icon to quickly copy name")
|
|
|
|
# Create favorite icon slots
|
|
for _ in range(MAX_FAVORITES):
|
|
cmds.symbolButton(parent=favorites_layout, width=45, height=45, visible=False)
|
|
|
|
cmds.setParent('..')
|
|
cmds.separator(height=10, style='none') # Add bottom spacing
|
|
|
|
def create_icon_grid():
|
|
"""Create icon grid with scroll layout"""
|
|
global scroll_layout, grid_layout
|
|
scroll_layout = cmds.scrollLayout(horizontalScrollBarThickness=16,
|
|
verticalScrollBarThickness=16)
|
|
grid_layout = cmds.gridLayout(numberOfColumns=COLUMNS,
|
|
cellWidthHeight=(ICON_SIZE, ICON_SIZE))
|
|
|
|
def update_icons(*args):
|
|
"""Update icon display based on search term"""
|
|
search_term = cmds.textFieldGrp("searchField", query=True, text=True).lower()
|
|
|
|
# Clear existing icons
|
|
for child in cmds.gridLayout(grid_layout, query=True, childArray=True) or []:
|
|
cmds.deleteUI(child)
|
|
|
|
# Add matching icons
|
|
for icon in cmds.resourceManager(nameFilter="*.png"):
|
|
if search_term in icon.lower():
|
|
cmds.symbolButton(parent=grid_layout, image=icon, width=45, height=45,
|
|
command=lambda x, i=icon: handle_click(i), annotation=icon)
|
|
|
|
adjust_layout()
|
|
|
|
def adjust_layout():
|
|
"""Adjust layout size based on number of visible icons"""
|
|
visible_icons = len(cmds.gridLayout(grid_layout, query=True, childArray=True) or [])
|
|
total_rows = -(-visible_icons // COLUMNS) # Ceiling division
|
|
scroll_height = min(total_rows, ROWS) * ICON_SIZE
|
|
cmds.scrollLayout(scroll_layout, edit=True, height=scroll_height)
|
|
cmds.window(WINDOW_NAME, edit=True, height=scroll_height + 180)
|
|
|
|
def handle_click(icon):
|
|
"""Handle icon click event"""
|
|
copy_to_clipboard(icon)
|
|
add_to_favorites(icon)
|
|
|
|
def copy_to_clipboard(icon):
|
|
"""Copy icon name to clipboard (cross-platform compatible)"""
|
|
try:
|
|
if sys.platform == 'win32':
|
|
# Windows
|
|
os.system('echo {}| clip'.format(icon.replace('|', '^|')))
|
|
elif sys.platform == 'darwin':
|
|
# macOS
|
|
os.system('echo "{}" | pbcopy'.format(icon))
|
|
else:
|
|
# Linux
|
|
try:
|
|
os.system('echo "{}" | xclip -selection clipboard'.format(icon))
|
|
except:
|
|
# Fallback if xclip is not available
|
|
os.system('echo "{}" | xsel --clipboard --input'.format(icon))
|
|
print("Copied to clipboard: {}".format(icon))
|
|
except Exception as e:
|
|
cmds.warning("Failed to copy to clipboard: {}".format(str(e)))
|
|
|
|
def add_to_favorites(icon):
|
|
"""Add icon to favorites"""
|
|
global favorites
|
|
if icon not in favorites:
|
|
if len(favorites) >= MAX_FAVORITES:
|
|
favorites.pop(0) # Remove oldest icon if favorites is full
|
|
favorites.append(icon)
|
|
update_favorites()
|
|
|
|
def update_favorites():
|
|
"""Update favorites display"""
|
|
children = cmds.layout(favorites_layout, query=True, childArray=True)
|
|
for i, child in enumerate(children[1:], 1): # Skip first child (star icon)
|
|
if i <= len(favorites):
|
|
cmds.symbolButton(child, edit=True, image=favorites[i-1], visible=True,
|
|
command=lambda x, icon=favorites[i-1]: copy_to_clipboard(icon))
|
|
else:
|
|
cmds.symbolButton(child, edit=True, visible=False)
|
|
|
|
if __name__ == "__main__":
|
|
create_icon_viewer()
|