1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 03:28:20 +02:00

Removed System.Tuple type

This commit is contained in:
Brian Fiete 2020-09-06 05:27:37 -07:00
parent e37e1ac687
commit d11b09dd07
6 changed files with 316 additions and 64 deletions

View file

@ -255,8 +255,8 @@ namespace Beefy.widgets
public class IndentTextAction : TextAction
{
// InsertCharList is for block indent, RemoveCharList is for unindent (shift-tab)
public List<Tuple<int32, char8>> mRemoveCharList = new List<Tuple<int32, char8>>() ~ delete _;
public List<Tuple<int32, char8>> mInsertCharList = new List<Tuple<int32, char8>>() ~ delete _;
public List<(int32, char8)> mRemoveCharList = new .() ~ delete _;
public List<(int32, char8)> mInsertCharList = new .() ~ delete _;
public EditSelection mNewSelection;
public this(EditWidgetContent editWidget)
@ -272,13 +272,13 @@ namespace Beefy.widgets
{
var idxChar = mRemoveCharList[idx];
editWidgetContent.InsertText(idxChar.Item1, ToStackString!(idxChar.Item2));
editWidgetContent.InsertText(idxChar.0, ToStackString!(idxChar.1));
}
for (int idx = mInsertCharList.Count - 1; idx >= 0; idx--)
{
var idxChar = mInsertCharList[idx];
editWidgetContent.RemoveText(idxChar.Item1, 1);
editWidgetContent.RemoveText(idxChar.0, 1);
}
editWidgetContent.ContentChanged();
SetPreviousState(false);
@ -290,12 +290,12 @@ namespace Beefy.widgets
var editWidgetContent = EditWidgetContent;
SetPreviousState(true);
for (var idxChar in mRemoveCharList)
editWidgetContent.RemoveText(idxChar.Item1, 1);
editWidgetContent.RemoveText(idxChar.0, 1);
var charStr = scope String(' ', 1);
for (var idxChar in mInsertCharList)
{
charStr[0] = idxChar.Item2;
editWidgetContent.InsertText(idxChar.Item1, charStr);
charStr[0] = idxChar.1;
editWidgetContent.InsertText(idxChar.0, charStr);
}
editWidgetContent.ContentChanged();
editWidgetContent.mSelection = mNewSelection;
@ -3158,7 +3158,7 @@ namespace Beefy.widgets
char8 c = (char8)mData.mText[lineStart + i].mChar;
if (((c == '\t') && (i == 0)) || (c == ' '))
{
indentTextAction.mRemoveCharList.Add(Tuple<int32, char8>((int32)lineStart + i + endAdjust, c));
indentTextAction.mRemoveCharList.Add(((int32)lineStart + i + endAdjust, c));
//RemoveText(lineStart, 1);
endAdjust--;
}
@ -3181,7 +3181,7 @@ namespace Beefy.widgets
GetLinePosition(lineIdx, out lineStart, out lineEnd);
lineStart += endAdjust;
//InsertText(lineStart, "\t");
indentTextAction.mInsertCharList.Add(Tuple<int32, char8>((int32)lineStart, '\t'));
indentTextAction.mInsertCharList.Add(((int32)lineStart, '\t'));
endAdjust++;
}

View file

@ -1,27 +0,0 @@
namespace System
{
struct Tuple<T1, T2> : IHashable where T1 : IHashable where T2 : IHashable
{
public T1 Item1;
public T2 Item2;
public this()
{
Item1 = default(T1);
Item2 = default(T2);
}
public this(T1 item1, T2 item2)
{
Item1 = item1;
Item2 = item2;
}
public int GetHashCode()
{
int h1 = Item1.GetHashCode();
int h2 = Item2.GetHashCode();
return (((h1 << 5) + h1) ^ h2);
}
}
}

View file

@ -539,12 +539,12 @@ namespace IDE.ui
if ((GetCategoryTargetedKind(categoryTypeInt) == .Config) &&
((mConfigNames.Count == 1) && (mPlatformNames.Count == 1)))
{
var key = Tuple<String, String>(configName, platformName);
var key = ConfigPlatformPair(configName, platformName);
var targetedConfigDataResult = mTargetedConfigDatas.GetValue(key);
if (!(targetedConfigDataResult case .Ok(out targetedConfigData)))
{
key.Item1 = new String(key.Item1);
key.Item2 = new String(key.Item2);
key.mConfig = new String(key.mConfig);
key.mPlatform = new String(key.mPlatform);
targetedConfigData = new ConfigDataGroup((int32)CategoryType.COUNT);
targetedConfigData.mTarget = key;
mTargetedConfigDatas[key] = targetedConfigData;
@ -1021,7 +1021,7 @@ namespace IDE.ui
projectProperties.HadExternalChanges(configName, platformName);
}
else
projectProperties.HadExternalChanges(targetedConfigData.mTarget.Item1, targetedConfigData.mTarget.Item2);
projectProperties.HadExternalChanges(targetedConfigData.mTarget.mConfig, targetedConfigData.mTarget.mPlatform);
}
else
projectProperties.HadExternalChanges(null, null);

View file

@ -1763,7 +1763,7 @@ namespace IDE.ui
for (i = 0; i < indentCount; i++)
{
InsertText(lineStart + i, "\t");
indentTextAction.mInsertCharList.Add(Tuple<int32, char8>((int32)(lineStart + i), '\t'));
indentTextAction.mInsertCharList.Add(((int32)(lineStart + i), '\t'));
endAdjust++;
}
@ -1772,16 +1772,16 @@ namespace IDE.ui
if (wantsContentTab)
{
InsertText(lineStart + i, "{\n\t");
indentTextAction.mInsertCharList.Add(Tuple<int32, char8>((int32)(lineStart + i), '{'));
indentTextAction.mInsertCharList.Add(Tuple<int32, char8>((int32)(lineStart + i + 1), '\n'));
indentTextAction.mInsertCharList.Add(Tuple<int32, char8>((int32)(lineStart + i + 2), '\t'));
indentTextAction.mInsertCharList.Add(((int32)(lineStart + i), '{'));
indentTextAction.mInsertCharList.Add(((int32)(lineStart + i + 1), '\n'));
indentTextAction.mInsertCharList.Add(((int32)(lineStart + i + 2), '\t'));
endAdjust += 3;
}
else
{
InsertText(lineStart + i, "{\n");
indentTextAction.mInsertCharList.Add(Tuple<int32, char8>((int32)(lineStart + i), '{'));
indentTextAction.mInsertCharList.Add(Tuple<int32, char8>((int32)(lineStart + i + 1), '\n'));
indentTextAction.mInsertCharList.Add(((int32)(lineStart + i), '{'));
indentTextAction.mInsertCharList.Add(((int32)(lineStart + i + 1), '\n'));
startAdjust -= 1;
endAdjust += 2;
}
@ -1803,19 +1803,19 @@ namespace IDE.ui
for (i = 0; i < indentCount; i++)
{
InsertText(lineStart + i, "\t");
indentTextAction.mInsertCharList.Add(Tuple<int32, char8>((int32)(lineStart + i), '\t'));
indentTextAction.mInsertCharList.Add(((int32)(lineStart + i), '\t'));
}
if (isEmbeddedEnd)
{
InsertText(lineStart + i, "}");
indentTextAction.mInsertCharList.Add(Tuple<int32, char8>((int32)(lineStart + i), '}'));
indentTextAction.mInsertCharList.Add(((int32)(lineStart + i), '}'));
}
else
{
InsertText(lineStart + i, "}\n");
indentTextAction.mInsertCharList.Add(Tuple<int32, char8>((int32)(lineStart + i), '}'));
indentTextAction.mInsertCharList.Add(Tuple<int32, char8>((int32)(lineStart + i + 1), '\n'));
indentTextAction.mInsertCharList.Add(((int32)(lineStart + i), '}'));
indentTextAction.mInsertCharList.Add(((int32)(lineStart + i + 1), '\n'));
}
newSel.mEndPos = (int32)(lineStart + i + 1);
@ -1828,7 +1828,7 @@ namespace IDE.ui
if (c != '#')
{
InsertText(lineStart, "\t");
indentTextAction.mInsertCharList.Add(Tuple<int32, char8>((int32)(lineStart), '\t'));
indentTextAction.mInsertCharList.Add(((int32)(lineStart), '\t'));
endAdjust++;
}
}
@ -2121,7 +2121,7 @@ namespace IDE.ui
public void DuplicateLine()
{
UndoBatchStart undoBatchStart = new UndoBatchStart("embeddedToggleComment");
UndoBatchStart undoBatchStart = new UndoBatchStart("duplicateLine");
mData.mUndoManager.Add(undoBatchStart);
mData.mUndoManager.Add(new SetCursorAction(this));
@ -2139,6 +2139,268 @@ namespace IDE.ui
mData.mUndoManager.Add(undoBatchStart.mBatchEnd);
}
bool GetStatementRange(int checkIdx, out int startIdx, out int endIdx, out char8 endChar)
{
startIdx = -1;
endIdx = -1;
endChar = 0;
GetLineCharAtIdx(checkIdx, var line, var lineChar);
GetBlockStart(line, var foundBlockStartIdx, var blockOpenSpaceCount);
bool expectingStatement = true;
int stmtStart = -1;
int lastNonWS = -1;
int parenCount = 0;
int lastCrPos = -1;
for (int checkPos = foundBlockStartIdx; true; checkPos++)
{
if (checkPos >= mData.mTextLength)
break;
char8 checkC = mData.mText[checkPos].mChar;
if (checkC == '\n')
lastCrPos = checkPos;
if (checkC.IsWhiteSpace)
continue;
let displayType = (SourceElementType)mData.mText[checkPos].mDisplayTypeId;
if (displayType == .Comment)
continue;
if (displayType == .Normal)
{
if (checkC == '(')
parenCount++;
else if (checkC == ')')
parenCount--;
}
if (parenCount != 0)
continue;
if ((displayType == .Normal) &&
((checkC == '{') || (checkC == '}') || (checkC == ';')))
{
if ((checkPos >= checkIdx) && (!expectingStatement))
{
endChar = checkC;
if (lastNonWS < checkIdx)
return false;
startIdx = stmtStart;
endIdx = lastNonWS + 1;
return true;
}
expectingStatement = true;
}
else if (expectingStatement)
{
if (lastCrPos >= checkIdx)
{
return false;
}
expectingStatement = false;
stmtStart = checkPos;
}
lastNonWS = checkPos;
}
return false;
}
void MoveSelection(int toLinePos)
{
/*if (GetStatementRange(CursorTextPos, var startIdx, var endIdx))
{
mSelection = .(startIdx, endIdx);
}
return;*/
UndoBatchStart undoBatchStart = new UndoBatchStart("moveSelection");
mData.mUndoManager.Add(undoBatchStart);
mData.mUndoManager.Add(new SetCursorAction(this));
var prevCursorLineAndColumn = CursorLineAndColumn;
var str = scope String();
ExtractString(mSelection.Value.MinPos, mSelection.Value.Length, str);
DeleteSelection();
if (str.EndsWith('\n'))
str.RemoveFromEnd(1);
int offsetLinePos = toLinePos;
bool movingDown = offsetLinePos > prevCursorLineAndColumn.mLine;
if (movingDown)
offsetLinePos -= str.Count('\n');
GetLinePosition(Math.Max(offsetLinePos, 0), var offsetLineStart, var offsetLineEnd);
String offsetText = scope .();
ExtractString(offsetLineStart, offsetLineEnd - offsetLineStart, offsetText);
if (movingDown)
{
GetLinePosition(Math.Max(offsetLinePos - 1, 0), var toLineStart, var toLineEnd);
String txt = scope .();
ExtractString(toLineStart, toLineEnd - toLineStart, txt);
if (GetStatementRange(toLineStart, var stmtStartIdx, var stmtEndIdx, var stmtEndChar))
{
String stmt = scope .();
ExtractString(stmtStartIdx, stmtEndIdx - stmtStartIdx, stmt);
GetLineCharAtIdx(stmtEndIdx - 1, var stmtLine, var stmtLineChar);
offsetLinePos = stmtLine + 1;
GetLinePosition(Math.Max(offsetLinePos, 0), out offsetLineStart, out offsetLineEnd);
if (stmtEndChar == '{')
offsetLinePos++;
}
}
else
{
/*for (int checkPos = offsetLineStart; checkPos < offsetLineEnd; checkPos++)
{
if (mData.mText[checkPos].mDisplayTypeId != 0)
continue;
char8 checkC = mData.mText[checkPos].mChar;
if (checkC.IsWhiteSpace)
continue;
if (checkC == '{')
{
if (offsetLinePos > prevCursorLineAndColumn.mLine)
offsetLinePos--;
}
break;
}*/
GetLinePosition(Math.Max(offsetLinePos, 0), var toLineStart, var toLineEnd);
String txt = scope .();
ExtractString(toLineStart, toLineEnd - toLineStart, txt);
if (!GetStatementRange(toLineStart, var stmtStartIdx, var stmtEndIdx, var stmtEndChar))
{
if (stmtEndChar == '{')
GetLinePosition(Math.Max(offsetLinePos - 1, 0), out toLineStart, out toLineEnd);
}
if (GetStatementRange(toLineStart, var stmtStartIdx, var stmtEndIdx, var stmtEndChar))
{
String stmt = scope .();
ExtractString(stmtStartIdx, stmtEndIdx - stmtStartIdx, stmt);
GetLineCharAtIdx(stmtStartIdx, var stmtLine, var stmtLineChar);
offsetLinePos = stmtLine;
GetLinePosition(Math.Max(offsetLinePos, 0), out offsetLineStart, out offsetLineEnd);
}
}
let wantCursorPos = LineAndColumn(Math.Max(offsetLinePos, 0), 0);
if (wantCursorPos.mLine >= GetLineCount())
{
CursorTextPos = mData.mTextLength;
InsertAtCursor("\n");
}
CursorLineAndColumn = wantCursorPos;
PasteText(str, "line");
CursorLineAndColumn = LineAndColumn(wantCursorPos.mLine, prevCursorLineAndColumn.mColumn);
mData.mUndoManager.Add(undoBatchStart.mBatchEnd);
}
public void MoveLine(VertDir dir)
{
int lineNum = CursorLineAndColumn.mLine;
GetLinePosition(lineNum, var lineStart, var lineEnd);
mSelection = .(lineStart, Math.Min(lineEnd + 1, mData.mTextLength));
MoveSelection(lineNum + (int)dir);
}
public void MoveStatement(VertDir dir)
{
int lineNum = CursorLineAndColumn.mLine;
GetLinePosition(lineNum, var lineStart, var lineEnd);
int selStart = -1;
int selEnd = -1;
int parenDepth = 0;
int checkPos = lineStart;
for ( ; checkPos < mData.mTextLength - 1; checkPos++)
{
char8 checkC = mData.mText[checkPos].mChar;
if (selStart == -1)
{
if (checkC == '\n')
break; // Don't support moving empty lines
if (!checkC.IsWhiteSpace)
{
selStart = checkPos;
}
}
if (mData.mText[checkPos].mDisplayTypeId != 0)
continue;
if ((checkC == ';') && (parenDepth == 0))
{
selEnd = checkPos + 1;
break;
}
if (checkC == '{')
{
parenDepth++;
}
if (checkC == '}')
{
parenDepth--;
if (parenDepth <= 0)
{
selEnd = checkPos + 1;
break;
}
}
}
if (selEnd == -1)
return;
for ( ; checkPos < mData.mTextLength - 1; checkPos++)
{
char8 checkC = mData.mText[checkPos].mChar;
selEnd = checkPos + 1;
if (checkC == '\n')
break;
}
UndoBatchStart undoBatchStart = new UndoBatchStart("moveLine");
mData.mUndoManager.Add(undoBatchStart);
mData.mUndoManager.Add(new SetCursorAction(this));
mSelection = .(lineStart, selEnd);
int toLine = lineNum + (int)dir;
if (dir == .Down)
{
GetLineCharAtIdx(selEnd, var line, var lineChar);
toLine = line;
}
MoveSelection(toLine);
mData.mUndoManager.Add(undoBatchStart.mBatchEnd);
}
public override void ContentChanged()
{
base.ContentChanged();

View file

@ -278,10 +278,27 @@ namespace IDE.ui
protected DarkComboBox mConfigComboBox;
protected DarkComboBox mPlatformComboBox;
public struct ConfigPlatformPair : IHashable
{
public String mConfig;
public String mPlatform;
public this(String config, String platform)
{
mConfig = config;
mPlatform = platform;
}
public int GetHashCode()
{
return mConfig.GetHashCode() ^ mPlatform.GetHashCode();
}
}
protected class ConfigDataGroup
{
public bool mIsMultiTargeted;
public Tuple<String, String> mTarget;
public ConfigPlatformPair mTarget;
public PropPage[] mPropPages ~ delete _;
public this(int categoryCount)
@ -296,7 +313,7 @@ namespace IDE.ui
}
}
protected Dictionary<Tuple<String, String>, ConfigDataGroup> mTargetedConfigDatas = new Dictionary<Tuple<String, String>, ConfigDataGroup>() ~ delete _;
protected Dictionary<ConfigPlatformPair, ConfigDataGroup> mTargetedConfigDatas = new .() ~ delete _;
protected ConfigDataGroup mMultiTargetConfigData;
protected List<ConfigDataGroup> mConfigDatas = new List<ConfigDataGroup>() ~ DeleteContainerAndItems!(_);
@ -328,8 +345,8 @@ namespace IDE.ui
{
for (var kv in mTargetedConfigDatas)
{
delete kv.key.Item1;
delete kv.key.Item2;
delete kv.key.mConfig;
delete kv.key.mPlatform;
delete kv.value;
mConfigDatas.Remove(kv.value);
}
@ -659,8 +676,8 @@ namespace IDE.ui
if (mTargetedConfigDatas.GetAndRemove(.(configName, platformName)) case .Ok((var key, var configDataGroup)))
{
delete key.Item1;
delete key.Item2;
delete key.mConfig;
delete key.mPlatform;
if (configDataGroup.mPropPages[categoryType] == mPropPage)
RemovePropPage();
mConfigDatas.Remove(configDataGroup);
@ -779,8 +796,8 @@ namespace IDE.ui
{
var targetedConfigName = targetedConfigData.mTarget;
bool isCurrent = (targetedConfigName.Item1 == null) ||
((mConfigNames.Contains(targetedConfigName.Item1)) && (mPlatformNames.Contains(targetedConfigName.Item2)));
bool isCurrent = (targetedConfigName.mConfig == null) ||
((mConfigNames.Contains(targetedConfigName.mConfig)) && (mPlatformNames.Contains(targetedConfigName.mPlatform)));
for (int32 pageIdx = 0; pageIdx < targetedConfigData.mPropPages.Count; pageIdx++)
{

View file

@ -401,12 +401,12 @@ namespace IDE.ui
if ((GetCategoryTargetedKind(categoryTypeInt) != .None) &&
((mConfigNames.Count == 1) && (mPlatformNames.Count == 1)))
{
var key = Tuple<String, String>(configName, platformName);
var key = ConfigPlatformPair(configName, platformName);
mTargetedConfigDatas.TryGetValue(key, out targetedConfigData);
if (targetedConfigData == null)
{
key.Item1 = new String(key.Item1);
key.Item2 = new String(key.Item2);
key.mConfig = new String(key.mConfig);
key.mPlatform = new String(key.mPlatform);
targetedConfigData = new ConfigDataGroup((int32)CategoryType.COUNT);
targetedConfigData.mTarget = key;
mConfigDatas.Add(targetedConfigData);
@ -873,7 +873,7 @@ namespace IDE.ui
workspaceProperties.HadExternalChanges(configName, platformName);
}
else
workspaceProperties.HadExternalChanges(targetedConfigData.mTarget.Item1, targetedConfigData.mTarget.Item2);
workspaceProperties.HadExternalChanges(targetedConfigData.mTarget.mConfig, targetedConfigData.mTarget.mPlatform);
}
else
workspaceProperties.HadExternalChanges(null, null);