mirror of
https://github.com/SpartanJ/eepp.git
synced 2026-09-22 13:01:05 +03:00
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:
@@ -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 );
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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() );
|
||||
}
|
||||
|
||||
@@ -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* ) {
|
||||
|
||||
Reference in New Issue
Block a user