Switching UIFrame to sf::Color* for outline and fill members. Haven't tested with Python integration, but I wrote the methods to take a crack at it

This commit is contained in:
John McCardle 2023-08-30 14:38:49 -04:00
parent c4d5a497d4
commit 884a49a63a
3 changed files with 114 additions and 24 deletions

View File

@ -8,12 +8,86 @@ void UIDrawable::render()
render(sf::Vector2f()); render(sf::Vector2f());
} }
UIFrame::UIFrame(): UIFrame::UIFrame():
x(0), y(0), w(0), h(0), outline(0), fillColor(0,0,0,255), outlineColor(0,0,0,0) x(0), y(0), w(0), h(0), outline(0)
{} {
pyOutlineColor = NULL;
pyFillColor = NULL;
_outlineColor = NULL;
_fillColor = NULL;
}
UIFrame::UIFrame(float _x, float _y, float _w, float _h): UIFrame::UIFrame(float _x, float _y, float _w, float _h):
x(_x), y(_y), w(_w), h(_h), outline(0), fillColor(0,0,0,255), outlineColor(0,0,0,0) x(_x), y(_y), w(_w), h(_h), outline(0)
{} {
pyOutlineColor = NULL;
pyFillColor = NULL;
_outlineColor = NULL;
_fillColor = NULL;
}
UIFrame::~UIFrame()
{
if (pyOutlineColor) { Py_DECREF(pyOutlineColor); }
else { if (_outlineColor) { delete _outlineColor; } }
if (pyFillColor) { Py_DECREF(pyFillColor); }
else { if (_fillColor) { delete _fillColor; } }
}
/*
sf::Color& fillColor(); // getter
void fillColor(sf::Color c); // C++ setter
void fillColor(PyObject* pyColor); // Python setter
sf::Color& outlineColor(); // getter
void outlineColor(sf::Color c); // C++ setter
void outlineColor(PyObject* pyColor); // Python setter
*/
sf::Color UIFrame::fillColor()
{
if (_fillColor == NULL) return sf::Color();
return *_fillColor;
}
void UIFrame::fillColor(sf::Color c)
{
if (pyFillColor) { Py_DECREF(pyFillColor); }
else { delete _fillColor; }
_fillColor = new sf::Color(c.r, c.g, c.b, c.a);
pyFillColor = NULL;
}
void UIFrame::fillColor(PyColorObject* pyColor)
{
if (pyFillColor) { Py_DECREF(pyFillColor); }
else { delete _fillColor; }
Py_INCREF(pyColor);
pyFillColor = pyColor;
_fillColor = &(pyFillColor->color);
}
sf::Color UIFrame::outlineColor()
{
if (_outlineColor == NULL) return sf::Color();
return *_outlineColor;
}
void UIFrame::outlineColor(sf::Color c)
{
if (pyOutlineColor) { Py_DECREF(pyOutlineColor); }
else { delete _outlineColor; }
_outlineColor = new sf::Color(c.r, c.g, c.b, c.a);
pyOutlineColor = NULL;
}
void UIFrame::outlineColor(PyColorObject* pyColor)
{
if (pyOutlineColor) { Py_DECREF(pyOutlineColor); }
else { delete _outlineColor; }
Py_INCREF(pyColor);
pyOutlineColor = pyColor;
_outlineColor = &(pyOutlineColor->color);
}
void UIFrame::render(sf::Vector2f offset) void UIFrame::render(sf::Vector2f offset)
{ {
@ -25,8 +99,8 @@ void UIFrame::render(sf::Vector2f offset)
sf::RectangleShape box = sf::RectangleShape(sf::Vector2f(w,h)); sf::RectangleShape box = sf::RectangleShape(sf::Vector2f(w,h));
sf::Vector2f pos = sf::Vector2f(x, y); sf::Vector2f pos = sf::Vector2f(x, y);
box.setPosition(offset + pos); box.setPosition(offset + pos);
box.setFillColor(fillColor); if (_fillColor) { box.setFillColor(fillColor()); }
box.setOutlineColor(outlineColor); if (_outlineColor) { box.setOutlineColor(outlineColor()); }
box.setOutlineThickness(outline); box.setOutlineThickness(outline);
Resources::game->getWindow().draw(box); Resources::game->getWindow().draw(box);
for (auto drawable : children) { for (auto drawable : children) {

View File

@ -14,19 +14,38 @@ public:
std::string action; std::string action;
}; };
//PyColorObject struct required to embed Python colors into UIFrame
typedef struct {
PyObject_HEAD
sf::Color color;
} PyColorObject;
class UIFrame: public UIDrawable class UIFrame: public UIDrawable
{ {
public: public:
UIFrame(float, float, float, float); UIFrame(float, float, float, float);
UIFrame(); UIFrame();
~UIFrame();
//sf::RectangleShape box; //sf::RectangleShape box;
//Simulate RectangleShape //Simulate RectangleShape
sf::Color fillColor, outlineColor;
float x, y, w, h, outline; float x, y, w, h, outline;
std::vector<UIDrawable*> children; std::vector<UIDrawable*> children;
void render(sf::Vector2f) override final; void render(sf::Vector2f) override final;
void move(sf::Vector2f); void move(sf::Vector2f);
sf::Color fillColor(); // getter
void fillColor(sf::Color c); // C++ setter
void fillColor(PyColorObject* pyColor); // Python setter
sf::Color outlineColor(); // getter
void outlineColor(sf::Color c); // C++ setter
void outlineColor(PyColorObject* pyColor); // Python setter
private:
sf::Color *_fillColor, *_outlineColor;
PyColorObject *pyFillColor, *pyOutlineColor;
}; };
class UICaption: public UIDrawable class UICaption: public UIDrawable
@ -49,10 +68,7 @@ namespace mcrfpydef {
// Color Definitions // Color Definitions
// struct, members, new, set_member, PyTypeObject // struct, members, new, set_member, PyTypeObject
typedef struct {
PyObject_HEAD
sf::Color color;
} PyColorObject;
static PyMemberDef PyColor_members[] static PyMemberDef PyColor_members[]
{ {

View File

@ -15,23 +15,23 @@ UITestScene::UITestScene(GameEngine* g) : Scene(g)
// Create a UI element or three? // Create a UI element or three?
e1 = UIFrame(100,150,400,400); e1 = UIFrame(100,150,400,400);
//e1.box.setPosition(100, 150); //e1.box.setPosition(100, 150);
//e1.box.setSize(sf::Vector2f(400,400)); //e1.box.setSize(sf::Vector2f(400,400));
//e1.box.setFillColor(sf::Color(255, 0, 0)); //e1.box.setFillColor(sf::Color(255, 0, 0));
e1.fillColor = sf::Color(255,0,0); e1.fillColor(sf::Color(255,0,0));
e1a = UIFrame(50,50,200,200); e1a = UIFrame(50,50,200,200);
//e1a.box.setPosition(50, 50); //e1a.box.setPosition(50, 50);
//e1a.box.setSize(sf::Vector2f(200,200)); //e1a.box.setSize(sf::Vector2f(200,200));
//e1a.box.setFillColor(sf::Color(0, 255, 0)); //e1a.box.setFillColor(sf::Color(0, 255, 0));
e1a.fillColor = sf::Color(0, 255, 0); e1a.fillColor(sf::Color(0, 255, 0));
e1.children.push_back(&e1a); e1.children.push_back(&e1a);
e1aa = UIFrame(5,5,100,100); e1aa = UIFrame(5,5,100,100);
//e1aa.box.setPosition(5, 5); //e1aa.box.setPosition(5, 5);
//e1aa.box.setSize(sf::Vector2f(100,100)); //e1aa.box.setSize(sf::Vector2f(100,100));
//e1aa.box.setFillColor(sf::Color(0, 0, 255)); //e1aa.box.setFillColor(sf::Color(0, 0, 255));
e1aa.fillColor = sf::Color(0, 0, 255); e1aa.fillColor(sf::Color(0, 0, 255));
e1a.children.push_back(&e1aa); e1a.children.push_back(&e1aa);
e2 = UICaption(); e2 = UICaption();