[Mono-osx] [MonoMac] MM Add-in templates
Michael Hutchinson
m.j.hutchinson at gmail.com
Mon Jan 31 14:05:43 EST 2011
On Sat, Jan 29, 2011 at 2:48 AM, kjpou <kjpou at pt.lu> wrote:
> Michael
>
> See below the responses.
>
> On 1/28/11 8:03 PM, Michael Hutchinson wrote:
>>
>> I see, so you are defining the class in the nib file, not just using
>> it. There are two problems with this:
>> * you cannot use your custom view in more than one nib file, since the
>> register will be generated in both vases.
>> * the C# namespace of the nib's designer class and the the custom view
>> will have to match.
>> * the class is partial across two locations with no intuitive
>> relationship.
>
> Yes that is correct. Also for my short samples it was a lot easier to do it
> that way.
>
>> The "correct" solution to this is nonpartial class with register
>> attribute, but in order to work completely smoothly it would
>> necessitate two nontrivial features:
>> * have MD synch classes defined in C# code into the nib files.
>
> This would be more Apple'ish for people coming over to MM from Obj-c. I
> personally do not see a problem with the way it is implemented now.
> Actually I kind of like it. It is not as automated as XCode but I
> personally feel more in control. The only thing I see is the namespace
> problem. I have not done a large project yet with MM so am limited here.
>
>> * have the MD code generator use the project type database to resolve
>> obj-c types to types registered in C# in the project and libraries,
>> not just MonoMac.dll (I have some proof of concept code for this if
>> anyone else want to take it on).
>>
> That could be as well.
>
> The problem I see with it is that once you start adding outlets and actions
> on a custom NSView from IB they automatically get registered in the
> designer. For example a custom NSView called MyBackView I did not define
> the MyBackView as a subclass of NSView in the Nib file just changed the type
> to be MyBackView. The following is what is generated in the designer class.
>
> // Should subclass MonoMac.Foundation.NSObject
> [MonoMac.Foundation.Register("MyBackView")]
> public partial class MyBackView {
>
> private global::MonoMac.AppKit.NSButton __mt_myButton;
>
> private global::MonoMac.AppKit.NSTextField __mt_myLabel;
>
> #pragma warning disable 0169
> [MonoMac.Foundation.Export("buttonAction:")]
> partial void buttonAction (MonoMac.AppKit.NSButton sender);
>
> [MonoMac.Foundation.Export("myButtonAction:")]
> partial void myButtonAction (MonoMac.AppKit.NSButton sender);
>
> [MonoMac.Foundation.Connect("myButton")]
> private global::MonoMac.AppKit.NSButton myButton {
> get {
> this.__mt_myButton =
> ((global::MonoMac.AppKit.NSButton)(this.GetNativeField("myButton")));
> return this.__mt_myButton;
> }
> set {
> this.__mt_myButton = value;
> this.SetNativeField("myButton", value);
> }
> }
>
> [MonoMac.Foundation.Connect("myLabel")]
> private global::MonoMac.AppKit.NSTextField myLabel {
> get {
> this.__mt_myLabel =
> ((global::MonoMac.AppKit.NSTextField)(this.GetNativeField("myLabel")));
> return this.__mt_myLabel;
> }
> set {
> this.__mt_myLabel = value;
> this.SetNativeField("myLabel", value);
> }
> }
> }
>
> When you say non trivial in my opinion it is going to take a rethink of the
> whole process. I do not know how it is all glued together so am not able to
> see the whole picture.
>
> When we start going outside of IB we are going to have to start doing all of
> this in code by hand.
>
> An option could be have two different templates. One for use cases such as
> this and another for when you want to create a non partial class to be used
> programatically. Would that be confusing for developers? Maybe maybe not.
The thing I have a problem with is that the class is effectively
defined by a nib and the nib's designer code file, yet its other part
is kept completely separate from them. It would be *much* better if it
were grouped under the nib file.
Maybe you could add a context menu command to nib files that would
offer to add a partial class file for any classes defined in the nib
that did not already have non-designer parts. This would be a much
more solid approach IMO, and not very hard to implement.
--
Michael Hutchinson
http://mjhutchinson.com
More information about the Mono-osx
mailing list