1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-14 14:24:10 +02:00
Beef/IDE/src/ui/TextPanel.bf

271 lines
6.8 KiB
Beef

using System;
using System.Collections;
using System.Diagnostics;
using System.Text;
using System.Threading.Tasks;
using Beefy;
using Beefy.widgets;
using Beefy.geom;
using Beefy.theme.dark;
namespace IDE.ui
{
public abstract class TextPanel : Panel
{
public HoverWatch mHoverWatch;
public bool mDisposed;
public int32 mLastFocusTick;
public abstract SourceEditWidget EditWidget
{
get;
}
public QuickFind mQuickFind;
public ~this()
{
Widget.RemoveAndDelete(mQuickFind);
}
public virtual bool EscapeHandler()
{
if (mHoverWatch != null)
{
mHoverWatch.Close();
return true;
}
if (mQuickFind != null)
{
if (mQuickFind.Close())
return true;
}
var editWidget = EditWidget;
if (editWidget.Content.HasSelection())
{
editWidget.Content.mSelection = null;
return true;
}
return false;
}
public virtual void Dispose()
{
if (mQuickFind != null)
{
//
}
if (mHoverWatch != null)
mHoverWatch.Close();
mDisposed = true;
}
public override void ParentDeleted()
{
if (!mDisposed)
Dispose();
base.ParentDeleted();
}
public virtual void EditGotFocus()
{
}
public virtual void EditLostFocus()
{
}
public bool CheckAllowHoverWatch()
{
if (mHoverWatch != null)
{
bool hasActiveHoverWatch = false;
if (mHoverWatch.mEditWidget != null)
hasActiveHoverWatch = true;
// Allow a sloped area for the cursor to move down-right to the hover widget
// without causing the hover watch to close because we moved the cursor away
// from the hovered text
float xOfs = DarkTooltipManager.sLastRelMousePos.x - mHoverWatch.mOpenMousePos.x;
float yOfs = DarkTooltipManager.sLastRelMousePos.y - mHoverWatch.mOpenMousePos.y;
if ((xOfs >= 0) && (yOfs >= 0) && (yOfs < 24))
{
if (xOfs < yOfs * 4 + 6)
{
hasActiveHoverWatch = true;
}
}
if ((mHoverWatch.mWidgetWindow != null) && (mHoverWatch.mWidgetWindow.mCaptureWidget != null))
{
// Don't close if hover has mouse mousecapture (particularly while dragging scrollbar)
hasActiveHoverWatch = true;
}
if ((mHoverWatch.mWidgetWindow != null) && (mHoverWatch.mWidgetWindow.mOverWidget != null))
{
// Don't close if hover has mouse mousecapture (particularly while dragging scrollbar)
hasActiveHoverWatch = true;
}
/*if (mHoverWatch.mWidgetWindow.mHasMouseInside)
hasActiveHoverWatch = true;*/
if (hasActiveHoverWatch)
{
//if (mHoverWatch.mCloseCountdown > 0)
//Debug.WriteLine("CheckAllowHoverWatch mCloseCountdown = 0");
mHoverWatch.mCloseCountdown = 0;
return false;
}
else
{
//Debug.WriteLine("CheckAllowHoverWatch !hasActiveHoverWatch");
}
}
if (!mWidgetWindow.mHasMouseInside)
return false;
for (WidgetWindow childWindow in mWidgetWindow.mChildWindows)
{
// We're showing an error dialog, don't close mouseover
var dialog = childWindow.mRootWidget as Dialog;
if ((dialog != null) && (dialog.mWindowFlags.HasFlag(BFWindow.Flags.Modal)))
{
return false;
}
}
if (DarkTooltipManager.sTooltip != null)
return false;
var checkWidget = DarkTooltipManager.sLastMouseWidget;
while ((checkWidget != null) && (checkWidget.mWidgetWindow != null))
{
if (checkWidget.mWidgetWindow != mWidgetWindow)
return false; // We have to at least be over this window
if (checkWidget is HoverWatch)
{
var hw = (HoverWatch)checkWidget;
if (hw.HasContentAt(hw.mWidgetWindow.mMouseX, hw.mWidgetWindow.mMouseY))
return false;
}
if (checkWidget is AutoComplete.AutoCompleteListWidget)
return false;
checkWidget = checkWidget.mParent;
}
return true;
}
public override void SetFocus()
{
base.SetFocus();
EditWidget.SetFocus();
}
public virtual void ShowQuickFind(bool isReplace)
{
if (mQuickFind != null)
{
mQuickFind.Close();
delete mQuickFind;
}
mQuickFind = new QuickFind(this, EditWidget, isReplace);
mWidgetWindow.SetFocus(mQuickFind.mFindEditWidget);
Resize(mX, mY, mWidth, mHeight);
}
public virtual void FindNext(int32 dir = 1)
{
if (mQuickFind == null)
{
ShowQuickFind(false);
if (mQuickFind == null)
return;
mQuickFind.Close();
}
mQuickFind.FindNext(dir, false);
}
protected virtual void ResizeComponents()
{
if (mQuickFind != null)
mQuickFind.ResizeSelf();
}
public override void Resize(float x, float y, float width, float height)
{
base.Resize(x, y, width, height);
ResizeComponents();
}
public virtual void RecordHistoryLocation(bool ignoreIfClose = false)
{
}
public override void Update()
{
base.Update();
if (mQuickFind != null)
mQuickFind.UpdateData();
if (mHoverWatch != null)
{
Debug.Assert(mHoverWatch.mTextPanel == this);
}
}
public virtual void Clear()
{
}
}
class EmptyTextPanel : TextPanel
{
public bool mAllowHoverWatch = false;
public Rect? mHoverWatchRect;
public override SourceEditWidget EditWidget
{
get
{
return null;
}
}
public override void Update()
{
base.Update();
if (!CheckAllowHoverWatch())
return;
if (IDEApp.sApp.HasPopupMenus())
return;
if (mHoverWatchRect.HasValue)
{
float x;
float y;
RootToSelfTranslate(mWidgetWindow.mMouseX, mWidgetWindow.mMouseY, out x, out y);
if (mHoverWatchRect.Value.Contains(x, y))
return;
}
if ((mHoverWatch != null) && (mHoverWatch.mCloseDelay == 0))
mHoverWatch.Close();
}
}
}