From: Dave T. <duk...@gm...> - 2011-07-29 23:56:35
|
On 29 July 2011 21:49, Dave Tapley <duk...@gm...> wrote: > Hi Jeremy, > > Did you ever make a start wrapping wxPropertyGrid? > http://permalink.gmane.org/gmane.comp.lang.haskell.wxhaskell.general/1016 > > I'm going to have a go now. > > Dave, > In my quest to understand how a class from wxWidgets is wrapped I took at look at wxSlider as it shares the same class hierarchy as wxPropertyGrid and 'slider' is a fairly distinct term. Searching for 'slider' in the wxHaskell code I extracted the following references to it. Does this look complete? If anyone could comment further on what function each part provides I'd be very grateful. # HAND-WRITTEN FILES # ./wx/src/Graphics/UI/WX/Controls.hs: Haskell impl ./wxcore/src/eiffel/wx_defs.e: Eiffel alias for wxEVT_COMMAND_SLIDER_UPDATED as expEVT_COMMAND_SLIDER_UPDATED ./wxcore/src/include/wxc.h: TClassDefExtend saying wxSlider95 and wxSliderMSW are wxSlider ./wxcore/src/include/wxc_glue.h: Decl of int expEVT_COMMAND_SLIDER_UPDATED(); TClassDefExtend saying wxSlider is a wxControl Decl of many wxSlider_ methods such as wxSlider_ClearSel Decl of wxXmlResource_GetSlider method ./wxcore/src/haskell/Graphics/UI/WXCore/Layout.hs: This code is commented out ./wxcore/src/haskell/Graphics/UI/WXCore/Events.hs: Exports sliderOnCommand, sliderGetOnCommand Def for sliderOnCommand which sends wxEVT_COMMAND_SLIDER_UPDATED and take an eventHandler Def for sliderGetOnCommand which returns the event handler ./wxcore/src/cpp/extra.cpp: ifdef wxUSE_SLIDER wxT("SLIDER") ./wxcore/src/cpp/eljslider.cpp: EWXWEXPORT calls for all the wxSlider_ methods decl'd in wxc_glue.h ./wxcore/src/cpp/eljrc.cpp: BUILD_XRCGETCTRL_FN(Slider) (constructs functions for geting control pointers out of window hierarchies created from XRC files. The functions themselves) ./wxcore/src/cpp/defs.cpp:EWXWCONSTANTINT(wxEVT_COMMAND_SLIDER_UPDATED,wxEVT_COMMAND_SLIDER_UPDATED) ./wxcore/src/cpp/eljevent.cpp: MAKE_EVENT_WRAPPER(EVT_COMMAND_SLIDER_UPDATED) # MISC FILES # ./wxcore/wxcore.cabal: add src/cpp/eljslider.cpp to c-sources ./samples/test/XRCControls/XRCControls_Wx.hs: test code for xrc # GENERATED FILES # ./wxcore/src/haskell/Graphics/UI/WXCore/WxcClassesMZ.hs: File generated by wxDirect from ./wxcore/src/include/wxc.h: Export of (wxEVT_COMMAND_SLIDER_UPDATED :: EventId) Export of many slider functions such as sliderClearSel, these match the wxSlider_ methods decl'd in wxc_glue.h Export of xmlResourceGetSlider function decl'd in wxc_glue.h Definition for slider functions using FFI foreign import ccall Definition of wxEVT_COMMAND_SLIDER_UPDATED which imports the enum value Definition of xmlResourceGetSlider using FFI foreign import ccall ./wxcore/src/haskell/Graphics/UI/WXCore/WxcClassInfo.hs: File generated by wxDirect Export of classSlider, classSlider95, classSliderMSW Export of downcastSlider, downcastSlider95, downcastSliderMSW Definition classSlider functions which bind them to the their C++ class names using a classInfoFindClass function Definition of downcast functions using an objectCast function ./wxcore/src/haskell/Graphics/UI/WXCore/WxcClassTypes.hs: File generated by wxDirect from ./wxcore/src/include/wxc.h: Exports Slider, TSlider, CSlider, and 95 and MSW variants Definitions of these as data types, encapsulating the class hierarchy from C++ classes. TSlider is the inheritance type, CSlider is the abstract type. |
From: Jeremy O'D. <jer...@gm...> - 2011-08-01 15:57:29
|
Hi Dave, Playing catch-up after the weekend... Short answer - I think you have the correct places to put code. On 30 July 2011 00:56, Dave Tapley <duk...@gm...> wrote: > On 29 July 2011 21:49, Dave Tapley <duk...@gm...> wrote: > >> Hi Jeremy, >> >> Did you ever make a start wrapping wxPropertyGrid? >> http://permalink.gmane.org/gmane.comp.lang.haskell.wxhaskell.general/1016 >> >> I'm going to have a go now. >> >> Dave, >> > > In my quest to understand how a class from wxWidgets is wrapped I took at > look at wxSlider as it shares the same class hierarchy as wxPropertyGrid and > 'slider' is a fairly distinct term. > > Searching for 'slider' in the wxHaskell code I extracted the following > references to it. > Does this look complete? If anyone could comment further on what function > each part provides I'd be very grateful. > > > # HAND-WRITTEN FILES # > > ./wx/src/Graphics/UI/WX/Controls.hs: > Haskell impl > 'High' level Haskell wrapper. You place constructors which are property-aware here. In most respects this is straightforward except that you need to work out what instances are appropriate to a PropertyGrid. You may want to look at http://wewantarock.wordpress.com/2010/01/11/custom-controls-in-wxhaskell-part-3/for some more information about implementing Attribute instances. ./wxcore/src/eiffel/wx_defs.e: > Eiffel alias for wxEVT_COMMAND_SLIDER_UPDATED as > expEVT_COMMAND_SLIDER_UPDATED > An ugly piece of legacy from the days when wxcore was derived from an Eiffel wrapping of wxWidgets. Event identifiers need to be defined here. I *really* want to get rid of this file one day - it serves no purpose to have an Eiffel file these days. > ./wxcore/src/include/wxc.h: > TClassDefExtend saying wxSlider95 and wxSliderMSW are wxSlider > This creates the correct type witnesses to map the class Hierarchy. > ./wxcore/src/include/wxc_glue.h: > Decl of int expEVT_COMMAND_SLIDER_UPDATED(); > TClassDefExtend saying wxSlider is a wxControl > Decl of many wxSlider_ methods such as wxSlider_ClearSel > Decl of wxXmlResource_GetSlider method > This is basically where you need to put the declarations for C++ method wrappers. > ./wxcore/src/haskell/Graphics/UI/WXCore/Layout.hs: > This code is commented out > I don't think you would need to do anything here > ./wxcore/src/haskell/Graphics/UI/WXCore/Events.hs: > Exports sliderOnCommand, sliderGetOnCommand > Def for sliderOnCommand which sends wxEVT_COMMAND_SLIDER_UPDATED and take > an eventHandler > Def for sliderGetOnCommand which returns the event handler > Your Haskell event handler code goes here. You need one function which reacts to events, which accepts an event handler as a parameter and a function which will fetch your event handler (you need this mostly in case you want to hook a further event handler which doesn't kill the one already present). > ./wxcore/src/cpp/extra.cpp: > ifdef wxUSE_SLIDER wxT("SLIDER") > I'm not completely sure why this is required. I suspect it's not used any more. > ./wxcore/src/cpp/eljslider.cpp: > EWXWEXPORT calls for all the wxSlider_ methods decl'd in wxc_glue.h > Implementations of the wrappers. The old eljXXX naming convention for these files really isn't necessary any more. I'd suggest calling the implementation 'propertysheet.cpp' or something like that. > ./wxcore/src/cpp/eljrc.cpp: > BUILD_XRCGETCTRL_FN(Slider) (constructs functions for geting control > pointers out of window hierarchies created from XRC files. The functions > themselves) > Correct. > > ./wxcore/src/cpp/defs.cpp:EWXWCONSTANTINT(wxEVT_COMMAND_SLIDER_UPDATED,wxEVT_COMMAND_SLIDER_UPDATED) > I'd forgotten about these. Another way of wrapping up event values as functions. I don't tend to do this, and I don't think anyone has for years... ./wxcore/src/cpp/eljevent.cpp: > MAKE_EVENT_WRAPPER(EVT_COMMAND_SLIDER_UPDATED) > I tend to do this instead. It does exactly the same thing as the code in defs.cppp. # MISC FILES # > > ./wxcore/wxcore.cabal: > add src/cpp/eljslider.cpp to c-sources > Obvious... ./samples/test/XRCControls/XRCControls_Wx.hs: > test code for xrc > You should probably write one or more pieces of test code for your wrapped control. # GENERATED FILES # > > ./wxcore/src/haskell/Graphics/UI/WXCore/WxcClassesMZ.hs: > File generated by wxDirect from ./wxcore/src/include/wxc.h: > Export of (wxEVT_COMMAND_SLIDER_UPDATED :: EventId) > Export of many slider functions such as sliderClearSel, these match the > wxSlider_ methods decl'd in wxc_glue.h > Export of xmlResourceGetSlider function decl'd in wxc_glue.h > Definition for slider functions using FFI foreign import ccall > Definition of wxEVT_COMMAND_SLIDER_UPDATED which imports the enum value > Definition of xmlResourceGetSlider using FFI foreign import ccall > > ./wxcore/src/haskell/Graphics/UI/WXCore/WxcClassInfo.hs: > File generated by wxDirect > Export of classSlider, classSlider95, classSliderMSW > Export of downcastSlider, downcastSlider95, downcastSliderMSW > Definition classSlider functions which bind them to the their C++ class > names using a classInfoFindClass function > Definition of downcast functions using an objectCast function > > ./wxcore/src/haskell/Graphics/UI/WXCore/WxcClassTypes.hs: > File generated by wxDirect from ./wxcore/src/include/wxc.h: > Exports Slider, TSlider, CSlider, and 95 and MSW variants > Definitions of these as data types, encapsulating the class hierarchy from > C++ classes. TSlider is the inheritance type, CSlider is the abstract type. > All correct. Hope this helps. Jeremy |