1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-23 18:18:00 +02:00
Beef/IDE/src/ui/AutoCompletePanel.bf
2019-08-23 11:56:54 -07:00

178 lines
4.8 KiB
Beef

using Beefy.utils;
using Beefy.theme.dark;
using Beefy.widgets;
namespace IDE.ui
{
class AutoCompletePanel : Panel
{
public class DataArea : DockedWidget
{
public AutoCompletePanel mPanel;
public void ResizeContent()
{
var autoComplete = mPanel.mAutoComplete;
if (autoComplete == null)
return;
float yOfs = 0;
if (autoComplete.mInvokeWidget != null)
{
/*float height = GS!(20);
mAutoComplete.mInvokeWidget.Resize(0, 2, mWidth, height);
yOfs += mAutoComplete.mInvokeWidget.mHeight;*/
autoComplete.mInvokeWidget.ResizeContent(false);
float height = autoComplete.mInvokeWidget.mHeight - GS!(12);
autoComplete.mInvokeWidget.Resize(GS!(0), GS!(2), mWidth, height);
yOfs += height;
}
if (autoComplete.mAutoCompleteListWidget != null)
{
autoComplete.mAutoCompleteListWidget.Resize(0, yOfs, mWidth, mHeight - yOfs);
autoComplete.mAutoCompleteListWidget.mScrollContent.mWidth = mWidth;
}
}
public override void Resize(float x, float y, float width, float height)
{
base.Resize(x, y, width, height);
ResizeContent();
}
}
public class CommentArea : DockedWidget
{
public AutoCompletePanel mPanel;
public override void Draw(Beefy.gfx.Graphics g)
{
base.Draw(g);
var autoComplete = mPanel.mAutoComplete;
if (autoComplete == null)
return;
if (autoComplete.mAutoCompleteListWidget == null)
return;
if (autoComplete.mAutoCompleteListWidget.mSelectIdx == -1)
return;
if (autoComplete.mAutoCompleteListWidget.mDocumentationDelay > 0)
return;
var selectedEntry = autoComplete.mAutoCompleteListWidget.mEntryList[autoComplete.mAutoCompleteListWidget.mSelectIdx];
if (selectedEntry.mDocumentation == null)
return;
DocumentationParser docParser = scope .(selectedEntry.mDocumentation);
float drawX = GS!(6);
float drawY = GS!(4);
using (g.PushColor(0xFFC0C0C0))
g.DrawString(docParser.ShowDocString, drawX, drawY, .Left, mWidth - drawX - GS!(8), .Wrap);
}
public override void DrawAll(Beefy.gfx.Graphics g)
{
base.DrawAll(g);
using (g.PushColor(0x80FFFFFF))
g.DrawBox(DarkTheme.sDarkTheme.GetImage(DarkTheme.ImageIdx.Bkg), 0, -GS!(6), mWidth, GS!(6));
}
}
public AutoComplete mAutoComplete;
public DarkDockingFrame mDockingFrame;
public DataArea mDataArea;
public CommentArea mCommentArea;
public this()
{
mDataArea = new .();
mDataArea.mPanel = this;
mDataArea.mIsFillWidget = true;
mCommentArea = new .();
mCommentArea.mPanel = this;
mCommentArea.mRequestedHeight = GS!(60);
mDockingFrame = new DarkDockingFrame();
mDockingFrame.mDrawBkg = false;
mDockingFrame.AddDockedWidget(mDataArea, null, .Top);
mDockingFrame.AddDockedWidget(mCommentArea, mDataArea, .Bottom);
AddWidget(mDockingFrame);
}
public bool Unbind(AutoComplete autoComplete)
{
if (mAutoComplete != autoComplete)
return false;
if ((mAutoComplete.mInvokeWidget != null) && (mAutoComplete.mInvokeWidget.mParent == mDataArea))
mDataArea.RemoveWidget(mAutoComplete.mInvokeWidget);
if ((mAutoComplete.mAutoCompleteListWidget != null) && (mAutoComplete.mAutoCompleteListWidget.mParent == mDataArea))
mDataArea.RemoveWidget(mAutoComplete.mAutoCompleteListWidget);
mAutoComplete = null;
return true;
}
public bool StartBind(AutoComplete autoComplete)
{
bool showInPanel = gApp.mSettings.mEditorSettings.mAutoCompleteShowKind == .Panel;
if (gApp.mSettings.mEditorSettings.mAutoCompleteShowKind == .PanelIfVisible)
showInPanel = mWidgetWindow != null;
if (!showInPanel)
{
if (mAutoComplete != null)
Unbind(mAutoComplete);
return false;
}
if (mAutoComplete == autoComplete)
return true;
if (mAutoComplete != null)
Unbind(mAutoComplete);
if (mWidgetWindow == null)
return false;
mAutoComplete = autoComplete;
return true;
}
public void FinishBind()
{
if (mAutoComplete == null)
return;
if ((mAutoComplete.mInvokeWidget != null) && (mAutoComplete.mInvokeWidget.mParent == null))
mDataArea.AddWidget(mAutoComplete.mInvokeWidget);
if ((mAutoComplete.mAutoCompleteListWidget != null) && (mAutoComplete.mAutoCompleteListWidget.mParent == null))
mDataArea.AddWidget(mAutoComplete.mAutoCompleteListWidget);
ResizeComponents();
if (mAutoComplete.mAutoCompleteListWidget != null)
mAutoComplete.mAutoCompleteListWidget.CenterSelection();
}
public void ResizeComponents()
{
mDockingFrame.Resize(0, 0, mWidth, mHeight);
}
public override void Resize(float x, float y, float width, float height)
{
base.Resize(x, y, width, height);
ResizeComponents();
}
public override void Serialize(StructuredData data)
{
data.Add("Type", "AutoCompletePanel");
}
}
}