McRogueFace/src/Scene.cpp
John McCardle e3d8f54d46 feat: Implement Phase A UI hierarchy foundations (closes #122, #102, #116, #118)
Parent-Child UI System (#122):
- Add parent weak_ptr to UIDrawable for hierarchy tracking
- Add setParent(), getParent(), removeFromParent() methods
- UICollection now tracks owner and sets parent on append/insert
- Auto-remove from old parent when adding to new collection

Global Position Property (#102):
- Add get_global_position() that walks up parent chain
- Expose as read-only 'global_position' property on all UI types
- Add UIDRAWABLE_PARENT_GETSETTERS macro for consistent bindings

Dirty Flag System (#116):
- Modify markDirty() to propagate up the parent chain
- Add isDirty() and clearDirty() methods for render optimization

Scene as Drawable (#118):
- Add position, visible, opacity properties to Scene
- Add setProperty()/getProperty() for animation support
- Apply scene transformations in PyScene::render()
- Fix lifecycle callbacks to clear errors when methods don't exist
- Add GameEngine::getScene() public accessor

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-27 16:33:17 -05:00

96 lines
2.1 KiB
C++

#include "Scene.h"
#include "UI.h"
//Scene::Scene() { game = 0; std::cout << "WARN: default Scene constructor called. (game = " << game << ")" << std::endl;};
Scene::Scene(GameEngine* g)
{
key_callable = std::make_unique<PyKeyCallable>();
game = g;
ui_elements = std::make_shared<std::vector<std::shared_ptr<UIDrawable>>>();
}
void Scene::registerAction(int code, std::string name)
{
actions[code] = name;
actionState[name] = false;
}
bool Scene::hasAction(std::string name)
{
for (auto& item : actions)
if (item.second == name) return true;
return false;
}
bool Scene::hasAction(int code)
{
return (actions.find(code) != actions.end());
}
std::string Scene::action(int code)
{
return actions[code];
}
void Scene::key_register(PyObject* callable)
{
/*
if (key_callable)
{
// decrement reference before overwriting
Py_DECREF(key_callable);
}
key_callable = callable;
Py_INCREF(key_callable);
*/
key_callable = std::make_unique<PyKeyCallable>(callable);
}
void Scene::key_unregister()
{
/*
if (key_callable == NULL) return;
Py_DECREF(key_callable);
key_callable = NULL;
*/
key_callable.reset();
}
// #118: Scene animation property support
bool Scene::setProperty(const std::string& name, float value)
{
if (name == "x") {
position.x = value;
return true;
}
if (name == "y") {
position.y = value;
return true;
}
if (name == "opacity") {
opacity = std::max(0.0f, std::min(1.0f, value));
return true;
}
if (name == "visible") {
visible = (value != 0.0f);
return true;
}
return false;
}
bool Scene::setProperty(const std::string& name, const sf::Vector2f& value)
{
if (name == "pos" || name == "position") {
position = value;
return true;
}
return false;
}
float Scene::getProperty(const std::string& name) const
{
if (name == "x") return position.x;
if (name == "y") return position.y;
if (name == "opacity") return opacity;
if (name == "visible") return visible ? 1.0f : 0.0f;
return 0.0f;
}