Morphic thoughts and Questions
Stefan Matthias Aust
sma at 3plus4.de
Sun Jun 25 13:29:03 UTC 2000
At 20:42 20.06.00 +0200, Stephane Ducasse wrote:
>I decided to rejump into the morphic
Brave man ;-)
>(without the refactoring browser nearly a nightmare ;)
Well, the current state is not the fault of the tools but of the tool
users... even with an refactoring browser you can still forget to refactor
or even have the delusion that there'll be time in the future to do a redesign.
>So I would like to know what are the most important classes that I
>should study and relationships.
For a minimal morphic system, you need
o Morph
o HandMorph
o PasteUpMorph (former WorldMorph)
Morph is the base class of everything that can be displayed in a world and
which what you can interact via a hand. If we look at the instance
variables, Morphs have bounds and can contain other morphs as
submorphs. The morph's own bounds merged with the submorphs' bounds is
called fullBounds. As each morph can be a submorph of another morph, it
has an owner. Every morph is directly or indirected owned by the
world. The only exceptions are morphs picked up by the hand. Their owner
is a hand which is not part of the world. Finally, each morph has a color
(actually not the best idea) and other attributes which are modelled by the
MorphExtension helper class.
HandMorph is the class representing a mouse cursor. Morphic supports more
than one hand, even hands controlled by other systems, called remote hands,
or controlled by an event recoder, a HandMorphForReplay thingy. Normally,
there's one primaryHand per world and one activeHand during event
processing. There's also the notation of a currentHand but I think, either
primary or current but not both makes sense. A hand morph has some 30
instance variables - most of them results of poor refactorings. They hold
internal states like time between double clicks or the active popup menu.
Each hand is an event source and you can register yourself for receiving
events like mouse down or mouse moved. Normally, the hand automatically
interacts with morphs so you don't need to register event handlers. Each
hand also knows a keyboard focus, a morph that receives keyStroke events.
Each hand - normally represented by the hardware cursor - can switch to any
form it wants and can bear user initials which helps to distinguish
different mouse cursors. Actually all images but the primary hand are
simulated. There're more instance variables to cache form images and to
record damage done by morphs which what to redisplay theirselves while
picked up.
Then a hand can send all events via a socket connection to some other
remote hand. This code which burdens the already not trivial
implementation, should be better factored out.
Finally, a hand controls tool tips (aka bubble help), popup menus and drag
and drop. The hand also synthesizes the events it gets from polling during
a world display loop.
A PasteUpMorph is a container, called a world, that contains all other
morphs and bridges that world and other morphic worlds or the old MVC
system. It uses a few helper classes like WorldState or MorphWorldView and
the things gets further complicated by the fact that you can have worlds in
worlds and starting with 2.9a multiple active worlds. (Actually the hole
class is a mess and as Stephane already noticed, it contains a lot of stuff
which should better refactored to specialized classes). Looking at the
instance variables, we see that a world can have a presenter and a model (I
don't understand that) and much other stuff like a background or some not
yet working (or agan broken) things like support for hypercard-like
stacks. More important are the variables of the world state.
Here we see, that a world knows its hands, bounds and a so called step list
which is used to animate morphs which registered theirself at the
world. Actually each morph is steppable, that is, in periodic time steps,
the world automatically calls a #step method which most often leads to
drawing that morph.
The world is responsible to displaying it. Morphs ever directy draw
theirselves but simply post request for redisplay which are collected by
the world, optimized and then performed by calling the morphs' drawOn:
methods. The world knows how often this should happen at most. Between
each redisplay, all events of all hands are processed.
Actually, these three classes are enough to understand morphic and if they
would restrict theirselves on the described functionality, morphic might be
quite easy to understand and program. Unfortunately, all code is bloaded
with support for scripting and probably also contains quite a few obsolete
methods that got lost.
Morphs are the building blocks of morphic but if you want to create UIs,
you need to know a few other morphs, too. A SystemWindow implements a
toplevel window that can contain other morhs, typically
Pluggable<whatever>Morphs. To implement menus, you don't need morphic but
you can use the PopupMenu class and its friends. You might want to use an
AlignmentMorph to layout other morphs but IMHO that is a faulty design and
I'd either stick with the automatic layouting support of SystemWindows or
construct a real layout morph with plugable layout algorithms, similar to
what Java has.
>In fact I really have the impression that Morphic are impacted by the
>scripting, turtle etoy like stuff.
Unfortunately, yes.
>Was it the same in Self?
AFAIK, no.
> - Has any morph a player?
No. AFAIK, you don't need them if you don't want to use scripting.
> I was wondering if Morph could not be
> split into two classes:
> one without extension and etoy related stuff
> and one with extension.
Probably because everyone at Disney was busily working on their internal
projects using the Ur-Morphic like a quarry for code, hacking any change in
the system, delaying refactorings. A good design was not goal.
> A bit like what people made in VisualWorks were they split the
> View class into three classes (one with the controller, model).
Actually, separating controller and view isn't that useful, but separating
the model is. There are MorphicModels but IMHO they're not obvious to use,
and different to what one could expect coming from VisualWorks. It's
nothing separated from the View (the morph) but a
subclass. Pluggable*Morph thingys have no real models - compared with
VisualWorks what I'd call a model. There's no automatic update of the view
if you change the model. And without that feature, I don't need that
models at all. A MorphicModel again is for scripting support as it can for
example automatically generate and compile glue code. Pluggable*Morphs are
such models but I think they don't use these features at all.
> - What is the difference with a player and an actor state?
Don't know
> - Is PasteUpMorph is the class of the current screen when I open
> a morphic project?
Yes.
> if yes (I hope that I understood right)
> why PasteUpMorph needs to have information about
> lastTurtlePositions, TurtlePen, TurtleTrails........
eToy
> I was thinking that only when we use morphic having player we would
> need that kind of information.
Sure.
> - FormCanvas has a strange classVariable called AA that nobody uses.
It's probably some artifact left over in you image. The current 2.9a
doesn't have that variable.
bye
--
Stefan Matthias Aust \\ Truth Until Paradox
More information about the Squeak-dev
mailing list
|