Some minor optimizations to take advantage of UIDropDownModelList (which is faster) and fixed a couple or minor issues in it.

This commit is contained in:
Martín Lucas Golini
2026-08-24 16:05:38 -03:00
parent 932c00ae4f
commit bc98615590
4 changed files with 47 additions and 25 deletions

View File

@@ -152,29 +152,36 @@ UIDropDownModelList* UIDropDownModelList::showList() {
if ( !mModel->hasChildren() )
return this;
const Uint32 itemCount = static_cast<Uint32>( mModel->rowCount() );
mListView->setVerticalScrollMode( itemCount > mStyleConfig.MaxNumVisibleItems
? ScrollBarMode::AlwaysOn
: ScrollBarMode::AlwaysOff );
Rectf tPadding = mListView->getPadding();
Float sliderValue = 0;
if ( mListView->getVerticalScrollBar() )
sliderValue = mListView->getVerticalScrollBar()->getValue();
Float contentsWidth = eeceil( PixelDensity::pxToDp(
mListView->getMaxColumnContentWidth( 0, true ) +
PixelDensity::dpToPx( mListView->getPadding().getWidth() ) +
( mListView->getVerticalScrollBar()
? mListView->getVerticalScrollBar()->getPixelsSize().getWidth()
: 0.f ) ) );
Float contentsWidth = 0;
if ( mStyleConfig.menuWidthRule != MenuWidthMode::DropDown ) {
contentsWidth = eeceil( PixelDensity::pxToDp(
mListView->getMaxColumnContentWidth( 0, true ) +
PixelDensity::dpToPx( mListView->getPadding().getWidth() ) +
( mListView->getVerticalScrollBar()
? mListView->getVerticalScrollBar()->getPixelsSize().getWidth()
: 0.f ) ) );
}
Float width = getPopUpWidth( contentsWidth );
Float height = std::ceil(
std::ceil( eemin( (Uint32)mModel->rowCount(), mStyleConfig.MaxNumVisibleItems ) *
PixelDensity::pxToDp( mListView->getRowHeight() ) ) +
tPadding.Top + tPadding.Bottom + mListView->getHeaderHeight() +
( mListView->getHorizontalScrollBar() &&
mListView->getHorizontalScrollBar()->isVisible()
? mListView->getHorizontalScrollBar()->getSize().getHeight()
: 0.f ) );
Float height = std::ceil( std::ceil( eemin( itemCount, mStyleConfig.MaxNumVisibleItems ) *
PixelDensity::pxToDp( mListView->getRowHeight() ) ) +
tPadding.Top + tPadding.Bottom + mListView->getHeaderHeight() +
( mListView->getHorizontalScrollBar() &&
mListView->getHorizontalScrollBar()->isVisible()
? mListView->getHorizontalScrollBar()->getSize().getHeight()
: 0.f ) );
mListView->setSize( width, height );

View File

@@ -122,10 +122,11 @@ void UIScrollableWidget::onContentSizeChange() {
} else if ( ScrollBarMode::AlwaysOff == mVScrollMode ) {
mVScroll->setVisible( false )->setEnabled( false );
} else {
Float totH =
getPixelsSize().getHeight() - getPixelsPadding().Top - getPixelsPadding().Bottom -
( ScrollBarMode::AlwaysOff == mHScrollMode ? 0
: mHScroll->getPixelsSize().getHeight() );
Float totH = getPixelsSize().getHeight() - getPixelsPadding().Top -
getPixelsPadding().Bottom -
( ScrollBarMode::AlwaysOff == mHScrollMode || !mHScroll->isVisible()
? 0
: mHScroll->getPixelsSize().getHeight() );
bool visible = contentSize.getHeight() > totH;

View File

@@ -7,6 +7,7 @@
#include <eepp/ui/uiapplication.hpp>
#include <eepp/ui/uidropdownmodellist.hpp>
#include <eepp/ui/uiscenenode.hpp>
#include <eepp/ui/uiscrollbar.hpp>
#include <eepp/window/engine.hpp>
using namespace EE;
@@ -38,6 +39,14 @@ UTEST( UIDropDownModelList, basicFunctionality ) {
EXPECT_EQ( dropDown->getListView()->getModel()->rowCount(), 3ul );
// Max visible items
dropDown->setSize( 200, 30 );
dropDown->setMaxNumVisibleItems( 3 );
dropDown->showList();
EXPECT_FALSE( dropDown->getListView()->getVerticalScrollBar()->isVisible() );
dropDown->getListView()->setVisible( false );
dropDown->setMaxNumVisibleItems( 2 );
dropDown->showList();
EXPECT_EQ( dropDown->getMaxNumVisibleItems(), 2ul );
EXPECT_TRUE( dropDown->getListView()->getVerticalScrollBar()->isVisible() );
}

View File

@@ -258,7 +258,7 @@ static constexpr const char* SETTINGS_SUBCATEGORY_HEADING_LAYOUT = R"xml(
)xml";
static constexpr const char* SETTINGS_BOOL_LAYOUT = R"xml(<CheckBox class="settings_bool" />)xml";
static constexpr const char* SETTINGS_CHOICE_LAYOUT =
R"xml(<DropDownList class="settings_choice" />)xml";
R"xml(<DropDownModelList class="settings_choice" />)xml";
static constexpr const char* SETTINGS_EDITABLE_CHOICE_LAYOUT =
R"xml(<ComboBox class="settings_editable_choice" popup-to-root="true" />)xml";
static constexpr const char* SETTINGS_INTEGER_LAYOUT =
@@ -539,18 +539,22 @@ void SettingsPanel::addChoice( PanelState& panel, SettingBinding binding,
auto* dropDown = mApp->getUISceneNode()
->loadLayoutFromString( SETTINGS_CHOICE_LAYOUT,
row->find<UILinearLayout>( "setting_control" ) )
->asType<UIDropDownList>();
dropDown->getListBox()->addListBoxItems( choices );
->asType<UIDropDownModelList>();
auto model = ItemListOwnerModel<String>::create( choices );
dropDown->setModel( model );
const size_t selected = get();
dropDown->getListBox()->setSelected( selected );
if ( selected < choices.size() ) {
dropDown->getListView()->getSelection().set( model->index( selected, 0 ) );
dropDown->setText( choices[selected] );
}
if ( selected < choiceDescriptions.size() )
dropDown->setTooltipText( choiceDescriptions[selected] );
panel.connections += dropDown->connect(
Event::OnValueChange, [dropDown, set = std::move( set ),
descriptions = std::move( choiceDescriptions )]( const Event* ) {
if ( !dropDown->getListBox()->hasSelection() )
if ( dropDown->getListView()->getSelection().isEmpty() )
return;
const size_t selected = dropDown->getListBox()->getItemSelectedIndex();
const size_t selected = dropDown->getListView()->getSelection().first().row();
if ( selected < descriptions.size() )
dropDown->setTooltipText( descriptions[selected] );
set( selected );
@@ -567,7 +571,8 @@ void SettingsPanel::addEditableChoice( PanelState& panel, SettingBinding binding
->loadLayoutFromString( SETTINGS_EDITABLE_CHOICE_LAYOUT,
row->find<UILinearLayout>( "setting_control" ) )
->asType<UIComboBox>();
combo->getListBox()->addListBoxItems( choices );
for ( const auto& choice : choices )
combo->getListBox()->addListBoxItem( choice );
combo->setText( get() );
panel.connections +=
combo->connect( Event::OnValueChange, [combo, set = std::move( set )]( const Event* ) {