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

Bookmark panel tweaks

This commit is contained in:
Brian Fiete 2022-08-23 10:45:57 -07:00
parent 9daae6baa6
commit ebcaffbae9
7 changed files with 204 additions and 24 deletions

View file

@ -4,6 +4,7 @@ using System.Text;
using System.Threading.Tasks;
using IDE.ui;
using System.Diagnostics;
using System.IO;
namespace IDE
{
@ -65,7 +66,7 @@ namespace IDE
public List<Bookmark> mBookmarkList = new List<Bookmark>() ~ delete _;
/// Gets or Sets whether every bookmark in this folder is disabled or not.
public bool IsDisabled
public bool AreAllDisabled
{
get
{
@ -84,6 +85,25 @@ namespace IDE
}
}
public bool AreAllEnabled
{
get
{
for (var bookmark in mBookmarkList)
if (bookmark.mIsDisabled)
return false;
return true;
}
set
{
for (var bookmark in mBookmarkList)
bookmark.mIsDisabled = !value;
gApp.mBookmarkManager.BookmarksChanged();
}
}
/// Adds the given bookmark to this folder. If needed, removes it from its old folder.
internal void AddBookmark(Bookmark bookmark)
{
@ -125,9 +145,9 @@ namespace IDE
private int mBookmarkCount;
/// Number of bookmarks created, used to generate the names.
private int32 _createdBookmarks;
private int32 sBookmarkId;
/// Number of folders created, used to generate the names.
private int32 _createdFolders;
private int32 sFolderId;
/// Gets or sets whether all bookmarks are disabled or not.
public bool AllBookmarksDisabled
@ -136,7 +156,7 @@ namespace IDE
{
for (var folder in mBookmarkFolders)
{
if (!folder.IsDisabled)
if (!folder.AreAllDisabled)
return false;
}
@ -146,7 +166,7 @@ namespace IDE
{
for (var folder in mBookmarkFolders)
{
folder.IsDisabled = value;
folder.AreAllDisabled = value;
}
BookmarksChanged();
@ -172,7 +192,7 @@ namespace IDE
BookmarkFolder folder = new .();
if (title == null)
folder.mTitle = new $"Folder {_createdFolders++}";
folder.mTitle = new $"Folder {++sFolderId}";
else
folder.mTitle = new String(title);
@ -247,7 +267,36 @@ namespace IDE
bookmark.mColumn = (int32)wantColumn;
if (title == null)
bookmark.mTitle = new $"Bookmark {_createdBookmarks++}";
{
String baseName = Path.GetFileNameWithoutExtension(fileName, .. scope .());
if (IDEApp.IsSourceCode(fileName))
{
var bfSystem = IDEApp.sApp.mBfResolveSystem;
if (bfSystem != null)
{
String content = scope .();
gApp.LoadTextFile(fileName, content).IgnoreError();
var parser = bfSystem.CreateEmptyParser(null);
defer delete parser;
parser.SetSource(content, fileName, -1);
var passInstance = bfSystem.CreatePassInstance();
defer delete passInstance;
parser.Parse(passInstance, IDEApp.IsBeefFile(fileName));
parser.Reduce(passInstance);
String name = parser.GetLocationName(wantLineNum, wantColumn, .. scope .());
if (!name.IsEmpty)
bookmark.mTitle = new $"#{++sBookmarkId} {name}";
}
}
if (bookmark.mTitle == null)
{
bookmark.mTitle = new $"#{++sBookmarkId} {baseName}";
}
}
else
bookmark.mTitle = new String(title);
@ -517,5 +566,33 @@ namespace IDE
MovedToBookmark(bookmark);
}
public void RecalcCurId()
{
sBookmarkId = 0;
sFolderId = 0;
for (var folder in mBookmarkFolders)
{
if (folder.mTitle?.StartsWith("Folder ") == true)
{
if (int32 curId = int32.Parse(folder.mTitle.Substring("Folder ".Length)))
sFolderId = Math.Max(sFolderId, curId);
}
for (var bookmark in folder.mBookmarkList)
{
if (bookmark.mTitle.StartsWith("#"))
{
int spacePos = bookmark.mTitle.IndexOf(' ');
if (spacePos != -1)
{
if (int32 curId = int32.Parse(bookmark.mTitle.Substring(1, spacePos - 1)))
sBookmarkId = Math.Max(sBookmarkId, curId);
}
}
}
}
}
}
}

View file

@ -175,6 +175,9 @@ namespace IDE.Compiler
[CallingConvention(.Stdcall), CLink]
static extern void BfParser_SetCompleteParse(void* bfParser);
[CallingConvention(.Stdcall), CLink]
static extern char8* BfSystem_GetParserLocationName(void* bfParser, int32 line, int32 column);
public BfSystem mSystem;
public void* mNativeBfParser;
public bool mIsUsed;
@ -419,5 +422,12 @@ namespace IDE.Compiler
var md5Hash;
BfParser_SetHashMD5(mNativeBfParser, ref md5Hash);
}
public void GetLocationName(int line, int column, String outBuffer)
{
var ptr = BfSystem_GetParserLocationName(mNativeBfParser, (.)line, (.)column);
if (ptr != null)
outBuffer.Append(ptr);
}
}
}

View file

@ -3382,6 +3382,7 @@ namespace IDE
mBookmarkManager.CreateBookmark(absPath, lineNum, column, isDisabled, bookmarkTitle, folder);
}
}
mBookmarkManager.RecalcCurId();
for (var referenceId in data.Enumerate("DebuggerDisplayTypes"))
{

View file

@ -124,13 +124,12 @@ namespace IDE.ui
mBookmarksListView.mOnItemMouseDown.Add(new (item, x, y, btnNum, btnCount) =>
{
ListViewItemMouseDown(item, x, y, btnNum, btnCount);
if ((btnNum == 0) && (btnCount == 2))
{
let mainItem = (BookmarksListViewItem)item.GetSubItem(0);
mainItem.Goto();
}
ListViewItemMouseDown(item, x, y, btnNum, btnCount);
});
mBookmarksListView.mOnItemMouseClicked.Add(new => ListViewItemMouseClicked);
mBookmarksListView.mOnKeyDown.Add(new => BookmarksLV_OnKeyDown);
@ -207,6 +206,8 @@ namespace IDE.ui
if (source == target)
return;
target.Open(true, true);
List<BookmarksListViewItem> selectedItems = scope .();
mBookmarksListView.GetRoot().WithSelectedItems(scope [&] (selectedItem) =>
{
@ -394,11 +395,11 @@ namespace IDE.ui
if (mBookmarksDirty)
UpdateBookmarks();
ShowTooltip(mBtnCreateBookmarkFolder, "Create a new folder.");
ShowTooltip(mBtnPrevBookmark, "Move the cursor to the previous bookmark.");
ShowTooltip(mBtnNextBookmark, "Move the cursor to the next bookmark.");
ShowTooltip(mBtnPrevBookmarkInFolder, "Move the cursor to the previous bookmark in the current folder.");
ShowTooltip(mBtnNextBookmarkInFolder, "Move the cursor to the next bookmark in the current folder.");
ShowTooltip(mBtnCreateBookmarkFolder, "Create new folder");
ShowTooltip(mBtnPrevBookmark, "Previous bookmark");
ShowTooltip(mBtnNextBookmark, "Next bookmark");
ShowTooltip(mBtnPrevBookmarkInFolder, "Previous bookmark in folder");
ShowTooltip(mBtnNextBookmarkInFolder, "Next bookmark in folder");
base.Update();
}
@ -479,20 +480,23 @@ namespace IDE.ui
private BookmarksListViewItem AddFolderToListView(BookmarksListViewItem parent, BookmarkFolder folder)
{
var listViewItem = (BookmarksListViewItem)parent.CreateChildItem();
listViewItem.MakeParent();
listViewItem.RefObject = folder;
listViewItem.AllowDragging = true;
var subViewItem = (DarkListViewItem)listViewItem.GetOrCreateSubItem(0);
if (!folder.mBookmarkList.IsEmpty)
{
DarkCheckBox cb = new DarkCheckBox();
cb.Checked = !folder.IsDisabled;
cb.State = folder.AreAllDisabled ? .Unchecked : folder.AreAllEnabled ? .Checked : .Indeterminate;
cb.Resize(GS!(-16), 0, GS!(22), GS!(22));
cb.mOnValueChanged.Add(new () =>
{
folder.IsDisabled = !cb.Checked;
folder.AreAllEnabled = cb.State != .Unchecked;
});
subViewItem.AddWidget(cb);
}
subViewItem.Label = folder.mTitle;
subViewItem.Resize(GS!(22), 0, 0, 0);
@ -516,6 +520,7 @@ namespace IDE.ui
cb.mOnValueChanged.Add(new () =>
{
bookmark.mIsDisabled = !cb.Checked;
mBookmarksDirty = true;
});
subViewItem.AddWidget(cb);

View file

@ -452,6 +452,26 @@ void BfParser::GetLineCharAtIdx(int idx, int& line, int& lineChar)
mParserData->GetLineCharAtIdx(idx, line, lineChar);
}
int BfParser::GetIndexAtLine(int line)
{
if (line == 0)
return 0;
int curLine = 0;
for (int i = 0; i < mSrcLength; i++)
{
char c = mSrc[i];
if (c == '\n')
{
curLine++;
if (line == curLine)
return i;
}
}
return -1;
}
void BfParser::Fail(const StringImpl& error, int offset)
{
mPassInstance->FailAt(error, mSourceData, mSrcIdx + offset);

View file

@ -230,6 +230,7 @@ public:
virtual BfParser* ToParser() override { return this; }
void GetLineCharAtIdx(int idx, int& line, int& lineChar);
int GetIndexAtLine(int line);
void Fail(const StringImpl& error, int offset = -1);
void TokenFail(const StringImpl& error, int offset = -1);

View file

@ -4090,6 +4090,72 @@ BF_EXPORT void BF_CALLTYPE BfSystem_DeleteParser(BfSystem* bfSystem, BfParser* b
//bfSystem->mParserDeleteQueue.push_back(bfParser);
}
class BfLocationNameVisitor : public BfElementVisitor
{
public:
int mIndex;
String mName;
bool TryNode(BfAstNode* node)
{
if ((mIndex >= node->mSrcStart) && (mIndex < node->mSrcEnd))
{
if (!mName.IsEmpty())
mName += ".";
return true;
}
return false;
}
virtual void Visit(BfTypeDeclaration* typeDeclaration)
{
if ((typeDeclaration->mNameNode != NULL) && (TryNode(typeDeclaration)))
{
typeDeclaration->mNameNode->ToString(mName);
}
BfElementVisitor::Visit(typeDeclaration);
}
virtual void Visit(BfMethodDeclaration* methodDeclaration)
{
if ((methodDeclaration->mNameNode != NULL) && (TryNode(methodDeclaration)))
{
if (methodDeclaration->mNameNode != NULL)
methodDeclaration->mNameNode->ToString(mName);
}
BfElementVisitor::Visit(methodDeclaration);
}
virtual void Visit(BfPropertyDeclaration* propertyDeclaration)
{
if ((propertyDeclaration->mNameNode != NULL) && (TryNode(propertyDeclaration)))
{
if (propertyDeclaration->mNameNode != NULL)
propertyDeclaration->mNameNode->ToString(mName);
}
BfElementVisitor::Visit(propertyDeclaration);
}
};
BF_EXPORT const char* BfSystem_GetParserLocationName(BfParser* parser, int line, int column)
{
int idx = parser->GetIndexAtLine(line);
if (idx == -1)
return NULL;
idx += column;
BfLocationNameVisitor visitor;
visitor.mIndex = idx;
visitor.VisitMembers(parser->mRootNode);
String& outString = *gTLStrReturn.Get();
outString = visitor.mName;
return outString.c_str();
}
BF_EXPORT BfCompiler* BF_CALLTYPE BfSystem_CreateCompiler(BfSystem* bfSystem, bool isResolveOnly)
{
return bfSystem->CreateCompiler(isResolveOnly);