Exemple #1
0
    ///---------------------------------------------------------------------
    /// <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);
    }
Exemple #2
0
    ///---------------------------------------------------------------------
    /// <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);
    }
Exemple #3
0
    /// <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);
                    }
                }
            }
        }
    }
Exemple #4
0
    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();
        }
    }
Exemple #5
0
    ///---------------------------------------------------------------------
	/// <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);



	}