[Cuis-dev] custom morph confusion

Mark Volkmann r.mark.volkmann at gmail.com
Thu Jul 11 16:50:46 PDT 2024


On Thu, Jul 11, 2024 at 5:51 PM Juan Vuletich <juan at cuis.st> wrote:

> On 7/11/2024 4:39 PM, Mark Volkmann via Cuis-dev wrote:
>
> When creating a custom morph it's not clear to me whether I should
> subclass PlacedMorph or BoxedMorph.
>
> I see that PlacedMorph doesn't hold the size of the morph, but BoxedMorph
> does. BoxedMorph has the instance variable extent and the accessors
> morphExtent and morphExtent:. I want to be able to set the extent of my
> custom morph instances and utilize that size information in my drawOn:
> method.
>
> However, the drawOn: method in PlaceMorph uses a VectorCanvas and
> BoxedMorph uses a HybridCanvas. HybridCanvas doesn't have the
> strokeWidth:color:fillColor:do: method and I want to use that.
>
> I could add my own extent instance variable to my PlacedMorph subclass,
> but that feels wrong.
>
> I need some advice on this.
>
> --
> R. Mark Volkmann
> Object Computing, Inc.
>
> BoxedMorph are a Hierarchy for morphs that are rectangle like, and that
> occupy an area that can be specified as a Rectangle. This means that,
> besides being of rectangular shape, sides are aligned with local coordinate
> axes. Including rectangles with rounded corners and such. The idea is that
> the 'extent' ivar is all that's needed to establish our dimensions and
> shape.
>
> They are used, for example, for common widgets.
>
> If your morph is not in the shape of a rectangle, it is better to make it
> a PlacedMorph. See `PlacedMorph subclasses`, and play with instances of
> them in your Morphic World to see some of the things that can be done.
>
> See #requiresVectorCanvas and #knowsOwnLocalBounds. You can redefine
> #requiresVectorCanvas in a subclass of BoxedMorph if desired. But see, in
> the other subclasses of PlacedMorph, the kind of freedom you get when you
> can make #knowsOwnLocalBounds answer false.
>
> Finally, you can add whatever instance variable you need to any of your
> classes. You're the master. Why would adding 'extent' to your own
> PlacedMorph feel wrong, if that happens to be what you need / want? Don't
> be shy. You're just playing.
>
> Happy explorations!
>

Thanks Juan! I suppose the reason I thought that adding an `extent`
instance variable to my class was suspect is that I would get that
automatically if I subclass BoxedMorph instead of PlacedMorph.

Here is my latest code that subclasses PlacedMorph and does add an `extent`
instance variable. I'm curious if anyone sees anything suspect in this code.

PlacedMorph subclass: #CanvasDemo
    instanceVariableNames: 'extent'
    classVariableNames: ''
    poolDictionaries: ''
    category: 'Volkmann'

extent
    ^ extent

extent: aPoint
    extent := aPoint

initialize
    super initialize.
    extent := 100 @ 100

drawOn: aCanvas
    | x1 x2 y1 y2 |
    x1 := 0.
    y1 := 0.
    x2 := extent x.
    y2 := extent y.
    aCanvas strokeWidth: 10 color: Color red fillColor: Color green do: [
        aCanvas
            moveTo: x1 @ y1;
            lineTo: x2 @ y2;
            lineTo: x2 @ y1;
            lineTo: x1 @ y1;
            lineTo: x1 @ y2;
            lineTo: x2 @ y2

Here's an example of using this class:

cd := CanvasDemo new extent: 300 at 400.
cd openInHand.

-- 
R. Mark Volkmann
Object Computing, Inc.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.cuis.st/mailman/archives/cuis-dev/attachments/20240711/aff10b6a/attachment-0001.htm>


More information about the Cuis-dev mailing list