diff --git a/modules/yup_gui/widgets/yup_ComboBox.cpp b/modules/yup_gui/widgets/yup_ComboBox.cpp index 13ad3260..01134e63 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 62fe1ee0..8c362a81 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/modules/yup_gui/widgets/yup_Label.cpp b/modules/yup_gui/widgets/yup_Label.cpp index 1dce3559..918aa0e8 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; diff --git a/tests/yup_gui/yup_ComboBox.cpp b/tests/yup_gui/yup_ComboBox.cpp index 2ff16245..f623aec7 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);