[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: widget_control and group_leader
In article <3A4652F8.D47410F8@astro.cornell.edu>,
John-David Smith <jdsmith@astro.cornell.edu> wrote:
Thanks JD. Lots of good info here. Having looked at the code, I realize
that I'm unlikely to have more than one object widget behaving in the B
position. So, rather than having the list revolve around objects, I
thought it might be cute to have it use the event.id as the key.
What I mean is that the first thing when you create the Broker is that
it does a
widget_control, id, event_pro = broker_event
to all the widgets. Then, B registers with the broker items in the
signup_list of the following type:
item: Event_ID ;The ID to match
Object B ;The object owning the method
Method ;The method to be called
Call_Before ;A boolean value indicating when to call the method
So, the event handler gets changed to:
1. Find all items in the list such that item.Event_ID = event.id
2. Of these, find those where Call_Before = 1
3. Call each of these methods
4. Send the object back to where it came from (widget control, send..)
5. Find the remaining items where Call_Before = 0
6. Call each of these methods
The principle is the same, the details are a bit different. I also have
some technical questions about your code. Things I couldn't find in the
help.
>
> pro Broker::signup, obj, method, REMOVE=rm
> if obj_valid(obj) eq 0 then return
> if ptr_valid(self.signup) then begin
--> I couldn't find the keyword COMPLEMENT documented in the call to
'where.' It appears to return those items that are not in 'wh'.
> wh=where((*self.signup).object eq obj,cnt,COMPLEMENT=valid)
>
> ;; Rid list of obj, if it's already on there
> if cnt ne 0 then begin
-->Assuming I'm right about what 'valid' is, does valid[0] = -1 if there
are no items in the list that arent in 'wh'?
> if valid[0] eq -1 then ptr_free, self.signup $
-->I am not sure what (*self.signup)[valid] does. Reissue self.signup to
be valid? [valid] ?
> else *self.signup=(*self.signup)[valid]
> endif
> endif
>
> ;; Add it to the list, if necessary
> if keyword_set(rm) then return
>
-->Why does list_item have 'BROKER_SIGNUP'? What does that do/why is it
there?
> list_item={BROKER_SIGNUP,Object:obj,Method:Method}
> if ptr_valid(self.signup) then begin ; append item
> *self.signup=[*self.signup, list_item]
> endif else $ ;create list with item
> self.signup=ptr_new(list_item,/NO_COPY)
> end
>
> pro broker_handler, ev
> widget_control,ev.top, get_uvalue=self
> self->Handler
> end
>
> pro Broker::Handler, ev
> ;; Send it to A
> widget_control, self.A_ID, SEND_EVENT=ev
>
> ;; Send it to all the B's
> if ptr_valid(self.signup) eq 0 then return
>
> for i=0,n_elements(*self.signup)-1 do begin
> call_method, (*self.signup)[i].Method, $
> (*self.signup)[i].Object, ev
> endfor
> end
>
> pro Broker::Cleanup
> ptr_free,self.signup
> end
>
> pro Broker::Init, A_ID
> ;; We will pre-process A's events
> widget_control,A_ID, event_pro= 'c_handler'
> end
>
> pro Broker__Define
> struct={Broker,A_ID: A_ID, signup:ptr_new(), ...}
>
> ;; A convenience struct for the signup list
-->Again, you use the term 'Broker_Signup'. What is that?
> list_struct={BROKER_SIGNUP, object:obj_new(), method:''}
> end
>
> This is just an outline, and I haven't tried it. But it gives you an
idea of
> what I had in mind. You can see how I caught A's events before it
does, and
> then send them on to A (via the standard IDL event flow), and also to
the B's
> (via the method/object they signed up for). You could obviously add
more
> intelligence to this dispatch process (e.g. only button events to B1,
etc.)
>
>
> So, the one thing I didn't specify is when the B's signup for events.
I.e. how
> do they know they are on? Two possibilities:
>
> 1. They are always on, i.e. you start them from the command line, and
they
> immediately sign up:
>
> a=A_widget(lots_of_args)
> c=obj_new('Broker',a)
> b=obj_new('Cool_foreign_helper',BROKER=c)
This seems like a good choice. I really dont want to mess with A.
>
> and in b's Init:
>
> function Cool_foreign_helper::Init, BROKER=brk
> brk->Signup, self, 'MyHandler'
> return, 1
> end
>
> 2. They get turned on by A (which means you'd have to modify A to at
least have
> this ability).
> Just because RSI publishes a manual describing standard event
> processing doesn't mean you can't innovate beyond that (especially in
> unusual cases like yours).
True. Sometimes you just cant follow the herd. Moooo.
Thanks much :)
Nidhi
--
-----------------
Nidhi Kalra
nrk5@cornell.edu
Sent via Deja.com
http://www.deja.com/