diff --git a/examples/common/imgui/imgui.cpp b/examples/common/imgui/imgui.cpp index e627abdf..049a510b 100644 --- a/examples/common/imgui/imgui.cpp +++ b/examples/common/imgui/imgui.cpp @@ -1430,15 +1430,45 @@ struct Imgui } } - uint8_t tabs(uint8_t _selected, bool _enabled, ImguiAlign::Enum _align, int32_t _height, int32_t _r, va_list _argList) + uint8_t tabs(uint8_t _selected, bool _enabled, ImguiAlign::Enum _align, int32_t _height, int32_t _r, uint8_t _nTabs, uint8_t _nEnabled, va_list _argList) { - BX_UNUSED(_align); - uint8_t count; const char* titles[16]; - const char* str = va_arg(_argList, const char*); - for (count = 0; str != NULL || count >= 16; ++count, str = va_arg(_argList, const char*) ) + bool tabEnabled[16]; + const uint8_t tabCount = IMGUI_MIN(_nTabs, 16); + const uint8_t enabledCount = IMGUI_MIN(_nEnabled, 16); + + // Read titles. { - titles[count] = str; + uint8_t ii = 0; + for (; ii < tabCount; ++ii) + { + const char* str = va_arg(_argList, const char*); + titles[ii] = str; + } + for (; ii < _nTabs; ++ii) + { + const char* str = va_arg(_argList, const char*); + BX_UNUSED(str); + } + } + + // Read enabled tabs. + { + uint8_t ii = 0; + for (; ii < enabledCount; ++ii) + { + bool enabled = va_arg(_argList, bool); + tabEnabled[ii] = enabled; + } + for (; ii < _nEnabled; ++ii) + { + bool enabled = va_arg(_argList, bool); + BX_UNUSED(enabled); + } + for (; ii < _nTabs; ++ii) + { + tabEnabled[ii] = true; + } } Area& area = getCurrentArea(); @@ -1466,8 +1496,8 @@ struct Imgui } uint8_t selected = _selected; - const int32_t tabWidth = width / count; - const int32_t tabWidthHalf = width / (count*2); + const int32_t tabWidth = width / tabCount; + const int32_t tabWidthHalf = width / (tabCount*2); const int32_t textY = yy + _height/2 + int32_t(m_fonts[m_currentFontIdx].m_size)/2 - 2; if (0 == _r) @@ -1490,14 +1520,14 @@ struct Imgui ); } - for (uint8_t ii = 0; ii < count; ++ii) + for (uint8_t ii = 0; ii < tabCount; ++ii) { const uint32_t id = getId(); int32_t buttonX = xx + ii*tabWidth; int32_t textX = buttonX + tabWidthHalf; - const bool enabled = _enabled && isEnabled(m_areaId); + const bool enabled = _enabled && tabEnabled[ii] && isEnabled(m_areaId); const bool over = enabled && inRect(buttonX, yy, tabWidth, _height); const bool res = buttonLogic(id, over); @@ -3218,41 +3248,11 @@ void imguiInput(const char* _label, char* _str, uint32_t _len, bool _enabled, Im s_imgui.input(_label, _str, _len, _enabled, _align, _r); } -uint8_t imguiTabsUseMacroInstead(uint8_t _selected, ...) +uint8_t imguiTabs(uint8_t _selected, bool _enabled, ImguiAlign::Enum _align, int32_t _height, int32_t _r, uint8_t _nTabs, uint8_t _nEnabled, ...) { va_list argList; - va_start(argList, _selected); - const uint8_t result = s_imgui.tabs(_selected, true, ImguiAlign::LeftIndented, BUTTON_HEIGHT, BUTTON_HEIGHT/2 - 1, argList); - va_end(argList); - - return result; -} - -uint8_t imguiTabsUseMacroInstead(uint8_t _selected, bool _enabled, ...) -{ - va_list argList; - va_start(argList, _enabled); - const uint8_t result = s_imgui.tabs(_selected, _enabled, ImguiAlign::LeftIndented, BUTTON_HEIGHT, BUTTON_HEIGHT/2 - 1, argList); - va_end(argList); - - return result; -} - -uint8_t imguiTabsUseMacroInstead(uint8_t _selected, bool _enabled, ImguiAlign::Enum _align, ...) -{ - va_list argList; - va_start(argList, _align); - const uint8_t result = s_imgui.tabs(_selected, _enabled, _align, BUTTON_HEIGHT, BUTTON_HEIGHT/2 - 1, argList); - va_end(argList); - - return result; -} - -uint8_t imguiTabsUseMacroInstead(uint8_t _selected, bool _enabled, ImguiAlign::Enum _align, int32_t _height, int32_t _r, ...) -{ - va_list argList; - va_start(argList, _r); - const uint8_t result = s_imgui.tabs(_selected, _enabled, _align, _height, _r, argList); + va_start(argList, _nEnabled); + const uint8_t result = s_imgui.tabs(_selected, _enabled, _align, _height, _r, _nTabs, _nEnabled, argList); va_end(argList); return result; diff --git a/examples/common/imgui/imgui.h b/examples/common/imgui/imgui.h index 764e9362..fc8ec0bc 100644 --- a/examples/common/imgui/imgui.h +++ b/examples/common/imgui/imgui.h @@ -162,11 +162,13 @@ bool imguiSlider(const char* _text, float& _val, float _vmin, float _vmax, float bool imguiSlider(const char* _text, int32_t& _val, int32_t _vmin, int32_t _vmax, bool _enabled = true, ImguiAlign::Enum _align = ImguiAlign::LeftIndented); void imguiInput(const char* _label, char* _str, uint32_t _len, bool _enabled = true, ImguiAlign::Enum _align = ImguiAlign::LeftIndented, int32_t _r = IMGUI_INPUT_R); -uint8_t imguiTabsUseMacroInstead(uint8_t _selected, ...); -uint8_t imguiTabsUseMacroInstead(uint8_t _selected, bool _enabled, ...); -uint8_t imguiTabsUseMacroInstead(uint8_t _selected, bool _enabled, ImguiAlign::Enum _align, ...); -uint8_t imguiTabsUseMacroInstead(uint8_t _selected, bool _enabled, ImguiAlign::Enum _align, int32_t _height, int32_t _r, ...); -#define imguiTabs(...) imguiTabsUseMacroInstead(__VA_ARGS__, NULL) +/// Usage example: +/// imguiTabs(0, true, ImguiAlign::CenterIndented, 20, 0, 3, 2, "Tab0", "Tab1", "Tab2", true, false); +/// _nTabs - Number of tabs (in the above example, 3, and their labes are 'Tab0', 'Tab1' and 'Tab2'. +/// _nEnabled - Number of specified 'enabled' flags. All other unspecified tabs are considered enabled by default. +/// In the above example, there are 2 enabled flags: 'Tab0' is specified as enabled and 'Tab1' is specified as disabled. +/// Tab2 is unspecified and therefore is treated as enabled. +uint8_t imguiTabs(uint8_t _selected, bool _enabled, ImguiAlign::Enum _align, int32_t _height, int32_t _r, uint8_t _nTabs, uint8_t _nEnabled, ...); uint32_t imguiChooseUseMacroInstead(uint32_t _selected, ...); #define imguiChoose(...) imguiChooseUseMacroInstead(__VA_ARGS__, NULL)