Hi all,
I have been unable to set EVENT_PRO to a class method. My current work around is to create a dummy 'global' standalone function at the top of the *__DEFINE.pro file that pulls the object data and then calls the method on the object.
I was curious if it is even possible to set a widget event handler to a class method. What is the rationale behind not letting an event handler be a class method? Perhaps it doesn't make sense to do it...
For example,
below is a window/level class that ends up modifying the window/level on a display object that I create. I've been using it for medical imaging.
------------------------------------------------------------ --------
PRO jkcm_window_level_widget_wwEventHandler, event
widget_control, event.top, get_uvalue=obj
obj->wwEventHandler, event
END
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;
PRO jkcm_window_level_widget_wlEventHandler, event
widget_control, event.top, get_uvalue=obj
obj->wlEventHandler, event
END
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;
PRO jkcm_window_level_widget::CREATE_WIDGETS, PARENT_WIDGET = inp_PARENT_WIDGET
self.parent_widget = (N_ELEMENTS(inp_PARENT_WIDGET) NE 0) ? inp_PARENT_WIDGET : WIDGET_BASE(COLUMN=2, YSIZE=512, TLB_FRAME_ATTR=2)
;I would like to be able to say:
; EVENT_PRO='jkcm_window_level_widget::wwEventHandler'
self.wwSlider = WIDGET_SLIDER(self.parent_widget, UNAME='WW_widget', YSIZE=512,$
TITLE='WW', /VERTICAL, EVENT_PRO='jkcm_window_level_widget_wwEventHandler', $
MINIMUM=0, MAXIMUM=4095, /DRAG)
self.wlSlider = WIDGET_SLIDER(self.parent_widget, UNAME='WL_widget',YSIZE=512,$
TITLE='WL', /VERTICAL, EVENT_PRO='jkcm_window_level_widget_wlEventHandler', $
MINIMUM=-1024, MAXIMUM=4095, /DRAG)
END ;jkcm_window_level_widget::CREATE_WIDGETS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;
...
PRO jkcm_window_level_widget::wwEventHandler, event
val=''
widget_control, self.wwSlider, GET_VALUE=val
self.svo->SET_WINDOW_LEVEL, WIDTH=val
END ;jkcm_window_level_widget::wwEventHandler
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;
PRO jkcm_window_level_widget::wlEventHandler, event
val=''
widget_control, self.wlSlider, GET_VALUE=val
self.svo->SET_WINDOW_LEVEL, LEVEL=val
END ;jkcm_window_level_widget::wlEventHandler
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;
FUNCTION jkcm_window_level_widget::INIT, SVO=inp_SVO
self.svo = (N_ELEMENTS(inp_svo) NE 0) ? inp_svo : !NULL
self->CREATE_WIDGETS
RETURN, 1
END
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;
PRO jkcm_window_level_widget::CLEANUP
widget_control, self.parent_widget, /destroy
END
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;
PRO jkcm_window_level_widget__DEFINE
struct = { jkcm_window_level_widget , $
parent_widget:0L,$ ;'top' level widget
wwSlider:0L, $; widget slider for window width
wlSlider:0L, $; widget slider for window level
svo:OBJ_NEW(), $;reference to single_view_obj_graphics object (dont delete)
ww: double(1), $ ;window width
wl: double(1) $ ;window length
}
END ;END jkcm_window_level_widget__DEFINE
|