Exemple #1
0
        static bool IsApplicableForOperation(
            string path,
            bool isDirectory,
            AssetMenuOperations operation,
            IAssetStatusCache assetStatusCache)
        {
            SelectedAssetGroupInfo info = SelectedAssetGroupInfo.BuildFromSingleFile(
                path, isDirectory, assetStatusCache);

            return(AssetMenuUpdater.GetAvailableMenuOperations(info).HasFlag(operation));
        }
Exemple #2
0
        internal static void Initialize(
            IAssetStatusCache cache,
            Action repaintProjectWindow)
        {
            mAssetStatusCache     = cache;
            mRepaintProjectWindow = repaintProjectWindow;

            EditorApplication.projectWindowItemOnGUI += OnProjectWindowItemGUI;

            mRepaintProjectWindow();
        }
        static bool IsConflicted(
            bool isGluonMode,
            IAssetStatusCache assetStatusCache,
            string fullPath)
        {
            if (!isGluonMode)
            {
                return(false);
            }

            return(ClassifyAssetStatus.IsConflicted(
                       assetStatusCache.GetStatusForPath(fullPath)));
        }
Exemple #4
0
        internal static void Enable(
            IAssetMenuOperations operations,
            IAssetStatusCache statusCache,
            AssetOperations.IAssetSelection assetsSelection)
        {
            mOperations      = operations;
            mStatusCache     = statusCache;
            mAssetsSelection = assetsSelection;

            mIsEnabled = true;

            UnityEditor.Editor.finishedDefaultHeaderGUI +=
                Editor_finishedDefaultHeaderGUI;

            RefreshAsset.RepaintInspectors();
        }
Exemple #5
0
        void DoFileList(
            WorkspaceInfo wkInfo,
            List <string> paths,
            IAssetStatusCache assetStatusCache,
            MetaCache metaCache)
        {
            mFileListScrollPosition = GUILayout.BeginScrollView(
                mFileListScrollPosition,
                EditorStyles.helpBox,
                GUILayout.ExpandHeight(true));

            foreach (string path in paths)
            {
                if (MetaPath.IsMetaPath(path))
                {
                    continue;
                }

                Texture fileIcon = Directory.Exists(path) ?
                                   Images.GetDirectoryIcon() :
                                   Images.GetFileIcon(path);

                string label = WorkspacePath.GetWorkspaceRelativePath(
                    wkInfo.ClientPath, path);

                if (metaCache.HasMeta(path))
                {
                    label = string.Concat(label, UnityConstants.TREEVIEW_META_LABEL);
                }

                GUIContent content = new GUIContent(
                    label, fileIcon);

                GUILayout.Label(
                    content,
                    GUILayout.Height(UnityConstants.TREEVIEW_ROW_HEIGHT));

                Rect iconRect = GUILayoutUtility.GetLastRect();

                DoStatusOverlays(
                    iconRect,
                    assetStatusCache,
                    path);
            }

            GUILayout.EndScrollView();
        }
        internal PendingChangesTab(
            WorkspaceInfo wkInfo,
            ViewHost viewHost,
            bool isGluonMode,
            WorkspaceWindow workspaceWindow,
            IViewSwitcher switcher,
            IMergeViewLauncher mergeViewLauncher,
            IHistoryViewLauncher historyViewLauncher,
            PlasticGui.WorkspaceWindow.PendingChanges.PendingChanges pendingChanges,
            NewIncomingChangesUpdater developerNewIncomingChangesUpdater,
            GluonNewIncomingChangesUpdater gluonNewIncomingChangesUpdater,
            IAssetStatusCache assetStatusCache,
            EditorWindow parentWindow)
        {
            mWkInfo              = wkInfo;
            mViewHost            = viewHost;
            mIsGluonMode         = isGluonMode;
            mWorkspaceWindow     = workspaceWindow;
            mHistoryViewLauncher = historyViewLauncher;
            mPendingChanges      = pendingChanges;
            mDeveloperNewIncomingChangesUpdater = developerNewIncomingChangesUpdater;
            mGluonNewIncomingChangesUpdater     = gluonNewIncomingChangesUpdater;
            mAssetStatusCache = assetStatusCache;
            mParentWindow     = parentWindow;
            mGuiMessage       = new UnityPlasticGuiMessage(parentWindow);

            mCheckedStateManager = new CheckedStateManager();

            mNewChangesInWk = NewChangesInWk.Build(
                mWkInfo, new BuildWorkspacekIsRelevantNewChange());

            BuildComponents(isGluonMode, parentWindow);

            mProgressControls = new ProgressControlsForViews();

            workspaceWindow.RegisterPendingChangesProgressControls(
                mProgressControls);

            mPendingChangesOperations = new PendingChangesOperations(
                mWkInfo, workspaceWindow, switcher, mergeViewLauncher, this,
                mProgressControls, workspaceWindow, null, null, null);

            InitIgnoreRulesAndRefreshView(mWkInfo.ClientPath, this);
        }
Exemple #7
0
            internal static List <string> ForOperation(
                IAssetSelection assetSelection,
                IAssetStatusCache assetStatusCache,
                AssetMenuOperations operation)
            {
                List <string> selectedPaths = AssetsSelection.GetSelectedPaths(
                    assetSelection.GetSelectedAssets());

                List <string> result = new List <string>(selectedPaths);

                foreach (string path in selectedPaths)
                {
                    if (MetaPath.IsMetaPath(path))
                    {
                        continue;
                    }

                    string metaPath = MetaPath.GetMetaPath(path);

                    if (!File.Exists(metaPath))
                    {
                        continue;
                    }

                    if (result.Contains(metaPath))
                    {
                        continue;
                    }

                    if (!IsApplicableForOperation(
                            metaPath, false, operation, assetStatusCache))
                    {
                        continue;
                    }

                    result.Add(metaPath);
                }

                return(result);
            }
Exemple #8
0
        void DoFileList(
            WorkspaceInfo wkInfo,
            List <string> paths,
            IAssetStatusCache assetStatusCache,
            MetaCache metaCache)
        {
            mFileListScrollPosition = GUILayout.BeginScrollView(
                mFileListScrollPosition,
                EditorStyles.helpBox,
                GUILayout.ExpandHeight(true));

            foreach (string path in paths)
            {
                if (MetaPath.IsMetaPath(path))
                {
                    continue;
                }

                Texture fileIcon = Directory.Exists(path) ?
                                   Images.GetDirectoryIcon() :
                                   Images.GetFileIcon(path);

                string label = WorkspacePath.GetWorkspaceRelativePath(
                    wkInfo.ClientPath, path);

                if (metaCache.HasMeta(path))
                {
                    label = string.Concat(label, UnityConstants.TREEVIEW_META_LABEL);
                }

                AssetsOverlays.AssetStatus assetStatus =
                    assetStatusCache.GetStatusForPath(path);

                Rect selectionRect = EditorGUILayout.GetControlRect();

                DoListViewItem(selectionRect, fileIcon, label, assetStatus);
            }

            GUILayout.EndScrollView();
        }
Exemple #9
0
        static void DoStatusOverlays(
            Rect iconRect,
            IAssetStatusCache assetStatusCache,
            string path)
        {
            AssetsOverlays.AssetStatus statusesToDraw = DrawAssetOverlay.GetStatusesToDraw(
                assetStatusCache.GetStatusForPath(path));

            foreach (AssetsOverlays.AssetStatus status in Enum.GetValues(typeof(AssetsOverlays.AssetStatus)))
            {
                if (status == AssetsOverlays.AssetStatus.None)
                {
                    continue;
                }

                if (!statusesToDraw.HasFlag(status))
                {
                    continue;
                }

                GetChangesOverlayIcon.Data overlayIconData =
                    GetChangesOverlayIcon.ForAssetStatus(status);

                if (overlayIconData != null)
                {
                    Rect overlayIconRect = new Rect(
                        iconRect.x + overlayIconData.XOffset,
                        iconRect.y + overlayIconData.YOffset,
                        overlayIconData.Size, overlayIconData.Size);

                    GUI.DrawTexture(
                        overlayIconRect, overlayIconData.Texture,
                        ScaleMode.ScaleToFit);
                }
            }
        }
Exemple #10
0
 internal static void RegisterAssetStatusCache(
     IAssetStatusCache assetStatusCache)
 {
     mAssetStatusCache = assetStatusCache;
 }
        static void ChangeTreeViewItemCellGUI(
            bool isGluonMode,
            IAssetStatusCache assetStatusCache,
            Rect rect,
            float rowHeight,
            PendingChangesTreeView treeView,
            UnityPendingChangesTree pendingChangesTree,
            ChangeTreeViewItem item,
            PendingChangesTreeColumn column,
            bool isSelected,
            bool isFocused)
        {
            PendingChangeInfo changeInfo = item.ChangeInfo;

            string label = changeInfo.GetColumnText(
                PendingChangesTreeHeaderState.GetColumnName(column));

            DefaultStyles.label.fontSize = UnityConstants.PENDING_CHANGES_FONT_SIZE;

            if (column == PendingChangesTreeColumn.Item)
            {
                if (pendingChangesTree.HasMeta(changeInfo.ChangeInfo))
                {
                    label = string.Concat(label, UnityConstants.TREEVIEW_META_LABEL);
                }

                Texture icon = GetIcon(changeInfo);

                bool isConflicted = IsConflicted(
                    isGluonMode, assetStatusCache,
                    changeInfo.ChangeInfo.GetFullPath());

                GetChangesOverlayIcon.Data overlayIconData =
                    GetChangesOverlayIcon.ForPendingChange(
                        changeInfo.ChangeInfo, isConflicted);

                bool wasChecked = changeInfo.IsChecked();

                bool isChecked = DrawTreeViewItem.ForCheckableItemCell(
                    rect, rowHeight, item.depth,
                    icon, overlayIconData, label,
                    isSelected, isFocused, false,
                    wasChecked);

                changeInfo.UpdateCheckedState(isChecked);

                if (wasChecked != isChecked)
                {
                    UpdateCheckStateForSelection(treeView, item);
                    treeView.SelectionChanged();
                }

                return;
            }

            if (column == PendingChangesTreeColumn.Size)
            {
                DrawTreeViewItem.ForSecondaryLabelRightAligned(
                    rect, label, isSelected, isFocused, false);
                return;
            }

            DrawTreeViewItem.ForSecondaryLabel(
                rect, label, isSelected, isFocused, false);
        }
Exemple #12
0
        internal static SelectedAssetGroupInfo BuildFromAssetList(
            AssetList assetList,
            IAssetStatusCache statusCache)
        {
            bool isCheckedInSelection          = true;
            bool isControlledSelection         = true;
            bool isCheckedOutSelection         = true;
            bool isPrivateSelection            = true;
            bool isAddedSelection              = true;
            bool isFileSelection               = true;
            bool hasAnyAddedInSelection        = false;
            bool hasAnyRemoteLockedInSelection = false;

            int selectedCount = 0;

            foreach (Asset asset in assetList)
            {
                if (string.IsNullOrEmpty(asset.path))
                {
                    continue;
                }

                SelectedAssetGroupInfo singleFileGroupInfo = BuildFromSingleFile(
                    asset.path,
                    asset.isFolder,
                    statusCache);

                if (!singleFileGroupInfo.IsCheckedInSelection)
                {
                    isCheckedInSelection = false;
                }

                if (!singleFileGroupInfo.IsControlledSelection)
                {
                    isControlledSelection = false;
                }

                if (!singleFileGroupInfo.IsCheckedOutSelection)
                {
                    isCheckedOutSelection = false;
                }

                if (!singleFileGroupInfo.IsPrivateSelection)
                {
                    isPrivateSelection = false;
                }

                if (!singleFileGroupInfo.IsAddedSelection)
                {
                    isAddedSelection = false;
                }

                if (!singleFileGroupInfo.IsFileSelection)
                {
                    isFileSelection = false;
                }

                if (singleFileGroupInfo.HasAnyAddedInSelection)
                {
                    hasAnyAddedInSelection = true;
                }

                if (singleFileGroupInfo.HasAnyRemoteLockedInSelection)
                {
                    hasAnyRemoteLockedInSelection = true;
                }

                selectedCount++;
            }

            return(new SelectedAssetGroupInfo()
            {
                IsCheckedInSelection = isCheckedInSelection,
                IsCheckedOutSelection = isCheckedOutSelection,
                IsControlledSelection = isControlledSelection,
                IsPrivateSelection = isPrivateSelection,
                IsAddedSelection = isAddedSelection,
                IsFileSelection = isFileSelection,
                HasAnyAddedInSelection = hasAnyAddedInSelection,
                HasAnyRemoteLockedInSelection = hasAnyRemoteLockedInSelection,
                SelectedCount = selectedCount,
            });
        }
Exemple #13
0
        internal static SelectedAssetGroupInfo BuildFromSingleFile(
            string path,
            bool isDirectory,
            IAssetStatusCache statusCache)
        {
            bool isCheckedInSelection          = true;
            bool isControlledSelection         = true;
            bool isCheckedOutSelection         = true;
            bool isPrivateSelection            = true;
            bool isAddedSelection              = true;
            bool isFileSelection               = true;
            bool hasAnyAddedInSelection        = false;
            bool hasAnyRemoteLockedInSelection = false;

            string assetPath = Path.GetFullPath(path);

            WorkspaceTreeNode wkTreeNode =
                PlasticGui.Plastic.API.GetWorkspaceTreeNode(assetPath);

            if (isDirectory)
            {
                isFileSelection = false;
            }

            if (CheckWorkspaceTreeNodeStatus.IsPrivate(wkTreeNode))
            {
                isControlledSelection = false;
            }
            else
            {
                isPrivateSelection = false;
            }

            if (CheckWorkspaceTreeNodeStatus.IsCheckedOut(wkTreeNode))
            {
                isCheckedInSelection = false;
            }
            else
            {
                isCheckedOutSelection = false;
            }

            if (CheckWorkspaceTreeNodeStatus.IsAdded(wkTreeNode))
            {
                hasAnyAddedInSelection = true;
            }
            else
            {
                isAddedSelection = false;
            }

            AssetsOverlays.AssetStatus assetStatus = statusCache.GetStatusForPath(assetPath);

            if (ClassifyAssetStatus.IsLockedRemote(assetStatus))
            {
                hasAnyRemoteLockedInSelection = true;
            }

            return(new SelectedAssetGroupInfo()
            {
                IsCheckedInSelection = isCheckedInSelection,
                IsCheckedOutSelection = isCheckedOutSelection,
                IsControlledSelection = isControlledSelection,
                IsPrivateSelection = isPrivateSelection,
                IsAddedSelection = isAddedSelection,
                IsFileSelection = isFileSelection,
                HasAnyAddedInSelection = hasAnyAddedInSelection,
                HasAnyRemoteLockedInSelection = hasAnyRemoteLockedInSelection,
                SelectedCount = 1,
            });
        }
        internal PendingChangesTab(
            WorkspaceInfo wkInfo,
            ViewHost viewHost,
            bool isGluonMode,
            WorkspaceWindow workspaceWindow,
            IViewSwitcher switcher,
            IMergeViewLauncher mergeViewLauncher,
            IHistoryViewLauncher historyViewLauncher,
            PlasticGui.WorkspaceWindow.PendingChanges.PendingChanges pendingChanges,
            NewIncomingChangesUpdater developerNewIncomingChangesUpdater,
            GluonNewIncomingChangesUpdater gluonNewIncomingChangesUpdater,
            IAssetStatusCache assetStatusCache,
            StatusBar statusBar,
            EditorWindow parentWindow)
        {
            mWkInfo              = wkInfo;
            mViewHost            = viewHost;
            mIsGluonMode         = isGluonMode;
            mWorkspaceWindow     = workspaceWindow;
            mHistoryViewLauncher = historyViewLauncher;
            mPendingChanges      = pendingChanges;
            mDeveloperNewIncomingChangesUpdater = developerNewIncomingChangesUpdater;
            mGluonNewIncomingChangesUpdater     = gluonNewIncomingChangesUpdater;
            mAssetStatusCache    = assetStatusCache;
            mStatusBar           = statusBar;
            mParentWindow        = parentWindow;
            mGuiMessage          = new UnityPlasticGuiMessage(parentWindow);
            mCheckedStateManager = new CheckedStateManager();

            mNewChangesInWk = NewChangesInWk.Build(
                mWkInfo,
                new BuildWorkspacekIsRelevantNewChange());

            BuildComponents(isGluonMode, parentWindow);

            mBorderColor = EditorGUIUtility.isProSkin
                ? (Color) new Color32(35, 35, 35, 255)
                : (Color) new Color32(153, 153, 153, 255);

            mProgressControls = new ProgressControlsForViews();

            mCooldownClearCheckinSuccessAction = new CooldownWindowDelayer(
                DelayedClearCheckinSuccess,
                UnityConstants.NOTIFICATION_CLEAR_INTERVAL);

            workspaceWindow.RegisterPendingChangesProgressControls(mProgressControls);

            mPendingChangesOperations = new PendingChangesOperations(
                mWkInfo,
                workspaceWindow,
                switcher,
                mergeViewLauncher,
                this,
                mProgressControls,
                workspaceWindow,
                null,
                null,
                null);

            InitIgnoreRulesAndRefreshView(mWkInfo.ClientPath, this);
        }
Exemple #15
0
        internal static SelectedPathsGroupInfo GetSelectedPathsGroupInfo(
            AssetList selectedAssets,
            IAssetStatusCache assetStatusCache)
        {
            SelectedPathsGroupInfo result = new SelectedPathsGroupInfo();

            if (selectedAssets.Count == 0)
            {
                return(result);
            }

            result.SelectedCount = selectedAssets.Count;

            result.IsRootSelected            = false;
            result.IsCheckedoutEverySelected = true;
            result.IsDirectoryEverySelected  = true;
            result.IsCheckedinEverySelected  = true;
            result.IsChangedEverySelected    = true;

            Asset       firstAsset     = selectedAssets[0];
            string      firstAssetName = GetAssetName(firstAsset);
            AssetStatus firstStatus    = GetAssetStatus(
                firstAsset,
                assetStatusCache);

            result.FirstIsControlled = ClassifyAssetStatus.IsControlled(firstStatus);
            result.FirstIsDirectory  = firstAsset.isFolder;

            result.FilterInfo.CommonName      = firstAssetName;
            result.FilterInfo.CommonExtension = Path.GetExtension(firstAssetName);
            result.FilterInfo.CommonFullPath  = firstAsset.assetPath;

            foreach (Asset asset in selectedAssets)
            {
                string      assetName = GetAssetName(asset);
                AssetStatus status    = GetAssetStatus(
                    asset,
                    assetStatusCache);

                result.IsCheckedoutEverySelected &= ClassifyAssetStatus.IsCheckedOut(status);
                result.IsDirectoryEverySelected  &= asset.isFolder;
                result.IsCheckedinEverySelected  &= false; // TODO: not implemented yet
                result.IsChangedEverySelected    &= false; // TODO: not implemented yet

                result.IsAnyDirectorySelected |= asset.isFolder;
                result.IsAnyPrivateSelected   |= ClassifyAssetStatus.IsPrivate(status);

                result.FilterInfo.IsAnyIgnoredSelected       |= ClassifyAssetStatus.IsIgnored(status);
                result.FilterInfo.IsAnyHiddenChangedSelected |= ClassifyAssetStatus.IsHiddenChanged(status);

                if (result.SelectedCount == 1)
                {
                    continue;
                }

                if (result.FilterInfo.CommonName != assetName)
                {
                    result.FilterInfo.CommonName = null;
                }

                if (result.FilterInfo.CommonExtension != Path.GetExtension(assetName))
                {
                    result.FilterInfo.CommonExtension = null;
                }

                if (result.FilterInfo.CommonFullPath != asset.assetPath)
                {
                    result.FilterInfo.CommonFullPath = null;
                }
            }

            return(result);
        }