diff options
Diffstat (limited to 'Source/GUI/IMUI/imgui.cpp')
-rw-r--r-- | Source/GUI/IMUI/imgui.cpp | 929 |
1 files changed, 430 insertions, 499 deletions
diff --git a/Source/GUI/IMUI/imgui.cpp b/Source/GUI/IMUI/imgui.cpp index f858e779..97bfe009 100644 --- a/Source/GUI/IMUI/imgui.cpp +++ b/Source/GUI/IMUI/imgui.cpp @@ -1,7 +1,7 @@ //----------------------------------------------------------------------------- // Name: imgui.cpp // Developer: Wolfire Games LLC -// Description: Main class for creating adhoc GUIs as part of the UI tools +// Description: Main class for creating adhoc GUIs as part of the UI tools // License: Read below //----------------------------------------------------------------------------- // @@ -40,38 +40,35 @@ */ int guicount = 0; -IMGUI::IMGUI() : - elementCount(1), - header(), - footer(), - main(), - mainOffset(0.0), - footerOffset(0.0), - headerHeight(0.0), - footerHeight(0.0), - mainHeight(0.0), - headerPanelGap(0.0), - footerPanelGap(0.0), - mainPanelGap(0.0), - pendingFGLayers(1), - pendingBGLayers(1), - pendingHeaderHeight(0.0f), - pendingFooterHeight(0.0f), - refCount(1) -{ - - IMrefCountTracker.addRefCountObject( "IMGUI" ); +IMGUI::IMGUI() : elementCount(1), + header(), + footer(), + main(), + mainOffset(0.0), + footerOffset(0.0), + headerHeight(0.0), + footerHeight(0.0), + mainHeight(0.0), + headerPanelGap(0.0), + footerPanelGap(0.0), + mainPanelGap(0.0), + pendingFGLayers(1), + pendingBGLayers(1), + pendingHeaderHeight(0.0f), + pendingFooterHeight(0.0f), + refCount(1) { + IMrefCountTracker.addRefCountObject("IMGUI"); guicount++; - + guiid = guicount; - + screenSize = screenMetrics.getMetrics(); - + lastUpdateTime = 0; - + needsRelayout = false; showGuides = false; - + IMGUI_IMUIContext = new IMUIContext; IMGUI_IMUIContext->Init(); @@ -79,9 +76,9 @@ IMGUI::IMGUI() : } /* IMGUI::IMGUI( IMGUI const& other ) { - + IMrefCountTracker.addRefCountObject( "IMGUI" ); - + lastUpdateTime = other.lastUpdateTime; elementCount = other.elementCount; needsRelayout = other.needsRelayout; @@ -115,7 +112,7 @@ IMGUI::IMGUI( IMGUI const& other ) { pendingFooterPanels = other.pendingFooterPanels; screenSize = other.screenSize; refCount = other.refCount; - + IMGUI_IMUIContext = new IMUIContext; IMGUI_IMUIContext->Init(); @@ -123,16 +120,14 @@ IMGUI::IMGUI( IMGUI const& other ) { } */ -void IMGUI::AddRef() -{ +void IMGUI::AddRef() { // Increase the reference counter refCount++; } -void IMGUI::Release() -{ +void IMGUI::Release() { // Decrease ref count and delete if it reaches 0 - if( --refCount == 0 ) { + if (--refCount == 0) { delete this; } } @@ -148,7 +143,7 @@ void IMGUI::Release() * @param numLayers number of layers required * */ -void IMGUI::setBackgroundLayers( unsigned int numLayers ) { +void IMGUI::setBackgroundLayers(unsigned int numLayers) { pendingBGLayers = numLayers; } @@ -163,7 +158,7 @@ void IMGUI::setBackgroundLayers( unsigned int numLayers ) { * @param numLayers number of layers required * */ -void IMGUI::setForegroundLayers( unsigned int numLayers ) { +void IMGUI::setForegroundLayers(unsigned int numLayers) { pendingFGLayers = numLayers; } @@ -176,7 +171,7 @@ void IMGUI::setForegroundLayers( unsigned int numLayers ) { * @param _headerSize size in GUI space * */ -void IMGUI::setHeaderHeight( float _headerSize ) { +void IMGUI::setHeaderHeight(float _headerSize) { pendingHeaderHeight = _headerSize; } @@ -189,7 +184,7 @@ void IMGUI::setHeaderHeight( float _headerSize ) { * @param _footerSize size in GUI space * */ -void IMGUI::setFooterHeight( float _footerSize ) { +void IMGUI::setFooterHeight(float _footerSize) { pendingFooterHeight = _footerSize; } @@ -203,20 +198,18 @@ void IMGUI::setFooterHeight( float _footerSize ) { * Three will be left, center, right justified * */ -void IMGUI::setHeaderPanels( float first, float second, float third ) { - - if( first > 0.0 ) { - pendingHeaderPanels.push_back( first ); +void IMGUI::setHeaderPanels(float first, float second, float third) { + if (first > 0.0) { + pendingHeaderPanels.push_back(first); } - - if( second > 0.0 ) { - pendingHeaderPanels.push_back( second ); + + if (second > 0.0) { + pendingHeaderPanels.push_back(second); } - - if( third > 0.0 ) { - pendingHeaderPanels.push_back( third ); + + if (third > 0.0) { + pendingHeaderPanels.push_back(third); } - } /*******************************************************************************************/ @@ -229,21 +222,18 @@ void IMGUI::setHeaderPanels( float first, float second, float third ) { * Three will be left, center, right justified * */ -void IMGUI::setMainPanels( float first, float second, float third ) { - - if( first > 0.0 ) { - pendingMainPanels.push_back( first ); +void IMGUI::setMainPanels(float first, float second, float third) { + if (first > 0.0) { + pendingMainPanels.push_back(first); } - - if( second > 0.0 ) { - pendingMainPanels.push_back( second ); - } - - if( third > 0.0 ) { - pendingMainPanels.push_back( third ); + + if (second > 0.0) { + pendingMainPanels.push_back(second); } - + if (third > 0.0) { + pendingMainPanels.push_back(third); + } } /*******************************************************************************************/ @@ -256,23 +246,20 @@ void IMGUI::setMainPanels( float first, float second, float third ) { * Three will be left, center, right justified * */ -void IMGUI::setFooterPanels( float first, float second, float third ) { - - if( first > 0.0 ) { - pendingFooterPanels.push_back( first ); +void IMGUI::setFooterPanels(float first, float second, float third) { + if (first > 0.0) { + pendingFooterPanels.push_back(first); } - - if( second > 0.0 ) { - pendingFooterPanels.push_back( second ); + + if (second > 0.0) { + pendingFooterPanels.push_back(second); } - - if( third > 0.0 ) { - pendingFooterPanels.push_back( first ); + + if (third > 0.0) { + pendingFooterPanels.push_back(first); } - } - /*******************************************************************************************/ /** * @brief Sets up main layer with header, footer and primary panel (clears any existing) @@ -282,176 +269,158 @@ void IMGUI::setFooterPanels( float first, float second, float third ) { * */ void IMGUI::setup() { - - for(auto & it : header) { - + for (auto& it : header) { it->Release(); } - - for(auto & it : footer) { - + + for (auto& it : footer) { it->Release(); } - - for(auto & it : main) { - + + for (auto& it : main) { it->Release(); } - + header.clear(); footer.clear(); main.clear(); - + // Make sure we at least some values - if( pendingMainPanels.size() == 0 ) { - pendingMainPanels.push_back( screenMetrics.mainSize.x() ); + if (pendingMainPanels.size() == 0) { + pendingMainPanels.push_back(screenMetrics.mainSize.x()); } - - if( pendingHeaderPanels.size() == 0 ) { - pendingHeaderPanels.push_back( screenMetrics.mainSize.x() ); + + if (pendingHeaderPanels.size() == 0) { + pendingHeaderPanels.push_back(screenMetrics.mainSize.x()); } - - if( pendingFooterPanels.size() == 0 ) { - pendingFooterPanels.push_back( screenMetrics.mainSize.x() ); + + if (pendingFooterPanels.size() == 0) { + pendingFooterPanels.push_back(screenMetrics.mainSize.x()); } - + // Sanity check - if( pendingHeaderHeight + pendingFooterHeight > screenMetrics.mainSize.y() ) { + if (pendingHeaderHeight + pendingFooterHeight > screenMetrics.mainSize.y()) { IMDisplayError("GUI Error", "Header/footer too large"); } - - const std::string numbering[] = { std::string("0"), std::string("1"), std::string("2") }; + + const std::string numbering[] = {std::string("0"), std::string("1"), std::string("2")}; // Now build the panels - if( pendingHeaderHeight > 0 ) { + if (pendingHeaderHeight > 0) { headerHeight = pendingHeaderHeight; - + float totalWidth = 0; - + // Go through the list of pending panels, create them and total their widths int panelCount = 0; - for(float & pendingHeaderPanel : pendingHeaderPanels) { - - IMContainer* panel = new IMContainer( "header" + numbering[panelCount], - SizePolicy(pendingHeaderPanel), - SizePolicy(headerHeight) ); - panel->setOwnerParent( this, NULL ); - header.push_back( panel ); - + for (float& pendingHeaderPanel : pendingHeaderPanels) { + IMContainer* panel = new IMContainer("header" + numbering[panelCount], + SizePolicy(pendingHeaderPanel), + SizePolicy(headerHeight)); + panel->setOwnerParent(this, NULL); + header.push_back(panel); + totalWidth += pendingHeaderPanel; - } - + // Sanity check - if( totalWidth > screenMetrics.mainSize.x() ) { + if (totalWidth > screenMetrics.mainSize.x()) { IMDisplayError("GUI Error", "Header panels too wide"); } - + // determine the gap size - if( header.size() == 1 || header.size() == 3 ) { - headerPanelGap = ( screenMetrics.mainSize.x() - totalWidth )/2; + if (header.size() == 1 || header.size() == 3) { + headerPanelGap = (screenMetrics.mainSize.x() - totalWidth) / 2; + } else { + headerPanelGap = (screenMetrics.mainSize.x() - totalWidth); } - else { - headerPanelGap = ( screenMetrics.mainSize.x() - totalWidth ); - } - } - - if( pendingFooterHeight > 0 ) { - + + if (pendingFooterHeight > 0) { footerHeight = pendingFooterHeight; - + float totalWidth = 0; - + // Go through the list of pending panels, create them and total their widths int panelCount = 0; - for(float & pendingFooterPanel : pendingFooterPanels) { - - IMContainer* panel = new IMContainer( "footer" + numbering[panelCount], + for (float& pendingFooterPanel : pendingFooterPanels) { + IMContainer* panel = new IMContainer("footer" + numbering[panelCount], SizePolicy(pendingFooterPanel), - SizePolicy(footerHeight) ); - panel->setOwnerParent( this, NULL ); - - footer.push_back( panel ); - + SizePolicy(footerHeight)); + panel->setOwnerParent(this, NULL); + + footer.push_back(panel); + totalWidth += pendingFooterPanel; - } - + // Sanity check - if( totalWidth > screenMetrics.mainSize.x() ) { + if (totalWidth > screenMetrics.mainSize.x()) { IMDisplayError("GUI Error", "Footer panels too wide"); } - + // determine the gap size - if( footer.size() == 1 || main.size() == 3 ) { - footerPanelGap = ( screenMetrics.mainSize.x() - totalWidth )/2; - } - else { - footerPanelGap = ( screenMetrics.mainSize.x() - totalWidth ); + if (footer.size() == 1 || main.size() == 3) { + footerPanelGap = (screenMetrics.mainSize.x() - totalWidth) / 2; + } else { + footerPanelGap = (screenMetrics.mainSize.x() - totalWidth); } - } - + mainHeight = screenMetrics.mainSize.y() - (headerHeight + footerHeight); - + { - float totalWidth = 0; - + // Go through the list of pending panels, create them and total their widths int panelCount = 0; - for(float & pendingMainPanel : pendingMainPanels) { - - IMContainer* panel = new IMContainer( "main" + numbering[panelCount], + for (float& pendingMainPanel : pendingMainPanels) { + IMContainer* panel = new IMContainer("main" + numbering[panelCount], SizePolicy(pendingMainPanel), - SizePolicy(mainHeight) ); - panel->setOwnerParent( this, NULL ); - - main.push_back( panel ); - + SizePolicy(mainHeight)); + panel->setOwnerParent(this, NULL); + + main.push_back(panel); + totalWidth += pendingMainPanel; - } - + // Sanity check - if( totalWidth > screenMetrics.mainSize.x() ) { + if (totalWidth > screenMetrics.mainSize.x()) { IMDisplayError("GUI Error", "Main panels too wide"); } - + // determine the gap size for rendering - if( main.size() == 1 || main.size() == 3 ) { - mainPanelGap = ( screenMetrics.mainSize.x() - totalWidth )/2; - } - else { - mainPanelGap = ( screenMetrics.mainSize.x() - totalWidth ); + if (main.size() == 1 || main.size() == 3) { + mainPanelGap = (screenMetrics.mainSize.x() - totalWidth) / 2; + } else { + mainPanelGap = (screenMetrics.mainSize.x() - totalWidth); } - } - + // setup background layers - for( unsigned int i = 0; i < pendingFGLayers; ++i ) { - IMContainer* newContainer = new IMContainer( SizePolicy(screenMetrics.GUISpace.x()), - SizePolicy(screenMetrics.GUISpace.y()) ); - - newContainer->setOwnerParent( this, NULL ); - - foregrounds.push_back( newContainer ); + for (unsigned int i = 0; i < pendingFGLayers; ++i) { + IMContainer* newContainer = new IMContainer(SizePolicy(screenMetrics.GUISpace.x()), + SizePolicy(screenMetrics.GUISpace.y())); + + newContainer->setOwnerParent(this, NULL); + + foregrounds.push_back(newContainer); } - - for( unsigned int i = 0; i < pendingBGLayers; ++i ) { - IMContainer* newContainer = new IMContainer( SizePolicy(screenMetrics.GUISpace.x()), - SizePolicy(screenMetrics.GUISpace.y()) ); - - newContainer->setOwnerParent( this, NULL ); - - backgrounds.push_back( newContainer ); + + for (unsigned int i = 0; i < pendingBGLayers; ++i) { + IMContainer* newContainer = new IMContainer(SizePolicy(screenMetrics.GUISpace.x()), + SizePolicy(screenMetrics.GUISpace.y())); + + newContainer->setOwnerParent(this, NULL); + + backgrounds.push_back(newContainer); } - + derivePanelOffsets(); - + doRelayout(); - + pendingFGLayers = 1; pendingBGLayers = 1; pendingHeaderHeight = 0.0f; @@ -459,7 +428,6 @@ void IMGUI::setup() { pendingHeaderPanels.clear(); pendingFooterPanels.clear(); pendingMainPanels.clear(); - } /*******************************************************************************************/ @@ -468,39 +436,36 @@ void IMGUI::setup() { * */ void IMGUI::derivePanelOffsets() { - float headerEnd = -1; - - if( header.size() != 0 ) { + + if (header.size() != 0) { headerEnd = headerHeight - 1; } - + footerOffset = screenMetrics.GUISpace.y(); - - if( footer.size() != 0 ) { + + if (footer.size() != 0) { footerOffset = screenMetrics.GUISpace.y() - footerHeight; } - - if( main.size() != 0 ) { - + + if (main.size() != 0) { // see if we have any space - if( headerHeight + footerHeight + mainHeight < screenMetrics.GUISpace.y() ) { + if (headerHeight + footerHeight + mainHeight < screenMetrics.GUISpace.y()) { // first center the main panel - mainOffset = (screenMetrics.GUISpace.y()/2.0f) - (mainHeight/2.0f); - + mainOffset = (screenMetrics.GUISpace.y() / 2.0f) - (mainHeight / 2.0f); + // now check if we're going over our bounds - if( mainOffset <= headerEnd ) { + if (mainOffset <= headerEnd) { mainOffset += (headerEnd - mainOffset) + 1; } - - float mainEnd = mainOffset + mainHeight -1; - - if ( mainEnd >= footerOffset ) { + + float mainEnd = mainOffset + mainHeight - 1; + + if (mainEnd >= footerOffset) { // we can do these two checks independently as we know there's enough room for all three - mainOffset -= ( mainEnd - footerOffset ) + 1; + mainOffset -= (mainEnd - footerOffset) + 1; } - } - else { + } else { mainOffset = headerEnd + 1; } } @@ -514,14 +479,13 @@ void IMGUI::derivePanelOffsets() { * */ void IMGUI::clear() { - std::vector<IMContainer*> containerList; - containerList.insert(containerList.end(), backgrounds.begin(), backgrounds.end() ); - containerList.insert(containerList.end(), foregrounds.begin(), foregrounds.end() ); - containerList.insert(containerList.end(), header.begin(), header.end() ); - containerList.insert(containerList.end(), footer.begin(), footer.end() ); - containerList.insert(containerList.end(), main.begin(), main.end() ); + containerList.insert(containerList.end(), backgrounds.begin(), backgrounds.end()); + containerList.insert(containerList.end(), foregrounds.begin(), foregrounds.end()); + containerList.insert(containerList.end(), header.begin(), header.end()); + containerList.insert(containerList.end(), footer.begin(), footer.end()); + containerList.insert(containerList.end(), main.begin(), main.end()); backgrounds.clear(); foregrounds.clear(); @@ -529,11 +493,11 @@ void IMGUI::clear() { footer.clear(); main.clear(); - for( int i = int(containerList.size())-1; i >= 0; --i ) { + for (int i = int(containerList.size()) - 1; i >= 0; --i) { containerList[i]->Release(); } - for(auto & i : messageQueue) { + for (auto& i : messageQueue) { i->Release(); } messageQueue.clear(); @@ -546,7 +510,7 @@ void IMGUI::clear() { * @param setting True to turn on guides, false otherwise * */ -void IMGUI::setGuides( bool setting ) { +void IMGUI::setGuides(bool setting) { showGuides = setting; } @@ -556,10 +520,8 @@ void IMGUI::setGuides( bool setting ) { * */ void IMGUI::onRelayout() { - // Record this needsRelayout = true; - } /*******************************************************************************************/ @@ -569,22 +531,22 @@ void IMGUI::onRelayout() { * @param newError Newly reported error string * */ -void IMGUI::reportError( std::string const& newError ) { +void IMGUI::reportError(std::string const& newError) { reportedErrors += newError + "\n"; } /*******************************************************************************************/ /** * @brief Receives a message - used internally - * + * * Remember to increase the message's ref count if used internally! * * @param message The message in question * */ -void IMGUI::receiveMessage( IMMessage* message ) { - IMMessage* messageCopy = new IMMessage( *message ); - messageQueue.push_back( messageCopy ); +void IMGUI::receiveMessage(IMMessage* message) { + IMMessage* messageCopy = new IMMessage(*message); + messageQueue.push_back(messageCopy); message->Release(); } @@ -610,8 +572,8 @@ IMMessage* IMGUI::getNextMessage() { // Again, I'm aware this isn't very efficient, but we're only dealing with at most // a half dozen of these a frame IMMessage* message = *messageQueue.begin(); - messageQueue.erase( messageQueue.begin() ); - + messageQueue.erase(messageQueue.begin()); + return message; } @@ -622,12 +584,12 @@ IMMessage* IMGUI::getNextMessage() { * @param layerNum index of the background layer (starting at 0) * */ -IMContainer* IMGUI::getBackgroundLayer( unsigned int layerNum ) { - if( layerNum >= backgrounds.size() ) { +IMContainer* IMGUI::getBackgroundLayer(unsigned int layerNum) { + if (layerNum >= backgrounds.size()) { IMDisplayError("GUI Error", "Unknown background layer "); return NULL; } - IMContainer* container = backgrounds[ layerNum ]; + IMContainer* container = backgrounds[layerNum]; container->AddRef(); return container; } @@ -639,16 +601,15 @@ IMContainer* IMGUI::getBackgroundLayer( unsigned int layerNum ) { * @param layerNum index of the foreground layer (starting at 0) * */ -IMContainer* IMGUI::getForegroundLayer( unsigned int layerNum ) { - if( layerNum >= foregrounds.size() ) { +IMContainer* IMGUI::getForegroundLayer(unsigned int layerNum) { + if (layerNum >= foregrounds.size()) { IMDisplayError("GUI Error", "Unknown foreground layer "); return NULL; } - - IMContainer* container = foregrounds[ layerNum ]; + + IMContainer* container = foregrounds[layerNum]; container->AddRef(); return container; - } /*******************************************************************************************/ @@ -657,35 +618,34 @@ IMContainer* IMGUI::getForegroundLayer( unsigned int layerNum ) { * */ void IMGUI::doRelayout() { - int relayoutCount = 0; - while( needsRelayout ) { + while (needsRelayout) { relayoutCount++; - + // clear the error string reportedErrors = ""; - + needsRelayout = false; - for( int layer = int(backgrounds.size())-1; layer >= 0; --layer ) { - backgrounds[ layer ]->doRelayout(); + for (int layer = int(backgrounds.size()) - 1; layer >= 0; --layer) { + backgrounds[layer]->doRelayout(); } - - for(auto & it : header) { + + for (auto& it : header) { it->doRelayout(); } - - for(auto & it : footer) { + + for (auto& it : footer) { it->doRelayout(); } - - for(auto & it : main) { + + for (auto& it : main) { it->doRelayout(); } - - for(auto & foreground : foregrounds) { + + for (auto& foreground : foregrounds) { foreground->doRelayout(); } - + // MJB Note: I'm aware that redoing the layout for the whole structure // is rather inefficient, but given that this is targeted at most a few // dozen elements, this should not be a problem -- can easily be optimized @@ -700,116 +660,108 @@ void IMGUI::doRelayout() { */ extern Timer ui_timer; void IMGUI::update() { - // Do relayout as necessary doRelayout(); - + // If we haven't updated yet, set the time - if( lastUpdateTime == 0 ) { - lastUpdateTime = uint64_t( ui_timer.game_time * 1000 ); + if (lastUpdateTime == 0) { + lastUpdateTime = uint64_t(ui_timer.game_time * 1000); } - + // Calculate the delta time - uint64_t delta = uint64_t( ui_timer.game_time * 1000 ) - lastUpdateTime; - + uint64_t delta = uint64_t(ui_timer.game_time * 1000) - lastUpdateTime; + // Update the time - lastUpdateTime = uint64_t( ui_timer.game_time * 1000 ); - + lastUpdateTime = uint64_t(ui_timer.game_time * 1000); + // Get the input from the engine IMGUI_IMUIContext->UpdateControls(); - + vec2 engineMousePos = IMGUI_IMUIContext->getMousePosition(); - + // Translate to GUISpace - mousePosition.x() = (engineMousePos.x() - screenMetrics.renderOffset.x() ) / screenMetrics.GUItoScreenXScale; - mousePosition.y() = ( screenMetrics.getScreenHeight() - engineMousePos.y() + screenMetrics.renderOffset.y() ) / screenMetrics.GUItoScreenYScale; + mousePosition.x() = (engineMousePos.x() - screenMetrics.renderOffset.x()) / screenMetrics.GUItoScreenXScale; + mousePosition.y() = (screenMetrics.getScreenHeight() - engineMousePos.y() + screenMetrics.renderOffset.y()) / screenMetrics.GUItoScreenYScale; leftMouseState = IMGUI_IMUIContext->getLeftMouseState(); - + // Fill in our GUI structure guistate.mousePosition = mousePosition; guistate.leftMouseState = leftMouseState; guistate.inheritedMouseDown = false; guistate.inheritedMouseOver = false; guistate.clickHandled = false; - + // Do relayout as necessary doRelayout(); - - vec2 drawOffset(0,0); + + vec2 drawOffset(0, 0); // update the backgrounds - for( int layer = int(backgrounds.size())-1; layer >= 0; --layer ) { - backgrounds[ layer ]->update( delta, drawOffset, guistate ); + for (int layer = int(backgrounds.size()) - 1; layer >= 0; --layer) { + backgrounds[layer]->update(delta, drawOffset, guistate); } - - if( header.size() == 1 ) { + + if (header.size() == 1) { drawOffset.x() = headerPanelGap; - header[0]->update( delta, drawOffset, guistate ); - } - else if( header.size() == 2 ) { - header[0]->update( delta, drawOffset, guistate ); + header[0]->update(delta, drawOffset, guistate); + } else if (header.size() == 2) { + header[0]->update(delta, drawOffset, guistate); drawOffset.x() = header[0]->getSizeX() + headerPanelGap; - header[1]->update( delta, drawOffset, guistate ); - } - else if( header.size() == 3 ) { - header[0]->update( delta, drawOffset, guistate ); + header[1]->update(delta, drawOffset, guistate); + } else if (header.size() == 3) { + header[0]->update(delta, drawOffset, guistate); drawOffset.x() = header[0]->getSizeX() + headerPanelGap; - header[1]->update( delta, drawOffset, guistate ); + header[1]->update(delta, drawOffset, guistate); drawOffset.x() = header[1]->getSizeX() + headerPanelGap; - header[2]->update( delta, drawOffset, guistate ); + header[2]->update(delta, drawOffset, guistate); } - + drawOffset.x() = 0; drawOffset.y() = mainOffset; - if( main.size() == 1 ) { + if (main.size() == 1) { drawOffset.x() = mainPanelGap; - main[0]->update( delta, drawOffset, guistate ); - } - else if( main.size() == 2 ) { - main[0]->update( delta, drawOffset, guistate ); + main[0]->update(delta, drawOffset, guistate); + } else if (main.size() == 2) { + main[0]->update(delta, drawOffset, guistate); drawOffset.x() = main[0]->getSizeX() + mainPanelGap; - main[1]->update( delta, drawOffset, guistate ); - } - else if( main.size() == 3 ) { - main[0]->update( delta, drawOffset, guistate ); + main[1]->update(delta, drawOffset, guistate); + } else if (main.size() == 3) { + main[0]->update(delta, drawOffset, guistate); drawOffset.x() = main[0]->getSizeX() + mainPanelGap; - main[1]->update( delta, drawOffset, guistate ); + main[1]->update(delta, drawOffset, guistate); drawOffset.x() = main[1]->getSizeX() + mainPanelGap; - main[2]->update( delta, drawOffset, guistate ); + main[2]->update(delta, drawOffset, guistate); } - + drawOffset.x() = 0; drawOffset.y() = footerOffset; - if( footer.size() == 1 ) { + if (footer.size() == 1) { drawOffset.x() = footerPanelGap; - footer[0]->update( delta, drawOffset, guistate ); - } - else if( footer.size() == 2 ) { - footer[0]->update( delta, drawOffset, guistate ); + footer[0]->update(delta, drawOffset, guistate); + } else if (footer.size() == 2) { + footer[0]->update(delta, drawOffset, guistate); drawOffset.x() = footer[0]->getSizeX() + footerPanelGap; - footer[1]->update( delta, drawOffset, guistate ); - } - else if( footer.size() == 3 ) { - footer[0]->update( delta, drawOffset, guistate ); + footer[1]->update(delta, drawOffset, guistate); + } else if (footer.size() == 3) { + footer[0]->update(delta, drawOffset, guistate); drawOffset.x() = footer[0]->getSizeX() + footerPanelGap; - footer[1]->update( delta, drawOffset, guistate ); + footer[1]->update(delta, drawOffset, guistate); drawOffset.x() = footer[1]->getSizeX() + footerPanelGap; - footer[2]->update( delta, drawOffset, guistate ); + footer[2]->update(delta, drawOffset, guistate); } - - drawOffset = vec2(0,0); + + drawOffset = vec2(0, 0); // update the backgrounds - for( int layer = int(foregrounds.size())-1; layer >= 0; --layer ) { - foregrounds[ layer ]->update( delta, drawOffset, guistate ); + for (int layer = int(foregrounds.size()) - 1; layer >= 0; --layer) { + foregrounds[layer]->update(delta, drawOffset, guistate); } - + // See if this triggered any relayout events doRelayout(); - + // If we've got here and still have an error, report it - if( reportedErrors != "" ) { + if (reportedErrors != "") { IMDisplayError("GUI Error", reportedErrors); } - } /*******************************************************************************************/ @@ -818,187 +770,176 @@ void IMGUI::update() { * */ void IMGUI::doScreenResize() { - - screenMetrics.checkMetrics( screenSize ); - + screenMetrics.checkMetrics(screenSize); + // All the font sizes will likely have changed IMGUI_IMUIContext->clearTextAtlases(); - + // Move our panels around (if necessary) derivePanelOffsets(); - + // We need to inform the elements - for( int layer = int(backgrounds.size())-1; layer >= 0; --layer ) { - backgrounds[ layer ]->setSizePolicy( SizePolicy(screenMetrics.GUISpace.x()), - SizePolicy(screenMetrics.GUISpace.y()) ); - - backgrounds[ layer ]->setSize( vec2( screenMetrics.GUISpace.x(), - screenMetrics.GUISpace.y() ) ); - - backgrounds[ layer ]->doScreenResize(); + for (int layer = int(backgrounds.size()) - 1; layer >= 0; --layer) { + backgrounds[layer]->setSizePolicy(SizePolicy(screenMetrics.GUISpace.x()), + SizePolicy(screenMetrics.GUISpace.y())); + + backgrounds[layer]->setSize(vec2(screenMetrics.GUISpace.x(), + screenMetrics.GUISpace.y())); + + backgrounds[layer]->doScreenResize(); } - - for(auto & it : header) { + + for (auto& it : header) { it->doScreenResize(); } - - for(auto & it : footer) { + + for (auto& it : footer) { it->doScreenResize(); } - - for(auto & it : main) { + + for (auto& it : main) { it->doScreenResize(); } - - for(auto & foreground : foregrounds) { + + for (auto& foreground : foregrounds) { // reset the size - foreground->setSizePolicy( SizePolicy(screenMetrics.GUISpace.x()), - SizePolicy(screenMetrics.GUISpace.y()) ); - - + foreground->setSizePolicy(SizePolicy(screenMetrics.GUISpace.x()), + SizePolicy(screenMetrics.GUISpace.y())); + foreground->doScreenResize(); } - + doRelayout(); } - /*******************************************************************************************/ /** * @brief Render the GUI * */ void IMGUI::render() { - - vec2 origin(0,0); + vec2 origin(0, 0); // render the backgrounds - for( int layer = int(backgrounds.size())-1; layer >= 0; --layer ) { - backgrounds[ layer ]->render( origin, origin, vec2( UNDEFINEDSIZE, UNDEFINEDSIZE ) ); + for (int layer = int(backgrounds.size()) - 1; layer >= 0; --layer) { + backgrounds[layer]->render(origin, origin, vec2(UNDEFINEDSIZE, UNDEFINEDSIZE)); IMGUI_IMUIContext->render(); } - + // render the main content - vec2 drawOffset(0,0); - if( header.size() == 1 ) { + vec2 drawOffset(0, 0); + if (header.size() == 1) { drawOffset.x() = headerPanelGap; - header[0]->render( drawOffset, drawOffset, vec2( UNDEFINEDSIZE, UNDEFINEDSIZE ) ); - } - else if( header.size() == 2 ) { - header[0]->render( drawOffset, drawOffset, vec2( UNDEFINEDSIZE, UNDEFINEDSIZE ) ); + header[0]->render(drawOffset, drawOffset, vec2(UNDEFINEDSIZE, UNDEFINEDSIZE)); + } else if (header.size() == 2) { + header[0]->render(drawOffset, drawOffset, vec2(UNDEFINEDSIZE, UNDEFINEDSIZE)); drawOffset.x() = header[0]->getSizeX() + headerPanelGap; - header[1]->render( drawOffset, drawOffset, vec2( UNDEFINEDSIZE, UNDEFINEDSIZE ) ); - } - else if( header.size() == 3 ) { - header[0]->render( drawOffset, drawOffset, vec2( UNDEFINEDSIZE, UNDEFINEDSIZE ) ); + header[1]->render(drawOffset, drawOffset, vec2(UNDEFINEDSIZE, UNDEFINEDSIZE)); + } else if (header.size() == 3) { + header[0]->render(drawOffset, drawOffset, vec2(UNDEFINEDSIZE, UNDEFINEDSIZE)); drawOffset.x() = header[0]->getSizeX() + headerPanelGap; - header[1]->render( drawOffset, drawOffset, vec2( UNDEFINEDSIZE, UNDEFINEDSIZE ) ); + header[1]->render(drawOffset, drawOffset, vec2(UNDEFINEDSIZE, UNDEFINEDSIZE)); drawOffset.x() = header[1]->getSizeX() + headerPanelGap; - header[2]->render( drawOffset, drawOffset, vec2( UNDEFINEDSIZE, UNDEFINEDSIZE ) ); + header[2]->render(drawOffset, drawOffset, vec2(UNDEFINEDSIZE, UNDEFINEDSIZE)); } - + drawOffset.x() = 0; drawOffset.y() = mainOffset; - if( main.size() == 1 ) { + if (main.size() == 1) { drawOffset.x() = mainPanelGap; - main[0]->render( drawOffset, drawOffset, vec2( UNDEFINEDSIZE, UNDEFINEDSIZE ) ); - } - else if( main.size() == 2 ) { - main[0]->render( drawOffset, drawOffset, vec2( UNDEFINEDSIZE, UNDEFINEDSIZE ) ); + main[0]->render(drawOffset, drawOffset, vec2(UNDEFINEDSIZE, UNDEFINEDSIZE)); + } else if (main.size() == 2) { + main[0]->render(drawOffset, drawOffset, vec2(UNDEFINEDSIZE, UNDEFINEDSIZE)); drawOffset.x() = main[0]->getSizeX() + mainPanelGap; - main[1]->render( drawOffset, drawOffset, vec2( UNDEFINEDSIZE, UNDEFINEDSIZE ) ); - } - else if( main.size() == 3 ) { - main[0]->render( drawOffset, drawOffset, vec2( UNDEFINEDSIZE, UNDEFINEDSIZE ) ); + main[1]->render(drawOffset, drawOffset, vec2(UNDEFINEDSIZE, UNDEFINEDSIZE)); + } else if (main.size() == 3) { + main[0]->render(drawOffset, drawOffset, vec2(UNDEFINEDSIZE, UNDEFINEDSIZE)); drawOffset.x() = main[0]->getSizeX() + mainPanelGap; - main[1]->render( drawOffset, drawOffset, vec2( UNDEFINEDSIZE, UNDEFINEDSIZE ) ); + main[1]->render(drawOffset, drawOffset, vec2(UNDEFINEDSIZE, UNDEFINEDSIZE)); drawOffset.x() = main[1]->getSizeX() + mainPanelGap; - main[2]->render( drawOffset, drawOffset, vec2( UNDEFINEDSIZE, UNDEFINEDSIZE ) ); + main[2]->render(drawOffset, drawOffset, vec2(UNDEFINEDSIZE, UNDEFINEDSIZE)); } - + drawOffset.x() = 0; drawOffset.y() = footerOffset; - if( footer.size() == 1 ) { + if (footer.size() == 1) { drawOffset.x() = footerPanelGap; - footer[0]->render( drawOffset, drawOffset, vec2( UNDEFINEDSIZE, UNDEFINEDSIZE ) ); - } - else if( footer.size() == 2 ) { - footer[0]->render( drawOffset, drawOffset, vec2( UNDEFINEDSIZE, UNDEFINEDSIZE ) ); + footer[0]->render(drawOffset, drawOffset, vec2(UNDEFINEDSIZE, UNDEFINEDSIZE)); + } else if (footer.size() == 2) { + footer[0]->render(drawOffset, drawOffset, vec2(UNDEFINEDSIZE, UNDEFINEDSIZE)); drawOffset.x() = footer[0]->getSizeX() + footerPanelGap; - footer[1]->render( drawOffset, drawOffset, vec2( UNDEFINEDSIZE, UNDEFINEDSIZE ) ); - } - else if( footer.size() == 3 ) { - footer[0]->render( drawOffset, drawOffset, vec2( UNDEFINEDSIZE, UNDEFINEDSIZE ) ); + footer[1]->render(drawOffset, drawOffset, vec2(UNDEFINEDSIZE, UNDEFINEDSIZE)); + } else if (footer.size() == 3) { + footer[0]->render(drawOffset, drawOffset, vec2(UNDEFINEDSIZE, UNDEFINEDSIZE)); drawOffset.x() = footer[0]->getSizeX() + footerPanelGap; - footer[1]->render( drawOffset, drawOffset, vec2( UNDEFINEDSIZE, UNDEFINEDSIZE ) ); + footer[1]->render(drawOffset, drawOffset, vec2(UNDEFINEDSIZE, UNDEFINEDSIZE)); drawOffset.x() = footer[1]->getSizeX() + footerPanelGap; - footer[2]->render( drawOffset, drawOffset, vec2( UNDEFINEDSIZE, UNDEFINEDSIZE ) ); + footer[2]->render(drawOffset, drawOffset, vec2(UNDEFINEDSIZE, UNDEFINEDSIZE)); } - + IMGUI_IMUIContext->render(); - + // render the foregrounds - for(auto & foreground : foregrounds) { - foreground->render( origin, origin, vec2( UNDEFINEDSIZE, UNDEFINEDSIZE ) ); + for (auto& foreground : foregrounds) { + foreground->render(origin, origin, vec2(UNDEFINEDSIZE, UNDEFINEDSIZE)); IMGUI_IMUIContext->render(); } - // TODO -// if( showGuides ) { -// -// for( int i = 2; i <= 16; i *= 2 ) { -// -// // draw the vertical lines -// float increment = screenMetrics.getScreenWidth() / (float)i; -// float xpos = increment; -// -// while( xpos < screenMetrics.getScreenWidth() ) { -// -// HUDImage* newimage = hud.AddImage(); -// newimage->SetImageFromPath("Data/Textures/ui/whiteblock.tga"); -// -// vec2 imagepos( xpos-1, 0.0f ); -// -// newimage->scale = 1; -// newimage->scale.x *= 2; -// newimage->scale.y *= screenMetrics.getScreenHeight(); -// -// newimage->position.x = imagepos.x; -// newimage->position.y() = screenMetrics.getScreenHeight() - imagepos.y() - (newimage.GetWidth() * newimage.scale.y() ); -// newimage->position.z() = -100.0;// 0.1f; -// -// newimage->color = vec4( 0.0, 0.2, 0.5 + (0.5/i), 0.25 ); -// -// xpos += increment; -// } -// -// increment = GetScreenHeight() / i; -// int ypos = increment; -// -// while( ypos < GetScreenHeight() ) { -// -// HUDImage @newimage = hud.AddImage(); -// newimage.SetImageFromPath("Data/Textures/ui/whiteblock.tga"); -// -// vec2 imagepos( 0, ypos -1 ); -// -// newimage.scale = 1; -// newimage.scale.x *= GetScreenWidth(); -// newimage.scale.y *= 2; -// -// newimage.position.x = imagepos.x; -// newimage.position.y = GetScreenHeight() - imagepos.y - (newimage.GetWidth() * newimage.scale.y ); -// newimage.position.z = -100.0;// 0.1f; -// -// newimage.color = vec4( 0.0, 0.2, 0.5 + (0.5/i), 0.25 ); -// -// ypos += increment; -// } -// } -// } -// -// hud.Draw(); + // if( showGuides ) { + // + // for( int i = 2; i <= 16; i *= 2 ) { + // + // // draw the vertical lines + // float increment = screenMetrics.getScreenWidth() / (float)i; + // float xpos = increment; + // + // while( xpos < screenMetrics.getScreenWidth() ) { + // + // HUDImage* newimage = hud.AddImage(); + // newimage->SetImageFromPath("Data/Textures/ui/whiteblock.tga"); + // + // vec2 imagepos( xpos-1, 0.0f ); + // + // newimage->scale = 1; + // newimage->scale.x *= 2; + // newimage->scale.y *= screenMetrics.getScreenHeight(); + // + // newimage->position.x = imagepos.x; + // newimage->position.y() = screenMetrics.getScreenHeight() - imagepos.y() - (newimage.GetWidth() * newimage.scale.y() ); + // newimage->position.z() = -100.0;// 0.1f; + // + // newimage->color = vec4( 0.0, 0.2, 0.5 + (0.5/i), 0.25 ); + // + // xpos += increment; + // } + // + // increment = GetScreenHeight() / i; + // int ypos = increment; + // + // while( ypos < GetScreenHeight() ) { + // + // HUDImage @newimage = hud.AddImage(); + // newimage.SetImageFromPath("Data/Textures/ui/whiteblock.tga"); + // + // vec2 imagepos( 0, ypos -1 ); + // + // newimage.scale = 1; + // newimage.scale.x *= GetScreenWidth(); + // newimage.scale.y *= 2; + // + // newimage.position.x = imagepos.x; + // newimage.position.y = GetScreenHeight() - imagepos.y - (newimage.GetWidth() * newimage.scale.y ); + // newimage.position.z = -100.0;// 0.1f; + // + // newimage.color = vec4( 0.0, 0.2, 0.5 + (0.5/i), 0.25 ); + // + // ypos += increment; + // } + // } + // } + // + // hud.Draw(); IMGUI_IMUIContext->render(); } @@ -1007,31 +948,27 @@ void IMGUI::render() { * @brief Draw a box (in *screen* coordinates) -- used internally * */ -void IMGUI::drawBox( vec2 boxPos, vec2 boxSize, vec4 boxColor, int zOrder, bool shouldClip, - vec2 currentClipPos, - vec2 currentClipSize ) { - +void IMGUI::drawBox(vec2 boxPos, vec2 boxSize, vec4 boxColor, int zOrder, bool shouldClip, + vec2 currentClipPos, + vec2 currentClipSize) { IMUIImage boxImage("Data/Textures/ui/whiteblock.tga"); - - boxImage.setPosition( vec3( boxPos.x(), boxPos.y(), float(zOrder) ) ); - boxImage.setColor( boxColor ); - boxImage.setRenderSize( vec2( boxSize.x(), boxSize.y() ) ); - - if( shouldClip && currentClipSize.x() != UNDEFINEDSIZE && currentClipSize.y() != UNDEFINEDSIZE ) { - - vec2 screenClipPos = screenMetrics.GUIToScreen( currentClipPos ); - - vec2 screenClipSize( (currentClipSize.x()*screenMetrics.GUItoScreenXScale) + 0.5f, - (currentClipSize.y()*screenMetrics.GUItoScreenYScale) + 0.5f ); - - boxImage.setClipping( vec2( screenClipPos.x(), float(screenClipPos.y()) ), - vec2( screenClipSize.x(), screenClipSize.y() ) ); + + boxImage.setPosition(vec3(boxPos.x(), boxPos.y(), float(zOrder))); + boxImage.setColor(boxColor); + boxImage.setRenderSize(vec2(boxSize.x(), boxSize.y())); + + if (shouldClip && currentClipSize.x() != UNDEFINEDSIZE && currentClipSize.y() != UNDEFINEDSIZE) { + vec2 screenClipPos = screenMetrics.GUIToScreen(currentClipPos); + + vec2 screenClipSize((currentClipSize.x() * screenMetrics.GUItoScreenXScale) + 0.5f, + (currentClipSize.y() * screenMetrics.GUItoScreenYScale) + 0.5f); + + boxImage.setClipping(vec2(screenClipPos.x(), float(screenClipPos.y())), + vec2(screenClipSize.x(), screenClipSize.y())); } - - IMGUI_IMUIContext->queueImage( boxImage ); - -} + IMGUI_IMUIContext->queueImage(boxImage); +} /*******************************************************************************************/ /** @@ -1042,38 +979,35 @@ void IMGUI::drawBox( vec2 boxPos, vec2 boxSize, vec4 boxColor, int zOrder, bool * @returns handle to the element (NULL if not found) * */ -IMElement* IMGUI::findElement( std::string const& elementName ) { - - - for(auto & it : header) { - IMElement* foundElement = it->findElement( elementName ); - - if( foundElement != NULL ) { +IMElement* IMGUI::findElement(std::string const& elementName) { + for (auto& it : header) { + IMElement* foundElement = it->findElement(elementName); + + if (foundElement != NULL) { foundElement->AddRef(); return foundElement; } } - - for(auto & it : footer) { - IMElement* foundElement = it->findElement( elementName ); - - if( foundElement != NULL ) { + + for (auto& it : footer) { + IMElement* foundElement = it->findElement(elementName); + + if (foundElement != NULL) { foundElement->AddRef(); return foundElement; } } - - for(auto & it : main) { - IMElement* foundElement = it->findElement( elementName ); - - if( foundElement != NULL ) { + + for (auto& it : main) { + IMElement* foundElement = it->findElement(elementName); + + if (foundElement != NULL) { foundElement->AddRef(); return foundElement; } } - + return NULL; - } /*******************************************************************************************/ @@ -1083,12 +1017,12 @@ IMElement* IMGUI::findElement( std::string const& elementName ) { * @returns Unique name as string * */ -std::string IMGUI::getUniqueName( std::string const& type ) { +std::string IMGUI::getUniqueName(std::string const& type) { elementCount += 1; - + std::ostringstream oss; oss << type << elementCount; - + return oss.str(); } @@ -1098,7 +1032,6 @@ std::string IMGUI::getUniqueName( std::string const& type ) { * */ void IMGUI::clense() { - backgrounds.clear(); foregrounds.clear(); header.clear(); @@ -1112,8 +1045,7 @@ void IMGUI::clense() { * */ IMGUI::~IMGUI() { - - IMrefCountTracker.removeRefCountObject( "IMGUI" ); + IMrefCountTracker.removeRefCountObject("IMGUI"); clear(); delete IMGUI_IMUIContext; @@ -1121,40 +1053,39 @@ IMGUI::~IMGUI() { imevents.TriggerDestroyed(this); } -void IMGUI::DestroyedIMElement( IMElement* element ) { - for( int i = backgrounds.size()-1; i >= 0; i-- ) { - if( backgrounds[i] == element ) { - backgrounds.erase(backgrounds.begin()+i); +void IMGUI::DestroyedIMElement(IMElement* element) { + for (int i = backgrounds.size() - 1; i >= 0; i--) { + if (backgrounds[i] == element) { + backgrounds.erase(backgrounds.begin() + i); } } - for( int i = foregrounds.size()-1; i >= 0; i-- ) { - if( foregrounds[i] == element ) { - foregrounds.erase(foregrounds.begin()+i); + for (int i = foregrounds.size() - 1; i >= 0; i--) { + if (foregrounds[i] == element) { + foregrounds.erase(foregrounds.begin() + i); } } - for( int i = header.size()-1; i >= 0; i-- ) { - if( header[i] == element ) { - header.erase(header.begin()+i); + for (int i = header.size() - 1; i >= 0; i--) { + if (header[i] == element) { + header.erase(header.begin() + i); } } - for( int i = footer.size()-1; i >= 0; i-- ) { - if( footer[i] == element ) { + for (int i = footer.size() - 1; i >= 0; i--) { + if (footer[i] == element) { LOGI << "Removing footer " << element << std::endl; - footer.erase(footer.begin()+i); + footer.erase(footer.begin() + i); } } - for( int i = main.size()-1; i >= 0; i-- ) { - if( main[i] == element ) { + for (int i = main.size() - 1; i >= 0; i--) { + if (main[i] == element) { LOGI << "Removing main " << element << std::endl; - main.erase(main.begin()+i); + main.erase(main.begin() + i); } } } -void IMGUI::DestroyedIMGUI( IMGUI* IMGUI ) { - +void IMGUI::DestroyedIMGUI(IMGUI* IMGUI) { } |