Browse Source

TabBar: Added extra mis-usage error recovery. Past the assert, common mis-usage don't lead to hard crashes any more, facilitating integration with scripting languages. (#1651)

omar 6 years ago
parent
commit
9da48c16c5
2 changed files with 17 additions and 3 deletions
  1. 2 0
      docs/CHANGELOG.txt
  2. 15 3
      imgui_widgets.cpp

+ 2 - 0
docs/CHANGELOG.txt

@@ -41,6 +41,8 @@ Other Changes:
 - InputText: Fixed an edge case crash that would happen if another widget sharing the same ID
 - InputText: Fixed an edge case crash that would happen if another widget sharing the same ID
   is being swapped with an InputText that has yet to be activated.
   is being swapped with an InputText that has yet to be activated.
 - TabBar: Fixed a crash when using BeginTabBar() recursively (didn't affect docking). (#2371)
 - TabBar: Fixed a crash when using BeginTabBar() recursively (didn't affect docking). (#2371)
+- TabBar: Added extra mis-usage error recovery. Past the assert, common mis-usage don't lead to
+  hard crashes any more, facilitating integration with scripting languages. (#1651)
 - Examples: OpenGL: Fix for OSX not supporting OpenGL 4.5, we don't try to read GL_CLIP_ORIGIN
 - Examples: OpenGL: Fix for OSX not supporting OpenGL 4.5, we don't try to read GL_CLIP_ORIGIN
   even if the OpenGL headers/loader happens to define the value. (#2366, #2186)
   even if the OpenGL headers/loader happens to define the value. (#2366, #2186)
 
 

+ 15 - 3
imgui_widgets.cpp

@@ -5993,7 +5993,11 @@ void    ImGui::EndTabBar()
         return;
         return;
 
 
     ImGuiTabBar* tab_bar = g.CurrentTabBar;
     ImGuiTabBar* tab_bar = g.CurrentTabBar;
-    IM_ASSERT(tab_bar != NULL && "Mismatched BeginTabBar()/EndTabBar()!");
+    if (tab_bar == NULL)
+    {
+        IM_ASSERT(tab_bar != NULL && "Mismatched BeginTabBar()/EndTabBar()!");
+        return; // FIXME-ERRORHANDLING
+    }
     if (tab_bar->WantLayout)
     if (tab_bar->WantLayout)
         TabBarLayout(tab_bar);
         TabBarLayout(tab_bar);
 
 
@@ -6376,7 +6380,11 @@ bool    ImGui::BeginTabItem(const char* label, bool* p_open, ImGuiTabItemFlags f
         return false;
         return false;
 
 
     ImGuiTabBar* tab_bar = g.CurrentTabBar;
     ImGuiTabBar* tab_bar = g.CurrentTabBar;
-    IM_ASSERT(tab_bar && "Needs to be called between BeginTabBar() and EndTabBar()!");
+    if (tab_bar == NULL)
+    {
+        IM_ASSERT(tab_bar && "Needs to be called between BeginTabBar() and EndTabBar()!");
+        return false; // FIXME-ERRORHANDLING
+    }
     bool ret = TabItemEx(tab_bar, label, p_open, flags);
     bool ret = TabItemEx(tab_bar, label, p_open, flags);
     if (ret && !(flags & ImGuiTabItemFlags_NoPushId))
     if (ret && !(flags & ImGuiTabItemFlags_NoPushId))
     {
     {
@@ -6393,7 +6401,11 @@ void    ImGui::EndTabItem()
         return;
         return;
 
 
     ImGuiTabBar* tab_bar = g.CurrentTabBar;
     ImGuiTabBar* tab_bar = g.CurrentTabBar;
-    IM_ASSERT(tab_bar != NULL && "Needs to be called between BeginTabBar() and EndTabBar()!");
+    if (tab_bar == NULL)
+    {
+        IM_ASSERT(tab_bar != NULL && "Needs to be called between BeginTabBar() and EndTabBar()!");
+        return;
+    }
     IM_ASSERT(tab_bar->LastTabItemIdx >= 0);
     IM_ASSERT(tab_bar->LastTabItemIdx >= 0);
     ImGuiTabItem* tab = &tab_bar->Tabs[tab_bar->LastTabItemIdx];
     ImGuiTabItem* tab = &tab_bar->Tabs[tab_bar->LastTabItemIdx];
     if (!(tab->Flags & ImGuiTabItemFlags_NoPushId))
     if (!(tab->Flags & ImGuiTabItemFlags_NoPushId))