Forráskód Böngészése

MultiSelect: Box-Select: added support for ImGuiMultiSelectFlags_BoxSelect.

(v11)
FIXME: broken on clipping demo.
ocornut 2 éve
szülő
commit
f904a6646c
4 módosított fájl, 107 hozzáadás és 11 törlés
  1. 7 6
      imgui.h
  2. 3 2
      imgui_demo.cpp
  3. 14 2
      imgui_internal.h
  4. 83 1
      imgui_widgets.cpp

+ 7 - 6
imgui.h

@@ -2733,12 +2733,13 @@ enum ImGuiMultiSelectFlags_
     ImGuiMultiSelectFlags_None                  = 0,
     ImGuiMultiSelectFlags_None                  = 0,
     ImGuiMultiSelectFlags_SingleSelect          = 1 << 0,   // Disable selecting more than one item. This is available to allow single-selection code to use same code/logic is desired, but may not be very useful.
     ImGuiMultiSelectFlags_SingleSelect          = 1 << 0,   // Disable selecting more than one item. This is available to allow single-selection code to use same code/logic is desired, but may not be very useful.
     ImGuiMultiSelectFlags_NoSelectAll           = 1 << 1,   // Disable CTRL+A shortcut to set RequestSelectAll
     ImGuiMultiSelectFlags_NoSelectAll           = 1 << 1,   // Disable CTRL+A shortcut to set RequestSelectAll
-    ImGuiMultiSelectFlags_ClearOnEscape         = 1 << 2,   // Clear selection when pressing Escape while scope is focused.
-    ImGuiMultiSelectFlags_ClearOnClickVoid      = 1 << 3,   // Clear selection when clicking on empty location within scope.
-    ImGuiMultiSelectFlags_ScopeWindow           = 1 << 4,   // Scope for _ClearOnClickVoid and _BoxSelect is whole window (Default). Use if (use if BeginMultiSelect() covers a whole window.
-    ImGuiMultiSelectFlags_ScopeRect             = 1 << 5,   // Scope for _ClearOnClickVoid and _BoxSelect is rectangle covering submitted items. Use if multiple BeginMultiSelect() are used in the same host window.
-    ImGuiMultiSelectFlags_SelectOnClick         = 1 << 7,   // Apply selection on mouse down when clicking on unselected item. (Default)
-    ImGuiMultiSelectFlags_SelectOnClickRelease  = 1 << 8,   // Apply selection on mouse release when clicking an unselected item. Allow dragging an unselected item without altering selection.
+    ImGuiMultiSelectFlags_BoxSelect             = 1 << 2,   // Enable box-selection. Box-selection works better with little bit of spacing between items hit-box in order to be able to aim at empty space.
+    ImGuiMultiSelectFlags_ClearOnEscape         = 1 << 4,   // Clear selection when pressing Escape while scope is focused.
+    ImGuiMultiSelectFlags_ClearOnClickVoid      = 1 << 5,   // Clear selection when clicking on empty location within scope.
+    ImGuiMultiSelectFlags_ScopeWindow           = 1 << 6,   // Scope for _ClearOnClickVoid and _BoxSelect is whole window (Default). Use if (use if BeginMultiSelect() covers a whole window.
+    ImGuiMultiSelectFlags_ScopeRect             = 1 << 7,   // Scope for _ClearOnClickVoid and _BoxSelect is rectangle covering submitted items. Use if multiple BeginMultiSelect() are used in the same host window.
+    ImGuiMultiSelectFlags_SelectOnClick         = 1 << 8,   // Apply selection on mouse down when clicking on unselected item. (Default)
+    ImGuiMultiSelectFlags_SelectOnClickRelease  = 1 << 9,   // Apply selection on mouse release when clicking an unselected item. Allow dragging an unselected item without altering selection.
 };
 };
 
 
 // Multi-selection system
 // Multi-selection system

+ 3 - 2
imgui_demo.cpp

@@ -3299,14 +3299,13 @@ static void ShowDemoWindowMultiSelect()
 
 
             for (int selection_scope_n = 0; selection_scope_n < SCOPES_COUNT; selection_scope_n++)
             for (int selection_scope_n = 0; selection_scope_n < SCOPES_COUNT; selection_scope_n++)
             {
             {
+                ImGui::PushID(selection_scope_n);
                 ExampleSelection* selection = &selections_data[selection_scope_n];
                 ExampleSelection* selection = &selections_data[selection_scope_n];
-
                 ImGuiMultiSelectIO* ms_io = ImGui::BeginMultiSelect(flags);
                 ImGuiMultiSelectIO* ms_io = ImGui::BeginMultiSelect(flags);
                 selection->ApplyRequests(ms_io, &selection_adapter, ITEMS_COUNT);
                 selection->ApplyRequests(ms_io, &selection_adapter, ITEMS_COUNT);
 
 
                 ImGui::SeparatorText("Selection scope");
                 ImGui::SeparatorText("Selection scope");
                 ImGui::Text("Selection size: %d/%d", selection->GetSize(), ITEMS_COUNT);
                 ImGui::Text("Selection size: %d/%d", selection->GetSize(), ITEMS_COUNT);
-                ImGui::PushID(selection_scope_n);
 
 
                 for (int n = 0; n < ITEMS_COUNT; n++)
                 for (int n = 0; n < ITEMS_COUNT; n++)
                 {
                 {
@@ -3325,6 +3324,7 @@ static void ShowDemoWindowMultiSelect()
             ImGui::TreePop();
             ImGui::TreePop();
         }
         }
 
 
+        // See ShowExampleAppAssetsBrowser()
         if (ImGui::TreeNode("Multi-Select (tiled assets browser)"))
         if (ImGui::TreeNode("Multi-Select (tiled assets browser)"))
         {
         {
             ImGui::BulletText("See 'Examples->Assets Browser' in menu");
             ImGui::BulletText("See 'Examples->Assets Browser' in menu");
@@ -3361,6 +3361,7 @@ static void ShowDemoWindowMultiSelect()
             ImGui::Checkbox("Show color button", &show_color_button);
             ImGui::Checkbox("Show color button", &show_color_button);
             ImGui::CheckboxFlags("ImGuiMultiSelectFlags_SingleSelect", &flags, ImGuiMultiSelectFlags_SingleSelect);
             ImGui::CheckboxFlags("ImGuiMultiSelectFlags_SingleSelect", &flags, ImGuiMultiSelectFlags_SingleSelect);
             ImGui::CheckboxFlags("ImGuiMultiSelectFlags_NoSelectAll", &flags, ImGuiMultiSelectFlags_NoSelectAll);
             ImGui::CheckboxFlags("ImGuiMultiSelectFlags_NoSelectAll", &flags, ImGuiMultiSelectFlags_NoSelectAll);
+            ImGui::CheckboxFlags("ImGuiMultiSelectFlags_BoxSelect", &flags, ImGuiMultiSelectFlags_BoxSelect);
             ImGui::CheckboxFlags("ImGuiMultiSelectFlags_ClearOnEscape", &flags, ImGuiMultiSelectFlags_ClearOnEscape);
             ImGui::CheckboxFlags("ImGuiMultiSelectFlags_ClearOnEscape", &flags, ImGuiMultiSelectFlags_ClearOnEscape);
             ImGui::CheckboxFlags("ImGuiMultiSelectFlags_ClearOnClickVoid", &flags, ImGuiMultiSelectFlags_ClearOnClickVoid);
             ImGui::CheckboxFlags("ImGuiMultiSelectFlags_ClearOnClickVoid", &flags, ImGuiMultiSelectFlags_ClearOnClickVoid);
             if (ImGui::CheckboxFlags("ImGuiMultiSelectFlags_ScopeWindow", &flags, ImGuiMultiSelectFlags_ScopeWindow) && (flags & ImGuiMultiSelectFlags_ScopeWindow))
             if (ImGui::CheckboxFlags("ImGuiMultiSelectFlags_ScopeWindow", &flags, ImGuiMultiSelectFlags_ScopeWindow) && (flags & ImGuiMultiSelectFlags_ScopeWindow))

+ 14 - 2
imgui_internal.h

@@ -1722,6 +1722,10 @@ struct IMGUI_API ImGuiMultiSelectTempData
     ImGuiMultiSelectFlags   Flags;
     ImGuiMultiSelectFlags   Flags;
     ImVec2                  ScopeRectMin;
     ImVec2                  ScopeRectMin;
     ImVec2                  BackupCursorMaxPos;
     ImVec2                  BackupCursorMaxPos;
+    ImGuiID                 BoxSelectId;
+    ImRect                  BoxSelectRectCurr;  // Selection rectangle in absolute coordinates (derived from Storage->BoxSelectStartPosRel + MousePos)
+    ImRect                  BoxSelectRectPrev;
+    ImGuiSelectionUserData  BoxSelectLastitem;
     ImGuiKeyChord           KeyMods;
     ImGuiKeyChord           KeyMods;
     bool                    LoopRequestClear;
     bool                    LoopRequestClear;
     bool                    LoopRequestSelectAll;
     bool                    LoopRequestSelectAll;
@@ -1733,7 +1737,7 @@ struct IMGUI_API ImGuiMultiSelectTempData
     bool                    RangeDstPassedBy;   // Set by the item that matches NavJustMovedToId when IsSetRange is set.
     bool                    RangeDstPassedBy;   // Set by the item that matches NavJustMovedToId when IsSetRange is set.
 
 
     ImGuiMultiSelectTempData()  { Clear(); }
     ImGuiMultiSelectTempData()  { Clear(); }
-    void Clear()            { size_t io_sz = sizeof(IO); IO.Clear(); memset((void*)(&IO + 1), 0, sizeof(*this) - io_sz); } // Zero-clear except IO
+    void Clear()            { size_t io_sz = sizeof(IO); IO.Clear(); memset((void*)(&IO + 1), 0, sizeof(*this) - io_sz); BoxSelectLastitem = -1; } // Zero-clear except IO
 };
 };
 
 
 // Persistent storage for multi-select (as long as selection is alive)
 // Persistent storage for multi-select (as long as selection is alive)
@@ -1747,8 +1751,15 @@ struct IMGUI_API ImGuiMultiSelectState
     ImGuiSelectionUserData  RangeSrcItem;       //
     ImGuiSelectionUserData  RangeSrcItem;       //
     ImGuiSelectionUserData  NavIdItem;          // SetNextItemSelectionUserData() value for NavId (if part of submitted items)
     ImGuiSelectionUserData  NavIdItem;          // SetNextItemSelectionUserData() value for NavId (if part of submitted items)
 
 
+    bool                    BoxSelectActive;
+    bool                    BoxSelectStarting;
+    bool                    BoxSelectFromVoid;
+    ImGuiKeyChord           BoxSelectKeyMods : 16; // Latched key-mods for box-select logic.
+    ImVec2                  BoxSelectStartPosRel;  // Start position in window-relative space (to support scrolling)
+    ImVec2                  BoxSelectEndPosRel;    // End position in window-relative space
+
     ImGuiMultiSelectState() { Init(0); }
     ImGuiMultiSelectState() { Init(0); }
-    void Init(ImGuiID id)   { Window = NULL; ID = id; LastFrameActive = 0; RangeSelected = NavIdSelected = -1; RangeSrcItem = NavIdItem = ImGuiSelectionUserData_Invalid; }
+    void Init(ImGuiID id)   { Window = NULL; ID = id; LastFrameActive = 0; RangeSelected = NavIdSelected = -1; RangeSrcItem = NavIdItem = ImGuiSelectionUserData_Invalid; BoxSelectActive = BoxSelectStarting = BoxSelectFromVoid = false; BoxSelectKeyMods = 0; }
 };
 };
 
 
 #endif // #ifdef IMGUI_HAS_MULTI_SELECT
 #endif // #ifdef IMGUI_HAS_MULTI_SELECT
@@ -3087,6 +3098,7 @@ namespace ImGui
     inline ImRect           WindowRectAbsToRel(ImGuiWindow* window, const ImRect& r) { ImVec2 off = window->DC.CursorStartPos; return ImRect(r.Min.x - off.x, r.Min.y - off.y, r.Max.x - off.x, r.Max.y - off.y); }
     inline ImRect           WindowRectAbsToRel(ImGuiWindow* window, const ImRect& r) { ImVec2 off = window->DC.CursorStartPos; return ImRect(r.Min.x - off.x, r.Min.y - off.y, r.Max.x - off.x, r.Max.y - off.y); }
     inline ImRect           WindowRectRelToAbs(ImGuiWindow* window, const ImRect& r) { ImVec2 off = window->DC.CursorStartPos; return ImRect(r.Min.x + off.x, r.Min.y + off.y, r.Max.x + off.x, r.Max.y + off.y); }
     inline ImRect           WindowRectRelToAbs(ImGuiWindow* window, const ImRect& r) { ImVec2 off = window->DC.CursorStartPos; return ImRect(r.Min.x + off.x, r.Min.y + off.y, r.Max.x + off.x, r.Max.y + off.y); }
     inline ImVec2           WindowPosRelToAbs(ImGuiWindow* window, const ImVec2& p)  { ImVec2 off = window->DC.CursorStartPos; return ImVec2(p.x + off.x, p.y + off.y); }
     inline ImVec2           WindowPosRelToAbs(ImGuiWindow* window, const ImVec2& p)  { ImVec2 off = window->DC.CursorStartPos; return ImVec2(p.x + off.x, p.y + off.y); }
+    inline ImVec2           WindowPosAbsToRel(ImGuiWindow* window, const ImVec2& p) { ImVec2 off = window->DC.CursorStartPos; return ImVec2(p.x - off.x, p.y - off.y); }
 
 
     // Windows: Display Order and Focus Order
     // Windows: Display Order and Focus Order
     IMGUI_API void          FocusWindow(ImGuiWindow* window, ImGuiFocusRequestFlags flags = 0);
     IMGUI_API void          FocusWindow(ImGuiWindow* window, ImGuiFocusRequestFlags flags = 0);

+ 83 - 1
imgui_widgets.cpp

@@ -7103,6 +7103,8 @@ void ImGui::DebugNodeTypingSelectState(ImGuiTypingSelectState* data)
 //-------------------------------------------------------------------------
 //-------------------------------------------------------------------------
 // [SECTION] Widgets: Multi-Select support
 // [SECTION] Widgets: Multi-Select support
 //-------------------------------------------------------------------------
 //-------------------------------------------------------------------------
+// - DebugLogMultiSelectRequests() [Internal]
+// - BoxSelectStart() [Internal]
 // - BeginMultiSelect()
 // - BeginMultiSelect()
 // - EndMultiSelect()
 // - EndMultiSelect()
 // - SetNextItemSelectionUserData()
 // - SetNextItemSelectionUserData()
@@ -7122,6 +7124,15 @@ static void DebugLogMultiSelectRequests(const char* function, const ImGuiMultiSe
     }
     }
 }
 }
 
 
+static void BoxSelectStart(ImGuiMultiSelectState* storage, ImGuiSelectionUserData clicked_item)
+{
+    ImGuiContext& g = *GImGui;
+    storage->BoxSelectStarting = true; // Consider starting box-select.
+    storage->BoxSelectFromVoid = (clicked_item == ImGuiSelectionUserData_Invalid);
+    storage->BoxSelectKeyMods = g.IO.KeyMods;
+    storage->BoxSelectStartPosRel = storage->BoxSelectEndPosRel = ImGui::WindowPosAbsToRel(g.CurrentWindow, g.IO.MousePos);
+}
+
 // Return ImGuiMultiSelectIO structure. Lifetime: valid until corresponding call to EndMultiSelect().
 // Return ImGuiMultiSelectIO structure. Lifetime: valid until corresponding call to EndMultiSelect().
 ImGuiMultiSelectIO* ImGui::BeginMultiSelect(ImGuiMultiSelectFlags flags)
 ImGuiMultiSelectIO* ImGui::BeginMultiSelect(ImGuiMultiSelectFlags flags)
 {
 {
@@ -7193,6 +7204,38 @@ ImGuiMultiSelectIO* ImGui::BeginMultiSelect(ImGuiMultiSelectFlags flags)
                 request_select_all = true;
                 request_select_all = true;
     }
     }
 
 
+    // Box-select handling: update active state.
+    if (flags & ImGuiMultiSelectFlags_BoxSelect)
+    {
+        ms->BoxSelectId = GetID("##BoxSelect");
+        KeepAliveID(ms->BoxSelectId);
+
+        // BoxSelectStarting is set by MultiSelectItemFooter() when considering a possible box-select. We validate it here and lock geometry.
+        if (storage->BoxSelectStarting && IsMouseDragPastThreshold(0))
+        {
+            storage->BoxSelectActive = true;
+            storage->BoxSelectStarting = false;
+            SetActiveID(ms->BoxSelectId, window);
+            if (storage->BoxSelectFromVoid && (storage->BoxSelectKeyMods & ImGuiMod_Shift) == 0)
+                request_clear = true;
+        }
+        else if ((storage->BoxSelectStarting || storage->BoxSelectActive) && g.IO.MouseDown[0] == false)
+        {
+            storage->BoxSelectActive = storage->BoxSelectStarting = false;
+            if (g.ActiveId == ms->BoxSelectId)
+                ClearActiveID();
+        }
+        if (storage->BoxSelectActive)
+        {
+            ImVec2 start_pos_abs = WindowPosRelToAbs(window, storage->BoxSelectStartPosRel);
+            ImVec2 prev_end_pos_abs = WindowPosRelToAbs(window, storage->BoxSelectEndPosRel);
+            ms->BoxSelectRectPrev.Min = ImMin(start_pos_abs, prev_end_pos_abs);
+            ms->BoxSelectRectPrev.Max = ImMax(start_pos_abs, prev_end_pos_abs);
+            ms->BoxSelectRectCurr.Min = ImMin(start_pos_abs, g.IO.MousePos);
+            ms->BoxSelectRectCurr.Max = ImMax(start_pos_abs, g.IO.MousePos);
+        }
+    }
+
     if (request_clear || request_select_all)
     if (request_clear || request_select_all)
         ms->IO.Requests.push_back(ImGuiSelectionRequest(request_select_all ? ImGuiSelectionRequestType_SelectAll : ImGuiSelectionRequestType_Clear));
         ms->IO.Requests.push_back(ImGuiSelectionRequest(request_select_all ? ImGuiSelectionRequestType_SelectAll : ImGuiSelectionRequestType_Clear));
     ms->LoopRequestClear = request_clear;
     ms->LoopRequestClear = request_clear;
@@ -7228,6 +7271,15 @@ ImGuiMultiSelectIO* ImGui::EndMultiSelect()
             storage->NavIdItem = ImGuiSelectionUserData_Invalid;
             storage->NavIdItem = ImGuiSelectionUserData_Invalid;
             storage->NavIdSelected = -1;
             storage->NavIdSelected = -1;
         }
         }
+
+        // Box-select: render selection rectangle
+        // FIXME-MULTISELECT: Scroll on box-select
+        if ((ms->Flags & ImGuiMultiSelectFlags_BoxSelect) && storage->BoxSelectActive)
+        {
+            ms->Storage->BoxSelectEndPosRel = WindowPosAbsToRel(window, g.IO.MousePos);
+            window->DrawList->AddRectFilled(ms->BoxSelectRectCurr.Min, ms->BoxSelectRectCurr.Max, GetColorU32(ImGuiCol_SeparatorHovered, 0.30f)); // FIXME-MULTISELECT: Styling
+            window->DrawList->AddRect(ms->BoxSelectRectCurr.Min, ms->BoxSelectRectCurr.Max, GetColorU32(ImGuiCol_NavHighlight)); // FIXME-MULTISELECT: Styling
+        }
     }
     }
 
 
     if (ms->IsEndIO == false)
     if (ms->IsEndIO == false)
@@ -7240,6 +7292,10 @@ ImGuiMultiSelectIO* ImGui::EndMultiSelect()
     // We specifically test for IsMouseDragPastThreshold(0) == false to allow box-selection!
     // We specifically test for IsMouseDragPastThreshold(0) == false to allow box-selection!
     if (scope_hovered && g.HoveredId == 0)
     if (scope_hovered && g.HoveredId == 0)
     {
     {
+        if (ms->Flags & ImGuiMultiSelectFlags_BoxSelect)
+            if (!storage->BoxSelectActive && !storage->BoxSelectStarting && g.IO.MouseClickedCount[0] == 1)
+                BoxSelectStart(storage, ImGuiSelectionUserData_Invalid);
+
         if (ms->Flags & ImGuiMultiSelectFlags_ClearOnClickVoid)
         if (ms->Flags & ImGuiMultiSelectFlags_ClearOnClickVoid)
             if (IsMouseReleased(0) && IsMouseDragPastThreshold(0) == false && g.IO.KeyMods == ImGuiMod_None)
             if (IsMouseReleased(0) && IsMouseDragPastThreshold(0) == false && g.IO.KeyMods == ImGuiMod_None)
             {
             {
@@ -7385,6 +7441,26 @@ void ImGui::MultiSelectItemFooter(ImGuiID id, bool* p_selected, bool* p_pressed)
             selected = pressed = true;
             selected = pressed = true;
     }
     }
 
 
+    // Box-select handling
+    if (ms->Storage->BoxSelectActive)
+    {
+        const bool rect_overlap_curr = ms->BoxSelectRectCurr.Overlaps(g.LastItemData.Rect);
+        const bool rect_overlap_prev = ms->BoxSelectRectPrev.Overlaps(g.LastItemData.Rect);
+        if ((rect_overlap_curr && !rect_overlap_prev && !selected) || (rect_overlap_prev && !rect_overlap_curr))
+        {
+            selected = !selected;
+            ImGuiSelectionRequest req(ImGuiSelectionRequestType_SetRange);
+            req.RangeFirstItem = req.RangeLastItem = item_data;
+            req.RangeSelected = selected;
+            ImGuiSelectionRequest* prev_req = (ms->IO.Requests.Size > 0) ? &ms->IO.Requests.Data[ms->IO.Requests.Size - 1] : NULL;
+            if (prev_req && prev_req->Type == ImGuiSelectionRequestType_SetRange && prev_req->RangeLastItem == ms->BoxSelectLastitem && prev_req->RangeSelected == selected)
+                prev_req->RangeLastItem = item_data; // Merge span into same request
+            else
+                ms->IO.Requests.push_back(req);
+        }
+        ms->BoxSelectLastitem = item_data;
+    }
+
     // Right-click handling: this could be moved at the Selectable() level.
     // Right-click handling: this could be moved at the Selectable() level.
     // FIXME-MULTISELECT: See https://github.com/ocornut/imgui/pull/5816
     // FIXME-MULTISELECT: See https://github.com/ocornut/imgui/pull/5816
     if (hovered && IsMouseClicked(1))
     if (hovered && IsMouseClicked(1))
@@ -7407,6 +7483,12 @@ void ImGui::MultiSelectItemFooter(ImGuiID id, bool* p_selected, bool* p_pressed)
     // Alter selection
     // Alter selection
     if (pressed && (!enter_pressed || !selected))
     if (pressed && (!enter_pressed || !selected))
     {
     {
+        // Box-select
+        ImGuiInputSource input_source = (g.NavJustMovedToId == id || g.NavActivateId == id) ? g.NavInputSource : ImGuiInputSource_Mouse;
+        if (ms->Flags & ImGuiMultiSelectFlags_BoxSelect)
+            if (selected == false && !storage->BoxSelectActive && !storage->BoxSelectStarting && input_source == ImGuiInputSource_Mouse && g.IO.MouseClickedCount[0] == 1)
+                BoxSelectStart(storage, item_data);
+
         //----------------------------------------------------------------------------------------
         //----------------------------------------------------------------------------------------
         // ACTION                      | Begin  | Pressed/Activated  | End
         // ACTION                      | Begin  | Pressed/Activated  | End
         //----------------------------------------------------------------------------------------
         //----------------------------------------------------------------------------------------
@@ -7424,7 +7506,6 @@ void ImGui::MultiSelectItemFooter(ImGuiID id, bool* p_selected, bool* p_pressed)
         // Mouse Pressed:  Ctrl+Shift  | n/a    | Dst=item, Sel=!Sel =>         SetRange Src-Dst
         // Mouse Pressed:  Ctrl+Shift  | n/a    | Dst=item, Sel=!Sel =>         SetRange Src-Dst
         //----------------------------------------------------------------------------------------
         //----------------------------------------------------------------------------------------
 
 
-        const ImGuiInputSource input_source = (g.NavJustMovedToId == id || g.NavActivateId == id) ? g.NavInputSource : ImGuiInputSource_Mouse;
         bool request_clear = false;
         bool request_clear = false;
         if (is_singleselect)
         if (is_singleselect)
             request_clear = true;
             request_clear = true;
@@ -7492,6 +7573,7 @@ void ImGui::DebugNodeMultiSelectState(ImGuiMultiSelectState* storage)
         return;
         return;
     Text("RangeSrcItem = %" IM_PRId64 " (0x%" IM_PRIX64 "), RangeSelected = %d", storage->RangeSrcItem, storage->RangeSrcItem, storage->RangeSelected);
     Text("RangeSrcItem = %" IM_PRId64 " (0x%" IM_PRIX64 "), RangeSelected = %d", storage->RangeSrcItem, storage->RangeSrcItem, storage->RangeSelected);
     Text("NavIdItem = %" IM_PRId64 " (0x%" IM_PRIX64 "), NavIdSelected = %d", storage->NavIdItem, storage->NavIdItem, storage->NavIdSelected);
     Text("NavIdItem = %" IM_PRId64 " (0x%" IM_PRIX64 "), NavIdSelected = %d", storage->NavIdItem, storage->NavIdItem, storage->NavIdSelected);
+    Text("BoxSelect Starting = %d, Active %d", storage->BoxSelectStarting, storage->BoxSelectActive);
     TreePop();
     TreePop();
 #else
 #else
     IM_UNUSED(storage);
     IM_UNUSED(storage);