| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- #include "BsEditorWidgetContainer.h"
- #include "BsGUITabbedTitleBar.h"
- #include "BsEditorWidget.h"
- using namespace CamelotFramework;
- using namespace BansheeEngine;
- namespace BansheeEditor
- {
- const CM::UINT32 EditorWidgetContainer::TitleBarHeight = 13;
- EditorWidgetContainer::EditorWidgetContainer(BS::GUIWidget* parent)
- :mParent(parent), mX(0), mY(0), mWidth(0), mHeight(0), mTitleBar(nullptr), mActiveWidget(-1)
- {
- mTitleBar = cm_new<GUITabbedTitleBar>(parent);
- }
- EditorWidgetContainer::~EditorWidgetContainer()
- {
- cm_delete(mTitleBar);
- }
- void EditorWidgetContainer::add(EditorWidget& widget)
- {
- auto iterFind = std::find(begin(mWidgets), end(mWidgets), &widget);
- if(iterFind != end(mWidgets))
- return;
- mTitleBar->addTab(widget.getName());
- mWidgets.push_back(&widget);
- widget._changeParent(*mParent);
- if(mActiveWidget == -1)
- {
- setActiveWidget((UINT32)mWidgets.size() - 1);
- }
- else
- widget._disable();
- }
- void EditorWidgetContainer::remove(EditorWidget& widget)
- {
- INT32 widgetIdx = -1;
- UINT32 curIdx = 0;
- for(auto& curWidget : mWidgets)
- {
- if(curWidget == &widget)
- {
- widgetIdx = curIdx;
- break;
- }
- curIdx++;
- }
- if(widgetIdx == -1)
- return;
- mWidgets.erase(mWidgets.begin() + widgetIdx);
- mTitleBar->removeTab((UINT32)widgetIdx);
- if(widgetIdx == mActiveWidget)
- {
- if(mWidgets.size() > 0)
- {
- setActiveWidget(0);
- }
- else
- {
- // TODO - Container is empty, send a signal to the parent EditorWindow and/or DockManager
- }
- }
- }
- void EditorWidgetContainer::move(EditorWidget& widget, UINT32 newPosition)
- {
- // TODO
- }
- void EditorWidgetContainer::setSize(UINT32 width, UINT32 height)
- {
- // TODO - Title bar is always TitleBarHeight size, so what happens when the container area is smaller than that?
- mTitleBar->setSize(width, TitleBarHeight);
- if(mActiveWidget >= 0)
- {
- EditorWidget* activeWidgetPtr = mWidgets[mActiveWidget];
- UINT32 contentHeight = (UINT32)std::max(0, (INT32)height - (INT32)TitleBarHeight);
- activeWidgetPtr->_setSize(width, contentHeight);
- }
- mWidth = width;
- mHeight = height;
- }
- void EditorWidgetContainer::setPosition(INT32 x, INT32 y)
- {
- mTitleBar->setPosition(x, y);
- if(mActiveWidget >= 0)
- {
- EditorWidget* activeWidgetPtr = mWidgets[mActiveWidget];
- activeWidgetPtr->_setPosition(x, y + TitleBarHeight);
- }
- mX = x;
- mY = y;
- }
- void EditorWidgetContainer::setActiveWidget(UINT32 idx)
- {
- if(mActiveWidget == idx)
- return;
- mActiveWidget = idx;
- UINT32 curIdx = 0;
- for(auto& curWidget : mWidgets)
- {
- if(curIdx != (UINT32)mActiveWidget)
- curWidget->_disable();
- else
- curWidget->_enable();
- curIdx++;
- }
- setPosition(mX, mY);
- setSize(mWidth, mHeight);
- }
- }
|