mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-12 05:14:10 +02:00
Smaller screenshot
This commit is contained in:
parent
fc4f5678dd
commit
52844cd30a
2 changed files with 302 additions and 0 deletions
Binary file not shown.
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 68 KiB |
302
IDE/src/ui/ErrorsPanel.bf
Normal file
302
IDE/src/ui/ErrorsPanel.bf
Normal file
|
@ -0,0 +1,302 @@
|
||||||
|
using Beefy.widgets;
|
||||||
|
using Beefy.theme.dark;
|
||||||
|
using IDE.Compiler;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading;
|
||||||
|
using System;
|
||||||
|
using Beefy.gfx;
|
||||||
|
using System.IO;
|
||||||
|
using Beefy.utils;
|
||||||
|
|
||||||
|
namespace IDE.ui
|
||||||
|
{
|
||||||
|
class ErrorsPanel : Panel
|
||||||
|
{
|
||||||
|
public class ErrorsListView : IDEListView
|
||||||
|
{
|
||||||
|
protected override ListViewItem CreateListViewItem()
|
||||||
|
{
|
||||||
|
return new ErrorsListViewItem();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ErrorsListViewItem : IDEListViewItem
|
||||||
|
{
|
||||||
|
public String mFilePath ~ delete _;
|
||||||
|
public int mLine;
|
||||||
|
public int mColumn;
|
||||||
|
|
||||||
|
public override void DrawSelect(Graphics g)
|
||||||
|
{
|
||||||
|
bool hasFocus = mListView.mHasFocus;
|
||||||
|
if ((mWidgetWindow.mFocusWidget != null) && (mWidgetWindow.mFocusWidget.HasParent(mListView)))
|
||||||
|
hasFocus = true;
|
||||||
|
using (g.PushColor(hasFocus ? 0xFFFFFFFF : 0x80FFFFFF))
|
||||||
|
base.DrawSelect(g);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Goto()
|
||||||
|
{
|
||||||
|
if (mFilePath == null)
|
||||||
|
return false;
|
||||||
|
gApp.ShowSourceFileLocation(mFilePath, -1, -1, mLine, mColumn, .Always);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public DarkDockingFrame mDockingFrame;
|
||||||
|
public ErrorsListView mErrorLV;
|
||||||
|
public OutputWidget mOutputWidget;
|
||||||
|
|
||||||
|
public bool mNeedsResolveAll;
|
||||||
|
public bool mErrorsDirty;
|
||||||
|
public Monitor mMonitor = new .() ~ delete _;
|
||||||
|
public List<BfPassInstance.BfError> mErrorList = new .() ~ DeleteContainerAndItems!(_);
|
||||||
|
public int mDirtyTicks;
|
||||||
|
|
||||||
|
public int mErrorCount;
|
||||||
|
public int mWarningCount;
|
||||||
|
|
||||||
|
public this()
|
||||||
|
{
|
||||||
|
mErrorLV = new .();
|
||||||
|
//mErrorLV.mPanel = this;
|
||||||
|
//mErrorLV.SetShowHeader(false);
|
||||||
|
mErrorLV.InitScrollbars(true, true);
|
||||||
|
mErrorLV.mLabelX = GS!(6);
|
||||||
|
//mErrorLV.mOnItemMouseDown.Add(new => ItemMouseDown);
|
||||||
|
mErrorLV.mOnItemMouseClicked.Add(new => ListViewItemMouseClicked);
|
||||||
|
mErrorLV.mOnKeyDown.Add(new => ListViewKeyDown_ShowMenu);
|
||||||
|
mErrorLV.AddColumn(100, "Code");
|
||||||
|
mErrorLV.AddColumn(400, "Description");
|
||||||
|
mErrorLV.AddColumn(100, "Project");
|
||||||
|
mErrorLV.AddColumn(120, "File");
|
||||||
|
mErrorLV.AddColumn(40, "Line");
|
||||||
|
mErrorLV.mOnItemMouseDown.Add(new (item, x, y, btnNum, btnCount) =>
|
||||||
|
{
|
||||||
|
if ((btnNum == 0) && (btnCount == 2))
|
||||||
|
{
|
||||||
|
let mainItem = (ErrorsListViewItem)item.GetSubItem(0);
|
||||||
|
mainItem.Goto();
|
||||||
|
}
|
||||||
|
|
||||||
|
ListViewItemMouseDown(item, x, y, btnNum, btnCount);
|
||||||
|
//mErrorLV.GetRoot().SelectItemExclusively()
|
||||||
|
});
|
||||||
|
//let newItem = mErrorLV.GetRoot().CreateChildItem();
|
||||||
|
//newItem.Label = "Hey";
|
||||||
|
|
||||||
|
mOutputWidget = new .();
|
||||||
|
|
||||||
|
var errorDock = new DockingProxy(mErrorLV);
|
||||||
|
var detailsDock = new DockingProxy(mOutputWidget);
|
||||||
|
|
||||||
|
mDockingFrame = new DarkDockingFrame();
|
||||||
|
mDockingFrame.mDrawBkg = false;
|
||||||
|
mDockingFrame.AddDockedWidget(errorDock, null, .Top);
|
||||||
|
mDockingFrame.AddDockedWidget(detailsDock, errorDock, .Bottom);
|
||||||
|
AddWidget(mDockingFrame);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Serialize(StructuredData data)
|
||||||
|
{
|
||||||
|
base.Serialize(data);
|
||||||
|
|
||||||
|
data.Add("Type", "ErrorsPanel");
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Resize(float x, float y, float width, float height)
|
||||||
|
{
|
||||||
|
base.Resize(x, y, width, height);
|
||||||
|
mDockingFrame.Resize(0, 0, width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ResolveKind
|
||||||
|
{
|
||||||
|
None,
|
||||||
|
Parse,
|
||||||
|
Resolve
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ProcessPassInstance(BfPassInstance passInstance, BfPassInstance.PassKind passKind)
|
||||||
|
{
|
||||||
|
using (mMonitor.Enter())
|
||||||
|
{
|
||||||
|
mErrorCount = 0;
|
||||||
|
mWarningCount = 0;
|
||||||
|
|
||||||
|
int32 errorCount = passInstance.GetErrorCount();
|
||||||
|
ClearAndDeleteItems(mErrorList);
|
||||||
|
mErrorList.Capacity = mErrorList.Count;
|
||||||
|
|
||||||
|
for (int32 errorIdx = 0; errorIdx < errorCount; errorIdx++)
|
||||||
|
{
|
||||||
|
BfPassInstance.BfError bfError = new BfPassInstance.BfError();
|
||||||
|
passInstance.GetErrorData(errorIdx, bfError, true);
|
||||||
|
|
||||||
|
if (bfError.mIsWarning)
|
||||||
|
mWarningCount++;
|
||||||
|
else
|
||||||
|
mErrorCount++;
|
||||||
|
|
||||||
|
for (int32 moreInfoIdx < bfError.mMoreInfoCount)
|
||||||
|
{
|
||||||
|
BfPassInstance.BfError moreInfo = new BfPassInstance.BfError();
|
||||||
|
passInstance.GetMoreInfoErrorData(errorIdx, moreInfoIdx, moreInfo, true);
|
||||||
|
if (bfError.mMoreInfo == null)
|
||||||
|
bfError.mMoreInfo = new List<BfPassInstance.BfError>();
|
||||||
|
bfError.mMoreInfo.Add(moreInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
mErrorList.Add(bfError);
|
||||||
|
}
|
||||||
|
|
||||||
|
mErrorsDirty = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ClearParserErrors(StringView filePath)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProcessErrors()
|
||||||
|
{
|
||||||
|
using (mMonitor.Enter())
|
||||||
|
{
|
||||||
|
if (mErrorsDirty)
|
||||||
|
{
|
||||||
|
let root = mErrorLV.GetRoot();
|
||||||
|
|
||||||
|
for (let error in mErrorList)
|
||||||
|
{
|
||||||
|
ErrorsListViewItem item;
|
||||||
|
|
||||||
|
bool changed = false;
|
||||||
|
void SetLabel(ListViewItem item, StringView str)
|
||||||
|
{
|
||||||
|
if (item.Label == str)
|
||||||
|
return;
|
||||||
|
changed = true;
|
||||||
|
item.Label = str;
|
||||||
|
}
|
||||||
|
|
||||||
|
int idx = @error.Index;
|
||||||
|
if (idx >= root.GetChildCount())
|
||||||
|
{
|
||||||
|
item = (.)root.CreateChildItem();
|
||||||
|
item.CreateSubItem(1);
|
||||||
|
item.CreateSubItem(2);
|
||||||
|
item.CreateSubItem(3);
|
||||||
|
item.CreateSubItem(4);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
item = (.)root.GetChildAtIndex(idx);
|
||||||
|
|
||||||
|
if (error.mFilePath == null)
|
||||||
|
DeleteAndNullify!(error.mFilePath);
|
||||||
|
else
|
||||||
|
String.NewOrSet!(item.mFilePath, error.mFilePath);
|
||||||
|
item.mLine = error.mLine;
|
||||||
|
item.mColumn = error.mColumn;
|
||||||
|
|
||||||
|
String codeStr = scope String(32);
|
||||||
|
codeStr.AppendF(error.mIsWarning ? "{}Warning" : "{}Error", Font.EncodeColor(error.mIsWarning ? 0xFFFFFF80 : 0xFFFF8080));
|
||||||
|
if (error.mCode != 0)
|
||||||
|
codeStr.AppendF(" {}", error.mCode);
|
||||||
|
codeStr.AppendF("{}", Font.EncodePopColor());
|
||||||
|
SetLabel(item, codeStr);
|
||||||
|
|
||||||
|
let descItem = item.GetSubItem(1);
|
||||||
|
SetLabel(descItem, scope String(32)..AppendF(error.mError));
|
||||||
|
|
||||||
|
let projectItem = item.GetSubItem(2);
|
||||||
|
SetLabel(projectItem, error.mProject);
|
||||||
|
|
||||||
|
let fileNameItem = item.GetSubItem(3);
|
||||||
|
let fileName = scope String(128);
|
||||||
|
Path.GetFileName(error.mFilePath, fileName);
|
||||||
|
SetLabel(fileNameItem, fileName);
|
||||||
|
let lineNumberItem = item.GetSubItem(4);
|
||||||
|
if (error.mLine != -1)
|
||||||
|
SetLabel(lineNumberItem, scope String(16)..AppendF("{}", error.mLine + 1));
|
||||||
|
else
|
||||||
|
SetLabel(lineNumberItem, "");
|
||||||
|
|
||||||
|
if (changed)
|
||||||
|
item.Focused = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (root.GetChildCount() > mErrorList.Count)
|
||||||
|
root.RemoveChildItemAt(root.GetChildCount() - 1);
|
||||||
|
|
||||||
|
mErrorsDirty = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CheckResolveAll()
|
||||||
|
{
|
||||||
|
let compiler = gApp.mBfResolveCompiler;
|
||||||
|
if ((mNeedsResolveAll) && (!compiler.IsPerformingBackgroundOperation()))
|
||||||
|
{
|
||||||
|
if (compiler.mResolveAllWait == 0)
|
||||||
|
compiler.QueueDeferredResolveAll();
|
||||||
|
mNeedsResolveAll = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Update()
|
||||||
|
{
|
||||||
|
base.Update();
|
||||||
|
|
||||||
|
if (!mVisible)
|
||||||
|
{
|
||||||
|
// Very dirty
|
||||||
|
mDirtyTicks = Math.Max(100, mDirtyTicks);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let compiler = gApp.mBfResolveCompiler;
|
||||||
|
if ((!compiler.IsPerformingBackgroundOperation()) && (compiler.mResolveAllWait == 0))
|
||||||
|
mDirtyTicks = 0;
|
||||||
|
else
|
||||||
|
mDirtyTicks++;
|
||||||
|
|
||||||
|
ProcessErrors();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetNeedsResolveAll()
|
||||||
|
{
|
||||||
|
mNeedsResolveAll = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ShowErrorNext()
|
||||||
|
{
|
||||||
|
ProcessErrors();
|
||||||
|
|
||||||
|
bool foundFocused = false;
|
||||||
|
let root = mErrorLV.GetRoot();
|
||||||
|
if (root.mChildItems == null)
|
||||||
|
return;
|
||||||
|
for (let lvItem in root.mChildItems)
|
||||||
|
{
|
||||||
|
if (lvItem.Focused)
|
||||||
|
{
|
||||||
|
lvItem.Focused = false;
|
||||||
|
foundFocused = true;
|
||||||
|
}
|
||||||
|
else if (foundFocused)
|
||||||
|
{
|
||||||
|
lvItem.Focused = true;
|
||||||
|
((ErrorsListViewItem)lvItem).Goto();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let lvItem = (ErrorsListViewItem)root.GetChildAtIndex(0);
|
||||||
|
lvItem.Focused = true;
|
||||||
|
lvItem.Goto();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue