mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-24 10:38:02 +02:00
Initial checkin
This commit is contained in:
parent
c74712dad9
commit
078564ac9e
3242 changed files with 1616395 additions and 0 deletions
220
IDE/src/ui/PanelPopup.bf
Normal file
220
IDE/src/ui/PanelPopup.bf
Normal file
|
@ -0,0 +1,220 @@
|
|||
using Beefy.theme.dark;
|
||||
using Beefy.widgets;
|
||||
using Beefy.events;
|
||||
using Beefy;
|
||||
using System;
|
||||
using Beefy.geom;
|
||||
using Beefy.gfx;
|
||||
|
||||
namespace IDE.ui
|
||||
{
|
||||
class PanelPopup : Widget
|
||||
{
|
||||
public Panel mPanel;
|
||||
public BFWindowBase.Flags mWindowFlags = .ClientSized | .NoActivate | .NoMouseActivate | .DestAlpha;
|
||||
Widget mRelativeWidget;
|
||||
bool mReverse;
|
||||
float mMinContainerWidth = 32;
|
||||
float mMaxContainerWidth = 2048;
|
||||
Insets mPopupInsets = new .() ~ delete _;
|
||||
bool mHasClosed;
|
||||
bool mDeferredClose;
|
||||
|
||||
public virtual void CalcSize()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public virtual float GetReverseAdjust()
|
||||
{
|
||||
return GS!(10);
|
||||
}
|
||||
|
||||
public override void Draw(Graphics g)
|
||||
{
|
||||
//g.DrawBox(DarkTheme.sDarkTheme.GetImage(.Window), 0, 0, mWidth, mHeight);
|
||||
|
||||
/*using (g.PushColor(0x80FF0000))
|
||||
g.FillRect(0, 0, mWidth, mHeight);*/
|
||||
|
||||
using (g.PushColor(0x80000000))
|
||||
g.DrawBox(DarkTheme.sDarkTheme.GetImage(DarkTheme.ImageIdx.DropShadow), GS!(2), 0 + GS!(2), mWidth - GS!(2), mHeight - GS!(2));
|
||||
|
||||
base.Draw(g);
|
||||
using (g.PushColor(0xFFFFFFFF))
|
||||
g.DrawBox(DarkTheme.sDarkTheme.GetImage(DarkTheme.ImageIdx.Menu), 0, 0, mWidth - GS!(8), mHeight - GS!(8));
|
||||
}
|
||||
|
||||
public override void Update()
|
||||
{
|
||||
base.Update();
|
||||
if (mDeferredClose)
|
||||
Close();
|
||||
}
|
||||
|
||||
public virtual void Init(Panel panel, Widget relativeWidget, float x, float y, float width, float height)
|
||||
{
|
||||
mPanel = panel;
|
||||
float curY = y;
|
||||
WidgetWindow curWidgetWindow = null;
|
||||
|
||||
Resize(0, 0, width, height);
|
||||
|
||||
bool reverse = false;
|
||||
bool allowReverse = true;
|
||||
if ((allowReverse) && (relativeWidget != null))
|
||||
{
|
||||
CalcSize();
|
||||
|
||||
float minHeight = mHeight;
|
||||
|
||||
float screenX;
|
||||
float screenY;
|
||||
relativeWidget.SelfToRootTranslate(0, curY, out screenX, out screenY);
|
||||
screenY += relativeWidget.mWidgetWindow.mClientY;
|
||||
|
||||
int wsX;
|
||||
int wsY;
|
||||
int wsWidth;
|
||||
int wsHeight;
|
||||
BFApp.sApp.GetWorkspaceRect(out wsX, out wsY, out wsWidth, out wsHeight);
|
||||
float spaceLeft = (wsY + wsHeight) - (screenY);
|
||||
if (spaceLeft < minHeight)
|
||||
{
|
||||
//curY = curY + GetReverseAdjust() - height;
|
||||
curY = curY - height - GetReverseAdjust();
|
||||
reverse = true;
|
||||
}
|
||||
}
|
||||
|
||||
mReverse = reverse;
|
||||
|
||||
float screenX = x;
|
||||
float screenY = curY;
|
||||
|
||||
CalcSize();
|
||||
|
||||
if (relativeWidget != null)
|
||||
relativeWidget.SelfToRootTranslate(x, curY, out screenX, out screenY);
|
||||
screenX += relativeWidget.mWidgetWindow.mClientX;
|
||||
screenY += relativeWidget.mWidgetWindow.mClientY;
|
||||
|
||||
//float screenWidth;
|
||||
//float screenHeight;
|
||||
//CalcContainerSize(panel, ref screenX, ref screenY, out screenWidth, out screenHeight);
|
||||
|
||||
BFWindowBase.Flags flags = mWindowFlags;
|
||||
curWidgetWindow = new WidgetWindow((relativeWidget != null) ? relativeWidget.mWidgetWindow : null,
|
||||
"Popup",
|
||||
(int32)(screenX), (int32)(screenY),
|
||||
(int32)width, (int32)height,
|
||||
flags,
|
||||
this);
|
||||
AddWidget(mPanel);
|
||||
|
||||
//Resize(0, 0, mWidth, mHeight);
|
||||
//panel.UpdateScrollbars();
|
||||
mRelativeWidget = relativeWidget;
|
||||
|
||||
WidgetWindow.sOnKeyDown.Add(new => HandleKeyDown);
|
||||
WidgetWindow.sOnWindowLostFocus.Add(new => WindowLostFocus);
|
||||
WidgetWindow.sOnMouseDown.Add(new => HandleMouseDown);
|
||||
WidgetWindow.sOnMouseWheel.Add(new => HandleMouseWheel);
|
||||
WidgetWindow.sOnWindowMoved.Add(new => HandleWindowMoved);
|
||||
WidgetWindow.sOnMenuItemSelected.Add(new => HandleSysMenuItemSelected);
|
||||
|
||||
/*if (mRelativeWidget != null)
|
||||
mRelativeWidget.mOnMouseUp.Add(new => HandleMouseUp);*/
|
||||
|
||||
curWidgetWindow.SetFocus(this);
|
||||
}
|
||||
|
||||
public override void Resize(float x, float y, float width, float height)
|
||||
{
|
||||
base.Resize(x, y, width, height);
|
||||
mPanel.Resize(GS!(1), GS!(0), width - GS!(9), height - GS!(8));
|
||||
}
|
||||
|
||||
public void RemoveHandlers()
|
||||
{
|
||||
WidgetWindow.sOnMouseDown.Remove(scope => HandleMouseDown, true);
|
||||
WidgetWindow.sOnMouseWheel.Remove(scope => HandleMouseWheel, true);
|
||||
WidgetWindow.sOnWindowLostFocus.Remove(scope => WindowLostFocus, true);
|
||||
WidgetWindow.sOnWindowMoved.Remove(scope => HandleWindowMoved, true);
|
||||
WidgetWindow.sOnMenuItemSelected.Remove(scope => HandleSysMenuItemSelected, true);
|
||||
WidgetWindow.sOnKeyDown.Remove(scope => HandleKeyDown, true);
|
||||
}
|
||||
|
||||
public void Close()
|
||||
{
|
||||
if (mHasClosed)
|
||||
return;
|
||||
mHasClosed = true;
|
||||
|
||||
RemoveHandlers();
|
||||
|
||||
//Debug.Assert(mWidgetWindow != null);
|
||||
|
||||
if (mWidgetWindow != null)
|
||||
{
|
||||
mWidgetWindow.Close();
|
||||
/*if (mMenu.mOnMenuClosed.HasListeners)
|
||||
mMenu.mOnMenuClosed(mMenu, mItemSelected);*/
|
||||
}
|
||||
}
|
||||
|
||||
void HandleMouseWheel(MouseEvent theEvent)
|
||||
{
|
||||
HandleMouseDown(theEvent);
|
||||
}
|
||||
|
||||
void HandleMouseDown(MouseEvent theEvent)
|
||||
{
|
||||
WidgetWindow widgetWindow = (WidgetWindow)theEvent.mSender;
|
||||
if (!(widgetWindow.mRootWidget is PanelPopup))
|
||||
mDeferredClose = true;
|
||||
//Close();
|
||||
}
|
||||
|
||||
void HandleSysMenuItemSelected(IMenu sysMenu)
|
||||
{
|
||||
Close();
|
||||
}
|
||||
|
||||
bool IsMenuWindow(BFWindow window)
|
||||
{
|
||||
var newWidgetWindow = window as WidgetWindow;
|
||||
if (newWidgetWindow != null)
|
||||
{
|
||||
if (newWidgetWindow.mRootWidget is PanelPopup)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void WindowLostFocus(BFWindow window, BFWindow newFocus)
|
||||
{
|
||||
if (IsMenuWindow(newFocus))
|
||||
return;
|
||||
|
||||
if ((mWidgetWindow != null) && (!mWidgetWindow.mHasFocus))
|
||||
Close();
|
||||
}
|
||||
|
||||
void HandleKeyDown(KeyDownEvent evt)
|
||||
{
|
||||
if (evt.mKeyCode == KeyCode.Escape)
|
||||
{
|
||||
evt.mHandled = true;
|
||||
Close();
|
||||
}
|
||||
}
|
||||
|
||||
void HandleWindowMoved(BFWindow window)
|
||||
{
|
||||
if (IsMenuWindow(window))
|
||||
return;
|
||||
Close();
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue