From 11f4594a0de14be55a57f72973574ca1f7074620 Mon Sep 17 00:00:00 2001 From: kunitoki Date: Thu, 4 Jun 2026 10:51:29 +0200 Subject: [PATCH 1/2] Fix combobox --- modules/yup_gui/widgets/yup_ComboBox.cpp | 26 ++++++++++++++++++++++++ modules/yup_gui/widgets/yup_ComboBox.h | 2 ++ tests/yup_gui/yup_ComboBox.cpp | 21 +++++++++++++++++++ 3 files changed, 49 insertions(+) diff --git a/modules/yup_gui/widgets/yup_ComboBox.cpp b/modules/yup_gui/widgets/yup_ComboBox.cpp index 13ad3260d..01134e630 100644 --- a/modules/yup_gui/widgets/yup_ComboBox.cpp +++ b/modules/yup_gui/widgets/yup_ComboBox.cpp @@ -207,10 +207,23 @@ void ComboBox::mouseDown (const MouseEvent& event) { takeKeyboardFocus(); + if (ignoreMouseDownAfterPopupDismissal) + { + ignoreMouseDownAfterPopupDismissal = false; + popupMenu = nullptr; + repaint(); + return; + } + if (popupMenu == nullptr || ! popupMenu->isBeingShown()) + { showPopup(); + } else + { + const auto dismissingFromThisMouseDown = ScopedValueSetter (dismissingPopupFromMouseDown, true); hidePopup(); + } repaint(); } @@ -251,7 +264,20 @@ void ComboBox::showPopup() popupMenu->show ([this] (int selectedItemID) { if (selectedItemID != 0) + { setSelectedId (selectedItemID); + } + else if (! dismissingPopupFromMouseDown) + { + ignoreMouseDownAfterPopupDismissal = true; + + WeakReference self = this; + MessageManager::callAsync ([this, self] + { + if (self.get() != nullptr) + ignoreMouseDownAfterPopupDismissal = false; + }); + } takeKeyboardFocus(); }); diff --git a/modules/yup_gui/widgets/yup_ComboBox.h b/modules/yup_gui/widgets/yup_ComboBox.h index 62fe1ee05..8c362a814 100644 --- a/modules/yup_gui/widgets/yup_ComboBox.h +++ b/modules/yup_gui/widgets/yup_ComboBox.h @@ -199,6 +199,8 @@ class YUP_API ComboBox : public Component StyledText styledText; PopupMenu::Ptr popupMenu; bool textIsEditable = false; + bool ignoreMouseDownAfterPopupDismissal = false; + bool dismissingPopupFromMouseDown = false; YUP_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ComboBox) }; diff --git a/tests/yup_gui/yup_ComboBox.cpp b/tests/yup_gui/yup_ComboBox.cpp index 2ff16245c..f623aec7f 100644 --- a/tests/yup_gui/yup_ComboBox.cpp +++ b/tests/yup_gui/yup_ComboBox.cpp @@ -294,6 +294,27 @@ TEST_F (ComboBoxTest, ComponentIdIsSet) EXPECT_EQ (String ("uniqueComboBoxId"), newComboBox->getComponentID()); } +TEST_F (ComboBoxTest, PopupDismissalClickDoesNotReopenPopup) +{ + comboBox->addItem (kTestText1, kTestId1); + comboBox->addItem (kTestText2, kTestId2); + + MouseEvent clickEvent (MouseEvent::leftButton, KeyModifiers(), Point (10.0f, 10.0f), comboBox.get()); + + comboBox->mouseDown (clickEvent); + ASSERT_TRUE (comboBox->isPopupShown()); + + PopupMenu::dismissAllPopups(); + + comboBox->mouseDown (clickEvent); + EXPECT_FALSE (comboBox->isPopupShown()); + + comboBox->mouseDown (clickEvent); + EXPECT_TRUE (comboBox->isPopupShown()); + + PopupMenu::dismissAllPopups(); +} + TEST_F (ComboBoxTest, BoundsAndSizeWork) { Rectangle bounds (10, 20, 150, 25); From 9d9bbc119e069f9e5316a29cf856ebd07cb23e99 Mon Sep 17 00:00:00 2001 From: kunitoki Date: Thu, 4 Jun 2026 11:03:02 +0200 Subject: [PATCH 2/2] Fix label --- modules/yup_gui/widgets/yup_Label.cpp | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/modules/yup_gui/widgets/yup_Label.cpp b/modules/yup_gui/widgets/yup_Label.cpp index 1dce35598..918aa0e80 100644 --- a/modules/yup_gui/widgets/yup_Label.cpp +++ b/modules/yup_gui/widgets/yup_Label.cpp @@ -126,23 +126,29 @@ void Label::prepareText() if (! needsUpdate) return; - auto fontSize = getHeight() * 0.8f; // TODO - needs config - auto fontToUse = ApplicationTheme::getGlobalTheme()->getDefaultFont().withHeight (fontSize); - if (font) - fontToUse = *font; + auto fontToUse = font.value_or (ApplicationTheme::getGlobalTheme()->getDefaultFont()); + auto setup = [&] (const Font& f) { auto modifier = styledText.startUpdate(); modifier.setMaxSize (getSize()); modifier.setHorizontalAlign (StyledText::horizontalAlignFromJustification (justification)); modifier.setVerticalAlign (StyledText::verticalAlignFromJustification (justification)); - modifier.setOverflow (StyledText::ellipsis); + modifier.setOverflow (StyledText::visible); modifier.setWrap (StyledText::noWrap); - modifier.clear(); - if (text.isNotEmpty()) - modifier.appendText (text, fontToUse); + modifier.appendText (text, f); + }; + + setup (fontToUse); + + if (text.isNotEmpty()) + { + const float availableWidth = static_cast (getWidth()); + const float textWidth = styledText.getComputedTextBounds().getWidth(); + if (availableWidth > 0.0f && textWidth > availableWidth) + setup (fontToUse.withHeight (fontToUse.getHeight() * (availableWidth / textWidth))); } needsUpdate = false;