using System; using System.Collections.Generic; using UnityEngine; using UnityEditor; using qtools.qhierarchy.pcomponent.pbase; using qtools.qhierarchy.phierarchy; using qtools.qhierarchy.phelper; using qtools.qhierarchy.pdata; namespace qtools.qhierarchy.pcomponent { public class QLockComponent: QBaseComponent { // PRIVATE private Texture2D buttonLockOn; private Texture2D buttonLockOff; private bool showModifierWarning; private int targetLockState = -1; // CONSTRUCTOR public QLockComponent() { buttonLockOn = QResources.getInstance().getTexture(QTexture.QLockOnButton); buttonLockOff = QResources.getInstance().getTexture(QTexture.QLockOffButton); QSettings.getInstance().addEventListener(QSetting.ShowModifierWarning , settingsChanged); QSettings.getInstance().addEventListener(QSetting.ShowLockComponent , settingsChanged); QSettings.getInstance().addEventListener(QSetting.ShowLockComponentDuringPlayMode, settingsChanged); settingsChanged(); } // PRIVATE private void settingsChanged() { showModifierWarning = QSettings.getInstance().get(QSetting.ShowModifierWarning); enabled = QSettings.getInstance().get(QSetting.ShowLockComponent); showComponentDuringPlayMode = QSettings.getInstance().get(QSetting.ShowLockComponentDuringPlayMode); } // DRAW public override void layout(GameObject gameObject, QObjectList objectList, ref Rect rect) { rect.x -= 13; rect.width = 13; } public override void draw(GameObject gameObject, QObjectList objectList, Rect selectionRect, Rect curRect) { bool isLock = isGameObjectLock(gameObject, objectList); if (isLock == true && (gameObject.hideFlags & HideFlags.NotEditable) != HideFlags.NotEditable) { gameObject.hideFlags |= HideFlags.NotEditable; EditorUtility.SetDirty(gameObject); } else if (isLock == false && (gameObject.hideFlags & HideFlags.NotEditable) == HideFlags.NotEditable) { gameObject.hideFlags ^= HideFlags.NotEditable; EditorUtility.SetDirty(gameObject); } GUI.DrawTexture(curRect, isLock ? buttonLockOn : buttonLockOff); } public override void eventHandler(GameObject gameObject, QObjectList objectList, Event currentEvent, Rect curRect) { if (currentEvent.isMouse && currentEvent.button == 0 && curRect.Contains(currentEvent.mousePosition)) { bool isLock = isGameObjectLock(gameObject, objectList); if (currentEvent.type == EventType.MouseDown) { targetLockState = ((!isLock) == true ? 1 : 0); } else if (currentEvent.type == EventType.MouseDrag && targetLockState != -1) { if (targetLockState == (isLock == true ? 1 : 0)) return; } else { targetLockState = -1; return; } List targetGameObjects = new List(); if (currentEvent.shift) { if (!showModifierWarning || EditorUtility.DisplayDialog("Change locking", "Are you sure you want to " + (isLock ? "unlock" : "lock") + " this GameObject and all its children? (You can disable this warning in the settings)", "Yes", "Cancel")) { getGameObjectListRecursive(gameObject, ref targetGameObjects); } } else if (currentEvent.alt) { if (gameObject.transform.parent != null) { if (!showModifierWarning || EditorUtility.DisplayDialog("Change locking", "Are you sure you want to " + (isLock ? "unlock" : "lock") + " this GameObject and its siblings? (You can disable this warning in the settings)", "Yes", "Cancel")) { getGameObjectListRecursive(gameObject.transform.parent.gameObject, ref targetGameObjects, 1); targetGameObjects.Remove(gameObject.transform.parent.gameObject); } } else { Debug.Log("This action for root objects is supported only for Unity3d 5.3.3 and above"); return; } } else { if (Selection.Contains(gameObject)) { targetGameObjects.AddRange(Selection.gameObjects); } else { getGameObjectListRecursive(gameObject, ref targetGameObjects, 0); }; } setLock(targetGameObjects, objectList, !isLock); currentEvent.Use(); } } public override void disabledHandler(GameObject gameObject, QObjectList objectList) { if (objectList != null && objectList.lockedObjects.Contains(gameObject)) { objectList.lockedObjects.Remove(gameObject); gameObject.hideFlags &= ~HideFlags.NotEditable; EditorUtility.SetDirty(gameObject); } } // PRIVATE private bool isGameObjectLock(GameObject gameObject, QObjectList objectList) { return objectList == null ? false : objectList.lockedObjects.Contains(gameObject); } private void setLock(List gameObjects, QObjectList objectList, bool targetLock) { if (gameObjects.Count == 0) return; if (objectList == null) objectList = QObjectListManager.getInstance().getObjectList(gameObjects[0], true); Undo.RecordObject(objectList, targetLock ? "Lock" : "Unlock"); for (int i = gameObjects.Count - 1; i >= 0; i--) { GameObject curGameObject = gameObjects[i]; Undo.RecordObject(curGameObject, targetLock ? "Lock" : "Unlock"); if (targetLock) { curGameObject.hideFlags |= HideFlags.NotEditable; if (!objectList.lockedObjects.Contains(curGameObject)) objectList.lockedObjects.Add(curGameObject); } else { curGameObject.hideFlags &= ~HideFlags.NotEditable; objectList.lockedObjects.Remove(curGameObject); } EditorUtility.SetDirty(curGameObject); } } } }