2026-03-27 09:51:53 +03:00
# include "ScrollAreaHelpers.hpp"
# include "../GUIManager.hpp"
namespace GUIStuff { namespace ElementHelpers {
2026-04-01 22:28:48 +03:00
ScrollArea * scroll_area_many_entries ( GUIManager & gui , const char * id , const ScrollBarManyEntriesOptions & options ) {
return gui . clipping_element < ScrollArea > ( id , ScrollArea : : Options {
2026-03-27 09:51:53 +03:00
. scrollVertical = true ,
. clipHorizontal = options . clipHorizontal ,
. clipVertical = true ,
. showScrollbarY = true ,
2026-04-01 18:00:22 +03:00
. innerContent = [ & ] ( const ScrollArea : : InnerContentParameters & params ) {
if ( options . innerContentExtraCallback ) options . innerContentExtraCallback ( params ) ;
2026-03-27 09:51:53 +03:00
2026-04-19 17:44:48 +03:00
if ( params . containerDimensions . y ( ) = = 0.0f ) {
if ( options . growing ) {
CLAY_AUTO_ID ( {
. layout = {
. sizing = { . width = CLAY_SIZING_GROW ( 0 ) , . height = CLAY_SIZING_FIXED ( 1 ) } ,
}
} ) { }
}
else {
CLAY_AUTO_ID ( {
. layout = {
. sizing = { . width = CLAY_SIZING_GROW ( 0 ) , . height = CLAY_SIZING_GROW ( 0 ) } ,
}
} ) { }
}
2026-04-19 13:37:16 +03:00
return ;
2026-04-19 17:44:48 +03:00
}
2026-04-19 13:37:16 +03:00
2026-04-05 11:02:48 +03:00
float absScrollAmount = std : : fabs ( params . scrollOffset - > y ( ) ) ;
2026-03-27 09:51:53 +03:00
size_t startPoint = absScrollAmount / options . entryHeight ;
size_t elementsContainable = ( params . containerDimensions . y ( ) / options . entryHeight ) + 2 ; // Displaying 2 more elements ensures that there isn't any empty space in the container
size_t endPoint = std : : min ( options . entryCount , startPoint + elementsContainable ) ;
if ( startPoint ! = 0 ) {
CLAY_AUTO_ID ( {
. layout = {
. sizing = { . width = CLAY_SIZING_GROW ( 0 ) , . height = CLAY_SIZING_FIXED ( startPoint * options . entryHeight ) } ,
}
} ) { }
}
2026-04-19 10:03:57 +03:00
gui . new_id ( " many element list " , [ & ] {
for ( size_t i = startPoint ; i < endPoint ; i + + ) {
2026-04-19 13:37:16 +03:00
gui . new_id ( i - startPoint , [ & ] {
2026-04-19 17:44:48 +03:00
CLAY_AUTO_ID ( {
. layout = { . sizing = { . width = CLAY_SIZING_GROW ( 0 ) , . height = CLAY_SIZING_FIXED ( options . entryHeight ) } }
} ) {
options . elementContent ( i ) ;
}
2026-04-19 10:03:57 +03:00
} ) ;
}
} ) ;
2026-03-27 09:51:53 +03:00
if ( endPoint ! = options . entryCount ) {
CLAY_AUTO_ID ( {
. layout = {
. sizing = { . width = CLAY_SIZING_GROW ( 0 ) , . height = CLAY_SIZING_FIXED ( ( options . entryCount - endPoint ) * options . entryHeight ) } ,
}
} ) { }
}
}
} ) ;
}
} }