Hi Dennis, On Fri, Apr 28, 2017 at 7:09 AM, Rob Rothwell <r.j.rothw...@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? [1] http://forum.world.st/Ann-PharmIDE-Pharo-remote-IDE-to-develop-farm-of-Pharo-images-remotely-td4930602.html 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.uh...@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 >> >> >