103 lines
5.1 KiB
C++
103 lines
5.1 KiB
C++
#pragma once
|
|
#include "Common.h"
|
|
#include "Python.h"
|
|
#include "UIDrawable.h"
|
|
#include "PyDrawable.h"
|
|
|
|
class UICaption: public UIDrawable
|
|
{
|
|
public:
|
|
sf::Text text;
|
|
UICaption(); // Default constructor with safe initialization
|
|
void render(sf::Vector2f, sf::RenderTarget&) override final;
|
|
PyObjectsEnum derived_type() override final;
|
|
virtual UIDrawable* click_at(sf::Vector2f point) override final;
|
|
|
|
// Phase 1 virtual method implementations
|
|
sf::FloatRect get_bounds() const override;
|
|
void move(float dx, float dy) override;
|
|
void resize(float w, float h) override;
|
|
void onPositionChanged() override;
|
|
|
|
// Property system for animations
|
|
bool setProperty(const std::string& name, float value) override;
|
|
bool setProperty(const std::string& name, const sf::Color& value) override;
|
|
bool setProperty(const std::string& name, const std::string& value) override;
|
|
|
|
bool getProperty(const std::string& name, float& value) const override;
|
|
bool getProperty(const std::string& name, sf::Color& value) const override;
|
|
bool getProperty(const std::string& name, std::string& value) const override;
|
|
|
|
static PyObject* get_float_member(PyUICaptionObject* self, void* closure);
|
|
static int set_float_member(PyUICaptionObject* self, PyObject* value, void* closure);
|
|
static PyObject* get_vec_member(PyUICaptionObject* self, void* closure);
|
|
static int set_vec_member(PyUICaptionObject* self, PyObject* value, void* closure);
|
|
static PyObject* get_color_member(PyUICaptionObject* self, void* closure);
|
|
static int set_color_member(PyUICaptionObject* self, PyObject* value, void* closure);
|
|
static PyObject* get_text(PyUICaptionObject* self, void* closure);
|
|
static int set_text(PyUICaptionObject* self, PyObject* value, void* closure);
|
|
static PyGetSetDef getsetters[];
|
|
static PyObject* repr(PyUICaptionObject* self);
|
|
static int init(PyUICaptionObject* self, PyObject* args, PyObject* kwds);
|
|
|
|
};
|
|
|
|
extern PyMethodDef UICaption_methods[];
|
|
|
|
namespace mcrfpydef {
|
|
static PyTypeObject PyUICaptionType = {
|
|
.ob_base = {.ob_base = {.ob_refcnt = 1, .ob_type = NULL}, .ob_size = 0},
|
|
.tp_name = "mcrfpy.Caption",
|
|
.tp_basicsize = sizeof(PyUICaptionObject),
|
|
.tp_itemsize = 0,
|
|
// TODO - move tp_dealloc to .cpp file as static function (UICaption::dealloc)
|
|
.tp_dealloc = (destructor)[](PyObject* self)
|
|
{
|
|
PyUICaptionObject* obj = (PyUICaptionObject*)self;
|
|
// TODO - reevaluate with PyFont usage; UICaption does not own the font
|
|
// release reference to font object
|
|
if (obj->font) Py_DECREF(obj->font);
|
|
obj->data.reset();
|
|
Py_TYPE(self)->tp_free(self);
|
|
},
|
|
.tp_repr = (reprfunc)UICaption::repr,
|
|
//.tp_hash = NULL,
|
|
//.tp_iter
|
|
//.tp_iternext
|
|
.tp_flags = Py_TPFLAGS_DEFAULT,
|
|
.tp_doc = PyDoc_STR("Caption(text='', x=0, y=0, font=None, fill_color=None, outline_color=None, outline=0, click=None)\n\n"
|
|
"A text display UI element with customizable font and styling.\n\n"
|
|
"Args:\n"
|
|
" text (str): The text content to display. Default: ''\n"
|
|
" x (float): X position in pixels. Default: 0\n"
|
|
" y (float): Y position in pixels. Default: 0\n"
|
|
" font (Font): Font object for text rendering. Default: engine default font\n"
|
|
" fill_color (Color): Text fill color. Default: (255, 255, 255, 255)\n"
|
|
" outline_color (Color): Text outline color. Default: (0, 0, 0, 255)\n"
|
|
" outline (float): Text outline thickness. Default: 0\n"
|
|
" click (callable): Click event handler. Default: None\n\n"
|
|
"Attributes:\n"
|
|
" text (str): The displayed text content\n"
|
|
" x, y (float): Position in pixels\n"
|
|
" font (Font): Font used for rendering\n"
|
|
" fill_color, outline_color (Color): Text appearance\n"
|
|
" outline (float): Outline thickness\n"
|
|
" click (callable): Click event handler\n"
|
|
" visible (bool): Visibility state\n"
|
|
" z_index (int): Rendering order\n"
|
|
" w, h (float): Read-only computed size based on text and font"),
|
|
.tp_methods = UICaption_methods,
|
|
//.tp_members = PyUIFrame_members,
|
|
.tp_getset = UICaption::getsetters,
|
|
.tp_base = &mcrfpydef::PyDrawableType,
|
|
.tp_init = (initproc)UICaption::init,
|
|
// TODO - move tp_new to .cpp file as a static function (UICaption::new)
|
|
.tp_new = [](PyTypeObject* type, PyObject* args, PyObject* kwds) -> PyObject*
|
|
{
|
|
PyUICaptionObject* self = (PyUICaptionObject*)type->tp_alloc(type, 0);
|
|
if (self) self->data = std::make_shared<UICaption>();
|
|
return (PyObject*)self;
|
|
}
|
|
};
|
|
}
|