mirror of
https://github.com/ocornut/imgui.git
synced 2025-12-23 22:59:10 +00:00
MultiSelect: Demo: Delete items from menu.
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user