diff --git a/IDE/src/IDEApp.bf b/IDE/src/IDEApp.bf index 3edc0f81..6ccc7ad9 100644 --- a/IDE/src/IDEApp.bf +++ b/IDE/src/IDEApp.bf @@ -133,7 +133,6 @@ namespace IDE public PropertiesPanel mPropertiesPanel; public Font mTinyCodeFont ~ delete _; public Font mCodeFont ~ delete _; - public Font mLargeFont ~ delete _; protected bool mInitialized; public bool mConfig_NoIR; public bool mFailed; @@ -1440,10 +1439,16 @@ namespace IDE continue; if (tabWidget.mContent is DisassemblyPanel) continue; + if (tabWidget.mContent is WelcomePanel) + continue; } using (data.CreateObject()) { + var panel = tabWidget.mContent as Panel; + if (!panel.WantsSerialization) + continue; + if (tabWidget.mIsActive) data.Add("Active", true); @@ -1454,7 +1459,7 @@ namespace IDE { watchPanel.Serialize(data, serializeDocs); } - else if (var panel = tabWidget.mContent as Panel) + else if (panel != null) { panel.Serialize(data); } @@ -9982,6 +9987,14 @@ namespace IDE ShowPanel(mOutputPanel, false); UpdateRecentFileMenuItems(); ShowStartupFile(); + + if (mIsFirstRun) + { + WelcomePanel welcomePanel = new .(); + TabbedView tabbedView = GetDefaultDocumentTabbedView(); + let tabButton = SetupTab(tabbedView, "Welcome", 0, welcomePanel, true); + tabButton.Activate(); + } } #endif diff --git a/IDE/src/ui/AutoComplete.bf b/IDE/src/ui/AutoComplete.bf index 637da70a..397ce29a 100644 --- a/IDE/src/ui/AutoComplete.bf +++ b/IDE/src/ui/AutoComplete.bf @@ -216,6 +216,12 @@ namespace IDE.ui if ((mWidgetWindow == null) || (mWidgetWindow.mRootWidget != this)) return; // We're being replaced as root + if (let widgetWindow = window as WidgetWindow) + { + if (widgetWindow.mRootWidget is DarkTooltipContainer) + return; + } + if ((!mIgnoreMove) && (mWidgetWindow != null) && (!mWidgetWindow.mHasClosed)) mAutoComplete.Close(); } @@ -2016,6 +2022,9 @@ namespace IDE.ui if (!mClosed) { + if ((DarkTooltipManager.sTooltip != null) && (!DarkTooltipManager.sTooltip.mRequireMouseInside)) + DarkTooltipManager.CloseTooltip(); + if (IsInPanel()) { gApp.mAutoCompletePanel.Unbind(this); diff --git a/IDE/src/ui/NewProjectDialog.bf b/IDE/src/ui/NewProjectDialog.bf index 359373f5..e0ba5817 100644 --- a/IDE/src/ui/NewProjectDialog.bf +++ b/IDE/src/ui/NewProjectDialog.bf @@ -132,6 +132,7 @@ namespace IDE.ui // If we don't yet have a workspace then create one now... if (!app.mWorkspace.IsInitialized) { + DeleteAndNullify!(app.mWorkspace.mDir); app.mWorkspace.mDir = new String(projDirectory); app.mWorkspace.mName = new String(projName); diff --git a/IDE/src/ui/Panel.bf b/IDE/src/ui/Panel.bf index 6ff48c5e..a3009610 100644 --- a/IDE/src/ui/Panel.bf +++ b/IDE/src/ui/Panel.bf @@ -31,6 +31,14 @@ namespace IDE.ui } } + public virtual bool WantsSerialization + { + get + { + return true; + } + } + public override void GotFocus() { base.GotFocus(); diff --git a/IDE/src/ui/WelcomePanel.bf b/IDE/src/ui/WelcomePanel.bf new file mode 100644 index 00000000..ce3715b8 --- /dev/null +++ b/IDE/src/ui/WelcomePanel.bf @@ -0,0 +1,119 @@ +using Beefy.gfx; +using Beefy.theme.dark; +using System; +using Beefy.widgets; + +namespace IDE.ui +{ + class WelcomePanel : Panel + { + class SampleButton : Widget + { + public Image mImage; + public String mLabel ~ delete _; + public Font mFont; + public String mPath ~ delete _; + + public override void Draw(Graphics g) + { + using (g.PushColor(mMouseOver ? 0xFFFFFFFF : 0x80FFFFFF)) + using (g.PushScale(DarkTheme.sScale, DarkTheme.sScale)) + g.Draw(mImage); + + g.SetFont(mFont); + g.DrawString(mLabel, 0, GS!(240), .Centered, mWidth); + } + + public override void MouseEnter() + { + base.MouseEnter(); + gApp.SetCursor(.Hand); + } + + public override void MouseLeave() + { + base.MouseLeave(); + gApp.SetCursor(.Pointer); + } + + public override void MouseClicked(float x, float y, int32 btn) + { + base.MouseClicked(x, y, btn); + + gApp.[Friend]mDeferredOpen = .Workspace; + String.NewOrSet!(gApp.[Friend]mDeferredOpenFileName, mPath); + } + } + + Font mLargeFont ~ delete _; + Font mMedFont ~ delete _; + Image mSampleImg0 ~ delete _; + Image mSampleImg1 ~ delete _; + SampleButton mSampleBtn0; + SampleButton mSampleBtn1; + + public override bool WantsSerialization + { + get + { + return false; + } + } + + public this() + { + mSampleImg0 = Image.LoadFromFile(scope String()..AppendF(@"{}\images\welcome_sample0.png", gApp.mInstallDir)); + mSampleImg1 = Image.LoadFromFile(scope String()..AppendF(@"{}\images\welcome_sample1.png", gApp.mInstallDir)); + + mSampleBtn0 = new .(); + mSampleBtn0.mPath = new String()..AppendF(@"\beef_website\Samples\SpaceGame\BeefSpace.toml"); + mSampleBtn0.mLabel = new String("Space Game"); + mSampleBtn0.mImage = mSampleImg0; + AddWidget(mSampleBtn0); + + mSampleBtn1 = new .(); + mSampleBtn1.mPath = new String()..AppendF(@"\beef_website\Samples\HelloWorld\BeefSpace.toml"); + mSampleBtn1.mLabel = new String("Hello World"); + mSampleBtn1.mImage = mSampleImg1; + AddWidget(mSampleBtn1); + } + + public override void RehupScale(float oldScale, float newScale) + { + base.RehupScale(oldScale, newScale); + + DeleteAndNullify!(mLargeFont); + DeleteAndNullify!(mMedFont); + } + + public override void DrawAll(Graphics g) + { + if (mLargeFont == null) + mLargeFont = new Font()..Load("Segoe UI Bold", 60.0f * DarkTheme.sScale); //8.8 + if (mMedFont == null) + mMedFont = new Font()..Load("Segoe UI Bold", 24.0f * DarkTheme.sScale); //8.8 + mSampleBtn0.mFont = mMedFont; + mSampleBtn1.mFont = mMedFont; + + base.DrawAll(g); + } + + public override void Draw(Graphics g) + { + g.SetFont(mLargeFont); + using (g.PushColor(0xFFE0E0FF)) + g.DrawString("Welcome to Beef", 0, GS!(48), .Centered, mWidth); + + g.SetFont(mMedFont); + g.DrawString("Click on a sample projects below\nor\nCreate a project from the File menu", GS!(32), GS!(148), .Centered, mWidth - GS!(64)); + } + + public override void Update() + { + base.Update(); + + mSampleBtn0.Resize(mWidth / 2 - GS!(32 + 320), GS!(300), GS!(320), GS!(240)); + mSampleBtn1.Resize(mWidth / 2 + GS!(32), GS!(300), GS!(320), GS!(240)); + } + } +}