2015-09-30 19:22:51 -04:00
|
|
|
/*
|
|
|
|
* Copyright 2011-2015 Branimir Karadzic. All rights reserved.
|
|
|
|
* License: http://www.opensource.org/licenses/BSD-2-Clause
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Based on ImWindow code from:
|
|
|
|
* https://github.com/thennequin/ImWindow
|
|
|
|
*
|
|
|
|
* MIT license:
|
|
|
|
* https://github.com/thennequin/ImWindow/blob/master/LICENSE
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef IMGUI_WM_H_HEADER_GUARD
|
|
|
|
#define IMGUI_WM_H_HEADER_GUARD
|
|
|
|
|
|
|
|
#include "imgui.h"
|
|
|
|
|
|
|
|
typedef unsigned int ImU32;
|
|
|
|
|
|
|
|
#ifndef ImwList
|
2015-09-30 23:02:59 -04:00
|
|
|
# include <list>
|
|
|
|
# define ImwList std::list
|
2015-09-30 19:22:51 -04:00
|
|
|
#endif // ImList
|
|
|
|
|
|
|
|
#ifndef ImwMap
|
2015-09-30 23:02:59 -04:00
|
|
|
# include <unordered_map>
|
|
|
|
# define ImwMap std::unordered_map
|
2015-09-30 19:22:51 -04:00
|
|
|
#endif // ImMap
|
|
|
|
|
|
|
|
namespace ImWindow
|
|
|
|
{
|
|
|
|
enum EDockOrientation
|
|
|
|
{
|
|
|
|
E_DOCK_ORIENTATION_CENTER,
|
|
|
|
E_DOCK_ORIENTATION_TOP,
|
|
|
|
E_DOCK_ORIENTATION_LEFT,
|
|
|
|
E_DOCK_ORIENTATION_RIGHT,
|
|
|
|
E_DOCK_ORIENTATION_BOTTOM,
|
|
|
|
};
|
|
|
|
|
2015-09-30 23:02:59 -04:00
|
|
|
class ImwId
|
2015-09-30 19:22:51 -04:00
|
|
|
{
|
2015-09-30 23:02:59 -04:00
|
|
|
public:
|
2015-09-30 19:22:51 -04:00
|
|
|
ImwId();
|
|
|
|
ImU32 GetId() const;
|
|
|
|
const char* GetStr() const;
|
2015-09-30 23:02:59 -04:00
|
|
|
|
2015-09-30 19:22:51 -04:00
|
|
|
private:
|
2015-09-30 23:02:59 -04:00
|
|
|
ImU32 m_iId;
|
|
|
|
char m_pId[11];
|
2015-09-30 19:22:51 -04:00
|
|
|
static int s_iNextId;
|
|
|
|
};
|
|
|
|
|
|
|
|
class ImwWindow
|
|
|
|
{
|
|
|
|
friend class ImwWindowManager;
|
|
|
|
friend class ImwContainer;
|
2015-09-30 23:02:59 -04:00
|
|
|
|
2015-09-30 19:22:51 -04:00
|
|
|
public:
|
2015-09-30 23:02:59 -04:00
|
|
|
virtual void OnGui() = 0;
|
|
|
|
virtual void OnMenu() {};
|
|
|
|
|
|
|
|
const char* GetId() const { return m_oId.GetStr(); }
|
2015-09-30 19:22:51 -04:00
|
|
|
|
2015-09-30 23:02:59 -04:00
|
|
|
void Destroy();
|
2015-09-30 19:22:51 -04:00
|
|
|
|
2015-09-30 23:02:59 -04:00
|
|
|
void SetTitle(const char* pTitle);
|
|
|
|
const char* GetTitle() const;
|
2015-09-30 19:22:51 -04:00
|
|
|
|
2015-09-30 23:02:59 -04:00
|
|
|
const ImVec2& GetLastPosition() const;
|
|
|
|
const ImVec2& GetLastSize() const;
|
2015-09-30 19:22:51 -04:00
|
|
|
|
|
|
|
protected:
|
2015-09-30 23:02:59 -04:00
|
|
|
ImwWindow();
|
|
|
|
virtual ~ImwWindow();
|
2015-09-30 19:22:51 -04:00
|
|
|
|
2015-09-30 23:02:59 -04:00
|
|
|
char* m_pTitle;
|
|
|
|
ImwId m_oId;
|
2015-09-30 19:22:51 -04:00
|
|
|
|
2015-09-30 23:02:59 -04:00
|
|
|
ImVec2 m_oLastPosition;
|
|
|
|
ImVec2 m_oLastSize;
|
2015-09-30 19:22:51 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
typedef ImwList<ImwWindow*> ImwWindowList;
|
|
|
|
|
|
|
|
class ImwPlatformWindow;
|
|
|
|
|
|
|
|
class ImwContainer
|
|
|
|
{
|
|
|
|
friend class ImwPlatformWindow;
|
|
|
|
|
|
|
|
public:
|
2015-09-30 23:02:59 -04:00
|
|
|
void Dock(ImwWindow* pWindow,EDockOrientation eOrientation = E_DOCK_ORIENTATION_CENTER);
|
|
|
|
bool UnDock(ImwWindow* pWindow);
|
2015-09-30 19:22:51 -04:00
|
|
|
|
2015-09-30 23:02:59 -04:00
|
|
|
bool IsEmpty();
|
|
|
|
bool IsSplit();
|
|
|
|
bool HasWindowTabbed();
|
|
|
|
ImwContainer* HasWindow(const ImwWindow* pWindow);
|
|
|
|
ImwPlatformWindow* GetPlatformWindowParent() const;
|
|
|
|
ImwContainer* GetBestDocking(const ImVec2 oCursorPosInContainer,EDockOrientation& oOutOrientation,ImVec2& oOutAreaPos,ImVec2& oOutAreaSize);
|
2015-09-30 19:22:51 -04:00
|
|
|
|
|
|
|
protected:
|
|
|
|
ImwContainer(ImwContainer* pParent);
|
|
|
|
ImwContainer(ImwPlatformWindow* pParent);
|
|
|
|
~ImwContainer();
|
|
|
|
|
2015-09-30 23:02:59 -04:00
|
|
|
void CreateSplits();
|
|
|
|
void Paint();
|
2015-09-30 19:22:51 -04:00
|
|
|
|
2015-09-30 23:02:59 -04:00
|
|
|
ImwContainer* m_pParent;
|
|
|
|
ImwPlatformWindow* m_pParentWindow;
|
|
|
|
ImwWindowList m_lWindows;
|
|
|
|
ImwContainer* m_pSplits[2];
|
2015-09-30 19:22:51 -04:00
|
|
|
|
2015-09-30 23:02:59 -04:00
|
|
|
float m_fSplitRatio;
|
|
|
|
bool m_bVerticalSplit;
|
|
|
|
int m_iActiveWindow;
|
2015-09-30 19:22:51 -04:00
|
|
|
|
2015-09-30 23:02:59 -04:00
|
|
|
bool m_bIsDrag;
|
2015-09-30 19:22:51 -04:00
|
|
|
|
2015-09-30 23:02:59 -04:00
|
|
|
ImVec2 m_oLastPosition;
|
|
|
|
ImVec2 m_oLastSize;
|
2015-09-30 19:22:51 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
class ImwPlatformWindow
|
|
|
|
{
|
|
|
|
friend class ImwWindowManager;
|
2015-09-30 23:02:59 -04:00
|
|
|
|
2015-09-30 19:22:51 -04:00
|
|
|
public:
|
2015-09-30 23:02:59 -04:00
|
|
|
ImwPlatformWindow(bool bMainWindow,bool bIsDragWindow);
|
|
|
|
virtual ~ImwPlatformWindow();
|
|
|
|
|
|
|
|
virtual bool Init(ImwPlatformWindow* pParent) = 0;
|
2015-09-30 19:22:51 -04:00
|
|
|
|
2015-09-30 23:02:59 -04:00
|
|
|
virtual const ImVec2& GetPosition() const = 0;
|
|
|
|
virtual const ImVec2& GetSize() const = 0;
|
2015-09-30 19:22:51 -04:00
|
|
|
|
2015-09-30 23:02:59 -04:00
|
|
|
virtual void Show() = 0;
|
|
|
|
virtual void Hide() = 0;
|
|
|
|
virtual void SetSize(const ImVec2& size) = 0;
|
|
|
|
virtual void SetPosition(const ImVec2& pos) = 0;
|
|
|
|
virtual void SetTitle(const char* pTitle) = 0;
|
2015-09-30 19:22:51 -04:00
|
|
|
|
2015-09-30 23:02:59 -04:00
|
|
|
bool IsMain();
|
2015-09-30 19:22:51 -04:00
|
|
|
|
2015-09-30 23:02:59 -04:00
|
|
|
void Dock(ImwWindow* pWindow);
|
|
|
|
bool UnDock(ImwWindow* pWindow);
|
2015-09-30 19:22:51 -04:00
|
|
|
|
2015-09-30 23:02:59 -04:00
|
|
|
ImwContainer* GetContainer();
|
|
|
|
ImwContainer* HasWindow(ImwWindow* pWindow);
|
|
|
|
bool IsStateSet();
|
2015-09-30 19:22:51 -04:00
|
|
|
|
|
|
|
protected:
|
2015-09-30 23:02:59 -04:00
|
|
|
void SetState();
|
|
|
|
void RestoreState();
|
|
|
|
void OnLoseFocus();
|
|
|
|
virtual void PreUpdate() = 0;
|
|
|
|
virtual void Paint();
|
|
|
|
virtual void Destroy() = 0;
|
|
|
|
virtual void StartDrag() = 0;
|
|
|
|
virtual void StopDrag() = 0;
|
|
|
|
virtual bool IsDraging() = 0;
|
|
|
|
|
|
|
|
void PaintContainer();
|
|
|
|
void OnClose();
|
|
|
|
|
|
|
|
ImwId m_oId;
|
|
|
|
bool m_bMain;
|
|
|
|
bool m_bIsDragWindow;
|
|
|
|
ImwContainer* m_pContainer;
|
|
|
|
void* m_pState;
|
|
|
|
void* m_pPreviousState;
|
2015-09-30 19:22:51 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
typedef ImwList<ImwPlatformWindow*> ImwPlatformWindowList;
|
|
|
|
|
|
|
|
class ImwWindowManager
|
|
|
|
{
|
|
|
|
friend class ImwWindow;
|
|
|
|
friend class ImwPlatformWindow;
|
|
|
|
friend class ImwContainer;
|
|
|
|
|
|
|
|
enum EPlatformWindowAction
|
|
|
|
{
|
2015-09-30 23:02:59 -04:00
|
|
|
E_PLATFORM_WINDOW_ACTION_DESTOY = 1,
|
|
|
|
E_PLATFORM_WINDOW_ACTION_SHOW = 2,
|
|
|
|
E_PLATFORM_WINDOW_ACTION_HIDE = 4,
|
|
|
|
E_PLATFORM_WINDOW_ACTION_SET_POSITION = 8,
|
|
|
|
E_PLATFORM_WINDOW_ACTION_SET_SIZE = 16,
|
2015-09-30 19:22:51 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
struct PlatformWindowAction
|
|
|
|
{
|
2015-09-30 23:02:59 -04:00
|
|
|
ImwPlatformWindow* m_pPlatformWindow;
|
|
|
|
unsigned int m_iFlags;
|
|
|
|
ImVec2 m_oPosition;
|
|
|
|
ImVec2 m_oSize;
|
2015-09-30 19:22:51 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
struct DockAction
|
|
|
|
{
|
2015-09-30 23:02:59 -04:00
|
|
|
ImwWindow* m_pWindow;
|
|
|
|
|
2015-09-30 19:22:51 -04:00
|
|
|
// Is Dock or Float
|
2015-09-30 23:02:59 -04:00
|
|
|
bool m_bFloat;
|
|
|
|
|
2015-09-30 19:22:51 -04:00
|
|
|
//For Docking
|
2015-09-30 23:02:59 -04:00
|
|
|
ImwWindow* m_pWith;
|
|
|
|
EDockOrientation m_eOrientation;
|
|
|
|
ImwPlatformWindow* m_pToPlatformWindow;
|
|
|
|
ImwContainer* m_pToContainer;
|
|
|
|
|
2015-09-30 19:22:51 -04:00
|
|
|
//For Floating
|
2015-09-30 23:02:59 -04:00
|
|
|
ImVec2 m_oPosition;
|
|
|
|
ImVec2 m_oSize;
|
2015-09-30 19:22:51 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
struct DrawWindowAreaAction
|
|
|
|
{
|
2015-09-30 23:02:59 -04:00
|
|
|
DrawWindowAreaAction(ImwPlatformWindow* pWindow,const ImVec2& oRectPos,const ImVec2& oRectSize,const ImColor& oColor);
|
|
|
|
ImwPlatformWindow* m_pWindow;
|
|
|
|
ImVec2 m_oRectPos;
|
|
|
|
ImVec2 m_oRectSize;
|
|
|
|
ImColor m_oColor;
|
2015-09-30 19:22:51 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
public:
|
|
|
|
struct Config
|
|
|
|
{
|
|
|
|
Config();
|
2015-09-30 23:02:59 -04:00
|
|
|
float m_fDragMarginRatio;
|
|
|
|
float m_fDragMarginSizeRatio;
|
|
|
|
ImColor m_oHightlightAreaColor;
|
2015-09-30 19:22:51 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
ImwWindowManager();
|
2015-09-30 23:02:59 -04:00
|
|
|
virtual ~ImwWindowManager();
|
2015-09-30 19:22:51 -04:00
|
|
|
|
2015-09-30 23:02:59 -04:00
|
|
|
bool Init();
|
|
|
|
bool Run();
|
|
|
|
void Exit();
|
2015-09-30 19:22:51 -04:00
|
|
|
|
2015-09-30 23:02:59 -04:00
|
|
|
ImwPlatformWindow* GetMainPlatformWindow();
|
|
|
|
Config& GetConfig();
|
2015-09-30 19:22:51 -04:00
|
|
|
|
2015-09-30 23:02:59 -04:00
|
|
|
void SetMainTitle(const char* pTitle);
|
2015-09-30 19:22:51 -04:00
|
|
|
|
2015-09-30 23:02:59 -04:00
|
|
|
void Dock(ImwWindow* pWindow,EDockOrientation eOrientation = E_DOCK_ORIENTATION_CENTER,ImwPlatformWindow* pToPlatformWindow = NULL);
|
|
|
|
void DockTo(ImwWindow* pWindow,EDockOrientation eOrientation = E_DOCK_ORIENTATION_CENTER,ImwContainer* pContainer = NULL);
|
|
|
|
void DockWith(ImwWindow* pWindow,ImwWindow* pWithWindow,EDockOrientation eOrientation = E_DOCK_ORIENTATION_CENTER);
|
|
|
|
void Float(ImwWindow* pWindow,const ImVec2& oPosition = ImVec2(-1,-1),const ImVec2& oSize = ImVec2(-1,-1));
|
2015-09-30 19:22:51 -04:00
|
|
|
|
2015-09-30 23:02:59 -04:00
|
|
|
const ImwWindowList& GetWindowList() const;
|
|
|
|
ImwPlatformWindow* GetCurrentPlatformWindow();
|
|
|
|
ImwPlatformWindow* GetWindowParent(ImwWindow* pWindow);
|
2015-09-30 19:22:51 -04:00
|
|
|
|
2015-09-30 23:02:59 -04:00
|
|
|
void Log(const char* pFormat, ...);
|
|
|
|
virtual void LogFormatted(const char* pStr) = 0;;
|
|
|
|
|
|
|
|
static ImwWindowManager* GetInstance();
|
2015-09-30 19:22:51 -04:00
|
|
|
|
|
|
|
protected:
|
2015-09-30 23:02:59 -04:00
|
|
|
virtual ImwPlatformWindow* CreatePlatformWindow(bool bMain,ImwPlatformWindow* pParent,bool bDragWindow) = 0;
|
|
|
|
virtual void InternalRun() = 0;
|
|
|
|
virtual ImVec2 GetCursorPos() = 0;
|
|
|
|
virtual bool IsLeftClickDown() = 0;
|
|
|
|
|
|
|
|
void AddWindow(ImwWindow* pWindow);
|
|
|
|
void RemoveWindow(ImwWindow* pWindow);
|
|
|
|
void DestroyWindow(ImwWindow* pWindow);
|
|
|
|
|
|
|
|
void InternalDock(ImwWindow* pWindow,EDockOrientation eOrientation,ImwPlatformWindow* pToPlatformWindow);
|
|
|
|
void InternalDockTo(ImwWindow* pWindow,EDockOrientation eOrientation,ImwContainer* pToContainer);
|
|
|
|
void InternalDockWith(ImwWindow* pWindow,ImwWindow* pWithWindow,EDockOrientation eOrientation);
|
|
|
|
void InternalFloat(ImwWindow* pWindow,ImVec2 oPosition,ImVec2 oSize);
|
|
|
|
void InternalUnDock(ImwWindow* pWindow);
|
|
|
|
void InternalDrag(ImwWindow* pWindow);
|
|
|
|
|
|
|
|
void OnClosePlatformWindow(ImwPlatformWindow* pWindow);
|
|
|
|
|
|
|
|
void DrawWindowArea(ImwPlatformWindow* pWindow,const ImVec2& oPos,const ImVec2& oSize,const ImColor& oColor);
|
|
|
|
|
|
|
|
void PreUpdate();
|
|
|
|
void Update();
|
|
|
|
void UpdatePlatformwWindowActions();
|
|
|
|
void UpdateDockActions();
|
|
|
|
void UpdateOrphans();
|
|
|
|
|
|
|
|
void Paint(ImwPlatformWindow* pWindow);
|
|
|
|
|
|
|
|
void StartDragWindow(ImwWindow* pWindow);
|
|
|
|
void StopDragWindow();
|
|
|
|
void UpdateDragWindow();
|
|
|
|
ImwContainer* GetBestDocking(ImwPlatformWindow* pPlatformWindow,const ImVec2 oCursorPos,EDockOrientation& oOutOrientation,ImVec2& oOutAreaPos,ImVec2& oOutAreaSize);
|
|
|
|
|
|
|
|
Config m_oConfig;
|
|
|
|
ImwPlatformWindow* m_pMainPlatformWindow;
|
|
|
|
ImwPlatformWindowList m_lPlatformWindows;
|
|
|
|
ImwPlatformWindow* m_pDragPlatformWindow;
|
|
|
|
ImwWindowList m_lWindows;
|
|
|
|
ImwWindowList m_lOrphanWindows;
|
|
|
|
ImwWindowList m_lToDestroyWindows;
|
|
|
|
ImwPlatformWindowList m_lToDestroyPlatformWindows;
|
|
|
|
ImwList<PlatformWindowAction*> m_lPlatformWindowActions;
|
|
|
|
ImwList<DockAction*> m_lDockActions;
|
|
|
|
ImwList<DrawWindowAreaAction> m_lDrawWindowAreas;
|
|
|
|
|
|
|
|
ImwPlatformWindow* m_pCurrentPlatformWindow;
|
|
|
|
ImwWindow* m_pDraggedWindow;
|
|
|
|
|
|
|
|
ImVec2 m_oDragPreviewOffset;
|
|
|
|
|
|
|
|
static ImwWindowManager* s_pInstance;
|
2015-09-30 19:22:51 -04:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif // IMGUI_WM_H_HEADER_GUARD
|