@ -7177,6 +7177,7 @@ void ImGui::MultiSelectItemFooter(ImGuiID id, bool* p_selected, bool* p_pressed)
}
}
// 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
bool hovered = IsItemHovered ( ImGuiHoveredFlags_AllowWhenBlockedByPopup ) ;
bool hovered = IsItemHovered ( ImGuiHoveredFlags_AllowWhenBlockedByPopup ) ;
if ( hovered & & IsMouseClicked ( 1 ) )
if ( hovered & & IsMouseClicked ( 1 ) )
{
{
@ -7216,11 +7217,12 @@ void ImGui::MultiSelectItemFooter(ImGuiID id, bool* p_selected, bool* p_pressed)
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
ImGuiInputSource input_source = ( g . NavJustMovedToId = = id | | g . NavActivateId = = id ) ? g . NavInputSource : ImGuiInputSource_Mouse ;
ImGuiInputSource input_source = ( g . NavJustMovedToId = = id | | g . NavActivateId = = id ) ? g . NavInputSource : ImGuiInputSource_Mouse ;
if ( is_shift & & is_multiselect )
{
// Shift+Arrow always select, Ctrl+Shift+Arrow copy source selection state.
ms - > EndIO . RequestSetRange = true ;
ms - > EndIO . RequestSetRange = true ;
ms - > EndIO . RangeDstItem = item_data ;
ms - > EndIO . RangeDstItem = item_data ;
if ( is_shift & & is_multiselect )
{
// Shift+Arrow always select
// Ctrl+Shift+Arrow copy source selection state (alrady stored by BeginMultiSelect() in RangeSelected)
if ( ! is_ctrl )
if ( ! is_ctrl )
ms - > EndIO . RangeSelected = true ;
ms - > EndIO . RangeSelected = true ;
ms - > EndIO . RangeDirection = ms - > BeginIO . RangeSrcPassedBy ? + 1 : - 1 ;
ms - > EndIO . RangeDirection = ms - > BeginIO . RangeSrcPassedBy ? + 1 : - 1 ;
@ -7229,41 +7231,24 @@ void ImGui::MultiSelectItemFooter(ImGuiID id, bool* p_selected, bool* p_pressed)
{
{
// Ctrl inverts selection, otherwise always select
// Ctrl inverts selection, otherwise always select
selected = is_ctrl ? ! selected : true ;
selected = is_ctrl ? ! selected : true ;
ms - > EndIO . RangeSrcItem = ms - > EndIO . RangeDstItem = item_data ;
ms - > EndIO . RangeSrcItem = item_data ;
ms - > EndIO . RangeSelected = selected ;
ms - > EndIO . RangeSelected = selected ;
ms - > EndIO . RequestSetRange = true ;
ms - > EndIO . RangeDirection = + 1 ;
ms - > EndIO . RangeDirection = + 1 ;
}
}
if ( input_source = = ImGuiInputSource_Mouse | | g . NavActivateId = = id )
if ( input_source = = ImGuiInputSource_Mouse | | g . NavActivateId = = id )
{
{
// Mouse click without CTRL clears the selection, unless the clicked item is already selected
if ( is_multiselect & & ! is_ctrl )
if ( is_multiselect & & ! is_ctrl )
ms - > EndIO . RequestClear = true ;
ms - > EndIO . RequestClear = true ;
if ( is_multiselect & & ! is_shift & & ms - > EndIO . RequestClear )
{
// For toggle selection unless there is a Clear request, we can handle it completely locally without sending a RangeSet request.
IM_ASSERT ( ms - > EndIO . RangeSrcItem = = ms - > EndIO . RangeDstItem ) ; // Setup by else block above
ms - > EndIO . RequestSetRange = true ;
ms - > EndIO . RangeSelected = selected ;
ms - > EndIO . RangeDirection = + 1 ;
}
if ( ! is_multiselect )
{
// Clear selection, set single item range
IM_ASSERT ( ms - > EndIO . RangeSrcItem = = item_data & & ms - > EndIO . RangeDstItem = = item_data ) ; // Setup by block above
ms - > EndIO . RequestClear = true ;
ms - > EndIO . RequestSetRange = true ;
}
}
}
else if ( input_source = = ImGuiInputSource_Keyboard | | input_source = = ImGuiInputSource_Gamepad )
else if ( input_source = = ImGuiInputSource_Keyboard | | input_source = = ImGuiInputSource_Gamepad )
{
{
if ( is_multiselect & & is_shift & & ! is_ctrl )
if ( is_multiselect & & is_shift & & ! is_ctrl ) // Without Shift the RequestClear was done in BeginIO, not necessary to do again.
ms - > EndIO . RequestClear = true ;
ms - > EndIO . RequestClear = true ;
}
else if ( ! is_multiselect )
else if ( ! is_multiselect )
ms - > EndIO . RequestClear = true ;
ms - > EndIO . RequestClear = true ;
}
}
}
// Update/store the selection state of the Source item (used by CTRL+SHIFT, when Source is unselected we perform a range unselect)
// Update/store the selection state of the Source item (used by CTRL+SHIFT, when Source is unselected we perform a range unselect)
if ( ms - > EndIO . RangeSrcItem = = item_data & & is_ctrl & & is_shift & & is_multiselect )
if ( ms - > EndIO . RangeSrcItem = = item_data & & is_ctrl & & is_shift & & is_multiselect )