Added event and draw tests for ListBox
@ -362,6 +362,20 @@ namespace tgui
|
||||
Widget::Ptr askToolTip(Vector2f mousePos) override;
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/// @internal
|
||||
// This function is called every frame with the time passed since the last frame.
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
void update(sf::Time elapsedTime) override;
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/// @internal
|
||||
// The function returns true when the event is consumed and false when the event was ignored by all widgets.
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
bool handleEvent(sf::Event& event);
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
protected:
|
||||
|
||||
@ -387,18 +401,6 @@ namespace tgui
|
||||
void load(const std::unique_ptr<DataIO::Node>& node, const LoadingRenderersMap& renderers) override;
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// This function is called every frame with the time passed since the last frame.
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
void update(sf::Time elapsedTime) override;
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// The function returns true when the event is consumed and false when the event was ignored by all widgets.
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
bool handleEvent(sf::Event& event);
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Checks above which widget the mouse is standing.
|
||||
// If there is no widget below the mouse then this function will return a null pointer.
|
||||
|
@ -24,6 +24,7 @@
|
||||
|
||||
#include "Tests.hpp"
|
||||
#include <TGUI/Widgets/ListBox.hpp>
|
||||
#include <TGUI/Widgets/Group.hpp>
|
||||
|
||||
TEST_CASE("[ListBox]")
|
||||
{
|
||||
@ -271,14 +272,153 @@ TEST_CASE("[ListBox]")
|
||||
REQUIRE(listBox->getItems()[2] == "Item 3");
|
||||
}
|
||||
|
||||
SECTION("AutoScroll")
|
||||
{
|
||||
REQUIRE(listBox->getAutoScroll());
|
||||
listBox->setAutoScroll(false);
|
||||
REQUIRE(!listBox->getAutoScroll());
|
||||
listBox->setAutoScroll(true);
|
||||
REQUIRE(listBox->getAutoScroll());
|
||||
}
|
||||
|
||||
SECTION("Events / Signals")
|
||||
{
|
||||
auto container = tgui::Group::create({400.f, 300.f});
|
||||
container->add(listBox);
|
||||
|
||||
auto mouseMoved = [container](sf::Vector2i pos){
|
||||
sf::Event event;
|
||||
event.type = sf::Event::MouseMoved;
|
||||
event.mouseMove.x = pos.x;
|
||||
event.mouseMove.y = pos.y;
|
||||
container->handleEvent(event);
|
||||
};
|
||||
auto mousePressed = [container](sf::Vector2i pos){
|
||||
sf::Event event;
|
||||
event.type = sf::Event::MouseButtonPressed;
|
||||
event.mouseButton.button = sf::Mouse::Left;
|
||||
event.mouseButton.x = pos.x;
|
||||
event.mouseButton.y = pos.y;
|
||||
container->handleEvent(event);
|
||||
};
|
||||
auto mouseReleased = [container](sf::Vector2i pos){
|
||||
sf::Event event;
|
||||
event.type = sf::Event::MouseButtonReleased;
|
||||
event.mouseButton.button = sf::Mouse::Left;
|
||||
event.mouseButton.x = pos.x;
|
||||
event.mouseButton.y = pos.y;
|
||||
container->handleEvent(event);
|
||||
};
|
||||
|
||||
listBox->setPosition(10, 20);
|
||||
listBox->setSize(120, 64);
|
||||
listBox->setItemHeight(20);
|
||||
listBox->getRenderer()->setBorders(2);
|
||||
listBox->getRenderer()->setScrollbarWidth(10);
|
||||
|
||||
listBox->addItem("Item 1");
|
||||
listBox->addItem("Item 2");
|
||||
listBox->addItem("Item 3");
|
||||
|
||||
SECTION("Widget")
|
||||
{
|
||||
testWidgetSignals(listBox);
|
||||
}
|
||||
|
||||
// TODO
|
||||
unsigned int itemSelectedCount = 0;
|
||||
unsigned int doubleClickedCount = 0;
|
||||
listBox->connect("ItemSelected", &genericCallback, std::ref(itemSelectedCount));
|
||||
listBox->connect("DoubleClicked", &genericCallback, std::ref(doubleClickedCount));
|
||||
|
||||
SECTION("Click on item")
|
||||
{
|
||||
// Clicking the border does nothing
|
||||
mouseMoved({11, 21});
|
||||
mousePressed({11, 21});
|
||||
mouseReleased({11, 21});
|
||||
REQUIRE(itemSelectedCount == 0);
|
||||
REQUIRE(listBox->getSelectedItemIndex() == -1);
|
||||
|
||||
// Select the first item
|
||||
mouseMoved({12, 22});
|
||||
mousePressed({12, 22});
|
||||
mouseReleased({12, 22});
|
||||
REQUIRE(itemSelectedCount == 1);
|
||||
REQUIRE(listBox->getSelectedItemIndex() == 0);
|
||||
|
||||
// Select the third item
|
||||
mousePressed({40, 70});
|
||||
mouseReleased({40, 70});
|
||||
REQUIRE(itemSelectedCount == 2);
|
||||
REQUIRE(listBox->getSelectedItemIndex() == 2);
|
||||
|
||||
SECTION("Double click")
|
||||
{
|
||||
// If a click happens a long time after the previous click then it isn't a double click
|
||||
container->update(sf::milliseconds(10000));
|
||||
mousePressed({40, 70});
|
||||
mouseReleased({40, 70});
|
||||
REQUIRE(doubleClickedCount == 0);
|
||||
|
||||
container->update(sf::milliseconds(5));
|
||||
mousePressed({40, 70});
|
||||
mouseReleased({40, 70});
|
||||
REQUIRE(doubleClickedCount == 1);
|
||||
REQUIRE(itemSelectedCount == 2);
|
||||
REQUIRE(listBox->getSelectedItemIndex() == 2);
|
||||
|
||||
// Third click is not registered as another double click
|
||||
mousePressed({40, 70});
|
||||
mouseReleased({40, 70});
|
||||
REQUIRE(doubleClickedCount == 1);
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("Scrollbar interaction")
|
||||
{
|
||||
// There is no scrollbar yet
|
||||
mousePressed({127, 81});
|
||||
mouseReleased({127, 81});
|
||||
REQUIRE(itemSelectedCount == 1);
|
||||
REQUIRE(listBox->getSelectedItemIndex() == 2);
|
||||
|
||||
listBox->addItem("Item 4");
|
||||
|
||||
// Clicking on scrollbar arrow down
|
||||
mousePressed({127, 81});
|
||||
mouseReleased({127, 81});
|
||||
|
||||
// Dragging scrollbar thumb
|
||||
mouseMoved({125, 50});
|
||||
mousePressed({125, 50});
|
||||
mouseMoved({125, 45});
|
||||
mouseReleased({125, 45});
|
||||
REQUIRE(itemSelectedCount == 1);
|
||||
REQUIRE(listBox->getSelectedItemIndex() == 2);
|
||||
|
||||
// Select the second and then third item
|
||||
mouseMoved({40, 51});
|
||||
mousePressed({40, 51});
|
||||
REQUIRE(itemSelectedCount == 2);
|
||||
REQUIRE(listBox->getSelectedItemIndex() == 1);
|
||||
mouseMoved({40, 52});
|
||||
REQUIRE(itemSelectedCount == 3);
|
||||
REQUIRE(listBox->getSelectedItemIndex() == 2);
|
||||
|
||||
listBox->setAutoScroll(false);
|
||||
listBox->addItem("Item 5");
|
||||
listBox->addItem("Item 6");
|
||||
listBox->addItem("Item 7");
|
||||
listBox->addItem("Item 8");
|
||||
listBox->addItem("Item 9");
|
||||
|
||||
// Scrolling down with mouse wheel
|
||||
container->mouseWheelScrolled(-1, {40, 70});
|
||||
container->mouseWheelScrolled(-1, {40, 70});
|
||||
|
||||
mousePressed({40, 52});
|
||||
REQUIRE(listBox->getSelectedItemIndex() == 4);
|
||||
}
|
||||
}
|
||||
|
||||
testWidgetRenderer(listBox->getRenderer());
|
||||
@ -308,6 +448,7 @@ TEST_CASE("[ListBox]")
|
||||
REQUIRE_NOTHROW(renderer->setProperty("TextStyle", "Bold"));
|
||||
REQUIRE_NOTHROW(renderer->setProperty("SelectedTextStyle", "Italic"));
|
||||
REQUIRE_NOTHROW(renderer->setProperty("Scrollbar", "{ TrackColor = Red; ThumbColor = Blue; }"));
|
||||
REQUIRE_NOTHROW(renderer->setProperty("ScrollbarWidth", "15"));
|
||||
}
|
||||
|
||||
SECTION("set object property")
|
||||
@ -326,6 +467,7 @@ TEST_CASE("[ListBox]")
|
||||
REQUIRE_NOTHROW(renderer->setProperty("TextStyle", sf::Text::Bold));
|
||||
REQUIRE_NOTHROW(renderer->setProperty("SelectedTextStyle", sf::Text::Italic));
|
||||
REQUIRE_NOTHROW(renderer->setProperty("Scrollbar", scrollbarRenderer.getData()));
|
||||
REQUIRE_NOTHROW(renderer->setProperty("ScrollbarWidth", 15));
|
||||
}
|
||||
|
||||
SECTION("functions")
|
||||
@ -344,6 +486,7 @@ TEST_CASE("[ListBox]")
|
||||
renderer->setTextStyle(sf::Text::Bold);
|
||||
renderer->setSelectedTextStyle(sf::Text::Italic);
|
||||
renderer->setScrollbar(scrollbarRenderer.getData());
|
||||
renderer->setScrollbarWidth(15);
|
||||
}
|
||||
|
||||
REQUIRE(renderer->getProperty("BackgroundColor").getColor() == sf::Color(20, 30, 40));
|
||||
@ -359,6 +502,7 @@ TEST_CASE("[ListBox]")
|
||||
REQUIRE(renderer->getProperty("Padding").getOutline() == tgui::Borders(5, 6, 7, 8));
|
||||
REQUIRE(renderer->getProperty("TextStyle").getTextStyle() == sf::Text::Bold);
|
||||
REQUIRE(renderer->getProperty("SelectedTextStyle").getTextStyle() == sf::Text::Italic);
|
||||
REQUIRE(renderer->getProperty("ScrollbarWidth").getNumber() == 15);
|
||||
|
||||
REQUIRE(renderer->getScrollbar()->propertyValuePairs.size() == 2);
|
||||
REQUIRE(renderer->getScrollbar()->propertyValuePairs["trackcolor"].getColor() == sf::Color::Red);
|
||||
@ -404,4 +548,181 @@ TEST_CASE("[ListBox]")
|
||||
|
||||
testSavingWidget("ListBox", listBox);
|
||||
}
|
||||
|
||||
SECTION("Draw")
|
||||
{
|
||||
TEST_DRAW_INIT(80, 70, listBox)
|
||||
|
||||
listBox->setEnabled(true);
|
||||
listBox->setPosition(10, 5);
|
||||
listBox->setSize(60, 60);
|
||||
listBox->setTextSize(14);
|
||||
listBox->setItemHeight(18);
|
||||
|
||||
tgui::ListBoxRenderer renderer = tgui::RendererData::create();
|
||||
renderer.setBackgroundColor(sf::Color::Green);
|
||||
renderer.setTextColor(sf::Color::Red);
|
||||
renderer.setSelectedBackgroundColor(sf::Color::White);
|
||||
renderer.setSelectedTextColor(sf::Color::Black);
|
||||
renderer.setBorderColor(sf::Color::Blue);
|
||||
renderer.setBorders({1, 2, 3, 4});
|
||||
renderer.setPadding({4, 3, 2, 1});
|
||||
renderer.setTextStyle(sf::Text::Italic);
|
||||
renderer.setSelectedTextStyle(sf::Text::Bold);
|
||||
renderer.setScrollbarWidth(14);
|
||||
renderer.setOpacity(0.7f);
|
||||
listBox->setRenderer(renderer.getData());
|
||||
|
||||
auto setHoverRenderer = [&]{
|
||||
renderer.setBackgroundColorHover(sf::Color::Yellow);
|
||||
renderer.setTextColorHover(sf::Color::Magenta);
|
||||
renderer.setSelectedBackgroundColorHover(sf::Color::Cyan);
|
||||
renderer.setSelectedTextColorHover("#808080");
|
||||
};
|
||||
|
||||
listBox->addItem("1");
|
||||
listBox->addItem("2");
|
||||
listBox->addItem("3");
|
||||
listBox->addItem("4");
|
||||
listBox->addItem("5");
|
||||
listBox->addItem("6");
|
||||
|
||||
const sf::Vector2f mousePos1{30, 20};
|
||||
const sf::Vector2f mousePos2{30, 35};
|
||||
const sf::Vector2f mousePos3{30, 50};
|
||||
|
||||
SECTION("Colored")
|
||||
{
|
||||
SECTION("No selected item")
|
||||
{
|
||||
SECTION("No hover")
|
||||
{
|
||||
TEST_DRAW("ListBox_NoSelectedNoHover.png")
|
||||
}
|
||||
|
||||
SECTION("Hover")
|
||||
{
|
||||
listBox->mouseMoved(mousePos2);
|
||||
|
||||
SECTION("No hover properties set")
|
||||
{
|
||||
TEST_DRAW("ListBox_NoSelectedHover_NoHoverSet.png")
|
||||
}
|
||||
SECTION("Hover properties set")
|
||||
{
|
||||
setHoverRenderer();
|
||||
TEST_DRAW("ListBox_NoSelectedHover_HoverSet.png")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("Selected item")
|
||||
{
|
||||
listBox->setSelectedItem("4");
|
||||
|
||||
SECTION("No hover")
|
||||
{
|
||||
TEST_DRAW("ListBox_SelectedNoHover.png")
|
||||
}
|
||||
|
||||
SECTION("Hover selected")
|
||||
{
|
||||
listBox->mouseMoved(mousePos1);
|
||||
|
||||
SECTION("No hover properties set")
|
||||
{
|
||||
TEST_DRAW("ListBox_SelectedHoverSelected_NoHoverSet.png")
|
||||
}
|
||||
SECTION("Hover properties set")
|
||||
{
|
||||
setHoverRenderer();
|
||||
TEST_DRAW("ListBox_SelectedHoverSelected_HoverSet.png")
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("Hover other")
|
||||
{
|
||||
listBox->mouseMoved(mousePos3);
|
||||
|
||||
SECTION("No hover properties set")
|
||||
{
|
||||
TEST_DRAW("ListBox_SelectedHoverOther_NoHoverSet.png")
|
||||
}
|
||||
SECTION("Hover properties set")
|
||||
{
|
||||
setHoverRenderer();
|
||||
TEST_DRAW("ListBox_SelectedHoverOther_HoverSet.png")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("Textured")
|
||||
{
|
||||
renderer.setTextureBackground("resources/Texture1.png");
|
||||
|
||||
SECTION("No selected item")
|
||||
{
|
||||
SECTION("No hover")
|
||||
{
|
||||
TEST_DRAW("ListBox_NoSelectedNoHover_Texture.png")
|
||||
}
|
||||
|
||||
SECTION("Hover")
|
||||
{
|
||||
listBox->mouseMoved(mousePos2);
|
||||
|
||||
SECTION("No hover properties set")
|
||||
{
|
||||
TEST_DRAW("ListBox_NoSelectedHover_NoHoverSet_Texture.png")
|
||||
}
|
||||
SECTION("Hover properties set")
|
||||
{
|
||||
setHoverRenderer();
|
||||
TEST_DRAW("ListBox_NoSelectedHover_HoverSet_Texture.png")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("Selected item")
|
||||
{
|
||||
listBox->setSelectedItem("4");
|
||||
|
||||
SECTION("No hover")
|
||||
{
|
||||
TEST_DRAW("ListBox_SelectedNoHover_Texture.png")
|
||||
}
|
||||
|
||||
SECTION("Hover selected")
|
||||
{
|
||||
listBox->mouseMoved(mousePos1);
|
||||
|
||||
SECTION("No hover properties set")
|
||||
{
|
||||
TEST_DRAW("ListBox_SelectedHoverSelected_NoHoverSet_Texture.png")
|
||||
}
|
||||
SECTION("Hover properties set")
|
||||
{
|
||||
setHoverRenderer();
|
||||
TEST_DRAW("ListBox_SelectedHoverSelected_HoverSet_Texture.png")
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("Hover other")
|
||||
{
|
||||
listBox->mouseMoved(mousePos3);
|
||||
|
||||
SECTION("No hover properties set")
|
||||
{
|
||||
TEST_DRAW("ListBox_SelectedHoverOther_NoHoverSet_Texture.png")
|
||||
}
|
||||
SECTION("Hover properties set")
|
||||
{
|
||||
setHoverRenderer();
|
||||
TEST_DRAW("ListBox_SelectedHoverOther_HoverSet_Texture.png")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
BIN
tests/expected/ListBox_NoSelectedHover_HoverSet.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
tests/expected/ListBox_NoSelectedHover_HoverSet_Texture.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
tests/expected/ListBox_NoSelectedHover_NoHoverSet.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
tests/expected/ListBox_NoSelectedHover_NoHoverSet_Texture.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
tests/expected/ListBox_NoSelectedNoHover.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
tests/expected/ListBox_NoSelectedNoHover_Texture.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
tests/expected/ListBox_SelectedHoverOther_HoverSet.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
tests/expected/ListBox_SelectedHoverOther_HoverSet_Texture.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
tests/expected/ListBox_SelectedHoverOther_NoHoverSet.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
tests/expected/ListBox_SelectedHoverOther_NoHoverSet_Texture.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
tests/expected/ListBox_SelectedHoverSelected_HoverSet.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 1.8 KiB |
BIN
tests/expected/ListBox_SelectedHoverSelected_NoHoverSet.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 1.8 KiB |
BIN
tests/expected/ListBox_SelectedNoHover.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
tests/expected/ListBox_SelectedNoHover_Texture.png
Normal file
After Width: | Height: | Size: 1.8 KiB |