pro spd_ui_scroll_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
pro spd_ui_scroll_bar::getProperty, $
value = value, $
range = range, $
xsize = xsize
compile_opt idl2
widget_control, self.id, get_value = value
range = self.range
geo = widget_info(self.id, /geometry)
xsize = geo.scr_xsize
end
pro spd_ui_scroll_bar::setProperty, $
value = value, $
xsize = xsize
compile_opt idl2
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(xsize) then begin
widget_control, self.id, scr_xsize=xsize
endif
end
function spd_ui_scroll_bar::getDataRange,traces,panelinfo
compile_opt idl2,hidden
datarange=[!VALUES.d_nan,!VALUES.d_nan]
for i=0, n_elements(traces)-1 do begin
traces[i]->getproperty, datax=xname
*self.loadeddata->getvardata, name=xname, data=d
if ptr_valid(d) then begin
if (panelinfo.xscale eq 0) then begin
limits = minmax(*d,/nan)
endif else if (panelinfo.xscale eq 1) then begin
limits = minmax(alog10(*d),/nan)
endif else begin
limits = minmax(alog(*d),/nan)
endelse
datarange=minmax([datarange,limits],/nan)
endif
endfor
return,datarange
end
pro spd_ui_scroll_bar::handleEvent, event
compile_opt idl2, hidden
currentwindow = *self.windowstorage->getactive()
currentwindow->GetProperty, panels=panels, locked=locked
lockedpanel = panels->Get(position=locked)
panelinfo = *self.drawObject->getPanelInfo(locked)
if ~is_struct(panelInfo) then begin
*self.statusBar->update,"Unable to scroll at this time."
return
end
lockedpanel->getproperty, tracesettings=tracesettings, xaxis=xaxis
traces = tracesettings->get(/all)
if is_num(traces) then begin
*self.statusbar->update, 'Scrollbar: No valid data exists, cannot scroll.'
return
endif
datarange=self->getDataRange(traces,panelinfo)
if ~finite(datarange[0]) || ~finite(datarange[1]) then begin
*self.statusbar->update, 'Scrollbar: No valid data exists with this scaling option, cannot scroll.'
widget_control, self.id, set_value = (self.range[1]-self.range[0])/2
return
endif
if (datarange[0] ge panelinfo.xrange[0]) and (datarange[1] le panelinfo.xrange[1]) then begin
*self.statusbar->update, 'Scrollbar: Entire data range is already contained within the locked panel'
widget_control, self.id, set_value = (self.range[1]-self.range[0])/2
return
endif
selection_percent = double(event.value)/(self.range[1]-self.range[0])
new_bottom = selection_percent*((datarange[1]-datarange[0])-(panelinfo.xrange[1]-panelinfo.xrange[0]))+datarange[0]
new_top = new_bottom+(panelinfo.xrange[1]-panelinfo.xrange[0])
newprange = [new_bottom,new_top]
if panelinfo.xscale eq 1 then begin
newprange=10^(newprange)
endif else if panelinfo.xscale eq 2 then begin
newprange=exp(newprange)
endif
xaxis->setproperty, rangeoption=2
xaxis->updaterange, newprange
*self.drawobject->update, *self.windowstorage, *self.loadeddata
*self.drawobject->draw
end
pro spd_ui_scroll_bar::update
compile_opt idl2, hidden
currentwindow = *self.windowstorage->getactive()
currentwindow->GetProperty, panels=panels, locked=locked
if locked lt 0 then begin
widget_control, self.id, sensitive=0, set_value=0
return
endif
lockedpanel = panels->Get(position=locked)
if ~obj_valid(lockedpanel) then begin
widget_control, self.id, sensitive=0, set_value=0
return
endif
panelinfo = *self.drawObject->getPanelInfo(locked)
if ~is_struct(panelInfo) then begin
*self.statusBar->update,"Unable to scroll at this time."
return
end
lockedpanel->getproperty, tracesettings=tracesettings
traces = tracesettings->get(/all)
if is_num(traces) then begin
widget_control, self.id, set_value=(self.range[1]-self.range[0])/2, $
sensitive=0
return
endif
datarange=self->getDataRange(traces,panelinfo)
if ~finite(datarange[0]) || ~finite(datarange[1]) then begin
widget_control, self.id, set_value = (self.range[1]-self.range[0])/2, $
sensitive = 0
return
endif
if (datarange[0] ge panelinfo.xrange[0]) and (datarange[1] le panelinfo.xrange[1]) then begin
widget_control, self.id, set_value = (self.range[1]-self.range[0])/2, $
sensitive = 1
return
endif
drange = (datarange[1] - datarange[0])-(panelinfo.xrange[1]-panelinfo.xrange[0])
widget_control, self.id, set_value = ((panelinfo.xrange[0]-datarange[0])/drange)*(self.range[1]-self.range[0]) > self.range[0] < self.range[1], $
sensitive = 1
end
function spd_ui_scroll_bar::init, $
parent, $
xsize, $
windowstorage, $
loadeddata, $
drawobject, $
statusbar, $
value=value, $
range=range
compile_opt idl2
m = 'Scroll Bar Object: '
n = 'Scroll Bar Error: '
if ~keyword_set(parent) then begin
ok = error_message(m+'Missing parent widget',/center,title=n)
return, 0
endif
if ~keyword_set(xsize) then begin
ok = error_message(m+'Missing xsize value',/center,title=n)
return, 0
endif
if ~obj_valid(drawobject) then begin
ok = error_message(m+'Missing draw object reference',/center,title=n)
return, 0
endif
if ~obj_valid(loadeddata) then begin
ok = error_message(m+'Missing loaded data object reference',/center,title=n)
return, 0
endif
if ~obj_valid(windowstorage) then begin
ok = error_message(m+'Missing windows object reference',/center,title=n)
return, 0
endif
if ~obj_valid(statusbar) then begin
ok = error_message(m+'Missing status bar object reference',/center,title=n)
return, 0
endif
if ~keyword_set(range) then range = [0,1000]
if ~keyword_set(value) or (value lt range[0]) or (value gt range[1]) then $
value = 0
self.drawobject = ptr_new(drawobject)
self.loadeddata = ptr_new(loadeddata)
self.windowstorage = ptr_new(windowstorage)
self.statusbar = ptr_new(statusbar)
self.parent = parent
self.range = range
self.id = widget_slider(self.parent, $
max = self.range[1], $
min = self.range[0], $
scroll = 0.02*(self.range[1]-self.range[0]), $
value = value, $
uvalue = self, $
xsize = xsize, $
event_pro = 'spd_ui_scroll_bar_event', $
/suppress_value)
return, 1
end
pro spd_ui_scroll_bar__define
compile_opt idl2
struct = {SPD_UI_SCROLL_BAR, $
parent: 0, $
id: 0, $
range: [0,0], $
windowstorage: ptr_new(), $
loadeddata: ptr_new(), $
drawobject: ptr_new(), $
statusbar: ptr_new() $
}
end