static bool IsApplicableForOperation( string path, bool isDirectory, AssetMenuOperations operation, IAssetStatusCache assetStatusCache) { SelectedAssetGroupInfo info = SelectedAssetGroupInfo.BuildFromSingleFile( path, isDirectory, assetStatusCache); return(AssetMenuUpdater.GetAvailableMenuOperations(info).HasFlag(operation)); }
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))); }
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(); }
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); }
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); }
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(); }
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); } } }
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); }
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, }); }
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); }
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); }