;+ ;NAME: ; thm_ui_slice2d_bar__define.pro ; ;PURPOSE: ; Object created for the 2d slices interface. Allows scrolling back ; and forth over a temporal series of slices. ; ;CALLING SEQUENCE: ; sb = obj_new('THM_UI_SLICE2D_BAR', parentID, xScreenSize, (windowStorage, loadedData, drawObject,) $ ; statusbar=statusbar, value = 500, range = [0,1000]) ; ;ATTRIBUTES: ; id: slider widget's ID ; parent: parent widget's ID ; xsize: screen size, in pixels, of the slider bar ; range: the numerical integer range about which the slider can move (in sec), [0,1000] by default ; value: the current value of the slider, zero (fully left) in the absence of data ; ok: flag indicating whether the slider should be sensitized ; ;PUBLIC METHODS: ; getValue: Allows retrieval of value, range, and xsize ; setValue: Allows setting of value and xsize, mainly for the purpose of gui resize events ; update: Update procedure to be called when: ; -new plots have been generated (after setValue) ; -there was an error (after setValue) ; -events are processed (w/ EVENT keyword) ; ;NOTES: ; ; ;HISTORY: ; Initial version: 4-02-10 ; Added title 3-5-12 ; ;- ;Wrapper to call object's "handleEvent" method which acts ;as the actual event handler. ; pro thm_ui_slice2d_bar_event, event compile_opt idl2, hidden widget_control, event.id, get_uvalue = object object->handleEvent, event widget_control, event.id, set_uvalue = object end ;------------------------------------------ ;Method for getting the current properties of the scroll bar. ; value: The current value of the slider ; range: The range of the slider (1000 by default) ; xsize: The screen size, in pixels, of the slider ; pro thm_ui_slice2d_bar::getProperty, $ value = value, $ range = range, $ xsize = xsize compile_opt idl2, hidden widget_control, self.id, get_value = value range = self.range xsize = self.xsize end ;------------------------------------------ ;Method to directly set the properties of the slider. ;See Update method as well. ; pro thm_ui_slice2d_bar::setProperty, $ value = value, $ xsize = xsize, $ range = range, $ ok = ok compile_opt idl2, hidden if keyword_set(xsize) then begin widget_control, self.id, xsize=xsize endif if keyword_set(range) and n_elements(range) eq 2 then begin ;setting a zero range will fail on mac/linux ; (slider isn't needed for single slice in any case) if range[0] eq range[1] then begin self.ok = 0b self.single = 1b return endif else begin self.single = 0b endelse widget_control, self.id, set_slider_min=range[0], set_slider_max=range[1] self.range = range endif if n_elements(value) gt 0 then begin if (value ge self.range[0]) and (value le self.range[1]) then begin widget_control, self.id, set_value=value endif endif if keyword_set(ok) then self.ok = ok end ;------------------------------------------ ;Method that acts as event handler for widget. ; pro thm_ui_slice2d_bar::handleEvent, event compile_opt idl2, hidden self->updateTitle end ;------------------------------------------ ;Method to update title with # of plots. ; pro thm_ui_slice2d_bar::updateTitle compile_opt idl2, hidden ;if sensitized, check if only 1 plot if ~self.ok then begin if self.single then begin widget_control, self.title, set_value = 'Plot 1 of 1.' endif else begin widget_control, self.title, set_value = 'No slices loaded.' endelse ;otherwise, list number of plots endif else begin widget_control, self.id, get_value = value widget_control, self.title, set_value = $ 'Plot '+strtrim(value+1,2)+' of '+strtrim(self.range[1]+1,2)+'.' endelse end ;------------------------------------------ ;Update method to be called after new slices are generated ; pro thm_ui_slice2d_bar::update, event=event compile_opt idl2, hidden ;Zero slider and desensitize if ~self.ok then begin widget_control, self.id, set_value = self.range[0], sensitive = 0 self->updateTitle return endif ;Zero slider if not from event and return if self.ok then begin if ~keyword_set(event) then begin widget_control, self.id, set_value = self.range[0], sensitive = 1 endif self->updateTitle return endif end ;------------------------------------------ function thm_ui_slice2d_bar::init, $ parent, $ xsize, $ statusbar=statusbar, $ value=value, $ range=range, $ ok=ok compile_opt idl2 m = 'Scroll Bar Object: ' n = 'Scroll Bar Error: ' if ~keyword_set(parent) then begin dummy = error_message(m+'Missing parent widget',/center,title=n) return, 0 endif if ~keyword_set(xsize) then begin dummy = error_message(m+'Missing xsize value',/center,title=n) return, 0 endif if ~keyword_set(range) then range = [0,1000] if ~keyword_set(value) then value = 0 if (value lt range[0]) or (value gt range[1]) then value = range[0] if obj_valid(statusbar) then self.statusbar = ptr_new(statusbar) if ~keyword_set(ok) then ok = 0b self.parent = parent self.range = range self.xsize = xsize self.single = 0b self.ok = ok self.title = widget_label(self.parent, value='No slices loaded.');, xsize=self.xsize);trying without specifying size as label and slider size don't seem to match self.id = widget_slider(self.parent, $ max = self.range[1], $ min = self.range[0], $ scroll = 1, $ value = value, $ uvalue = 'SLIDERBAR', $ xsize = self.xsize, $ ; event_pro = 'thm_ui_slice2d_bar_event', $ /suppress_value) return, 1 end ;------------------------------------------ pro thm_ui_slice2d_bar__define compile_opt idl2 struct = {THM_UI_SLICE2D_BAR, $ parent: 0, $ ;parent's widget ID id: 0, $ ;slider widget's ID xsize: 0, $ ;screen size, in pixels, of the slider range: [0,0], $ ;range of the slider statusbar: ptr_new(), $ ;pointer to status bar object title: 0, $ ;id of title widget single: 0b, $ ;internal flag indicating if single plot exists, ;helps update title on linux where range cannot = 0 ok: 0b $ ;flag indicating where bar should be usable } end