///--------------------------------------------------------------------- /// <summary> /// 右クリックメニュー /// </summary> ///--------------------------------------------------------------------- static bool IsManaged() { List <string> filepathArray = SelectAssetPaths; // 複数ファイル対応 foreach (var asset in filepathArray) { if (FileStatusMap.ContainsKey(asset)) { VCSStatus status = (VCSStatus)FileStatusMap[asset]; if (status == VCSStatus.UNMANAGE) { return(false); } } else if (FolderStatusMap.ContainsKey(asset)) { VCSStatus status = (VCSStatus)FolderStatusMap[asset]; if (status == VCSStatus.UNMANAGE) { return(false); } } } return(true); }
///--------------------------------------------------------------------- /// <summary> /// 状態アイコン表示 /// </summary> /// <param name="selectionRect"></param> private static void ShowStatusLabel(VCSStatus status, Rect selectionRect) { // アイコンの位置 const int size = 13; var pos = selectionRect; pos.y = selectionRect.position.y; pos.x = selectionRect.position.x; pos.width = size; pos.height = size; pos.yMin++; // ラベル表示 string text = StatusIconString[(int)status]; Color mColor = StatusIconColor[(int)status]; if (status == VCSStatus.NORMAL) { if (Settings.IconOverlayOnlyModified) { return; } } GUIStyleState styleState = new GUIStyleState(); styleState.textColor = Color.white; GUIStyle style = new GUIStyle(); style.fontSize = 14; style.fontStyle = FontStyle.Bold; style.normal = styleState; float offset = -12 + 3 * (selectionRect.height / 16.0f); // 小さいアイコンのときは端っこに寄せる pos.y = selectionRect.height > 16.0f ? selectionRect.position.y + offset : selectionRect.position.y + 1; pos.x = selectionRect.height > 16.0f ? selectionRect.position.x + offset : 0; // BG var color = GUI.color; GUI.color = mColor; GUI.DrawTexture(pos, EditorGUIUtility.whiteTexture); GUI.color = color; // テキストは少し中に寄せる pos.y -= 2; pos.x += 2; // アイコン GUI.Label(pos, text, style); }
/// <summary> /// ステータスアイコンをプロジェクトビューにオーバーレイ表示 /// </summary> /// <param name="guid"></param> /// <param name="selectionRect"></param> private static void OnGUI(string guid, Rect selectionRect) { if (Settings.IconOverlay) { // ステータス更新 //var current = Event.current; //if (current.type == EventType.MouseDown) if (IsSelectAsset && SelectAssetPaths[0] != "") { VCSStatusUpdate(SelectAssetPaths[0]); } var asset = AssetDatabase.GUIDToAssetPath(guid); if (IsUpdateSuccess) { if (FileStatusMap.ContainsKey(asset)) { // アイコン表示(ファイル) VCSStatus status = (VCSStatus)FileStatusMap[asset]; ShowStatusLabel(status, selectionRect); } else if (FolderStatusMap.ContainsKey(asset)) { // アイコン表示(フォルダ) VCSStatus status = (VCSStatus)FolderStatusMap[asset]; ShowStatusLabel(status, selectionRect); } else { if (asset != "" && Settings.VcsType != VCSType.SVN) { ShowStatusLabel(VCSStatus.NORMAL, selectionRect); } } } } }
private static void VCSStatusUpdate(string dataPath) { var path = dataPath; // ファイルのときはルートフォルダ if (path.IndexOf(".") != -1) { var startIndex = path.LastIndexOf("/"); if (startIndex == -1) { startIndex = path.Length; } path = path.Substring(0, startIndex); } // 既に更新済み if (path == svnupdatepath) { return; } // 念のため最大数超えたら一旦クリア if (FileStatusMap.Count > 1024) { FileStatusMap.Clear(); } //--------------------------------------------- // ファイルの状態取得 //--------------------------------------------- string st = execGetStatus("status " + consoleCmd[(int)Settings.VcsType], path, ""); // エラー? if (st == "error") { FileStatusMap.Clear(); } // ログ整形 st = st.Replace("\r", ""); st = st.Replace("\r", ""); st = st.Replace("\\", "/"); var files = st.Split('\n'); { // ステータス更新 foreach (string fileStatus in files) { if (fileStatus == "") { continue; } var sIndex = fileStatus.IndexOf(ASSET_ROOT_DIR); if (sIndex == -1) { sIndex = fileStatus.IndexOf(ASSET_ROOT); } if (sIndex == -1) { // ignoreとか。。。 continue; } string filepath = fileStatus.Substring(sIndex); // gitだと移動した時移動前と後のファイル名が出力される... if (filepath.IndexOf("->") > -1) { filepath = filepath.Substring(filepath.IndexOf("-> ") + 3); } { VCSStatus status = CheckStatus(fileStatus); if (filepath.IndexOf(".") != -1) { // metaファイルだけ更新されてるときチェック if (filepath.IndexOf(".meta") > -1) { string assetmeta = filepath.Replace(".meta", ""); VCSStatus assetstatus = FileStatusMap.Contains(assetmeta) ? (VCSStatus)FileStatusMap[assetmeta] : VCSStatus.UNMANAGE; if (status != VCSStatus.NORMAL && assetstatus == VCSStatus.NORMAL) { FileStatusMap[assetmeta] = status; } } FileStatusMap[filepath] = status; } else { FolderStatusMap[filepath] = status; } } } } //--------------------------------------------- // 変更されたファイルが存在するフォルダだけチェック //--------------------------------------------- st = execGetStatus("status " + consoleCmdDir[(int)Settings.VcsType], path, ""); // エラー? if (st == "error") { FolderStatusMap.Clear(); } // ログ整形 st = st.Replace("\r", ""); st = st.Replace("\r", ""); st = st.Replace("\\", "/"); var changefiles = st.Split('\n'); // ステータス更新 foreach (string fileStatus in changefiles) { if (fileStatus == "") { continue; } var sIndex = fileStatus.IndexOf(ASSET_ROOT_DIR); if (sIndex == -1) { sIndex = fileStatus.IndexOf(ASSET_ROOT); } if (sIndex == -1) { // ignoreとか。。。 continue; } string filepath = fileStatus.Substring(sIndex); // ファイルのときはルートフォルダに状態を伝播 var startIndex = filepath.LastIndexOf("/"); if (startIndex == -1) { startIndex = filepath.Length; } filepath = filepath.Substring(0, startIndex); VCSStatus status = CheckStatus(fileStatus); // フォルダが消されたみたいに見えるので、、、 if (status != VCSStatus.NORMAL && status != VCSStatus.CONFRICT) { status = VCSStatus.EDIT; } // ルートフォルダまで同じステータスに filepath = filepath.Replace(ASSET_ROOT_DIR, ""); var dirTree = filepath.Split('/'); string dirpath = ASSET_ROOT_DIR; foreach (var dir in dirTree) { dirpath += dir; if (!FolderStatusMap.Contains(dirpath) || (VCSStatus)FolderStatusMap[dirpath] == VCSStatus.NORMAL) { FolderStatusMap[dirpath] = status; } dirpath += "/"; } } // アセットフォルダは消しとく。 FolderStatusMap.Remove(ASSET_ROOT); // ステータス更新失敗したらしい。。 if (FolderStatusMap.Count == 0 && FileStatusMap.Count == 0) { IsUpdateSuccess = false; Debug.LogWarning("uVCSBridge Status Update Error."); } else { if (!IsUpdateSuccess) { Debug.Log("uVCSBridge Status Update Success."); } IsUpdateSuccess = true; } svnupdatepath = path; if (ProjectWindow) { ProjectWindow.Repaint(); } }
///--------------------------------------------------------------------- /// <summary> /// 状態アイコン表示 /// </summary> /// <param name="selectionRect"></param> private static void ShowStatusLabel(VCSStatus status, Rect selectionRect) { // アイコンの位置 const int size = 13; var pos = selectionRect; pos.y = selectionRect.position.y; pos.x = selectionRect.position.x; pos.width = size; pos.height = size; pos.yMin++; // ラベル表示 string text = StatusIconString[(int)status]; Color mColor = StatusIconColor[(int)status]; if (status == VCSStatus.NORMAL){ if (Settings.IconOverlayOnlyModified) { return; } } GUIStyleState styleState = new GUIStyleState(); styleState.textColor = Color.white; GUIStyle style = new GUIStyle(); style.fontSize = 14; style.fontStyle = FontStyle.Bold; style.normal = styleState; float offset = -12 + 3 * (selectionRect.height / 16.0f); // 小さいアイコンのときは端っこに寄せる pos.y = selectionRect.height > 16.0f ? selectionRect.position.y + offset : selectionRect.position.y+1; pos.x = selectionRect.height > 16.0f ? selectionRect.position.x + offset : 0; // BG var color = GUI.color; GUI.color = mColor; GUI.DrawTexture(pos, EditorGUIUtility.whiteTexture); GUI.color = color; // テキストは少し中に寄せる pos.y -= 2; pos.x += 2; // アイコン GUI.Label(pos, text, style); }