[Cuis-dev] dependency mechanism for TextModelMorph

Mark Volkmann r.mark.volkmann at gmail.com
Mon Mar 24 12:39:21 PDT 2025


The conclusion I'm reaching is that the necessary events to be notified of
every change to the value of a TextModelMorph aren't really in place, at
least not to support what I'm trying to do. It is far simpler to just do
this:

initialize
    | tmm |

    tmm := TextModelMorph withText: '' ::
        acceptOnAny: true;
        askBeforeDiscardingEdits: false.
    tmm keystrokeAction: [:event |
        tmm text print.
    ].
    SystemWindow new addMorph: tmm; openInWorld.

On Mon, Mar 24, 2025 at 12:41 PM Weslleymberg Lisboa <
weslleym.lisboa at gmail.com> wrote:

> Thats interesting... I tested it on a clean image updated to #7088. It
> asks to save the file on the first key stroke and generates the
> #clearUserEdits every time. Attached is a FileOut of the class I used.
>
> When inserting text, TextModel's actualContent is mainly changed through
> TextModel>>#basicReplaceFrom:to:with: and not by #actualContents:.
> Unfortunately, I think this is the furthest we can go with a clean base
> image. Anything beyond that will require you to change it or subclass
> TextModel or TextModelMorph to make it generate the desired notifications.
>
> I tried modifying #basicReplaceFrom:to:with: to include "self changed:
> #actualContents" but it caused a bug that makes cursor jump to the
> beginning of the string on every key stroke. Don't know why... since
> #basicReplaceFrom:to:with: does note return anything specific.
>
> Em 24/03/2025 09:41, Mark Volkmann escreveu:
> > Your solution does cause the update: method to be called, but only on
> > the first keystroke in the TextModelMorph. The argument passed to
> > update: is the symbol #clearUserEdits. I want a solution that invokes
> > update: on every keystroke. I know I could listen for key events, but
> > I'd really like to find a solution that utilizes the dependency
> > mechanism. Here is the latest code in the initialize method:
> >
> > initialize
> >      | tmm |
> >
> >      tmm := TextModelMorph withText: '' :: acceptOnAny: true.
> >      tmm model addDependent: self.
> >      SystemWindow new
> >          addMorph: tmm;
> >          model: tmm model;
> >          openInWorld.
> >
> > On Sun, Mar 23, 2025 at 10:24 PM Weslleymberg Lisboa
> > <weslleym.lisboa at gmail.com <mailto:weslleym.lisboa at gmail.com>> wrote:
> >
> >     This works:
> >
> >     initialize
> >
> >              | tmm window |
> >
> >              tmm := TextModelMorph withText: '' :: acceptOnAny: true.
> >
> >              "tmm model when: #changed: send: #update: to: self.
> >     (Samething as below)"
> >              tmm model addDependent: self.
> >
> >              SystemWindow new addMorph: tmm; model: tmm model;
> openInWorld.
> >
> >
> >     update: anEvent
> >
> >              (anEvent asString, ' triggered!') print.
> >
> >     Have no idea at the moment why this works and your example doesn't.
> But
> >     I looked on how TextEditor class>>#open and SystemWindow
> >     class>>#editString:label:wrap: does it to see what needs to be set
> >     before opening the window.
> >
> >
> >     Em 23/03/2025 18:31, Mark Volkmann escreveu:
> >      > I must be doing a poor job of describing what I want to achieve.
> >      > I've boiled it down to the minimum code needed to demonstrate.
> >      > Here are the steps:
> >      >
> >      > - create a subclass of Object
> >      >
> >      > - add the following instance methods
> >      >
> >      > initialize
> >      >      | tmm |
> >      >
> >      >      tmm := TextModelMorph withText: '' :: acceptOnAny: true.
> >      >      SystemWindow new addMorph: tmm; openInWorld.
> >      >
> >      > update: arg
> >      >      'update was called' print
> >      >
> >      > What can I do in the initialize method so update: is called after
> >     every
> >      > keystroke in the TextModelMorph?
> >      > Here are two things I tried that do not work:
> >      >
> >      >      tmm model addDependent: self.
> >      >
> >      >      tmm model when: #actualContents send: #update: to: self.
> >      >
> >      > On Sun, Mar 23, 2025 at 11:45 AM Weslleymberg Lisboa via Cuis-dev
> >     <cuis-
> >      > dev at lists.cuis.st <mailto:dev at lists.cuis.st> <mailto:cuis-
> >     dev at lists.cuis.st <mailto:cuis-dev at lists.cuis.st>>> wrote:
> >      >
> >      >     TextModel generates some events. Browse senders of #changed:
> >     to see
> >      >     it. Maybe the event that #addDepedent: listens to is not the
> >     one you
> >      >     need.
> >      >
> >      >     Cuis use the Observer Pattern as a dependency mechanism (see
> >     [1]) so
> >      >     #addDependent: and #changed: are "simplifications" of
> >     #when:send:to:
> >      >     and #triggerEvent:with:
> >      >
> >      >     IMHO if what you need is to be notified of changes in the
> >     model, I'd
> >      >     use it directly instead of making TextModelMorph notify me.
> >      >
> >      >     1 - <https://github.com/nmingotti/The-Cuis-CookBook/wiki/The-
> >     <https://github.com/nmingotti/The-Cuis-CookBook/wiki/The->
> >      >     Dependency-Mechanism--3 <https://github.com/nmingotti/The-
> >     Cuis- <https://github.com/nmingotti/The-Cuis->
> >      >     CookBook/wiki/The-Dependency-Mechanism--3>>
> >      >
> >      >
> >      >     Em 23 de março de 2025 11:53:10 BRT, Mark Volkmann via
> Cuis-dev
> >      >     <cuis-dev at lists.cuis.st <mailto:cuis-dev at lists.cuis.st>
> >     <mailto:cuis-dev at lists.cuis.st <mailto:cuis-dev at lists.cuis.st>>>
> >     escreveu:
> >      >
> >      >         As far as I can tell,TextModelmorph does not
> >     send#changed:every
> >      >         time its value changes, so that prevents me from
> >     listening for
> >      >         updates. I see that the TextModelmethodactualContents:does
> >      >         send#changed:, but that is not invoked on every change to
> >      >         aTextModelMorpheven when it is configured
> >     withacceptOnAny: true.
> >      >
> >      >         On Sun, Mar 23, 2025 at 9:38 AM <ken.dickey at whidbey.com
> >     <mailto:ken.dickey at whidbey.com>
> >      >         <mailto:ken.dickey at whidbey.com
> >     <mailto:ken.dickey at whidbey.com>>> wrote:
> >      >
> >      >             On 2025-03-23 06:35, Mark Volkmann via Cuis-dev wrote:
> >      >
> >      >              > ...
> >      >              > myTextModelMorph addDependent: self.
> >      >             ..
> >      >              >
> >      >              > I have a few questions.
> >      >              > - Are there reasons why I should not want this
> >     ability?
> >      >
> >      >             Generally, Morphs are Views and update to reflect
> >     changes in an
> >      >             underlying Model.
> >      >
> >      >             A Morph can be a Model if sensible.
> >      >
> >      >              > - Would it be better to listen for changes on the
> >      >             underlying TextModel?
> >      >
> >      >             IMHO, yes.
> >      >
> >      >             $0.02,
> >      >             -KenD
> >      >
> >      >
> >      >
> >      >
> >      >     --
> >      >     Att.
> >      >     Wéslleymberg Lisboa
> >      >     Graduado em Sistemas de Informação
> >      >     Docente no IFFluminense - Campus Itaboraí
> >      >     Ex-Bolsista de IC do Núcleo de Computação Científica
> (NC2-IFF) -
> >      >     Projeto IFF Aerospace
> >      >     Github: https://github.com/weslleymberg <https://github.com/
> >     weslleymberg> <https://github.com/ <https://github.com/>
> >      >     weslleymberg>
> >      >     Tel.: +55 22 99931-2376
> >      >     --
> >      >     Cuis-dev mailing list
> >      > Cuis-dev at lists.cuis.st <mailto:Cuis-dev at lists.cuis.st>
> >     <mailto:Cuis-dev at lists.cuis.st <mailto:Cuis-dev at lists.cuis.st>>
> >      > https://lists.cuis.st/mailman/listinfo/cuis-dev <https://
> >     lists.cuis.st/mailman/listinfo/cuis-dev> <https://
> >      > lists.cuis.st/mailman/listinfo/cuis-dev <http://lists.cuis.st/
> >     mailman/listinfo/cuis-dev>>
> >      >
> >      >
> >      >
> >      > --
> >      > R. Mark Volkmann
> >      > Object Computing, Inc.
> >
> >     --
> >     Wéslleymberg Lisboa
> >     Graduado em Sistemas de Informação
> >     Docente no IFFluminense - Campus Itaboraí
> >
> >
> >
> > --
> > R. Mark Volkmann
> > Object Computing, Inc.
>
> --
> Wéslleymberg Lisboa
> Graduado em Sistemas de Informação
> Docente no IFFluminense - Campus Itaboraí
>


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


More information about the Cuis-dev mailing list