diff --git a/src/eepp/ui/uidropdownmodellist.cpp b/src/eepp/ui/uidropdownmodellist.cpp index 880f9a7a1..6a68f1c6a 100644 --- a/src/eepp/ui/uidropdownmodellist.cpp +++ b/src/eepp/ui/uidropdownmodellist.cpp @@ -152,29 +152,36 @@ UIDropDownModelList* UIDropDownModelList::showList() { if ( !mModel->hasChildren() ) return this; + const Uint32 itemCount = static_cast( 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 ); diff --git a/src/eepp/ui/uiscrollablewidget.cpp b/src/eepp/ui/uiscrollablewidget.cpp index e8843b912..fc5c16cac 100644 --- a/src/eepp/ui/uiscrollablewidget.cpp +++ b/src/eepp/ui/uiscrollablewidget.cpp @@ -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; diff --git a/src/tests/unit_tests/uidropdownmodellist_tests.cpp b/src/tests/unit_tests/uidropdownmodellist_tests.cpp index 97854e7a4..1f5fd75c2 100644 --- a/src/tests/unit_tests/uidropdownmodellist_tests.cpp +++ b/src/tests/unit_tests/uidropdownmodellist_tests.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include 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() ); } diff --git a/src/tools/ecode/settingspanel.cpp b/src/tools/ecode/settingspanel.cpp index 552534010..479ad2154 100644 --- a/src/tools/ecode/settingspanel.cpp +++ b/src/tools/ecode/settingspanel.cpp @@ -258,7 +258,7 @@ static constexpr const char* SETTINGS_SUBCATEGORY_HEADING_LAYOUT = R"xml( )xml"; static constexpr const char* SETTINGS_BOOL_LAYOUT = R"xml()xml"; static constexpr const char* SETTINGS_CHOICE_LAYOUT = - R"xml()xml"; + R"xml()xml"; static constexpr const char* SETTINGS_EDITABLE_CHOICE_LAYOUT = R"xml()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( "setting_control" ) ) - ->asType(); - dropDown->getListBox()->addListBoxItems( choices ); + ->asType(); + auto model = ItemListOwnerModel::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( "setting_control" ) ) ->asType(); - 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* ) {