feat: Add UILine, UICircle, and UIArc drawing primitives
Implement new UIDrawable-derived classes for vector graphics:
- UILine: Thick line segments using sf::ConvexShape for proper thickness
- Properties: start, end, color, thickness
- Supports click detection along the line
- UICircle: Filled and outlined circles using sf::CircleShape
- Properties: radius, center, fill_color, outline_color, outline
- Full property system for animations
- UIArc: Arc segments for orbital paths and partial circles
- Properties: center, radius, start_angle, end_angle, color, thickness
- Uses sf::VertexArray with TriangleStrip for smooth rendering
- Supports arbitrary angle spans including negative (reverse) arcs
All primitives integrate with the Python API through mcrfpy module:
- Added to PyObjectsEnum for type identification
- Full getter/setter support for all properties
- Added to UICollection for scene management
- Support for visibility, opacity, z_index, name, and click handling
closes #128, closes #129
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 21:42:33 -05:00
# include "UICircle.h"
# include "GameEngine.h"
# include "McRFPy_API.h"
# include "PyVector.h"
# include "PyColor.h"
# include "PythonObjectCache.h"
2026-01-13 20:40:34 -05:00
# include "PyAlignment.h"
feat: Add UILine, UICircle, and UIArc drawing primitives
Implement new UIDrawable-derived classes for vector graphics:
- UILine: Thick line segments using sf::ConvexShape for proper thickness
- Properties: start, end, color, thickness
- Supports click detection along the line
- UICircle: Filled and outlined circles using sf::CircleShape
- Properties: radius, center, fill_color, outline_color, outline
- Full property system for animations
- UIArc: Arc segments for orbital paths and partial circles
- Properties: center, radius, start_angle, end_angle, color, thickness
- Uses sf::VertexArray with TriangleStrip for smooth rendering
- Supports arbitrary angle spans including negative (reverse) arcs
All primitives integrate with the Python API through mcrfpy module:
- Added to PyObjectsEnum for type identification
- Full getter/setter support for all properties
- Added to UICollection for scene management
- Support for visibility, opacity, z_index, name, and click handling
closes #128, closes #129
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 21:42:33 -05:00
# include <cmath>
UICircle : : UICircle ( )
: radius ( 10.0f ) ,
fill_color ( sf : : Color : : White ) ,
outline_color ( sf : : Color : : Transparent ) ,
outline_thickness ( 0.0f )
{
position = sf : : Vector2f ( 0.0f , 0.0f ) ;
shape . setRadius ( radius ) ;
shape . setFillColor ( fill_color ) ;
shape . setOutlineColor ( outline_color ) ;
shape . setOutlineThickness ( outline_thickness ) ;
shape . setOrigin ( radius , radius ) ; // Center the origin
}
UICircle : : UICircle ( float radius , sf : : Vector2f center , sf : : Color fillColor ,
sf : : Color outlineColor , float outlineThickness )
: radius ( radius ) ,
fill_color ( fillColor ) ,
outline_color ( outlineColor ) ,
outline_thickness ( outlineThickness )
{
position = center ;
shape . setRadius ( radius ) ;
shape . setFillColor ( fill_color ) ;
shape . setOutlineColor ( outline_color ) ;
shape . setOutlineThickness ( outline_thickness ) ;
shape . setOrigin ( radius , radius ) ; // Center the origin
}
UICircle : : UICircle ( const UICircle & other )
: UIDrawable ( other ) ,
radius ( other . radius ) ,
fill_color ( other . fill_color ) ,
outline_color ( other . outline_color ) ,
outline_thickness ( other . outline_thickness )
{
shape . setRadius ( radius ) ;
shape . setFillColor ( fill_color ) ;
shape . setOutlineColor ( outline_color ) ;
shape . setOutlineThickness ( outline_thickness ) ;
shape . setOrigin ( radius , radius ) ;
}
UICircle & UICircle : : operator = ( const UICircle & other ) {
if ( this ! = & other ) {
UIDrawable : : operator = ( other ) ;
radius = other . radius ;
fill_color = other . fill_color ;
outline_color = other . outline_color ;
outline_thickness = other . outline_thickness ;
shape . setRadius ( radius ) ;
shape . setFillColor ( fill_color ) ;
shape . setOutlineColor ( outline_color ) ;
shape . setOutlineThickness ( outline_thickness ) ;
shape . setOrigin ( radius , radius ) ;
}
return * this ;
}
UICircle : : UICircle ( UICircle & & other ) noexcept
: UIDrawable ( std : : move ( other ) ) ,
shape ( std : : move ( other . shape ) ) ,
radius ( other . radius ) ,
fill_color ( other . fill_color ) ,
outline_color ( other . outline_color ) ,
outline_thickness ( other . outline_thickness )
{
}
UICircle & UICircle : : operator = ( UICircle & & other ) noexcept {
if ( this ! = & other ) {
UIDrawable : : operator = ( std : : move ( other ) ) ;
shape = std : : move ( other . shape ) ;
radius = other . radius ;
fill_color = other . fill_color ;
outline_color = other . outline_color ;
outline_thickness = other . outline_thickness ;
}
return * this ;
}
void UICircle : : setRadius ( float r ) {
radius = r ;
shape . setRadius ( r ) ;
shape . setOrigin ( r , r ) ; // Keep origin at center
}
void UICircle : : setFillColor ( sf : : Color c ) {
fill_color = c ;
shape . setFillColor ( c ) ;
}
void UICircle : : setOutlineColor ( sf : : Color c ) {
outline_color = c ;
shape . setOutlineColor ( c ) ;
}
void UICircle : : setOutline ( float t ) {
outline_thickness = t ;
shape . setOutlineThickness ( t ) ;
}
void UICircle : : render ( sf : : Vector2f offset , sf : : RenderTarget & target ) {
if ( ! visible ) return ;
// Apply position and offset
shape . setPosition ( position + offset ) ;
// Apply opacity to colors
sf : : Color render_fill = fill_color ;
render_fill . a = static_cast < sf : : Uint8 > ( fill_color . a * opacity ) ;
shape . setFillColor ( render_fill ) ;
sf : : Color render_outline = outline_color ;
render_outline . a = static_cast < sf : : Uint8 > ( outline_color . a * opacity ) ;
shape . setOutlineColor ( render_outline ) ;
target . draw ( shape ) ;
}
UIDrawable * UICircle : : click_at ( sf : : Vector2f point ) {
2026-01-09 21:37:23 -05:00
// #184: Also check for Python subclass (might have on_click method)
if ( ! click_callable & & ! is_python_subclass ) return nullptr ;
feat: Add UILine, UICircle, and UIArc drawing primitives
Implement new UIDrawable-derived classes for vector graphics:
- UILine: Thick line segments using sf::ConvexShape for proper thickness
- Properties: start, end, color, thickness
- Supports click detection along the line
- UICircle: Filled and outlined circles using sf::CircleShape
- Properties: radius, center, fill_color, outline_color, outline
- Full property system for animations
- UIArc: Arc segments for orbital paths and partial circles
- Properties: center, radius, start_angle, end_angle, color, thickness
- Uses sf::VertexArray with TriangleStrip for smooth rendering
- Supports arbitrary angle spans including negative (reverse) arcs
All primitives integrate with the Python API through mcrfpy module:
- Added to PyObjectsEnum for type identification
- Full getter/setter support for all properties
- Added to UICollection for scene management
- Support for visibility, opacity, z_index, name, and click handling
closes #128, closes #129
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 21:42:33 -05:00
// Check if point is within the circle (including outline)
float dx = point . x - position . x ;
float dy = point . y - position . y ;
float distance = std : : sqrt ( dx * dx + dy * dy ) ;
float effective_radius = radius + outline_thickness ;
if ( distance < = effective_radius ) {
return this ;
}
return nullptr ;
}
PyObjectsEnum UICircle : : derived_type ( ) {
return PyObjectsEnum : : UICIRCLE ;
}
sf : : FloatRect UICircle : : get_bounds ( ) const {
float effective_radius = radius + outline_thickness ;
return sf : : FloatRect (
position . x - effective_radius ,
position . y - effective_radius ,
effective_radius * 2 ,
effective_radius * 2
) ;
}
void UICircle : : move ( float dx , float dy ) {
position . x + = dx ;
position . y + = dy ;
}
void UICircle : : resize ( float w , float h ) {
// For circles, use the average of w and h as diameter
radius = ( w + h ) / 4.0f ; // Average of w and h, then divide by 2 for radius
shape . setRadius ( radius ) ;
shape . setOrigin ( radius , radius ) ;
}
// Property system for animations
bool UICircle : : setProperty ( const std : : string & name , float value ) {
if ( name = = " radius " ) {
setRadius ( value ) ;
feat: Add dirty flag propagation to all UIDrawables and expand metrics API (#144, #104)
- Add markDirty() calls to setProperty() methods in:
- UISprite: position, scale, sprite_index changes
- UICaption: position, font_size, colors, text changes
- UIGrid: position, size, center, zoom, color changes
- UILine: thickness, position, endpoints, color changes
- UICircle: radius, position, colors changes
- UIArc: radius, angles, position, color changes
- UIEntity: position changes propagate to parent grid
- Expand getMetrics() Python API to include detailed timing breakdown:
- grid_render_time, entity_render_time, fov_overlay_time
- python_time, animation_time
- grid_cells_rendered, entities_rendered, total_entities
- Add comprehensive benchmark suite (tests/benchmarks/benchmark_suite.py):
- 6 scenarios: empty, static UI, animated UI, mixed, deep hierarchy, grid stress
- Automated metrics collection and performance assessment
- Timing breakdown percentages
This enables proper dirty flag propagation for the upcoming texture caching
system (#144) and provides infrastructure for performance benchmarking (#104).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 15:44:09 -05:00
markDirty ( ) ; // #144 - Content change
feat: Add UILine, UICircle, and UIArc drawing primitives
Implement new UIDrawable-derived classes for vector graphics:
- UILine: Thick line segments using sf::ConvexShape for proper thickness
- Properties: start, end, color, thickness
- Supports click detection along the line
- UICircle: Filled and outlined circles using sf::CircleShape
- Properties: radius, center, fill_color, outline_color, outline
- Full property system for animations
- UIArc: Arc segments for orbital paths and partial circles
- Properties: center, radius, start_angle, end_angle, color, thickness
- Uses sf::VertexArray with TriangleStrip for smooth rendering
- Supports arbitrary angle spans including negative (reverse) arcs
All primitives integrate with the Python API through mcrfpy module:
- Added to PyObjectsEnum for type identification
- Full getter/setter support for all properties
- Added to UICollection for scene management
- Support for visibility, opacity, z_index, name, and click handling
closes #128, closes #129
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 21:42:33 -05:00
return true ;
} else if ( name = = " outline " ) {
setOutline ( value ) ;
feat: Add dirty flag propagation to all UIDrawables and expand metrics API (#144, #104)
- Add markDirty() calls to setProperty() methods in:
- UISprite: position, scale, sprite_index changes
- UICaption: position, font_size, colors, text changes
- UIGrid: position, size, center, zoom, color changes
- UILine: thickness, position, endpoints, color changes
- UICircle: radius, position, colors changes
- UIArc: radius, angles, position, color changes
- UIEntity: position changes propagate to parent grid
- Expand getMetrics() Python API to include detailed timing breakdown:
- grid_render_time, entity_render_time, fov_overlay_time
- python_time, animation_time
- grid_cells_rendered, entities_rendered, total_entities
- Add comprehensive benchmark suite (tests/benchmarks/benchmark_suite.py):
- 6 scenarios: empty, static UI, animated UI, mixed, deep hierarchy, grid stress
- Automated metrics collection and performance assessment
- Timing breakdown percentages
This enables proper dirty flag propagation for the upcoming texture caching
system (#144) and provides infrastructure for performance benchmarking (#104).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 15:44:09 -05:00
markDirty ( ) ; // #144 - Content change
feat: Add UILine, UICircle, and UIArc drawing primitives
Implement new UIDrawable-derived classes for vector graphics:
- UILine: Thick line segments using sf::ConvexShape for proper thickness
- Properties: start, end, color, thickness
- Supports click detection along the line
- UICircle: Filled and outlined circles using sf::CircleShape
- Properties: radius, center, fill_color, outline_color, outline
- Full property system for animations
- UIArc: Arc segments for orbital paths and partial circles
- Properties: center, radius, start_angle, end_angle, color, thickness
- Uses sf::VertexArray with TriangleStrip for smooth rendering
- Supports arbitrary angle spans including negative (reverse) arcs
All primitives integrate with the Python API through mcrfpy module:
- Added to PyObjectsEnum for type identification
- Full getter/setter support for all properties
- Added to UICollection for scene management
- Support for visibility, opacity, z_index, name, and click handling
closes #128, closes #129
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 21:42:33 -05:00
return true ;
} else if ( name = = " x " ) {
position . x = value ;
2025-11-28 19:30:24 -05:00
markCompositeDirty ( ) ; // #144 - Position change, texture still valid
feat: Add UILine, UICircle, and UIArc drawing primitives
Implement new UIDrawable-derived classes for vector graphics:
- UILine: Thick line segments using sf::ConvexShape for proper thickness
- Properties: start, end, color, thickness
- Supports click detection along the line
- UICircle: Filled and outlined circles using sf::CircleShape
- Properties: radius, center, fill_color, outline_color, outline
- Full property system for animations
- UIArc: Arc segments for orbital paths and partial circles
- Properties: center, radius, start_angle, end_angle, color, thickness
- Uses sf::VertexArray with TriangleStrip for smooth rendering
- Supports arbitrary angle spans including negative (reverse) arcs
All primitives integrate with the Python API through mcrfpy module:
- Added to PyObjectsEnum for type identification
- Full getter/setter support for all properties
- Added to UICollection for scene management
- Support for visibility, opacity, z_index, name, and click handling
closes #128, closes #129
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 21:42:33 -05:00
return true ;
} else if ( name = = " y " ) {
position . y = value ;
2025-11-28 19:30:24 -05:00
markCompositeDirty ( ) ; // #144 - Position change, texture still valid
feat: Add UILine, UICircle, and UIArc drawing primitives
Implement new UIDrawable-derived classes for vector graphics:
- UILine: Thick line segments using sf::ConvexShape for proper thickness
- Properties: start, end, color, thickness
- Supports click detection along the line
- UICircle: Filled and outlined circles using sf::CircleShape
- Properties: radius, center, fill_color, outline_color, outline
- Full property system for animations
- UIArc: Arc segments for orbital paths and partial circles
- Properties: center, radius, start_angle, end_angle, color, thickness
- Uses sf::VertexArray with TriangleStrip for smooth rendering
- Supports arbitrary angle spans including negative (reverse) arcs
All primitives integrate with the Python API through mcrfpy module:
- Added to PyObjectsEnum for type identification
- Full getter/setter support for all properties
- Added to UICollection for scene management
- Support for visibility, opacity, z_index, name, and click handling
closes #128, closes #129
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 21:42:33 -05:00
return true ;
}
return false ;
}
bool UICircle : : setProperty ( const std : : string & name , const sf : : Color & value ) {
if ( name = = " fill_color " ) {
setFillColor ( value ) ;
feat: Add dirty flag propagation to all UIDrawables and expand metrics API (#144, #104)
- Add markDirty() calls to setProperty() methods in:
- UISprite: position, scale, sprite_index changes
- UICaption: position, font_size, colors, text changes
- UIGrid: position, size, center, zoom, color changes
- UILine: thickness, position, endpoints, color changes
- UICircle: radius, position, colors changes
- UIArc: radius, angles, position, color changes
- UIEntity: position changes propagate to parent grid
- Expand getMetrics() Python API to include detailed timing breakdown:
- grid_render_time, entity_render_time, fov_overlay_time
- python_time, animation_time
- grid_cells_rendered, entities_rendered, total_entities
- Add comprehensive benchmark suite (tests/benchmarks/benchmark_suite.py):
- 6 scenarios: empty, static UI, animated UI, mixed, deep hierarchy, grid stress
- Automated metrics collection and performance assessment
- Timing breakdown percentages
This enables proper dirty flag propagation for the upcoming texture caching
system (#144) and provides infrastructure for performance benchmarking (#104).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 15:44:09 -05:00
markDirty ( ) ; // #144 - Content change
feat: Add UILine, UICircle, and UIArc drawing primitives
Implement new UIDrawable-derived classes for vector graphics:
- UILine: Thick line segments using sf::ConvexShape for proper thickness
- Properties: start, end, color, thickness
- Supports click detection along the line
- UICircle: Filled and outlined circles using sf::CircleShape
- Properties: radius, center, fill_color, outline_color, outline
- Full property system for animations
- UIArc: Arc segments for orbital paths and partial circles
- Properties: center, radius, start_angle, end_angle, color, thickness
- Uses sf::VertexArray with TriangleStrip for smooth rendering
- Supports arbitrary angle spans including negative (reverse) arcs
All primitives integrate with the Python API through mcrfpy module:
- Added to PyObjectsEnum for type identification
- Full getter/setter support for all properties
- Added to UICollection for scene management
- Support for visibility, opacity, z_index, name, and click handling
closes #128, closes #129
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 21:42:33 -05:00
return true ;
} else if ( name = = " outline_color " ) {
setOutlineColor ( value ) ;
feat: Add dirty flag propagation to all UIDrawables and expand metrics API (#144, #104)
- Add markDirty() calls to setProperty() methods in:
- UISprite: position, scale, sprite_index changes
- UICaption: position, font_size, colors, text changes
- UIGrid: position, size, center, zoom, color changes
- UILine: thickness, position, endpoints, color changes
- UICircle: radius, position, colors changes
- UIArc: radius, angles, position, color changes
- UIEntity: position changes propagate to parent grid
- Expand getMetrics() Python API to include detailed timing breakdown:
- grid_render_time, entity_render_time, fov_overlay_time
- python_time, animation_time
- grid_cells_rendered, entities_rendered, total_entities
- Add comprehensive benchmark suite (tests/benchmarks/benchmark_suite.py):
- 6 scenarios: empty, static UI, animated UI, mixed, deep hierarchy, grid stress
- Automated metrics collection and performance assessment
- Timing breakdown percentages
This enables proper dirty flag propagation for the upcoming texture caching
system (#144) and provides infrastructure for performance benchmarking (#104).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 15:44:09 -05:00
markDirty ( ) ; // #144 - Content change
feat: Add UILine, UICircle, and UIArc drawing primitives
Implement new UIDrawable-derived classes for vector graphics:
- UILine: Thick line segments using sf::ConvexShape for proper thickness
- Properties: start, end, color, thickness
- Supports click detection along the line
- UICircle: Filled and outlined circles using sf::CircleShape
- Properties: radius, center, fill_color, outline_color, outline
- Full property system for animations
- UIArc: Arc segments for orbital paths and partial circles
- Properties: center, radius, start_angle, end_angle, color, thickness
- Uses sf::VertexArray with TriangleStrip for smooth rendering
- Supports arbitrary angle spans including negative (reverse) arcs
All primitives integrate with the Python API through mcrfpy module:
- Added to PyObjectsEnum for type identification
- Full getter/setter support for all properties
- Added to UICollection for scene management
- Support for visibility, opacity, z_index, name, and click handling
closes #128, closes #129
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 21:42:33 -05:00
return true ;
}
return false ;
}
bool UICircle : : setProperty ( const std : : string & name , const sf : : Vector2f & value ) {
if ( name = = " center " | | name = = " position " ) {
position = value ;
feat: Add dirty flag propagation to all UIDrawables and expand metrics API (#144, #104)
- Add markDirty() calls to setProperty() methods in:
- UISprite: position, scale, sprite_index changes
- UICaption: position, font_size, colors, text changes
- UIGrid: position, size, center, zoom, color changes
- UILine: thickness, position, endpoints, color changes
- UICircle: radius, position, colors changes
- UIArc: radius, angles, position, color changes
- UIEntity: position changes propagate to parent grid
- Expand getMetrics() Python API to include detailed timing breakdown:
- grid_render_time, entity_render_time, fov_overlay_time
- python_time, animation_time
- grid_cells_rendered, entities_rendered, total_entities
- Add comprehensive benchmark suite (tests/benchmarks/benchmark_suite.py):
- 6 scenarios: empty, static UI, animated UI, mixed, deep hierarchy, grid stress
- Automated metrics collection and performance assessment
- Timing breakdown percentages
This enables proper dirty flag propagation for the upcoming texture caching
system (#144) and provides infrastructure for performance benchmarking (#104).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 15:44:09 -05:00
markDirty ( ) ; // #144 - Propagate to parent for texture caching
feat: Add UILine, UICircle, and UIArc drawing primitives
Implement new UIDrawable-derived classes for vector graphics:
- UILine: Thick line segments using sf::ConvexShape for proper thickness
- Properties: start, end, color, thickness
- Supports click detection along the line
- UICircle: Filled and outlined circles using sf::CircleShape
- Properties: radius, center, fill_color, outline_color, outline
- Full property system for animations
- UIArc: Arc segments for orbital paths and partial circles
- Properties: center, radius, start_angle, end_angle, color, thickness
- Uses sf::VertexArray with TriangleStrip for smooth rendering
- Supports arbitrary angle spans including negative (reverse) arcs
All primitives integrate with the Python API through mcrfpy module:
- Added to PyObjectsEnum for type identification
- Full getter/setter support for all properties
- Added to UICollection for scene management
- Support for visibility, opacity, z_index, name, and click handling
closes #128, closes #129
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 21:42:33 -05:00
return true ;
}
return false ;
}
bool UICircle : : getProperty ( const std : : string & name , float & value ) const {
if ( name = = " radius " ) {
value = radius ;
return true ;
} else if ( name = = " outline " ) {
value = outline_thickness ;
return true ;
} else if ( name = = " x " ) {
value = position . x ;
return true ;
} else if ( name = = " y " ) {
value = position . y ;
return true ;
}
return false ;
}
bool UICircle : : getProperty ( const std : : string & name , sf : : Color & value ) const {
if ( name = = " fill_color " ) {
value = fill_color ;
return true ;
} else if ( name = = " outline_color " ) {
value = outline_color ;
return true ;
}
return false ;
}
bool UICircle : : getProperty ( const std : : string & name , sf : : Vector2f & value ) const {
if ( name = = " center " | | name = = " position " ) {
value = position ;
return true ;
}
return false ;
}
2026-01-04 15:32:14 -05:00
bool UICircle : : hasProperty ( const std : : string & name ) const {
// Float properties
if ( name = = " radius " | | name = = " outline " | |
name = = " x " | | name = = " y " ) {
return true ;
}
// Color properties
if ( name = = " fill_color " | | name = = " outline_color " ) {
return true ;
}
// Vector2f properties
if ( name = = " center " | | name = = " position " ) {
return true ;
}
return false ;
}
feat: Add UILine, UICircle, and UIArc drawing primitives
Implement new UIDrawable-derived classes for vector graphics:
- UILine: Thick line segments using sf::ConvexShape for proper thickness
- Properties: start, end, color, thickness
- Supports click detection along the line
- UICircle: Filled and outlined circles using sf::CircleShape
- Properties: radius, center, fill_color, outline_color, outline
- Full property system for animations
- UIArc: Arc segments for orbital paths and partial circles
- Properties: center, radius, start_angle, end_angle, color, thickness
- Uses sf::VertexArray with TriangleStrip for smooth rendering
- Supports arbitrary angle spans including negative (reverse) arcs
All primitives integrate with the Python API through mcrfpy module:
- Added to PyObjectsEnum for type identification
- Full getter/setter support for all properties
- Added to UICollection for scene management
- Support for visibility, opacity, z_index, name, and click handling
closes #128, closes #129
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 21:42:33 -05:00
// Python API implementations
PyObject * UICircle : : get_radius ( PyUICircleObject * self , void * closure ) {
return PyFloat_FromDouble ( self - > data - > getRadius ( ) ) ;
}
int UICircle : : set_radius ( PyUICircleObject * self , PyObject * value , void * closure ) {
if ( ! PyNumber_Check ( value ) ) {
PyErr_SetString ( PyExc_TypeError , " radius must be a number " ) ;
return - 1 ;
}
self - > data - > setRadius ( static_cast < float > ( PyFloat_AsDouble ( value ) ) ) ;
return 0 ;
}
PyObject * UICircle : : get_center ( PyUICircleObject * self , void * closure ) {
sf : : Vector2f center = self - > data - > getCenter ( ) ;
auto type = ( PyTypeObject * ) PyObject_GetAttrString ( McRFPy_API : : mcrf_module , " Vector " ) ;
if ( ! type ) return NULL ;
PyObject * result = PyObject_CallFunction ( ( PyObject * ) type , " ff " , center . x , center . y ) ;
Py_DECREF ( type ) ;
return result ;
}
int UICircle : : set_center ( PyUICircleObject * self , PyObject * value , void * closure ) {
PyVectorObject * vec = PyVector : : from_arg ( value ) ;
if ( ! vec ) {
PyErr_Clear ( ) ;
PyErr_SetString ( PyExc_TypeError , " center must be a Vector or tuple (x, y) " ) ;
return - 1 ;
}
self - > data - > setCenter ( vec - > data ) ;
return 0 ;
}
PyObject * UICircle : : get_fill_color ( PyUICircleObject * self , void * closure ) {
sf : : Color c = self - > data - > getFillColor ( ) ;
auto type = ( PyTypeObject * ) PyObject_GetAttrString ( McRFPy_API : : mcrf_module , " Color " ) ;
if ( ! type ) return NULL ;
PyObject * result = PyObject_CallFunction ( ( PyObject * ) type , " iiii " , c . r , c . g , c . b , c . a ) ;
Py_DECREF ( type ) ;
return result ;
}
int UICircle : : set_fill_color ( PyUICircleObject * self , PyObject * value , void * closure ) {
sf : : Color color ;
if ( PyObject_IsInstance ( value , PyObject_GetAttrString ( McRFPy_API : : mcrf_module , " Color " ) ) ) {
auto pyColor = ( PyColorObject * ) value ;
color = pyColor - > data ;
} else if ( PyTuple_Check ( value ) ) {
int r , g , b , a = 255 ;
if ( ! PyArg_ParseTuple ( value , " iii|i " , & r , & g , & b , & a ) ) {
PyErr_SetString ( PyExc_TypeError , " color tuple must be (r, g, b) or (r, g, b, a) " ) ;
return - 1 ;
}
color = sf : : Color ( r , g , b , a ) ;
} else {
PyErr_SetString ( PyExc_TypeError , " fill_color must be a Color or tuple " ) ;
return - 1 ;
}
self - > data - > setFillColor ( color ) ;
return 0 ;
}
PyObject * UICircle : : get_outline_color ( PyUICircleObject * self , void * closure ) {
sf : : Color c = self - > data - > getOutlineColor ( ) ;
auto type = ( PyTypeObject * ) PyObject_GetAttrString ( McRFPy_API : : mcrf_module , " Color " ) ;
if ( ! type ) return NULL ;
PyObject * result = PyObject_CallFunction ( ( PyObject * ) type , " iiii " , c . r , c . g , c . b , c . a ) ;
Py_DECREF ( type ) ;
return result ;
}
int UICircle : : set_outline_color ( PyUICircleObject * self , PyObject * value , void * closure ) {
sf : : Color color ;
if ( PyObject_IsInstance ( value , PyObject_GetAttrString ( McRFPy_API : : mcrf_module , " Color " ) ) ) {
auto pyColor = ( PyColorObject * ) value ;
color = pyColor - > data ;
} else if ( PyTuple_Check ( value ) ) {
int r , g , b , a = 255 ;
if ( ! PyArg_ParseTuple ( value , " iii|i " , & r , & g , & b , & a ) ) {
PyErr_SetString ( PyExc_TypeError , " color tuple must be (r, g, b) or (r, g, b, a) " ) ;
return - 1 ;
}
color = sf : : Color ( r , g , b , a ) ;
} else {
PyErr_SetString ( PyExc_TypeError , " outline_color must be a Color or tuple " ) ;
return - 1 ;
}
self - > data - > setOutlineColor ( color ) ;
return 0 ;
}
PyObject * UICircle : : get_outline ( PyUICircleObject * self , void * closure ) {
return PyFloat_FromDouble ( self - > data - > getOutline ( ) ) ;
}
int UICircle : : set_outline ( PyUICircleObject * self , PyObject * value , void * closure ) {
if ( ! PyNumber_Check ( value ) ) {
PyErr_SetString ( PyExc_TypeError , " outline must be a number " ) ;
return - 1 ;
}
self - > data - > setOutline ( static_cast < float > ( PyFloat_AsDouble ( value ) ) ) ;
return 0 ;
}
// Required typedef for UIDRAWABLE_GETSETTERS and UIDRAWABLE_METHODS macro templates
typedef PyUICircleObject PyObjectType ;
PyGetSetDef UICircle : : getsetters [ ] = {
{ " radius " , ( getter ) UICircle : : get_radius , ( setter ) UICircle : : set_radius ,
" Circle radius in pixels " , NULL } ,
{ " center " , ( getter ) UICircle : : get_center , ( setter ) UICircle : : set_center ,
" Center position of the circle " , NULL } ,
{ " fill_color " , ( getter ) UICircle : : get_fill_color , ( setter ) UICircle : : set_fill_color ,
" Fill color of the circle " , NULL } ,
{ " outline_color " , ( getter ) UICircle : : get_outline_color , ( setter ) UICircle : : set_outline_color ,
" Outline color of the circle " , NULL } ,
{ " outline " , ( getter ) UICircle : : get_outline , ( setter ) UICircle : : set_outline ,
" Outline thickness (0 for no outline) " , NULL } ,
2025-11-27 22:31:53 -05:00
{ " on_click " , ( getter ) UIDrawable : : get_click , ( setter ) UIDrawable : : set_click ,
2026-01-05 10:16:16 -05:00
" Callable executed when circle is clicked. Function receives (pos: Vector, button: str, action: str). " , ( void * ) PyObjectsEnum : : UICIRCLE } ,
feat: Add UILine, UICircle, and UIArc drawing primitives
Implement new UIDrawable-derived classes for vector graphics:
- UILine: Thick line segments using sf::ConvexShape for proper thickness
- Properties: start, end, color, thickness
- Supports click detection along the line
- UICircle: Filled and outlined circles using sf::CircleShape
- Properties: radius, center, fill_color, outline_color, outline
- Full property system for animations
- UIArc: Arc segments for orbital paths and partial circles
- Properties: center, radius, start_angle, end_angle, color, thickness
- Uses sf::VertexArray with TriangleStrip for smooth rendering
- Supports arbitrary angle spans including negative (reverse) arcs
All primitives integrate with the Python API through mcrfpy module:
- Added to PyObjectsEnum for type identification
- Full getter/setter support for all properties
- Added to UICollection for scene management
- Support for visibility, opacity, z_index, name, and click handling
closes #128, closes #129
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 21:42:33 -05:00
{ " z_index " , ( getter ) UIDrawable : : get_int , ( setter ) UIDrawable : : set_int ,
" Z-order for rendering (lower values rendered first). " , ( void * ) PyObjectsEnum : : UICIRCLE } ,
{ " name " , ( getter ) UIDrawable : : get_name , ( setter ) UIDrawable : : set_name ,
" Name for finding this element. " , ( void * ) PyObjectsEnum : : UICIRCLE } ,
{ " pos " , ( getter ) UIDrawable : : get_pos , ( setter ) UIDrawable : : set_pos ,
" Position as a Vector (same as center). " , ( void * ) PyObjectsEnum : : UICIRCLE } ,
2026-01-19 22:23:47 -05:00
{ " grid_pos " , ( getter ) UIDrawable : : get_grid_pos , ( setter ) UIDrawable : : set_grid_pos , " Position in grid tile coordinates (only when parent is Grid) " , ( void * ) PyObjectsEnum : : UICIRCLE } ,
{ " grid_size " , ( getter ) UIDrawable : : get_grid_size , ( setter ) UIDrawable : : set_grid_size , " Size in grid tile coordinates (only when parent is Grid) " , ( void * ) PyObjectsEnum : : UICIRCLE } ,
feat: Add UILine, UICircle, and UIArc drawing primitives
Implement new UIDrawable-derived classes for vector graphics:
- UILine: Thick line segments using sf::ConvexShape for proper thickness
- Properties: start, end, color, thickness
- Supports click detection along the line
- UICircle: Filled and outlined circles using sf::CircleShape
- Properties: radius, center, fill_color, outline_color, outline
- Full property system for animations
- UIArc: Arc segments for orbital paths and partial circles
- Properties: center, radius, start_angle, end_angle, color, thickness
- Uses sf::VertexArray with TriangleStrip for smooth rendering
- Supports arbitrary angle spans including negative (reverse) arcs
All primitives integrate with the Python API through mcrfpy module:
- Added to PyObjectsEnum for type identification
- Full getter/setter support for all properties
- Added to UICollection for scene management
- Support for visibility, opacity, z_index, name, and click handling
closes #128, closes #129
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 21:42:33 -05:00
UIDRAWABLE_GETSETTERS ,
2025-11-27 16:33:17 -05:00
UIDRAWABLE_PARENT_GETSETTERS ( PyObjectsEnum : : UICIRCLE ) ,
2026-01-13 20:40:34 -05:00
UIDRAWABLE_ALIGNMENT_GETSETTERS ( PyObjectsEnum : : UICIRCLE ) ,
feat: Add UILine, UICircle, and UIArc drawing primitives
Implement new UIDrawable-derived classes for vector graphics:
- UILine: Thick line segments using sf::ConvexShape for proper thickness
- Properties: start, end, color, thickness
- Supports click detection along the line
- UICircle: Filled and outlined circles using sf::CircleShape
- Properties: radius, center, fill_color, outline_color, outline
- Full property system for animations
- UIArc: Arc segments for orbital paths and partial circles
- Properties: center, radius, start_angle, end_angle, color, thickness
- Uses sf::VertexArray with TriangleStrip for smooth rendering
- Supports arbitrary angle spans including negative (reverse) arcs
All primitives integrate with the Python API through mcrfpy module:
- Added to PyObjectsEnum for type identification
- Full getter/setter support for all properties
- Added to UICollection for scene management
- Support for visibility, opacity, z_index, name, and click handling
closes #128, closes #129
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 21:42:33 -05:00
{ NULL }
} ;
PyMethodDef UICircle_methods [ ] = {
UIDRAWABLE_METHODS ,
{ NULL }
} ;
PyObject * UICircle : : repr ( PyUICircleObject * self ) {
std : : ostringstream oss ;
auto & circle = self - > data ;
sf : : Vector2f center = circle - > getCenter ( ) ;
sf : : Color fc = circle - > getFillColor ( ) ;
oss < < " <Circle center=( " < < center . x < < " , " < < center . y < < " ) "
< < " radius= " < < circle - > getRadius ( ) < < " "
< < " fill_color=( " < < ( int ) fc . r < < " , " < < ( int ) fc . g < < " , "
< < ( int ) fc . b < < " , " < < ( int ) fc . a < < " )> " ;
return PyUnicode_FromString ( oss . str ( ) . c_str ( ) ) ;
}
int UICircle : : init ( PyUICircleObject * self , PyObject * args , PyObject * kwds ) {
static const char * kwlist [ ] = {
" radius " , " center " , " fill_color " , " outline_color " , " outline " ,
2026-01-13 20:40:34 -05:00
" on_click " , " visible " , " opacity " , " z_index " , " name " ,
" align " , " margin " , " horiz_margin " , " vert_margin " , NULL
feat: Add UILine, UICircle, and UIArc drawing primitives
Implement new UIDrawable-derived classes for vector graphics:
- UILine: Thick line segments using sf::ConvexShape for proper thickness
- Properties: start, end, color, thickness
- Supports click detection along the line
- UICircle: Filled and outlined circles using sf::CircleShape
- Properties: radius, center, fill_color, outline_color, outline
- Full property system for animations
- UIArc: Arc segments for orbital paths and partial circles
- Properties: center, radius, start_angle, end_angle, color, thickness
- Uses sf::VertexArray with TriangleStrip for smooth rendering
- Supports arbitrary angle spans including negative (reverse) arcs
All primitives integrate with the Python API through mcrfpy module:
- Added to PyObjectsEnum for type identification
- Full getter/setter support for all properties
- Added to UICollection for scene management
- Support for visibility, opacity, z_index, name, and click handling
closes #128, closes #129
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 21:42:33 -05:00
} ;
float radius = 10.0f ;
PyObject * center_obj = NULL ;
PyObject * fill_color_obj = NULL ;
PyObject * outline_color_obj = NULL ;
float outline = 0.0f ;
// Common UIDrawable kwargs
PyObject * click_obj = NULL ;
int visible = 1 ;
float opacity_val = 1.0f ;
int z_index = 0 ;
const char * name = NULL ;
2026-01-13 20:40:34 -05:00
PyObject * align_obj = NULL ; // Alignment enum or None
float margin = 0.0f ;
float horiz_margin = - 1.0f ;
float vert_margin = - 1.0f ;
feat: Add UILine, UICircle, and UIArc drawing primitives
Implement new UIDrawable-derived classes for vector graphics:
- UILine: Thick line segments using sf::ConvexShape for proper thickness
- Properties: start, end, color, thickness
- Supports click detection along the line
- UICircle: Filled and outlined circles using sf::CircleShape
- Properties: radius, center, fill_color, outline_color, outline
- Full property system for animations
- UIArc: Arc segments for orbital paths and partial circles
- Properties: center, radius, start_angle, end_angle, color, thickness
- Uses sf::VertexArray with TriangleStrip for smooth rendering
- Supports arbitrary angle spans including negative (reverse) arcs
All primitives integrate with the Python API through mcrfpy module:
- Added to PyObjectsEnum for type identification
- Full getter/setter support for all properties
- Added to UICollection for scene management
- Support for visibility, opacity, z_index, name, and click handling
closes #128, closes #129
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 21:42:33 -05:00
2026-01-13 20:40:34 -05:00
if ( ! PyArg_ParseTupleAndKeywords ( args , kwds , " |fOOOfOpfisOfff " , ( char * * ) kwlist ,
feat: Add UILine, UICircle, and UIArc drawing primitives
Implement new UIDrawable-derived classes for vector graphics:
- UILine: Thick line segments using sf::ConvexShape for proper thickness
- Properties: start, end, color, thickness
- Supports click detection along the line
- UICircle: Filled and outlined circles using sf::CircleShape
- Properties: radius, center, fill_color, outline_color, outline
- Full property system for animations
- UIArc: Arc segments for orbital paths and partial circles
- Properties: center, radius, start_angle, end_angle, color, thickness
- Uses sf::VertexArray with TriangleStrip for smooth rendering
- Supports arbitrary angle spans including negative (reverse) arcs
All primitives integrate with the Python API through mcrfpy module:
- Added to PyObjectsEnum for type identification
- Full getter/setter support for all properties
- Added to UICollection for scene management
- Support for visibility, opacity, z_index, name, and click handling
closes #128, closes #129
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 21:42:33 -05:00
& radius , & center_obj , & fill_color_obj , & outline_color_obj , & outline ,
2026-01-13 20:40:34 -05:00
& click_obj , & visible , & opacity_val , & z_index , & name ,
& align_obj , & margin , & horiz_margin , & vert_margin ) ) {
feat: Add UILine, UICircle, and UIArc drawing primitives
Implement new UIDrawable-derived classes for vector graphics:
- UILine: Thick line segments using sf::ConvexShape for proper thickness
- Properties: start, end, color, thickness
- Supports click detection along the line
- UICircle: Filled and outlined circles using sf::CircleShape
- Properties: radius, center, fill_color, outline_color, outline
- Full property system for animations
- UIArc: Arc segments for orbital paths and partial circles
- Properties: center, radius, start_angle, end_angle, color, thickness
- Uses sf::VertexArray with TriangleStrip for smooth rendering
- Supports arbitrary angle spans including negative (reverse) arcs
All primitives integrate with the Python API through mcrfpy module:
- Added to PyObjectsEnum for type identification
- Full getter/setter support for all properties
- Added to UICollection for scene management
- Support for visibility, opacity, z_index, name, and click handling
closes #128, closes #129
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 21:42:33 -05:00
return - 1 ;
}
// Set radius
self - > data - > setRadius ( radius ) ;
// Set center if provided
if ( center_obj & & center_obj ! = Py_None ) {
PyVectorObject * vec = PyVector : : from_arg ( center_obj ) ;
if ( ! vec ) {
PyErr_Clear ( ) ;
PyErr_SetString ( PyExc_TypeError , " center must be a Vector or tuple (x, y) " ) ;
return - 1 ;
}
self - > data - > setCenter ( vec - > data ) ;
}
// Set fill color if provided
if ( fill_color_obj & & fill_color_obj ! = Py_None ) {
sf : : Color color ;
if ( PyObject_IsInstance ( fill_color_obj , PyObject_GetAttrString ( McRFPy_API : : mcrf_module , " Color " ) ) ) {
color = ( ( PyColorObject * ) fill_color_obj ) - > data ;
} else if ( PyTuple_Check ( fill_color_obj ) ) {
int r , g , b , a = 255 ;
if ( ! PyArg_ParseTuple ( fill_color_obj , " iii|i " , & r , & g , & b , & a ) ) {
PyErr_SetString ( PyExc_TypeError , " fill_color tuple must be (r, g, b) or (r, g, b, a) " ) ;
return - 1 ;
}
color = sf : : Color ( r , g , b , a ) ;
} else {
PyErr_SetString ( PyExc_TypeError , " fill_color must be a Color or tuple " ) ;
return - 1 ;
}
self - > data - > setFillColor ( color ) ;
}
// Set outline color if provided
if ( outline_color_obj & & outline_color_obj ! = Py_None ) {
sf : : Color color ;
if ( PyObject_IsInstance ( outline_color_obj , PyObject_GetAttrString ( McRFPy_API : : mcrf_module , " Color " ) ) ) {
color = ( ( PyColorObject * ) outline_color_obj ) - > data ;
} else if ( PyTuple_Check ( outline_color_obj ) ) {
int r , g , b , a = 255 ;
if ( ! PyArg_ParseTuple ( outline_color_obj , " iii|i " , & r , & g , & b , & a ) ) {
PyErr_SetString ( PyExc_TypeError , " outline_color tuple must be (r, g, b) or (r, g, b, a) " ) ;
return - 1 ;
}
color = sf : : Color ( r , g , b , a ) ;
} else {
PyErr_SetString ( PyExc_TypeError , " outline_color must be a Color or tuple " ) ;
return - 1 ;
}
self - > data - > setOutlineColor ( color ) ;
}
// Set outline thickness
self - > data - > setOutline ( outline ) ;
// Handle common UIDrawable properties
if ( click_obj & & click_obj ! = Py_None ) {
if ( ! PyCallable_Check ( click_obj ) ) {
refactor: Rename click kwarg to on_click for API consistency (closes #126)
BREAKING CHANGE: Constructor keyword argument renamed from `click` to
`on_click` for all UIDrawable types (Frame, Caption, Sprite, Grid, Line,
Circle, Arc).
Before: Frame(pos=(0,0), size=(100,100), click=handler)
After: Frame(pos=(0,0), size=(100,100), on_click=handler)
The property name was already `on_click` - this makes the constructor
kwarg match, completing the callback naming standardization from #139.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-28 14:31:22 -05:00
PyErr_SetString ( PyExc_TypeError , " on_click must be callable " ) ;
feat: Add UILine, UICircle, and UIArc drawing primitives
Implement new UIDrawable-derived classes for vector graphics:
- UILine: Thick line segments using sf::ConvexShape for proper thickness
- Properties: start, end, color, thickness
- Supports click detection along the line
- UICircle: Filled and outlined circles using sf::CircleShape
- Properties: radius, center, fill_color, outline_color, outline
- Full property system for animations
- UIArc: Arc segments for orbital paths and partial circles
- Properties: center, radius, start_angle, end_angle, color, thickness
- Uses sf::VertexArray with TriangleStrip for smooth rendering
- Supports arbitrary angle spans including negative (reverse) arcs
All primitives integrate with the Python API through mcrfpy module:
- Added to PyObjectsEnum for type identification
- Full getter/setter support for all properties
- Added to UICollection for scene management
- Support for visibility, opacity, z_index, name, and click handling
closes #128, closes #129
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 21:42:33 -05:00
return - 1 ;
}
self - > data - > click_register ( click_obj ) ;
}
self - > data - > visible = ( visible ! = 0 ) ;
self - > data - > opacity = opacity_val ;
self - > data - > z_index = z_index ;
if ( name ) {
self - > data - > name = name ;
}
2026-01-13 20:40:34 -05:00
// Process alignment arguments
UIDRAWABLE_PROCESS_ALIGNMENT ( self - > data , align_obj , margin , horiz_margin , vert_margin ) ;
2026-01-09 21:37:23 -05:00
// Register in Python object cache
if ( self - > data - > serial_number = = 0 ) {
self - > data - > serial_number = PythonObjectCache : : getInstance ( ) . assignSerial ( ) ;
PyObject * weakref = PyWeakref_NewRef ( ( PyObject * ) self , NULL ) ;
if ( weakref ) {
PythonObjectCache : : getInstance ( ) . registerObject ( self - > data - > serial_number , weakref ) ;
Py_DECREF ( weakref ) ;
}
}
// #184: Check if this is a Python subclass (for callback method support)
PyObject * circle_type = PyObject_GetAttrString ( McRFPy_API : : mcrf_module , " Circle " ) ;
if ( circle_type ) {
self - > data - > is_python_subclass = ( PyObject * ) Py_TYPE ( self ) ! = circle_type ;
Py_DECREF ( circle_type ) ;
}
feat: Add UILine, UICircle, and UIArc drawing primitives
Implement new UIDrawable-derived classes for vector graphics:
- UILine: Thick line segments using sf::ConvexShape for proper thickness
- Properties: start, end, color, thickness
- Supports click detection along the line
- UICircle: Filled and outlined circles using sf::CircleShape
- Properties: radius, center, fill_color, outline_color, outline
- Full property system for animations
- UIArc: Arc segments for orbital paths and partial circles
- Properties: center, radius, start_angle, end_angle, color, thickness
- Uses sf::VertexArray with TriangleStrip for smooth rendering
- Supports arbitrary angle spans including negative (reverse) arcs
All primitives integrate with the Python API through mcrfpy module:
- Added to PyObjectsEnum for type identification
- Full getter/setter support for all properties
- Added to UICollection for scene management
- Support for visibility, opacity, z_index, name, and click handling
closes #128, closes #129
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 21:42:33 -05:00
return 0 ;
}