1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-19 08:30:25 +02:00

Improve emit views where compile and resolve emissions differ

This commit is contained in:
Brian Fiete 2022-06-13 08:52:17 -07:00
parent 3f1f114180
commit ab494ad8d4
9 changed files with 300 additions and 64 deletions

View file

@ -224,7 +224,7 @@ namespace IDE.ui
{
mTypeName = new .(emitEmbed.mTypeName);
mEmitEmbed = emitEmbed;
mSourceViewPanel = new SourceViewPanel((emitEmbed.mEmitKind == .Method) ? .Method : .Type);
mSourceViewPanel = new SourceViewPanel((emitEmbed.mEmitKind == .Emit_Method) ? .Method : .Type);
mSourceViewPanel.mEmbedParent = mEmitEmbed.mEditWidgetContent.mSourceViewPanel;
var emitPath = scope $"$Emit${emitEmbed.mTypeName}";
@ -382,7 +382,7 @@ namespace IDE.ui
}
mAwaitingLoad = false;
if (!mEmitRemoved)
if ((!mEmitRemoved) && (gApp.mSettings.mEditorSettings.mEmitCompiler == .Resolve))
{
for (var explicitTypeName in mEmitEmbed.mEditWidgetContent.mSourceViewPanel.[Friend]mExplicitEmitTypes)
{
@ -397,6 +397,9 @@ namespace IDE.ui
if ((mAwaitingLoad) && (gApp.mUpdateCnt % 4 == 0))
MarkDirty();
if (mSourceViewPanel.HasFocus())
mEmitEmbed.mEditWidgetContent.mEmbedSelected = mEmitEmbed;
}
public void GetGenericTypes()
@ -516,6 +519,10 @@ namespace IDE.ui
public int32 mEndLine;
public View mView;
public this()
{
}
public ~this()
{
if (mView != null)
@ -525,17 +532,29 @@ namespace IDE.ui
}
}
public bool IsSelected => mEditWidgetContent.mEmbedSelected == this;
public float LabelWidth = GS!(42);
public override float GetWidth(bool hideLine)
{
return GS!(42);
return IsSelected ? GS!(60) : LabelWidth;
}
public override void Draw(Graphics g, Rect rect, bool hideLine)
{
var rect;
rect.mWidth = LabelWidth;
if (rect.mHeight >= DarkTheme.sDarkTheme.mSmallBoldFont.GetLineSpacing())
g.SetFont(DarkTheme.sDarkTheme.mSmallBoldFont);
using (g.PushColor(0x80707070))
uint32 fillColor = 0x80707070;
if (gApp.mSettings.mEditorSettings.mEmitCompiler == .Build)
{
fillColor = 0x805050E0;
}
using (g.PushColor(fillColor))
{
g.FillRect(rect.mX + 1, rect.mY + 1, rect.mWidth - 2, rect.mHeight - 2);
}
@ -558,6 +577,40 @@ namespace IDE.ui
var summaryString = "Emit";
g.DrawString(summaryString, rect.mX, rect.mY + (int)((rect.mHeight - g.mFont.GetLineSpacing()) * 0.5f), .Centered, rect.mWidth);
if (IsSelected)
{
g.Draw(DarkTheme.sDarkTheme.GetImage(.DropMenuButton), rect.Right, rect.Top);
}
}
public override void MouseDown(Rect rect, float x, float y, int btn, int btnCount)
{
base.MouseDown(rect, x, y, btn, btnCount);
if (x >= rect.mX + LabelWidth)
ShowMenu(x, y);
}
public void ShowMenu(float x, float y)
{
Menu menuItem;
Menu menu = new Menu();
menuItem = menu.AddItem("Compiler");
var subItem = menuItem.AddItem("Resolve");
if (gApp.mSettings.mEditorSettings.mEmitCompiler == .Resolve)
subItem.mIconImage = DarkTheme.sDarkTheme.GetImage(.Check);
subItem.mOnMenuItemSelected.Add(new (menu) => { gApp.SetEmbedCompiler(.Resolve); });
subItem = menuItem.AddItem("Build");
if (gApp.mSettings.mEditorSettings.mEmitCompiler == .Build)
subItem.mIconImage = DarkTheme.sDarkTheme.GetImage(.Check);
subItem.mOnMenuItemSelected.Add(new (menu) => { gApp.SetEmbedCompiler(.Build); });
MenuWidget menuWidget = DarkTheme.sDarkTheme.CreateMenuWidget(menu);
menuWidget.Init(mEditWidgetContent, x, y);
}
}
@ -575,10 +628,11 @@ namespace IDE.ui
case UsingNamespaces = 'U';
case Unknown = '?';
case HasUncertainEmits = '~';
case Emit = 'e';
case Emit_Type = 't';
case Emit_Method = 'm';
case EmitAddType = '+';
public bool IsEmit => (this == .Emit);
public bool IsEmit => (this == .Emit_Type) || (this == .Emit_Method);
}
public Kind mKind;
@ -614,6 +668,7 @@ namespace IDE.ui
public bool mOnlyInResolveAll;
public bool mIncludedInClassify;
public bool mIncludedInResolveAll;
public bool mIncludedInBuild;
public int32 mAnchorId;
}
@ -4408,6 +4463,7 @@ namespace IDE.ui
public override void KeyDown(KeyCode keyCode, bool isRepeat)
{
mIgnoreKeyChar = false;
mEmbedSelected = null;
bool autoCompleteRequireControl = (gApp.mSettings.mEditorSettings.mAutoCompleteRequireControl) && (mIsMultiline);
@ -4463,7 +4519,6 @@ namespace IDE.ui
{
return;
}
if ((keyCode == KeyCode.Escape) && (mSelection != null) && (mSelection.Value.HasSelection))
{
@ -4696,6 +4751,23 @@ namespace IDE.ui
{
base.MouseClicked(x, y, origX, origY, btn);
if (btn == 1)
{
int line = GetLineAt(y);
if (mEmbeds.GetValue((.)line) case .Ok(let embed))
{
Rect embedRect = GetEmbedRect(line, embed);
if (embedRect.Contains(x, y))
{
if (var emitEmbed = embed as EmitEmbed)
{
emitEmbed.ShowMenu(x, y);
}
return;
}
}
}
var useX = x;
var useY = y;
@ -5019,20 +5091,26 @@ namespace IDE.ui
Rect embedRect = GetEmbedRect(line, embed);
if (embedRect.Contains(x, y))
{
if ((btn == 0) && (btnCount % 2 == 0))
mEmbedSelected = embed;
embed.MouseDown(GetEmbedRect(line, embed), x, y, btn, btnCount);
if (btn == 0)
{
if (var collapseSummary = embed as SourceEditWidgetContent.CollapseSummary)
SetCollapseOpen(collapseSummary.mCollapseIndex, true);
else if (var emitEmbed = embed as EmitEmbed)
if (btnCount % 2 == 0)
{
emitEmbed.mIsOpen = !emitEmbed.mIsOpen;
mCollapseNeedsUpdate = true;
if (var collapseSummary = embed as SourceEditWidgetContent.CollapseSummary)
SetCollapseOpen(collapseSummary.mCollapseIndex, true);
else if (var emitEmbed = embed as EmitEmbed)
{
emitEmbed.mIsOpen = !emitEmbed.mIsOpen;
mCollapseNeedsUpdate = true;
}
}
}
return;
}
}
mEmbedSelected = null;
base.MouseDown(x, y, btn, btnCount);
}
@ -5727,6 +5805,13 @@ namespace IDE.ui
}
}
void DeleteEmbed(Embed embed)
{
if (mEmbedSelected == embed)
mEmbedSelected = null;
delete embed;
}
public override void GetTextData()
{
var data = Data;
@ -5755,8 +5840,14 @@ namespace IDE.ui
}
}
IdSpan.LookupContext lookupCtx = null;
for (var emitData in ref data.mEmitData)
{
if (lookupCtx == null)
lookupCtx = scope:: .(mData.mTextIdData);
emitData.mAnchorIdx = (.)lookupCtx.GetIndexFromId(emitData.mAnchorId);
GetLineCharAtIdx(emitData.mAnchorIdx, var line, var lineChar);
SourceEditWidgetContent.EmitEmbed emitEmbed = null;
@ -5776,7 +5867,7 @@ namespace IDE.ui
else
{
//Debug.WriteLine($" Occupied- deleting {emitEmbed}");
delete emitEmbed;
DeleteEmbed(emitEmbed);
emitEmbed = null;
}
}
@ -5837,7 +5928,7 @@ namespace IDE.ui
{
mCollapseNeedsUpdate = true;
mEmbeds.Remove(emitEmbed.mLine);
delete emitEmbed;
DeleteEmbed(emitEmbed);
}
}
@ -5863,7 +5954,7 @@ namespace IDE.ui
if (!(value is EmitEmbed))
{
mEmbeds.Remove(entry.mAnchorLine);
delete value;
DeleteEmbed(value);
}
}
@entry.Remove();
@ -5888,7 +5979,7 @@ namespace IDE.ui
{
//Debug.WriteLine($" Removing {val.value}");
if (val.value is CollapseSummary)
delete val.value;
DeleteEmbed(val.value);
}
continue;
}
@ -5914,7 +6005,7 @@ namespace IDE.ui
else
{
//Debug.WriteLine($" Deleting(3) {val}");
delete val;
DeleteEmbed(val);
}
}
}
@ -6241,7 +6332,7 @@ namespace IDE.ui
{
if ((embed.mKind == .HideLine) || (embed.mKind == .LineEnd))
{
delete embed;
DeleteEmbed(embed);
mEmbeds.Remove(entry.mAnchorLine);
}
}
@ -6283,7 +6374,7 @@ namespace IDE.ui
if (!(value is EmitEmbed))
{
mEmbeds.Remove(prevAnchorLine);
delete value;
DeleteEmbed(value);
}
}
@ -6304,7 +6395,7 @@ namespace IDE.ui
else
{
//Debug.WriteLine($" Occupied- deleting {val}");
delete val.value;
DeleteEmbed(val.value);
}
}
}
@ -6360,7 +6451,7 @@ namespace IDE.ui
if (entry.mDeleted)
{
if (mEmbeds.GetAndRemove(entry.mAnchorIdx) case .Ok(let val))
delete val.value;
DeleteEmbed(val.value);
continue;
}
@ -6388,7 +6479,7 @@ namespace IDE.ui
*valuePtr = val.value;
}
else
delete val.value;
DeleteEmbed(val.value);
}
}
}
@ -6401,7 +6492,7 @@ namespace IDE.ui
RehupLineCoords();
}
public void ParseCollapseRegions(String collapseText, int32 textVersion, ref IdSpan idSpan, ResolveType resolveType)
public void ParseCollapseRegions(String collapseText, int32 textVersion, ref IdSpan idSpan, ResolveType? resolveType)
{
/*if (resolveType == .None)
return;*/
@ -6415,6 +6506,8 @@ namespace IDE.ui
data.ClearCollapse();
}
bool wantsBuildEmits = gApp.mSettings.mEditorSettings.mEmitCompiler == .Build;
//Debug.WriteLine($"ParseCollapseRegions {resolveType} CollapseRevision:{data.mCollapseParseRevision+1} TextVersion:{textVersion} IdSpan:{idSpan:D}");
List<int32> typeNameIdxMap = scope .();
@ -6429,7 +6522,7 @@ namespace IDE.ui
if (emitInitialized)
return;
emitInitialized = true;
if ((hasUncertainEmits) || (resolveType == .None))
if ((hasUncertainEmits) || (wantsBuildEmits) || (resolveType == .None))
{
// Leave emits alone
for (var typeName in data.mTypeNames)
@ -6437,7 +6530,11 @@ namespace IDE.ui
for (var emitData in ref data.mEmitData)
{
emitAnchorIds[emitData.mAnchorId] = (.)@emitData.Index;
if (resolveType == .None)
if (resolveType == null)
{
// Do nothing
}
else if (resolveType == .None)
emitData.mIncludedInResolveAll = false;
else
emitData.mIncludedInClassify = false;
@ -6491,6 +6588,7 @@ namespace IDE.ui
emitData.mOnlyInResolveAll = resolveType == .None;
emitData.mIncludedInClassify = resolveType != .None;
emitData.mIncludedInResolveAll = resolveType == .None;
emitData.mIncludedInBuild = resolveType == null;
if (emitData.mAnchorIdx == -1)
{
@ -6508,8 +6606,14 @@ namespace IDE.ui
{
curEmitData.mIncludedInResolveAll = true;
}
else if ((wantsBuildEmits) && (resolveType != null))
{
curEmitData.mIncludedInBuild |= emitData.mIncludedInBuild;
curEmitData.mIncludedInClassify |= emitData.mIncludedInClassify;
}
else
{
emitData.mIncludedInBuild |= curEmitData.mIncludedInBuild;
emitData.mIncludedInClassify |= curEmitData.mIncludedInClassify;
curEmitData = emitData;
}
@ -6517,12 +6621,19 @@ namespace IDE.ui
continue;
}
if ((wantsBuildEmits) && (resolveType != null))
{
// Not included in the build emit data - just show as a marker
emitData.mStartLine = 0;
emitData.mEndLine = 0;
}
//Debug.WriteLine($" New emit AnchorIdx:{emitData.mAnchorIdx} AnchorId:{emitData.mAnchorId} CurTextVersion:{textVersion} FoundTextVersion:{foundTextVersion}");
data.mEmitData.Add(emitData);
continue;
}
if (resolveType == .None)
if ((resolveType == null) || (resolveType == .None))
continue;
CollapseData collapseData;
@ -6554,7 +6665,11 @@ namespace IDE.ui
for (var emitData in ref data.mEmitData)
{
if (((emitData.mOnlyInResolveAll) && (!emitData.mIncludedInResolveAll)) ||
if ((emitData.mIncludedInBuild) && (gApp.mSettings.mEditorSettings.mEmitCompiler == .Build))
{
// Allow build-only markers to survive
}
else if (((emitData.mOnlyInResolveAll) && (!emitData.mIncludedInResolveAll)) ||
((!emitData.mOnlyInResolveAll) && (!emitData.mIncludedInClassify)))
{
@emitData.RemoveFast();