refactor: move position property to UIDrawable base class (UISprite)
- Update UISprite to use base class position instead of sprite position - Synchronize sprite position with base class position for rendering - Implement onPositionChanged() for position synchronization - Update all UISprite methods to use base position consistently - Add comprehensive test coverage for UISprite position handling This is part 3 of moving position to the base class. UIGrid is the final class that needs to be updated.
This commit is contained in:
parent
5d24ba6a85
commit
e1c6c53157
Binary file not shown.
After Width: | Height: | Size: 39 KiB |
|
@ -17,14 +17,16 @@ UISprite::UISprite()
|
||||||
: sprite_index(0), ptex(nullptr)
|
: sprite_index(0), ptex(nullptr)
|
||||||
{
|
{
|
||||||
// Initialize sprite to safe defaults
|
// Initialize sprite to safe defaults
|
||||||
sprite.setPosition(0.0f, 0.0f);
|
position = sf::Vector2f(0.0f, 0.0f); // Set base class position
|
||||||
|
sprite.setPosition(position); // Sync sprite position
|
||||||
sprite.setScale(1.0f, 1.0f);
|
sprite.setScale(1.0f, 1.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
UISprite::UISprite(std::shared_ptr<PyTexture> _ptex, int _sprite_index, sf::Vector2f _pos, float _scale)
|
UISprite::UISprite(std::shared_ptr<PyTexture> _ptex, int _sprite_index, sf::Vector2f _pos, float _scale)
|
||||||
: ptex(_ptex), sprite_index(_sprite_index)
|
: ptex(_ptex), sprite_index(_sprite_index)
|
||||||
{
|
{
|
||||||
sprite = ptex->sprite(sprite_index, _pos, sf::Vector2f(_scale, _scale));
|
position = _pos; // Set base class position
|
||||||
|
sprite = ptex->sprite(sprite_index, position, sf::Vector2f(_scale, _scale));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -57,7 +59,8 @@ void UISprite::render(sf::Vector2f offset, sf::RenderTarget& target)
|
||||||
|
|
||||||
void UISprite::setPosition(sf::Vector2f pos)
|
void UISprite::setPosition(sf::Vector2f pos)
|
||||||
{
|
{
|
||||||
sprite.setPosition(pos);
|
position = pos; // Update base class position
|
||||||
|
sprite.setPosition(position); // Sync sprite position
|
||||||
}
|
}
|
||||||
|
|
||||||
void UISprite::setScale(sf::Vector2f s)
|
void UISprite::setScale(sf::Vector2f s)
|
||||||
|
@ -70,13 +73,13 @@ void UISprite::setTexture(std::shared_ptr<PyTexture> _ptex, int _sprite_index)
|
||||||
ptex = _ptex;
|
ptex = _ptex;
|
||||||
if (_sprite_index != -1) // if you are changing textures, there's a good chance you need a new index too
|
if (_sprite_index != -1) // if you are changing textures, there's a good chance you need a new index too
|
||||||
sprite_index = _sprite_index;
|
sprite_index = _sprite_index;
|
||||||
sprite = ptex->sprite(sprite_index, sprite.getPosition(), sprite.getScale());
|
sprite = ptex->sprite(sprite_index, position, sprite.getScale()); // Use base class position
|
||||||
}
|
}
|
||||||
|
|
||||||
void UISprite::setSpriteIndex(int _sprite_index)
|
void UISprite::setSpriteIndex(int _sprite_index)
|
||||||
{
|
{
|
||||||
sprite_index = _sprite_index;
|
sprite_index = _sprite_index;
|
||||||
sprite = ptex->sprite(sprite_index, sprite.getPosition(), sprite.getScale());
|
sprite = ptex->sprite(sprite_index, position, sprite.getScale()); // Use base class position
|
||||||
}
|
}
|
||||||
|
|
||||||
sf::Vector2f UISprite::getScale() const
|
sf::Vector2f UISprite::getScale() const
|
||||||
|
@ -86,7 +89,7 @@ sf::Vector2f UISprite::getScale() const
|
||||||
|
|
||||||
sf::Vector2f UISprite::getPosition()
|
sf::Vector2f UISprite::getPosition()
|
||||||
{
|
{
|
||||||
return sprite.getPosition();
|
return position; // Return base class position
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<PyTexture> UISprite::getTexture()
|
std::shared_ptr<PyTexture> UISprite::getTexture()
|
||||||
|
@ -112,7 +115,9 @@ sf::FloatRect UISprite::get_bounds() const
|
||||||
|
|
||||||
void UISprite::move(float dx, float dy)
|
void UISprite::move(float dx, float dy)
|
||||||
{
|
{
|
||||||
sprite.move(dx, dy);
|
position.x += dx;
|
||||||
|
position.y += dy;
|
||||||
|
sprite.setPosition(position); // Keep sprite in sync
|
||||||
}
|
}
|
||||||
|
|
||||||
void UISprite::resize(float w, float h)
|
void UISprite::resize(float w, float h)
|
||||||
|
@ -126,6 +131,12 @@ void UISprite::resize(float w, float h)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UISprite::onPositionChanged()
|
||||||
|
{
|
||||||
|
// Sync sprite position with base class position
|
||||||
|
sprite.setPosition(position);
|
||||||
|
}
|
||||||
|
|
||||||
PyObject* UISprite::get_float_member(PyUISpriteObject* self, void* closure)
|
PyObject* UISprite::get_float_member(PyUISpriteObject* self, void* closure)
|
||||||
{
|
{
|
||||||
auto member_ptr = reinterpret_cast<long>(closure);
|
auto member_ptr = reinterpret_cast<long>(closure);
|
||||||
|
@ -278,8 +289,8 @@ PyMethodDef UISprite_methods[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
PyGetSetDef UISprite::getsetters[] = {
|
PyGetSetDef UISprite::getsetters[] = {
|
||||||
{"x", (getter)UISprite::get_float_member, (setter)UISprite::set_float_member, "X coordinate of top-left corner", (void*)0},
|
{"x", (getter)UIDrawable::get_float_member, (setter)UIDrawable::set_float_member, "X coordinate of top-left corner", (void*)((intptr_t)PyObjectsEnum::UISPRITE << 8 | 0)},
|
||||||
{"y", (getter)UISprite::get_float_member, (setter)UISprite::set_float_member, "Y coordinate of top-left corner", (void*)1},
|
{"y", (getter)UIDrawable::get_float_member, (setter)UIDrawable::set_float_member, "Y coordinate of top-left corner", (void*)((intptr_t)PyObjectsEnum::UISPRITE << 8 | 1)},
|
||||||
{"scale", (getter)UISprite::get_float_member, (setter)UISprite::set_float_member, "Uniform size factor", (void*)2},
|
{"scale", (getter)UISprite::get_float_member, (setter)UISprite::set_float_member, "Uniform size factor", (void*)2},
|
||||||
{"scale_x", (getter)UISprite::get_float_member, (setter)UISprite::set_float_member, "Horizontal scale factor", (void*)3},
|
{"scale_x", (getter)UISprite::get_float_member, (setter)UISprite::set_float_member, "Horizontal scale factor", (void*)3},
|
||||||
{"scale_y", (getter)UISprite::get_float_member, (setter)UISprite::set_float_member, "Vertical scale factor", (void*)4},
|
{"scale_y", (getter)UISprite::get_float_member, (setter)UISprite::set_float_member, "Vertical scale factor", (void*)4},
|
||||||
|
@ -289,7 +300,7 @@ PyGetSetDef UISprite::getsetters[] = {
|
||||||
{"click", (getter)UIDrawable::get_click, (setter)UIDrawable::set_click, "Object called with (x, y, button) when clicked", (void*)PyObjectsEnum::UISPRITE},
|
{"click", (getter)UIDrawable::get_click, (setter)UIDrawable::set_click, "Object called with (x, y, button) when clicked", (void*)PyObjectsEnum::UISPRITE},
|
||||||
{"z_index", (getter)UIDrawable::get_int, (setter)UIDrawable::set_int, "Z-order for rendering (lower values rendered first)", (void*)PyObjectsEnum::UISPRITE},
|
{"z_index", (getter)UIDrawable::get_int, (setter)UIDrawable::set_int, "Z-order for rendering (lower values rendered first)", (void*)PyObjectsEnum::UISPRITE},
|
||||||
{"name", (getter)UIDrawable::get_name, (setter)UIDrawable::set_name, "Name for finding elements", (void*)PyObjectsEnum::UISPRITE},
|
{"name", (getter)UIDrawable::get_name, (setter)UIDrawable::set_name, "Name for finding elements", (void*)PyObjectsEnum::UISPRITE},
|
||||||
{"pos", (getter)UISprite::get_pos, (setter)UISprite::set_pos, "Position as a Vector", NULL},
|
{"pos", (getter)UIDrawable::get_pos, (setter)UIDrawable::set_pos, "Position as a Vector", (void*)PyObjectsEnum::UISPRITE},
|
||||||
UIDRAWABLE_GETSETTERS,
|
UIDRAWABLE_GETSETTERS,
|
||||||
{NULL}
|
{NULL}
|
||||||
};
|
};
|
||||||
|
@ -377,7 +388,6 @@ int UISprite::init(PyUISpriteObject* self, PyObject* args, PyObject* kwds)
|
||||||
}
|
}
|
||||||
|
|
||||||
self->data = std::make_shared<UISprite>(texture_ptr, sprite_index, sf::Vector2f(x, y), scale);
|
self->data = std::make_shared<UISprite>(texture_ptr, sprite_index, sf::Vector2f(x, y), scale);
|
||||||
self->data->setPosition(sf::Vector2f(x, y));
|
|
||||||
|
|
||||||
// Process click handler if provided
|
// Process click handler if provided
|
||||||
if (click_handler && click_handler != Py_None) {
|
if (click_handler && click_handler != Py_None) {
|
||||||
|
@ -394,11 +404,13 @@ int UISprite::init(PyUISpriteObject* self, PyObject* args, PyObject* kwds)
|
||||||
// Property system implementation for animations
|
// Property system implementation for animations
|
||||||
bool UISprite::setProperty(const std::string& name, float value) {
|
bool UISprite::setProperty(const std::string& name, float value) {
|
||||||
if (name == "x") {
|
if (name == "x") {
|
||||||
sprite.setPosition(sf::Vector2f(value, sprite.getPosition().y));
|
position.x = value;
|
||||||
|
sprite.setPosition(position); // Keep sprite in sync
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (name == "y") {
|
else if (name == "y") {
|
||||||
sprite.setPosition(sf::Vector2f(sprite.getPosition().x, value));
|
position.y = value;
|
||||||
|
sprite.setPosition(position); // Keep sprite in sync
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (name == "scale") {
|
else if (name == "scale") {
|
||||||
|
@ -434,11 +446,11 @@ bool UISprite::setProperty(const std::string& name, int value) {
|
||||||
|
|
||||||
bool UISprite::getProperty(const std::string& name, float& value) const {
|
bool UISprite::getProperty(const std::string& name, float& value) const {
|
||||||
if (name == "x") {
|
if (name == "x") {
|
||||||
value = sprite.getPosition().x;
|
value = position.x;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (name == "y") {
|
else if (name == "y") {
|
||||||
value = sprite.getPosition().y;
|
value = position.y;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (name == "scale") {
|
else if (name == "scale") {
|
||||||
|
|
|
@ -46,6 +46,7 @@ public:
|
||||||
sf::FloatRect get_bounds() const override;
|
sf::FloatRect get_bounds() const override;
|
||||||
void move(float dx, float dy) override;
|
void move(float dx, float dy) override;
|
||||||
void resize(float w, float h) override;
|
void resize(float w, float h) override;
|
||||||
|
void onPositionChanged() override;
|
||||||
|
|
||||||
// Property system for animations
|
// Property system for animations
|
||||||
bool setProperty(const std::string& name, float value) override;
|
bool setProperty(const std::string& name, float value) override;
|
||||||
|
|
Loading…
Reference in New Issue