ext/wxBrush.cpp in rwx-0.0.1.dev vs ext/wxBrush.cpp in rwx-0.0.1.1.dev
- old
+ new
@@ -6,28 +6,53 @@
*/
#include "wxBrush.hpp"
#include "wxColor.hpp"
#include "wxBitmap.hpp"
+#include "wxApp.hpp"
#define _self unwrap<wxBrush*>(self)
VALUE rb_cWXBrush;
typedef std::map<wxBrush*,VALUE> brushlisttype;
brushlisttype brushlistholder;
+
template <>
+VALUE wrap< wxBrush >(wxBrush *bitmap )
+{
+ if(!bitmap || !bitmap->IsOk())
+ return Qnil;
+ return wrapTypedPtr(bitmap,rb_cWXBrush);
+}
+
+template <>
+VALUE wrap< wxBrush >(const wxBrush &bitmap )
+{
+ if(bitmap.IsOk())
+ return wrapTypedPtr(const_cast<wxBrush*>(&bitmap),rb_cWXBrush);
+ return Qnil;
+}
+
+template <>
wxBrush unwrap< wxBrush >(const VALUE &vbrush)
{
- return NIL_P(vbrush) ? wxNullBrush : *unwrap< wxBrush* >(vbrush);
+ if(NIL_P(vbrush))
+ return wxNullBrush;
+ if(is_wrapable<wxColor>(vbrush))
+ return wxBrush(unwrap<wxColor>(vbrush));
+ if(rb_obj_is_kind_of(vbrush,rb_cWXBrush))
+ return *unwrap< wxBrush* >(vbrush);
+ else
+ return wxBrush(unwrap<wxBitmap>(vbrush));
}
namespace RubyWX {
namespace Brush {
DLL_LOCAL VALUE _alloc(VALUE self) {
- return wrap(new wxBrush(*wxBLACK));
+ return wrapTypedPtr(new wxBrush,self);
}
macro_attr(Colour,wxColour)
macro_attr_enum(Style,wxBrushStyle)
macro_attr(Stipple,wxBitmap)
@@ -35,10 +60,15 @@
singlereturn(IsHatch)
void define_const()
{
+#if 0
+ rb_mWX = rb_define_module("WX");
+ rb_cWXBrush = rb_define_class_under(rb_mWX,"Brush",rb_cObject);
+#endif
+
if(rb_const_defined(rb_cWXBrush,rb_intern("BLACK")))
return;
rb_define_const(rb_cWXBrush,"BLACK",wrap(wxBLACK_BRUSH));
rb_define_const(rb_cWXBrush,"BLUE",wrap(wxBLUE_BRUSH));
@@ -113,29 +143,53 @@
_setStipple(self, RARRAY_AREF(data,2));
return Qnil;
}
+struct equal_obj {
+ wxBrush* self;
+ VALUE other;
+};
+
+VALUE _equal_block(equal_obj *obj)
+{
+ return wrap(*obj->self == unwrap<wxBrush>(obj->other));
+}
+
+VALUE _equal_rescue(VALUE val)
+{
+ return Qfalse;
+}
+
/*
* call-seq:
* == brush -> bool
*
* compares two brush.
*
*
*/
DLL_LOCAL VALUE _equal(VALUE self, VALUE other)
{
- return wrap((*_self) == unwrap<wxBrush>(other));
+ equal_obj obj;
+ obj.self = _self;
+ obj.other = other;
+
+ return rb_rescue(
+ RUBY_METHOD_FUNC(_equal_block),(VALUE)&obj,
+ RUBY_METHOD_FUNC(_equal_rescue),Qnil
+ );
}
-
DLL_LOCAL VALUE _class_get(int argc,VALUE *argv,VALUE self)
{
VALUE color,style;
rb_scan_args(argc, argv, "11",&color,&style);
+
+ app_protected();
+
//TODO add refcounting
wxBrush *brush = wxTheBrushList->FindOrCreateBrush(
unwrap<wxColor>(color),
NIL_P(style) ? wxBRUSHSTYLE_SOLID : unwrapenum<wxBrushStyle>(style)
);
@@ -147,11 +201,11 @@
brushlisttype::iterator it = brushlistholder.find(brush);
if(it != brushlistholder.end()) {
return it->second;
} else {
//wrap wxBrush pointer to ruby object
- VALUE result = wrap(brush);
+ VALUE result = wrapTypedPtr(brush, self);
//BrushList objects should not be changed
rb_obj_freeze(result);
//Prevent BrushList objects from been deleted
rwx_refobject(result);
@@ -216,16 +270,22 @@
*/
DLL_LOCAL void Init_WXBrush(VALUE rb_mWX)
{
#if 0
+ rb_mWX = rb_define_module("WX");
+#endif
+ using namespace RubyWX::Brush;
+ rb_cWXBrush = rb_define_class_under(rb_mWX,"Brush",rb_cObject);
+ rb_define_alloc_func(rb_cWXBrush,_alloc);
+
+#if 0
rb_define_attr(rb_cWXBrush,"color",1,1);
rb_define_attr(rb_cWXBrush,"style",1,1);
rb_define_attr(rb_cWXBrush,"stipple",1,1);
- //need to
rb_define_const(rb_cWXBrush,"BLACK",wrap(wxBLACK_BRUSH));
rb_define_const(rb_cWXBrush,"BLUE",wrap(wxBLUE_BRUSH));
rb_define_const(rb_cWXBrush,"CYAN",wrap(wxCYAN_BRUSH));
rb_define_const(rb_cWXBrush,"GREEN",wrap(wxGREEN_BRUSH));
rb_define_const(rb_cWXBrush,"YELLOW",wrap(wxYELLOW_BRUSH));
@@ -235,25 +295,21 @@
rb_define_const(rb_cWXBrush,"RED",wrap(wxRED_BRUSH));
rb_define_const(rb_cWXBrush,"TRANSPARENT",wrap(wxTRANSPARENT_BRUSH));
rb_define_const(rb_cWXBrush,"WHITE",wrap(wxWHITE_BRUSH));
#endif
- using namespace RubyWX::Brush;
- rb_cWXBrush = rb_define_class_under(rb_mWX,"Brush",rb_cObject);
- rb_define_alloc_func(rb_cWXBrush,_alloc);
-
rb_define_method(rb_cWXBrush,"initialize",RUBY_METHOD_FUNC(_initialize),-1);
rb_define_private_method(rb_cWXBrush,"initialize_copy",RUBY_METHOD_FUNC(_initialize_copy),1);
rb_define_attr_method(rb_cWXBrush,"color",_getColour,_setColour);
rb_define_attr_method(rb_cWXBrush,"style",_getStyle,_setStyle);
rb_define_attr_method(rb_cWXBrush,"stipple",_getStipple,_setStipple);
rb_define_method(rb_cWXBrush,"hatch?",RUBY_METHOD_FUNC(_IsHatch),0);
rb_define_method(rb_cWXBrush,"marshal_dump",RUBY_METHOD_FUNC(_marshal_dump),0);
- rb_define_method(rb_cWXBrush,"marshal_load",RUBY_METHOD_FUNC(_marshal_load),1);
+ rb_define_method(rb_cWXBrush,"marshal_load",RUBY_METHOD_FUNC(_marshal_load),-2);
rb_define_method(rb_cWXBrush,"==",RUBY_METHOD_FUNC(_equal),1);
//
// rb_define_method(rb_cWXBrush,"to_s",RUBY_METHOD_FUNC(_tos),0);
@@ -270,10 +326,11 @@
->add(wxBRUSHSTYLE_BDIAGONAL_HATCH,"bdiagonal_hatch")
->add(wxBRUSHSTYLE_CROSSDIAG_HATCH,"crossdiag_hatch")
->add(wxBRUSHSTYLE_FDIAGONAL_HATCH,"fdiagonal_hatch")
->add(wxBRUSHSTYLE_CROSS_HATCH,"cross_hatch")
->add(wxBRUSHSTYLE_HORIZONTAL_HATCH,"horizontal_hatch")
- ->add(wxBRUSHSTYLE_VERTICAL_HATCH,"vertical_hatch");
+ ->add(wxBRUSHSTYLE_VERTICAL_HATCH,"vertical_hatch")
+ ->allow_array = false;
}