1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-09 03:52:19 +02:00

Improved #region collapse behavior

This commit is contained in:
Brian Fiete 2022-03-02 12:10:16 -08:00
parent 5fc95f8f07
commit 6fe9c97649
3 changed files with 45 additions and 17 deletions

View file

@ -219,9 +219,6 @@ namespace IDE.ui
public void FixAfterUpdate() mut public void FixAfterUpdate() mut
{ {
if (mKind == .Region)
mStartLine++;
if (mAnchorLine == mEndLine) if (mAnchorLine == mEndLine)
{ {
mDeleted = true; mDeleted = true;
@ -5073,6 +5070,8 @@ namespace IDE.ui
int32 closeDepth = 0; int32 closeDepth = 0;
int32 curAnimLineIdx = 0; int32 curAnimLineIdx = 0;
bool inAnim = false; bool inAnim = false;
int checkOpenIdx = 0;
for (int line < data.mLineStarts.Count) for (int line < data.mLineStarts.Count)
{ {
while (curIdx < mOrderedCollapseEntries.Count) while (curIdx < mOrderedCollapseEntries.Count)
@ -5086,27 +5085,30 @@ namespace IDE.ui
if (entry.mAnchorLine > line) if (entry.mAnchorLine > line)
break; break;
checkOpenIdx = Math.Min(checkOpenIdx, collapseStack.Count);
collapseStack.Add(curIdx); collapseStack.Add(curIdx);
curIdx++; curIdx++;
} }
bool deferClose = false; bool deferClose = false;
if (!collapseStack.IsEmpty) while (checkOpenIdx < collapseStack.Count)
{ {
int32 activeIdx = collapseStack.Back; int32 checkIdx = collapseStack[checkOpenIdx];
var entry = mOrderedCollapseEntries[activeIdx]; var entry = mOrderedCollapseEntries[checkIdx];
if (line == entry.mStartLine) if (line != entry.mStartLine)
break;
checkOpenIdx++;
if (checkIdx == animIdx)
inAnim = true;
if ((!entry.mIsOpen) && (checkIdx != animIdx))
{ {
if (activeIdx == animIdx) if ((closeDepth == 0) && (entry.mAnchorLine == entry.mStartLine))
inAnim = true; deferClose = true;
if ((!entry.mIsOpen) && (activeIdx != animIdx)) else
{ closeDepth++;
if ((closeDepth == 0) && (entry.mAnchorLine == entry.mStartLine))
deferClose = true;
else
closeDepth++;
}
} }
} }

View file

@ -4380,6 +4380,18 @@ namespace IDE.ui
{ {
var entry = ewc.mOrderedCollapseEntries[collapseIdx & CollapseRegionView.cIdMask]; var entry = ewc.mOrderedCollapseEntries[collapseIdx & CollapseRegionView.cIdMask];
g.Draw(DarkTheme.sDarkTheme.GetImage(entry.mIsOpen ? .CollapseOpened : .CollapseClosed), editX - GS!(16), ewc.mLineCoords[lineIdx] + boxAdjustTop + GS!(2)); g.Draw(DarkTheme.sDarkTheme.GetImage(entry.mIsOpen ? .CollapseOpened : .CollapseClosed), editX - GS!(16), ewc.mLineCoords[lineIdx] + boxAdjustTop + GS!(2));
int nextCollapseIdx = (collapseIdx & CollapseRegionView.cIdMask) + 1;
if ((entry.mIsOpen) && (nextCollapseIdx < ewc.mOrderedCollapseEntries.Count))
{
// Draw line between two collapse boxes in a row
var nextEntry = ewc.mOrderedCollapseEntries[nextCollapseIdx];
if (nextEntry.mAnchorLine == lineIdx + 1)
{
using (g.PushColor(0xFFA5A5A5))
g.FillRect(editX - (int)GS!(7.5f), ewc.mLineCoords[lineIdx] + boxAdjustTop + (int)GS!(15.5f), (int)GS!(1.5f), (lineSpacing - GS!(10)) + GS!(2));
}
}
} }
else if ((collapseIdx & CollapseRegionView.cEndFlag) != 0) else if ((collapseIdx & CollapseRegionView.cEndFlag) != 0)
{ {

View file

@ -9201,8 +9201,21 @@ BF_EXPORT const char* BF_CALLTYPE BfCompiler_GetCollapseRegions(BfCompiler* bfCo
mStartSeriesIdx = -1; mStartSeriesIdx = -1;
} }
int GetLineStartAfter(int startIdx)
{
for (int i = startIdx; i < mParser->mSrcLength - 1; i++)
{
if (mParser->mSrc[i] == '\n')
return i + 1;
}
return -1;
}
void Add(int anchor, int start, int end, char kind = '?') void Add(int anchor, int start, int end, char kind = '?')
{ {
if ((anchor == -1) || (start == -1) || (end == -1))
return;
bool isMultiline = false; bool isMultiline = false;
for (int i = start; i < end; i++) for (int i = start; i < end; i++)
{ {
@ -9396,7 +9409,8 @@ BF_EXPORT const char* BF_CALLTYPE BfCompiler_GetCollapseRegions(BfCompiler* bfCo
regionStart = preprocessorNode->mCommand; regionStart = preprocessorNode->mCommand;
else if (sv == "endregion") else if (sv == "endregion")
{ {
collapseVisitor.Add(regionStart, regionStart, preprocessorNode->mCommand, 'R'); if (regionStart != NULL)
collapseVisitor.Add(regionStart->mSrcStart, collapseVisitor.GetLineStartAfter(regionStart->mSrcStart), preprocessorNode->mCommand->mSrcStart, 'R');
regionStart = NULL; regionStart = NULL;
} }