Added default text to ComboBox which is displayed when no item is selected

0.8
Bruno Van de Velde 2019-03-10 19:35:15 +01:00
parent 6557785d51
commit 822fa05179
8 changed files with 132 additions and 2 deletions

View File

@ -1,6 +1,8 @@
TGUI 0.8.5 (TBD)
-----------------
- Svg images are now supported
- ComboBox can now contain some text when no item is selected
- Added RightClicked signal to ListView
- Added functions to ListView to change existing items
- ChildWindow can now have a different border color in focused state

View File

@ -50,6 +50,8 @@ struct ComboBoxProperties : WidgetProperties
comboBox->setItemsToDisplay(static_cast<std::size_t>(tgui::stoi(value)));
else if (property == "TextSize")
comboBox->setTextSize(static_cast<unsigned int>(tgui::stoi(value)));
else if (property == "DefaultText")
comboBox->setDefaultText(value);
else if (property == "MaximumItems")
comboBox->setMaximumItems(static_cast<unsigned int>(tgui::stoi(value)));
else if (property == "ExpandDirection")
@ -74,6 +76,7 @@ struct ComboBoxProperties : WidgetProperties
pair.second["Padding"] = {"Outline", renderer->getPadding().toString()};
pair.second["BackgroundColor"] = {"Color", tgui::Serializer::serialize(renderer->getBackgroundColor())};
pair.second["TextColor"] = {"Color", tgui::Serializer::serialize(renderer->getTextColor())};
pair.second["DefaultTextColor"] = {"Color", tgui::Serializer::serialize(renderer->getDefaultTextColor())};
pair.second["ArrowColor"] = {"Color", tgui::Serializer::serialize(renderer->getArrowColor())};
pair.second["ArrowColorHover"] = {"Color", tgui::Serializer::serialize(renderer->getArrowColorHover())};
pair.second["ArrowBackgroundColor"] = {"Color", tgui::Serializer::serialize(renderer->getArrowBackgroundColor())};
@ -83,6 +86,7 @@ struct ComboBoxProperties : WidgetProperties
pair.second["TextureArrow"] = {"Texture", tgui::Serializer::serialize(renderer->getTextureArrow())};
pair.second["TextureArrowHover"] = {"Texture", tgui::Serializer::serialize(renderer->getTextureArrowHover())};
pair.second["TextStyle"] = {"TextStyle", tgui::Serializer::serialize(renderer->getTextStyle())};
pair.second["DefaultTextStyle"] = {"TextStyle", tgui::Serializer::serialize(renderer->getDefaultTextStyle())};
return pair;
}

View File

@ -94,6 +94,26 @@ namespace tgui
TextStyle getTextStyle() const;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @brief Changes the text style of the default text (the text drawn when no item is selected)
///
/// @param style The new default text style
///
/// @code
/// comboBox->getSharedRenderer()->setDefaultTextStyle(sf::Text::Italic | sf::Text::Bold);
/// @endcode
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setDefaultTextStyle(TextStyle style);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @brief Returns the text style of the default text (the text drawn when no item is selected)
///
/// @return Style of the default text
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
TextStyle getDefaultTextStyle() const;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @brief Changes the background color of the combo box
///
@ -130,6 +150,22 @@ namespace tgui
Color getTextColor() const;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @brief Sets the color of the default text that can optionally be displayed when no item is selected
///
/// @param defaultTextColor The new default text color
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setDefaultTextColor(Color defaultTextColor);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @brief Returns the color of the default text that can optionally be displayed when no item is selected
///
/// @return Default text color
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Color getDefaultTextColor() const;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @brief Changes the color behind the arrow
///

View File

@ -455,6 +455,22 @@ namespace tgui
unsigned int getTextSize() const;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @brief Changes the default text of the combo box. This is the text drawn when no item is selected.
///
/// @param defaultText The new default text
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setDefaultText(const sf::String& defaultText);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @brief Returns the default text of the combo box. This is the text drawn when no item is selected.
///
/// @return The default text of the combo box
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
const sf::String& getDefaultText() const;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @brief Changes the side where the list is displayed
/// @param direction On which side of the combo box should the list be displayed?
@ -612,6 +628,7 @@ namespace tgui
ListBox::Ptr m_listBox = ListBox::create();
Text m_text;
Text m_defaultText;
#ifdef TGUI_NEXT
ExpandDirection m_expandDirection = ExpandDirection::Automatic;

View File

@ -35,6 +35,7 @@ namespace tgui
TGUI_RENDERER_PROPERTY_COLOR(ComboBoxRenderer, BackgroundColor, Color::White)
TGUI_RENDERER_PROPERTY_COLOR(ComboBoxRenderer, TextColor, Color::Black)
TGUI_RENDERER_PROPERTY_COLOR(ComboBoxRenderer, DefaultTextColor, {})
TGUI_RENDERER_PROPERTY_COLOR(ComboBoxRenderer, ArrowBackgroundColor, Color::White)
TGUI_RENDERER_PROPERTY_COLOR(ComboBoxRenderer, ArrowBackgroundColorHover, {})
TGUI_RENDERER_PROPERTY_COLOR(ComboBoxRenderer, ArrowColor, Color::Black)
@ -46,6 +47,7 @@ namespace tgui
TGUI_RENDERER_PROPERTY_TEXTURE(ComboBoxRenderer, TextureArrowHover)
TGUI_RENDERER_PROPERTY_TEXT_STYLE(ComboBoxRenderer, TextStyle, sf::Text::Regular)
TGUI_RENDERER_PROPERTY_TEXT_STYLE(ComboBoxRenderer, DefaultTextStyle, {})
TGUI_RENDERER_PROPERTY_RENDERER(ComboBoxRenderer, ListBox, "listbox")
}

View File

@ -40,6 +40,7 @@ namespace tgui
m_type = "ComboBox";
m_draggableWidget = true;
m_text.setFont(m_fontCached);
m_defaultText.setFont(m_fontCached);
initListBox();
@ -59,6 +60,7 @@ namespace tgui
m_nrOfItemsToDisplay {other.m_nrOfItemsToDisplay},
m_listBox {ListBox::copy(other.m_listBox)},
m_text {other.m_text},
m_defaultText {other.m_defaultText},
m_expandDirection {other.m_expandDirection},
m_spriteBackground {other.m_spriteBackground},
m_spriteArrow {other.m_spriteArrow},
@ -83,6 +85,7 @@ namespace tgui
m_nrOfItemsToDisplay {std::move(other.m_nrOfItemsToDisplay)},
m_listBox {std::move(other.m_listBox)},
m_text {std::move(other.m_text)},
m_defaultText {std::move(other.m_defaultText)},
m_expandDirection {std::move(other.m_expandDirection)},
m_spriteBackground {std::move(other.m_spriteBackground)},
m_spriteArrow {std::move(other.m_spriteArrow)},
@ -112,6 +115,7 @@ namespace tgui
std::swap(m_nrOfItemsToDisplay, temp.m_nrOfItemsToDisplay);
std::swap(m_listBox, temp.m_listBox);
std::swap(m_text, temp.m_text);
std::swap(m_defaultText, temp.m_defaultText);
std::swap(m_expandDirection, temp.m_expandDirection);
std::swap(m_spriteBackground, temp.m_spriteBackground);
std::swap(m_spriteArrow, temp.m_spriteArrow);
@ -140,6 +144,7 @@ namespace tgui
m_nrOfItemsToDisplay = std::move(other.m_nrOfItemsToDisplay);
m_listBox = std::move(other.m_listBox);
m_text = std::move(other.m_text);
m_defaultText = std::move(other.m_defaultText);
m_expandDirection = std::move(other.m_expandDirection);
m_spriteBackground = std::move(other.m_spriteBackground);
m_spriteArrow = std::move(other.m_spriteArrow);
@ -228,6 +233,7 @@ namespace tgui
}
m_text.setCharacterSize(m_listBox->getTextSize());
m_defaultText.setCharacterSize(m_listBox->getTextSize());
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -443,6 +449,7 @@ namespace tgui
{
m_listBox->setTextSize(textSize);
m_text.setCharacterSize(m_listBox->getTextSize());
m_defaultText.setCharacterSize(m_listBox->getTextSize());
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -454,6 +461,20 @@ namespace tgui
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void ComboBox::setDefaultText(const sf::String& defaultText)
{
m_defaultText.setString(defaultText);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
const sf::String& ComboBox::getDefaultText() const
{
return m_defaultText.getString();
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void ComboBox::setExpandDirection(ExpandDirection direction)
{
m_expandDirection = direction;
@ -581,10 +602,28 @@ namespace tgui
else if (property == "textcolor")
{
m_text.setColor(getSharedRenderer()->getTextColor());
if (!getSharedRenderer()->getDefaultTextColor().isSet())
m_defaultText.setColor(getSharedRenderer()->getTextColor());
}
else if (property == "textstyle")
{
m_text.setStyle(getSharedRenderer()->getTextStyle());
if (!getSharedRenderer()->getDefaultTextStyle().isSet())
m_defaultText.setStyle(getSharedRenderer()->getTextStyle());
}
else if (property == "defaulttextcolor")
{
if (getSharedRenderer()->getDefaultTextColor().isSet())
m_defaultText.setColor(getSharedRenderer()->getDefaultTextColor());
else
m_defaultText.setColor(getSharedRenderer()->getTextColor());
}
else if (property == "defaulttextstyle")
{
if (getSharedRenderer()->getDefaultTextStyle().isSet())
m_defaultText.setStyle(getSharedRenderer()->getDefaultTextStyle());
else
m_defaultText.setStyle(getSharedRenderer()->getTextStyle());
}
else if (property == "texturebackground")
{
@ -636,12 +675,14 @@ namespace tgui
m_spriteArrowHover.setOpacity(m_opacityCached);
m_text.setOpacity(m_opacityCached);
m_defaultText.setOpacity(m_opacityCached);
}
else if (property == "font")
{
Widget::rendererChanged(property);
m_text.setFont(m_fontCached);
m_defaultText.setFont(m_fontCached);
m_listBox->setInheritedFont(m_fontCached);
setSize(m_size);
@ -910,13 +951,18 @@ namespace tgui
}
// Draw the selected item
if (!m_text.getString().isEmpty())
const int selectedItemIndex = getSelectedItemIndex();
if (((selectedItemIndex >= 0) && !m_text.getString().isEmpty()) || ((selectedItemIndex == -1) && !m_defaultText.getString().isEmpty()))
{
const Clipping clipping{target, statesForText, {m_paddingCached.getLeft(), m_paddingCached.getTop()}, {getInnerSize().x - m_paddingCached.getLeft() - m_paddingCached.getRight() - arrowSize, getInnerSize().y - m_paddingCached.getTop() - m_paddingCached.getBottom()}};
statesForText.transform.translate(m_paddingCached.getLeft() + m_text.getExtraHorizontalPadding(),
m_paddingCached.getTop() + (((getInnerSize().y - m_paddingCached.getTop() - m_paddingCached.getBottom()) - m_text.getSize().y) / 2.0f));
m_text.draw(target, statesForText);
if (selectedItemIndex >= 0)
m_text.draw(target, statesForText);
else
m_defaultText.draw(target, statesForText);
}
}

View File

@ -246,6 +246,13 @@ TEST_CASE("[ComboBox]")
REQUIRE(comboBox->getTextSize() == 25);
}
SECTION("DefaultText")
{
REQUIRE(comboBox->getDefaultText().isEmpty());
comboBox->setDefaultText("Hello");
REQUIRE(comboBox->getDefaultText() == "Hello");
}
SECTION("ExpandDirection")
{
REQUIRE(comboBox->getExpandDirection() == tgui::ComboBox::ExpandDirection::Down);
@ -353,10 +360,12 @@ TEST_CASE("[ComboBox]")
REQUIRE_NOTHROW(renderer->setProperty("ArrowColor", "rgb(50, 60, 70)"));
REQUIRE_NOTHROW(renderer->setProperty("ArrowColorHover", "rgb(60, 70, 80)"));
REQUIRE_NOTHROW(renderer->setProperty("TextColor", "rgb(70, 80, 90)"));
REQUIRE_NOTHROW(renderer->setProperty("DefaultTextColor", "rgb(110, 120, 130)"));
REQUIRE_NOTHROW(renderer->setProperty("BorderColor", "rgb(80, 90, 100)"));
REQUIRE_NOTHROW(renderer->setProperty("Borders", "(1, 2, 3, 4)"));
REQUIRE_NOTHROW(renderer->setProperty("Padding", "(5, 6, 7, 8)"));
REQUIRE_NOTHROW(renderer->setProperty("TextStyle", "Bold"));
REQUIRE_NOTHROW(renderer->setProperty("DefaultTextStyle", "Italic"));
REQUIRE_NOTHROW(renderer->setProperty("ListBox", "{ BackgroundColor = Red; TextColor = Blue; }"));
}
@ -368,10 +377,12 @@ TEST_CASE("[ComboBox]")
REQUIRE_NOTHROW(renderer->setProperty("ArrowColor", sf::Color{50, 60, 70}));
REQUIRE_NOTHROW(renderer->setProperty("ArrowColorHover", sf::Color{60, 70, 80}));
REQUIRE_NOTHROW(renderer->setProperty("TextColor", sf::Color{70, 80, 90}));
REQUIRE_NOTHROW(renderer->setProperty("DefaultTextColor", sf::Color{110, 120, 130}));
REQUIRE_NOTHROW(renderer->setProperty("BorderColor", sf::Color{80, 90, 100}));
REQUIRE_NOTHROW(renderer->setProperty("Borders", tgui::Borders{1, 2, 3, 4}));
REQUIRE_NOTHROW(renderer->setProperty("Padding", tgui::Borders{5, 6, 7, 8}));
REQUIRE_NOTHROW(renderer->setProperty("TextStyle", sf::Text::Bold));
REQUIRE_NOTHROW(renderer->setProperty("DefaultTextStyle", sf::Text::Italic));
REQUIRE_NOTHROW(renderer->setProperty("ListBox", listBoxRenderer.getData()));
}
@ -383,10 +394,12 @@ TEST_CASE("[ComboBox]")
renderer->setArrowColor({50, 60, 70});
renderer->setArrowColorHover({60, 70, 80});
renderer->setTextColor({70, 80, 90});
renderer->setDefaultTextColor({110, 120, 130});
renderer->setBorderColor({80, 90, 100});
renderer->setBorders({1, 2, 3, 4});
renderer->setPadding({5, 6, 7, 8});
renderer->setTextStyle(sf::Text::Bold);
renderer->setDefaultTextStyle(sf::Text::Italic);
renderer->setListBox(listBoxRenderer.getData());
}
@ -396,10 +409,12 @@ TEST_CASE("[ComboBox]")
REQUIRE(renderer->getProperty("ArrowColor").getColor() == sf::Color(50, 60, 70));
REQUIRE(renderer->getProperty("ArrowColorHover").getColor() == sf::Color(60, 70, 80));
REQUIRE(renderer->getProperty("TextColor").getColor() == sf::Color(70, 80, 90));
REQUIRE(renderer->getProperty("DefaultTextColor").getColor() == sf::Color(110, 120, 130));
REQUIRE(renderer->getProperty("BorderColor").getColor() == sf::Color(80, 90, 100));
REQUIRE(renderer->getProperty("Borders").getOutline() == tgui::Borders(1, 2, 3, 4));
REQUIRE(renderer->getProperty("Padding").getOutline() == tgui::Borders(5, 6, 7, 8));
REQUIRE(renderer->getProperty("TextStyle").getTextStyle() == sf::Text::Bold);
REQUIRE(renderer->getProperty("DefaultTextStyle").getTextStyle() == sf::Text::Italic);
REQUIRE(renderer->getListBox()->propertyValuePairs.size() == 2);
REQUIRE(renderer->getListBox()->propertyValuePairs["backgroundcolor"].getColor() == sf::Color::Red);
@ -468,11 +483,13 @@ TEST_CASE("[ComboBox]")
tgui::ComboBoxRenderer renderer = tgui::RendererData::create();
renderer.setBackgroundColor(sf::Color::Green);
renderer.setTextColor(sf::Color::Red);
renderer.setDefaultTextColor(sf::Color::White);
renderer.setBorderColor(sf::Color::Blue);
renderer.setArrowBackgroundColor(sf::Color::Cyan);
renderer.setArrowColor(sf::Color::Magenta);
renderer.setBorders({1, 2, 3, 4});
renderer.setTextStyle(sf::Text::Italic);
renderer.setDefaultTextStyle(sf::Text::Italic);
renderer.setOpacity(0.7f);
comboBox->setRenderer(renderer.getData());
@ -593,5 +610,11 @@ TEST_CASE("[ComboBox]")
}
}
}
SECTION("Default text")
{
comboBox->setDefaultText("Test");
TEST_DRAW("ComboBox_DefaultText.png")
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB