Hi Dennis,

On Fri, Apr 28, 2017 at 7:09 AM, Rob Rothwell <r.j.rothwell@gmail.com> wrote:
Hi Peter,

Thank you very much for that overview!

It looks like even just creating a window with no other widgets is sort of "hard-wired" to Morphic through ComposableModel>>defaultWindowModelClass, so maybe just overriding that and trying to create a Cocoa window model and adapter is the place to start.

I need to find a good starting point because you can't poke at the existing code too much since even the debugger is built with Spec!

Would your remote IDE [1] be suitable to help Rob to hack around Spec without blowing up his IDE?��
But I think its only available on Pharo 6?


cheers -ben

��

It's pretty exciting, though, because it feels like all the right pieces are there and a lot of this could mostly be "just work" once I get going.

Thanks again,

Rob

On Thu, Apr 27, 2017 at 6:04 PM, Peter Uhnak <i.uhnak@gmail.com> wrote:
Hi Rob,

I guess the best resource at the moment is to just look at existing adapters.

But here are some thoughts to get you started:

(Spec) ComposableModel has as its widget (Spec) Adapter
Adapter has as its widget the actual visual component, which currently means Morphic.


The simplest example: LabelModel

1. model to adapter

LabelModel is adapted by MorphicLabelAdapter:

you can see on the class side in method `defaultSpec`.
There is only `LabelAdapter` there because there is some extra mapping for some classes, but you can specify directly the class of the Adapter, so the following would work just as well:

LabelModel class>>defaultSpec
�� �� �� �� <spec>

�� �� �� �� ^ #(MorphicLabelAdapter
�� �� �� �� �� �� �� �� adapt: #(model))


LabelModel -> LabelAdapter direct event propagation (pushing changes)

in Model world you can call changed:with: to execute code on the Adapter, e.g.

self changed: #emphasis: with: {emphasis}

which in turn will call the #emphasis: method on the LabelAdapter.

LabelModel -> LabelAdapter events (pulling changes)

preferred alternative is to do the opposite; properties of models are often held in ValueHolders, which can be observed on ValueChange, so the Adapter can register to event change and react on itself;

you can see this best in MorphicTabAdapter (but you will see that TabAdapter looks a bit different from the rest, because I was experimenting with cleaning up Adapters...)

2. adapter to morphic

Every adapter implements #buildWidget method that returns a Morphic Object.
Typically the adapter registers itself as the model of the adapter (so adapter's model is Spec, and Morphic's model is the adapter). This depends a lot on the API of morphic. (in TabAdapter I'm overriding adapt: so there's no buildWidget, and it is in #buildWidgetWith:).

It is all kinds of messy, but if you have other widgets then it will be a good test how well Spec can handle it... or rather we'll see how it can be improved...

Peter



On Thu, Apr 27, 2017 at 05:10:39PM -0400, Rob Rothwell wrote:
> Hello,
>
> I have recently been lucky enough to get the Cocoa portion of Mars working
> on Pharo 5.0.�� While there are some issues, it has a wonderful set of
> examples that allowed me create new Cocoa classes and delegate methods and
> see a straightforward path to learning how to use Coco widgets from Pharo.
>
> I'd like to do that by creating appropriate Spec adapters, but
> unfortunately the new Spec booklet wasn't designed for that!
>
> Can anyone give me any insight into creating (and using) a new Spec
> adapter?�� Maybe just some high level steps to help me orient my
> investigation into how Spec works?
>
> Thank you,
>
> Rob