Files
2026-11-01 23:39:55 +02:00

195 lines
5.9 KiB
C#

using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
using Codice.Utils;
using PlasticGui;
using Unity.PlasticSCM.Editor.UI;
using Unity.PlasticSCM.Editor.UI.UIElements;
namespace Unity.PlasticSCM.Editor.Diff.Text
{
internal class DiffTextViewContextMenu
{
internal DiffTextViewContextMenu(Unity.CodeEditor.TextEditor textEditor)
{
mTextEditor = textEditor;
CreateGUI();
mTextEditor.TextArea.RegisterCallback<PointerUpEvent>(OnPointerUp);
mTextEditor.TextArea.RegisterCallback<KeyDownEvent>(OnKeyDown);
}
internal void Dispose()
{
mTextEditor.TextArea.UnregisterCallback<PointerUpEvent>(OnPointerUp);
mTextEditor.TextArea.UnregisterCallback<KeyDownEvent>(OnKeyDown);
}
void OnKeyDown(KeyDownEvent e)
{
if (KeyboardEvents.MatchesShortcut(e, GetPlasticShortcut.ForGoToLine()))
{
e.StopPropagation();
OnGoToLine();
}
}
void OnPointerUp(PointerUpEvent e)
{
if (e.button != 1)
return;
GenericMenu menu = new GenericMenu();
UpdateMenuItems(menu);
menu.ShowAsContext();
}
void UpdateMenuItems(GenericMenu menu)
{
if (mTextEditor.CanUndo)
menu.AddItem(mUndoContent, false, OnUndo);
else
menu.AddDisabledItem(mUndoContent, false);
if (mTextEditor.CanRedo)
menu.AddItem(mRedoContent, false, OnRedo);
else
menu.AddDisabledItem(mRedoContent, false);
menu.AddSeparator(string.Empty);
if (mTextEditor.CanCopy)
menu.AddItem(mCopyContent, false, OnCopy);
else
menu.AddDisabledItem(mCopyContent, false);
if (mTextEditor.CanCut)
menu.AddItem(mCutContent, false, OnCut);
else
menu.AddDisabledItem(mCutContent, false);
if (mTextEditor.CanPaste)
menu.AddItem(mPasteContent, false, OnPaste);
else
menu.AddDisabledItem(mPasteContent, false);
if (mTextEditor.CanDelete)
menu.AddItem(mDeleteContent, false, OnDelete);
else
menu.AddDisabledItem(mDeleteContent, false);
menu.AddSeparator(string.Empty);
menu.AddItem(mSelectAllContent, false, OnSelectAll);
menu.AddSeparator(string.Empty);
menu.AddItem(mGoToLineContent, false, OnGoToLine);
menu.AddSeparator(string.Empty);
menu.AddItem(mFindContent, false, OnFind);
}
void OnUndo()
{
mTextEditor.Undo();
}
void OnRedo()
{
mTextEditor.Redo();
}
void OnCopy()
{
mTextEditor.Copy();
}
void OnCut()
{
mTextEditor.Cut();
}
void OnPaste()
{
mTextEditor.Paste();
}
void OnDelete()
{
mTextEditor.Delete();
}
void OnSelectAll()
{
mTextEditor.SelectAll();
}
void OnGoToLine()
{
GoToLineDialog.Show(
mTextEditor.TextArea.Caret.Line,
mTextEditor.LineCount,
GoToLine);
}
void OnFind()
{
mTextEditor.SearchPanel.IsReplaceMode = false;
mTextEditor.SearchPanel.Open();
}
void GoToLine(int targetLine)
{
mTextEditor.CaretOffset =
mTextEditor.Document.GetLineByNumber(targetLine).Offset;
mTextEditor.ScrollToLine(targetLine);
}
void CreateGUI()
{
mUndoContent = new GUIContent(string.Format("{0} {1}",
PlasticLocalization.GetString(PlasticLocalization.Name.EditMenuUndo),
GetPlasticShortcut.ForUndo()));
mRedoContent = new GUIContent(string.Format("{0} {1}",
PlasticLocalization.GetString(PlasticLocalization.Name.EditMenuRedo),
GetPlasticShortcut.ForRedo()));
mCopyContent = new GUIContent(string.Format("{0} {1}",
PlasticLocalization.GetString(PlasticLocalization.Name.EditMenuCopy),
GetPlasticShortcut.ForCopy()));
mCutContent = new GUIContent(string.Format("{0} {1}",
PlasticLocalization.GetString(PlasticLocalization.Name.EditMenuCut),
GetPlasticShortcut.ForCut()));
mPasteContent = new GUIContent(string.Format("{0} {1}",
PlasticLocalization.GetString(PlasticLocalization.Name.EditMenuPaste),
GetPlasticShortcut.ForPaste()));
mDeleteContent = new GUIContent(
PlasticLocalization.GetString(PlasticLocalization.Name.EditMenuDelete));
mSelectAllContent = new GUIContent(string.Format("{0} {1}",
PlasticLocalization.GetString(PlasticLocalization.Name.EditMenuSelectAll),
GetPlasticShortcut.ForSelectAll()));
mGoToLineContent = new GUIContent(string.Format("{0} {1}",
PlasticLocalization.GetString(PlasticLocalization.Name.EditMenuGoToLine),
GetPlasticShortcut.ForGoToLine()));
mFindContent = new GUIContent(string.Format("{0} {1}",
PlasticLocalization.GetString(PlasticLocalization.Name.EditMenuFind),
GetPlasticShortcut.ForFind()));
}
GUIContent mUndoContent;
GUIContent mRedoContent;
GUIContent mCopyContent;
GUIContent mCutContent;
GUIContent mPasteContent;
GUIContent mDeleteContent;
GUIContent mSelectAllContent;
GUIContent mGoToLineContent;
GUIContent mFindContent;
readonly Unity.CodeEditor.TextEditor mTextEditor;
}
}