Browse Source

MultiSelect: Demo: Delete items from menu.

pull/7804/head
ocornut 1 year ago
parent
commit
e3616e151f
  1. 12
      imgui_demo.cpp

12
imgui_demo.cpp

@ -2778,10 +2778,11 @@ struct ExampleSelection
// Data
ImGuiStorage Storage; // Selection set
int SelectionSize; // Number of selected items (== number of 1 in the Storage, maintained by this class). // FIXME-MULTISELECT: Imply more difficult to track with intrusive selection schemes?
bool QueueDeletion; // Request deleting selected items
// Functions
ExampleSelection() { Clear(); }
void Clear() { Storage.Clear(); SelectionSize = 0; }
void Clear() { Storage.Clear(); SelectionSize = 0; QueueDeletion = false; }
bool GetSelected(int n) const { return Storage.GetInt((ImGuiID)n, 0) != 0; }
void SetSelected(int n, bool v) { int* p_int = Storage.GetIntRef((ImGuiID)n, 0); if (*p_int == (int)v) return; if (v) SelectionSize++; else SelectionSize--; *p_int = (bool)v; }
int GetSize() const { return SelectionSize; }
@ -2822,6 +2823,8 @@ struct ExampleSelection
template<typename ITEM_TYPE>
int ApplyDeletionPreLoop(ImGuiMultiSelectIO* ms_io, ImVector<ITEM_TYPE>& items)
{
QueueDeletion = false;
// If current item is not selected.
if (ms_io->NavIdSelected == false) // Here 'NavIdSelected' should be == to 'GetSelected(ms_io->NavIdData)'
{
@ -3130,7 +3133,7 @@ static void ShowDemoWindowMultiSelect()
// FIXME-MULTISELECT: Shortcut(). Hard to demo this? May be helpful to send a helper/optional "delete" signal.
// FIXME-MULTISELECT: may turn into 'ms_io->RequestDelete' -> need HasSelection passed.
// FIXME-MULTISELECT: Test with intermediary modal dialog.
const bool want_delete = (selection.GetSize() > 0) && ImGui::IsWindowFocused() && ImGui::IsKeyPressed(ImGuiKey_Delete);
const bool want_delete = selection.QueueDeletion || ((selection.GetSize() > 0) && ImGui::IsWindowFocused() && ImGui::IsKeyPressed(ImGuiKey_Delete));
if (want_delete)
selection.ApplyDeletionPreLoop(ms_io, items);
const int next_focus_item_idx = (int)(intptr_t)ms_io->RequestFocusItem;
@ -3222,7 +3225,10 @@ static void ShowDemoWindowMultiSelect()
// Right-click: context menu
if (ImGui::BeginPopupContextItem())
{
ImGui::Text("(Testing Selectable inside an embedded popup)");
ImGui::BeginDisabled(!use_deletion || selection.GetSize() == 0);
sprintf(label, "Delete %d item(s)###DeleteSelected", selection.GetSize());
selection.QueueDeletion |= ImGui::Selectable(label);
ImGui::EndDisabled();
ImGui::Selectable("Close");
ImGui::EndPopup();
}

Loading…
Cancel
Save