> Hi Folks,
>
> I'm wondering if someone can help me here...
>
> I have a view (PrivGraph.View) that displays a directed graph. The display
> is affected by a number of different parameters, so I defined a
> Properties.Property to represent them:
>
> Prop* = POINTER TO PropDesc;
> PropDesc* = RECORD (Properties.Property)
> options* : SET;
> xAngle*, yAngle* : REAL;
> separation* : REAL;
> nodeColour*, edgeColour* : Ports.Color;
> ...
> END;
>
> ...
>
> VAR graphProp* : Prop;
>
> The view responds to Properties.SetMsg and Properties.PollMsg.
>
> I want to be able to control some of the view's properties are directly via
> mouse interaction (e.g.. rotation changes xAngle, yAngle) and some via a
> dialog. I want it to work like the control Inspector: the dialog edits the
> properties of the focus view, and updates automatically when these change.
>
> As far as I can see, the only way to achieve this is to set up a background
> task (Services.Action) to poll the properties of the Focus view using
> Properties.CollectProp.
yes, an action is necessary in order to update the dialog.
The information, that the selection changed in a container
is not distributed by any broadcast. Thus, you have to define your
own action or you define a guard which adjust your dialog. Guards
are executed regularly (in order to have a chance to react upon the
change of a selection).
> My Action copies these properties into a global
> variable (graphProp) which is linked to my dialog. It then calls
> Dialog.Update(graphProp) to update the dialog state.
ok. The Action in ObxCubes first checks, whether a cube is
visible at all. If not, the action terminates. It is restarted in the
restore procedure of ObxCubes. Second it picks the singleton
view and checks, whether it is a cube. If this is the case, then
it is compared with the last singleton cube view. If it is different,
then the properties of the new cube are picked and stored in
the interactor, and then Dialog.Update is called to update the
dialog.
> The notification
> procedure for the dialog copies the properties and calls
> Properties.EmitProp to update the view state.
I do not see why this is necessary, as only the dialog needs
to be updated, not your view.
> It seems to work ... up to a point. Two problems that have me mystified.
>
> 1) In order to receive a Properties.PollMsg from the framework, it seems
> that my view must be part of the selection within its container. I used
> ObxCubes as an example of how this should work. In ObxCubes, if the user
> clicks on the view with the modifier key, the view opens a dialog, and sets
> itself as a singleton selection using:
>
> c := Containers.Focus();
> IF c.opts # Containers.mask THEN
> ...
> c.SetSingleton(v);
> END;
yes, this is not the most elegant solution, probably we will change this
for a next release. The usual case is that the view is selected as singleton
in order to be manipulated by a property editor. Second, the editor
should be accessible over the Edit->Object Properties menu.
> Once my view is a selected singleton, it a receives Properties.PollMsg in
> response to Properties.CollectProp. Unfortunately, in this state it doesn't
> receive any control messages. Even when deposited in its own window, the
> views container interprets control messages (eg. for resizing, moving, etc)
> so I can no longer interact with it using the mouse.
>
> Question 1: How do I make my view so that it can receive PollMsgs AND
> control messages at the same time? I realise that I can implement this
> myself by bypassing the Properties/Focus mechanism, but it ought to be
> possible to do within the framework.
ok. In general, properties are only collected from the selection, thus your
view has to be selected in order to receive Properties.PollMsg/SetMsg.
However, the methods Properties.EmitMsg/CollectMsg are sent to the
focus view (these are controller messages!). If the focus is a container,
then he asks for the properties of its selection (and returns the intersection
of all the properties). If the focus is a simple view as in your case,
then the these two messages have to be answered as well. You have
to send a PollMsg/SetMsg to the view itself. Then you can change
the properties even if the view has the focus.
I have attached a simple view with a color. This color attribute can be
changed using the Attributes menu either if the view is contained in a
selection or if the view has the focus.
> 2) I tried to link my dialog to a property. As declared above, graphProp is
> a pointer to a record. Thus, in my control link fields I have values like:
>
> PrivGraph.graphProp.separation
>
> The problem is that Dialog.Update(graphProp^) does not update the dialog.
> If I declare graphProp as
>
> VAR graphProp : PropDesc;
>
> it seems to work fine.
>
> Question 2: Why doesn't Dialog.Update work if the interactor is a heap
> object accessed via a pointer? Do interactors only work if the record
> itself is declared as a global variable?
no, this should work. I just linked an integer field to M.para.val defined as
para*: POINTER TO RECORD val*: INTEGER END;
and both, Dialog.Update(para) and Dialog.Update(para^) work. Dialog.Update also works,
if the interactor record contains a reference.
Hope, this helps,
- Dominik
StdCoder.Decode ..,, ..ud....3Qw7uP5PRPPNR9Rbf9b8R79FTvMf1GomCrlAy2xhX,Cb2x
hXhC6FU1xhiZiVBhihgmRiioedhgrZcZRiXFfaqmSrtuGfa4700zdGrr8rmCLLCJuyKtYcZRiX
7.2.s,szH.0k,5TWyql.bnayKmKKqGomC5XzET1.PuP.MHT9N9ntumaU2,CJuyKtQC98P9PP7O
NbXmb.2.gd7k2kWa.,6.,U08J99SdfJHPNjvQCJuGKfaqmY6MwdONl1QCh0708T,U..w.wx6U.
sUGpmWbBxhYhAbndMHT9NY6Mw.sQq2Y6cwB.0.nj,,k5ksP.,E.EG5.86.QC18RdfQHfMf9R9v
Q7ONb17.,.D,,6.I16.M.6.JFkns.U.2m,.3Q.AU0KyB.,UgU.UT.,.1.SomuqmOrk2wAC.,U.
2GkRE,8Mtr.2.05,6.c6E.k.U6hggpiZZidRgV7sN22UE04.A,,k.8,w1AULU.IU.k.e.0.AU9
.UmU..1M91.xN.QU0KyBU.2.W10.e,0E.k.0.e0.,6j3.S.w76.c5Nf.OS28U0Cy2hgqRcjhhh
BgiZgZJinpZHZCh0E.4TWKKv.Uio8.,cw5.0..o.6.K,C0yzayIWKJaKIEGpmCLuin4qk2aoa0
pb8Je0GfaqmQig2YExhmZinZZU2emxhkhgmZidhgnRbBAVBAVIBfEhcUgV7AVKBhZ76v76VuHH
eHdOFZ86duH,dI9uETeI786FdJHPNCLLUdgV7AV7Qgu2YExhmFLCormqr8rRqk2akWuIWin4ak
2qk20JdyoVKIWKJdKIEWGveHEOpoK4,dI9vQdvPZHEWGneHEO3Cb4JiVhhZRbUYhg2YoZZUIig
2YWJbUAdCZe3xc3JedQbBAV0hc5BdChV7AVapZ2JiVxiGhgXZicYhg22.N76VuPZ1BPON9PN76
hf95P8PM09eH0GdKqtUvgV7g,VW1,.kI2dVphYZhZ3emxhkhdnxgh2Ycoe,JeUghnxgu2YKBBC
bEJij3C9vQbPMDPNHtCPM0HcJ1eI,tQVfC,7IZvPK4c9bWEJijtC,7Qp76V0916IZ1Ajvg,30k
faIeWIEqqtS4VeQUdV4xhXhin3emhga3Y2xdBAV7AVhRibpZnhgopcjRgp76pND,7JZOJ9O1HM
0t96PvQEt.EcyKqmqaCrn0GWyo4EbKofWmt0rIin4ak2QikpZqBggBhY3YugbUQjEJij3C.5vP
NvPqrRqk2.LfPTvRR96pND,tQVf9h1in4a.sMT9PoZqBgg3Yug5hf95vCPk22emxB.aIrCrm8L
uWmqCrnuGs85N76b9QH,m5I5km.CpmGraCrn.aEs0GRqXhRibp3sCPM0we6BdAhcU2Zk3YX2YC
BdABZUoYUojc2iUAdH3YEJijNN.G5M8,7FT86V96pND0LLuqmWLu0mWuIWi1Ad43Yk3YX.,7JF
OFRO1Hk2akYcRRtM,t6,7QF7IZvPK4.UdoZXxhg,6JFWUgV7AV7A,hf9596p,F7IMN..a0.QbB
A,aUKBBMJV9N19R998h99,dJH1iqmKKsOIt4qqQidQbBA,akWM1HM0.KIaCpWqk2akWu2KIb2Y
6Bgi,MHbnRqk2qUE,..a0U1ZimZhBRib3Ycogu.Cb4,rFf4IdgBeXK,CIu8Lqggn,r76h0BvP5
Xu2YK,O3amRqU0,sJH0PM0H6T.V091MFPPOdPHbvNGYUoedhAbHY4KrG4V0PWcoig2YhFLC5HN
1HM0t1e1MN.5uPmqmCKuqotSKE...g7W0EL0rrmKqam4aU3Z7UCN1EE.C2QCr,kV.Gom0rrCro
GLJin4aUKB6OLR00QbBAV0,cHcRHtC,dJHXn7F99QT1FdRHN1HMF6F99QkRqk2qkWuIWYeZRio
pZBgV02YWYeZRio7F99QUUQeoZg1hhYRii2eVRiohgKBhZd6PcUXDJ9X1xhiZimxhgZhZJinpZ
HlVGLtmKWKqtCK.4Te..c95uPR9R.7ONbvM,kVkkEt.85...CLL.U2V.Iy2U.UIU.U7U.2..AU
0CyIVGhighgmRiiQ88pum470,Mwd0UnpZGhighA70,cw5.,6.QJw.QI2U.sU.ktumdsIdPSNPN
7ONbvM,Mw.ELMSN12Umz.6..F.pW.6.Ikl1.RNEd1MNG259.G.0..676.16.6.6AXhKE.SoA5U
TyB4.4.0E.cUZT1E..UO.,.1.e0.,6Y1.0.UA2Tm.mnIjZ92T,eUXDFTXhhAsE..c2E..U6U..
HE.6wlgR0Oxad.az86Utj00LCjaUojC0eY....
--- end of encoding ---
Received on Thu Jul 15 1999 - 18:30:15 UTC