pro tplot_zoom_event, ev
compile_opt idl2, hidden
if ev.select then widget_control, ev.top, destroy = 1
end
pro tplot_zoom_set_tbar, linestyle = linestyle, color = color, thick = thick, $
reset = reset
compile_opt idl2, hidden
@tplot_zoom_com.pro
if keyword_set(reset) then begin
tbar = {linestyle:2, color: 6, thick:1.0}
return
endif
if size(tbar, /type) ne 8 then begin
tbar = {linestyle:2, color: 6, thick:1.0}
endif
if n_elements(linestyle) ne 0 then tbar.linestyle = linestyle
if n_elements(color) ne 0 then tbar.color = color
if n_elements(thick) ne 0 then tbar.thick = thick
end
pro tplot_zoom_set_ybar, linestyle = linestyle, color = color, thick = thick, $
reset = reset
compile_opt idl2, hidden
@tplot_zoom_com.pro
if keyword_set(reset) then begin
ybar = {linestyle:2, color: 6, thick:1.0}
return
endif
if size(ybar, /type) ne 8 then begin
ybar = {linestyle:2, color: 6, thick:1.0}
endif
if n_elements(linestyle) ne 0 then ybar.linestyle = linestyle
if n_elements(color) ne 0 then ybar.color = color
if n_elements(thick) ne 0 then ybar.thick = thick
end
pro tplot_zoom_trange_stack, reset = reset, addtr = addtr, inc_itr = inc_itr, $
dec_itr = dec_itr
compile_opt idl2, hidden
@tplot_com.pro
@tplot_zoom_com.pro
tspan = tplot_vars.options.trange_full
force_reset = 0
if size(trange_stack, /type) eq 8 then begin
if total(abs(trange_stack.tspan - tspan)) gt 0 then force_reset = 1
endif
if keyword_set(reset) or force_reset gt 0 then begin
tr = tplot_vars.settings.x.crange + tplot_vars.settings.time_offset
vars = tnames(/tplot)
nvars = n_elements(vars)
vars_arr = strarr(1, 100)
vars_arr[0,0:nvars-1] = vars
trange_stack = {tr: transpose(tr), itr:0, vars_arr:vars_arr, $
nvar_arr:[nvars], tspan:tspan}
return
endif
if keyword_set(addtr) then begin
tmptr = tplot_vars.settings.x.crange + tplot_vars.settings.time_offset
tmptr = transpose(tmptr)
tr = [trange_stack.tr[0:trange_stack.itr,*], tmptr]
itr = n_elements(tr) / 2 - 1
vars = tnames(/tplot)
nvars = n_elements(vars)
vars_arr = strarr(1, 100)
vars_arr[0,0:nvars-1] = vars
vars_arr = [trange_stack.vars_arr[0:trange_stack.itr,*], vars_arr]
nvar_arr = [trange_stack.nvar_arr[0:trange_stack.itr], nvars]
trange_stack = {tr: tr, itr:itr, vars_arr:vars_arr, $
nvar_arr:nvar_arr, tspan:tspan}
return
endif
if keyword_set(inc_itr) then begin
ntr = n_elements(trange_stack.tr) / 2
if trange_stack.itr eq ntr - 1 then begin
dprint, 'Already in the end of the time range stack. ', $
'No where to go forward.'
return
endif else begin
trange_stack.itr++
nvars = trange_stack.nvar_arr[trange_stack.itr]
tlist = trange_stack.vars_arr[trange_stack.itr, 0:nvars-1]
tr = trange_stack.tr[trange_stack.itr, *]
tplot, tlist, trange = tr
return
endelse
endif
if keyword_set(dec_itr) then begin
ntr = n_elements(trange_stack.tr) / 2
if trange_stack.itr eq 0 then begin
dprint, 'Already in the beginning of the time range stack. ', $
'No where to go backward.'
return
endif else begin
trange_stack.itr--
nvars = trange_stack.nvar_arr[trange_stack.itr]
tlist = trange_stack.vars_arr[trange_stack.itr, 0:nvars-1]
tr = trange_stack.tr[trange_stack.itr, *]
tplot, tlist, trange = tr
return
endelse
endif
end
pro tplot_zoom_yzoom_vars, reset = reset
compile_opt idl2, hidden
@tplot_com.pro
@tplot_zoom_com.pro
if keyword_set(reset) then begin
if size(yzoom_vars, /type) ne 8 then begin
yzoom_vars = {cvar:''}
endif else yzoom_vars.cvar = ''
return
endif
end
function quick_zoom_event, ev
compile_opt idl2, hidden
@tplot_com.pro
@tplot_zoom_com.pro
if !d.window eq -1 then begin
msg = 'There is currently no plot window. Click OK to continue.'
buttontext = dialog_message(msg, /center, /error)
return, -1
endif
names = tnames('*', /tplot)
if strcmp(names[0], '') then begin
msg = 'There is currently no tplot window yet. Click OK to continue.'
buttontext = dialog_message(msg, /center, /error)
return, -1
endif
widget_control, ev.id, get_uvalue = uvalue
case uvalue of
'ZoomIn2x': begin
trange = tplot_vars.settings.x.crange
tlen = trange[1] - trange[0]
tcenter = mean(trange) + tplot_vars.settings.time_offset
new_trange = tcenter + [-0.25d, 0.25d] * tlen
tlimit, new_trange
tplot_zoom_trange_stack, /add
end
'ZoomIn8x': begin
trange = tplot_vars.settings.x.crange
tlen = trange[1] - trange[0]
tcenter = mean(trange) + tplot_vars.settings.time_offset
new_trange = tcenter + [-0.25d, 0.25d] * tlen * 0.5d * 0.5d
tlimit, new_trange
tplot_zoom_trange_stack, /add
end
'ZoomOut2x': begin
trange = tplot_vars.settings.x.crange
tlen = trange[1] - trange[0]
tcenter = mean(trange) + tplot_vars.settings.time_offset
new_trange = tcenter + [-1d, 1d] * tlen
tlimit, new_trange
tplot_zoom_trange_stack, /add
end
'ZoomOut8x': begin
trange = tplot_vars.settings.x.crange
tlen = trange[1] - trange[0]
tcenter = mean(trange) + tplot_vars.settings.time_offset
new_trange = tcenter + [-1d, 1d] * tlen * 4d
tlimit, new_trange
tplot_zoom_trange_stack, /add
end
'ClickZoom': begin
tlimit
tplot_zoom_trange_stack, /add
end
'Backward': tplot_zoom_trange_stack, /dec
'Forward': tplot_zoom_trange_stack, /inc
'YZoom': begin
ctime,t,y,vname=var,npoints=2, panel = panel, ynorm = ynorm
pos = jbt_tplot_pos()
ivar = panel[0]
s = tplot_vars.settings.y[ivar].s
type = tplot_vars.settings.y[ivar].type
yvalue = (ynorm - s[0]) / s[1]
if type eq 1 then yvalue = 10^yvalue
options,var[0], yrange = minmax(yvalue), ystyle = 1
yzoom_vars.cvar = var[0]
tplot
end
'YZreset': begin
options,yzoom_vars.cvar, 'yrange'
options,yzoom_vars.cvar, 'ystyle'
tplot
end
'FullSpan': begin
tlimit, /full
tplot_zoom_trange_stack, /add
end
'HomeSpan': begin
nvars = trange_stack.nvar_arr[0]
tlist = trange_stack.vars_arr[0, 0:nvars-1]
tr = trange_stack.tr[0,*]
tplot, tlist, trange = tr
tplot_zoom_trange_stack, /add
end
'Tcross': begin
ctime, t, y, vname = vars
tlist = tnames(/tplot)
ind = uniq(vars)
vars = vars[ind]
ntotal = n_elements(tlist)
nsub = n_elements(vars)
if nsub ge ntotal then begin
erase
break
endif
ntmp = n_elements(vars)
con = intarr(ntotal) + 1
for i = 0, ntmp - 1 do begin
ind = where(strcmp(tlist, vars[i]))
con[ind] = 0
endfor
ind = where(con gt 0)
newlist = tlist[ind]
tplot, newlist
tplot_zoom_trange_stack, /add
end
'Tpick': begin
tplot, /pick
tplot_zoom_trange_stack, /add
end
'panForward': begin
trange = tplot_vars.settings.x.crange
tlen = trange[1] - trange[0]
tcenter = mean(trange) + tplot_vars.settings.time_offset
new_trange = trange + tlen * 0.5 + tplot_vars.settings.time_offset
tlimit, new_trange
tplot_zoom_trange_stack, /add
end
'panForward2': begin
trange = tplot_vars.settings.x.crange
tlen = trange[1] - trange[0]
tcenter = mean(trange) + tplot_vars.settings.time_offset
new_trange = trange + tlen * 1.0 + tplot_vars.settings.time_offset
tlimit, new_trange
tplot_zoom_trange_stack, /add
end
'panBackward': begin
trange = tplot_vars.settings.x.crange
tlen = trange[1] - trange[0]
tcenter = mean(trange) + tplot_vars.settings.time_offset
new_trange = trange - tlen * 0.5 + tplot_vars.settings.time_offset
tlimit, new_trange
tplot_zoom_trange_stack, /add
end
'panBackward2': begin
trange = tplot_vars.settings.x.crange
tlen = trange[1] - trange[0]
tcenter = mean(trange) + tplot_vars.settings.time_offset
new_trange = trange - tlen * 1.0 + tplot_vars.settings.time_offset
tlimit, new_trange
tplot_zoom_trange_stack, /add
end
'TimeBar': begin
ctime, tmptime
timebar, tmptime, linestyle = tbar.linestyle, color = tbar.color, $
thick = tbar.thick
end
'YBar': begin
ctime, t, y, panel = panel
pos = jbt_tplot_pos()
for ii = 0, n_elements(panel) - 1 do begin
tmppos = pos[panel[ii], *]
yrange = tplot_vars.settings.y[panel[ii]].crange
if tplot_vars.settings.y[panel[ii]].type eq 1 then $
yvalue = alog10(y[ii]) else yvalue = y[ii]
x0 = tmppos[0]
x1 = tmppos[2]
ylen = tmppos[3] - tmppos[1]
ytmp = (yvalue - yrange[0]) / (yrange[1] - yrange[0]) * ylen $
+ tmppos[1]
plots, [x0, x1], [ytmp, ytmp], /normal, linestyle = ybar.linestyle, $
color = ybar.color, thick = ybar.thick
endfor
end
else: begin
msg = 'No actions defined for this UVALUE. Click OK to continue.'
buttontext = dialog_message(msg, /center, /error)
return, -1
end
endcase
return, 0
end
function tplot_zoom_visible
compile_opt idl2, hidden
@tplot_zoom_com.pro
if n_elements(base) gt 0 then begin
errorNumber = 0L
catch, errorNumber
if (errorNumber ne 0L) then begin
catch, /cancel
return, 0
endif
info = widget_info(base, /visible)
return, info
endif else return, 0
end
pro tplot_zoom, reset = reset, horizontal = horizontal
compile_opt idl2
@tplot_zoom_com.pro
if !d.window eq -1 then begin
msg = 'There is currently no plot window. Click OK to continue.'
buttontext = dialog_message(msg, /center, /error)
return
endif
names = tnames(/tplot)
if strcmp(names[0], '') then begin
msg = 'There is currently no tplot window yet. Click OK to continue.'
buttontext = dialog_message(msg, /center, /error)
return
endif
if keyword_set(reset) or size(trange_stack, /type) ne 8 then begin
tplot_zoom_set_tbar, /reset
tplot_zoom_set_ybar, /reset
tplot_zoom_trange_stack, /reset
tplot_zoom_yzoom_vars, /reset
endif else tplot_zoom_trange_stack, /add
tplot_options, get_options = opt
str_element, opt, 'window', success = s
if s gt 0 then iwin = opt.window else iwin = 0
cur_iwin = !d.window
if iwin ne cur_iwin then begin
wset, iwin
endif
if tplot_zoom_visible() then return
quickbase_width = 140
xpad = 10
tplotwin_xsize = !d.x_size
tplotwin_ysize = !d.y_size
device, get_screen_size = scr_size, get_window_position = winpos
left_margin = winpos[0]
right_margin = scr_size[0] - winpos[0] - tplotwin_xsize
if left_margin lt 400 and right_margin lt 400 then begin
xoffset = 200
endif else begin
if left_margin ge right_margin then begin
xoffset = left_margin - quickbase_width - xpad*2 - 20
endif else begin
xoffset = scr_size[0] - right_margin + 10
endelse
endelse
callback_stack = scope_traceback(/structure)
level = scope_level()
levelstr = callback_stack[level-1]
bmp_dir = file_dirname(levelstr.filename) + path_sep() + $
'tplot_zoom_images' + path_sep()
if keyword_set(horizontal) then shape = 'horizontal'
if n_elements(shape) eq 0 then shape = 'box'
n_buttons = 19
case shape of
'horizontal': begin
basexpad = 10
baseypad = 0
widget_xsize = n_buttons * 36.5 + basexpad * 2
basexoffset = winpos[0] + (tplotwin_xsize - widget_xsize) * 0.5
baseyoffset = scr_size[1] - winpos[1] + 7
base = widget_base(/column, /align_center, xpad = basexpad, $
ypad = baseypad, $
xoffset = basexoffset, yoffset = baseyoffset, $
space = 0)
quickbase = widget_base(base, column=n_buttons, frame = 0, space = 0, $
/align_center)
end
'box': begin
base = widget_base(/column, /align_center, xpad = xpad, ypad = 10, $
xoffset = xoffset, $
yoffset = scr_size[1] - (winpos[1]+tplotwin_ysize), $
space = 10)
quickbase = widget_base(base, column=1, frame = 2, space = 0, $
/align_center, xsize = quickbase_width)
end
else: begin
dprint, 'Invalid shape. Abort.'
return
end
endcase
if strcmp(shape, 'box') then $
quickzoombase = widget_base(quickbase, column=4, frame = 0, space = 3, $
/align_center, xsize = 130) $
else quickzoombase = quickbase
bmp = transpose(read_bmp(bmp_dir + 'zoom_in8.bmp', /rgb), [1,2,0])
plus2 = widget_button(quickzoombase, value = bmp, /bitmap, $
event_func = 'quick_zoom_event', uname = 'ZoomIn8x', uvalue = 'ZoomIn8x', $
tooltip = 'Zoom in x 8')
bmp = transpose(read_bmp(bmp_dir + 'zoom_in2.bmp', /rgb), [1,2,0])
plus = widget_button(quickzoombase, value = bmp, /bitmap, $
event_func = 'quick_zoom_event', uname = 'ZoomIn2x', uvalue = 'ZoomIn2x', $
tooltip = 'Zoom in x 2')
bmp = transpose(read_bmp(bmp_dir + 'zoom_out2.bmp', /rgb), [1,2,0])
minus = widget_button(quickzoombase, value = bmp, /bitmap, $
event_func = 'quick_zoom_event', uname = 'ZoomOut2x', $
uvalue = 'ZoomOut2x', tooltip = 'Zoom out x 2')
bmp = transpose(read_bmp(bmp_dir + 'zoom_out8.bmp', /rgb), [1,2,0])
minus2 = widget_button(quickzoombase, value = bmp, /bitmap, $
event_func = 'quick_zoom_event', uname = 'ZoomOut8x', $
uvalue = 'ZoomOut8x', tooltip = 'Zoom out x 8')
if strcmp(shape, 'box') then $
selectzoombase = widget_base(quickbase, column=4, frame = 0, space = 3, $
/align_center, xsize = 130) $
else selectzoombase = quickbase
bmp = transpose(read_bmp(bmp_dir + 'click_zoom.bmp', /rgb), [1,2,0])
selectzoom = widget_button(selectzoombase, value = bmp, $
event_func = 'quick_zoom_event', uname = 'ClickZoom', $
uvalue = 'ClickZoom', tooltip = 'Left-click twice to zoom a new time range')
bmp = transpose(read_bmp(bmp_dir + 'backward.bmp', /rgb), [1,2,0])
backward = widget_button(selectzoombase, value = bmp, /bitmap, $
event_func = 'quick_zoom_event', uname = 'Backward', $
uvalue = 'Backward', $
tooltip = 'Go backward in the time range stack')
bmp = transpose(read_bmp(bmp_dir + 'forward.bmp', /rgb), [1,2,0])
forward = widget_button(selectzoombase, value = bmp, /bitmap, $
event_func = 'quick_zoom_event', uname = 'Forward', $
uvalue = 'Forward', $
tooltip = 'Go forward in the time range stack')
bmp = transpose(read_bmp(bmp_dir + 'yzoom.bmp', /rgb), [1,2,0])
yzoom = widget_button(selectzoombase, value = bmp, $
event_func = 'quick_zoom_event', uname = 'YZoom', uvalue = 'YZoom', $
tooltip = "Left-click twice to change a single panel's y-range")
if strcmp(shape, 'box') then $
panbase = widget_base(quickbase, column=4, frame = 0, space = 3, $
/align_center, xsize = 130) $
else panbase = quickbase
bmp = transpose(read_bmp(bmp_dir + 'left2.bmp', /rgb), [1,2,0])
left2 = widget_button(panbase, value = bmp, /bitmap, $
event_func = 'quick_zoom_event', uname = 'panBackward2', $
uvalue = 'panBackward2', $
tooltip = 'Pan backward by a full length of the current time range')
bmp = transpose(read_bmp(bmp_dir + 'left.bmp', /rgb), [1,2,0])
left = widget_button(panbase, value = bmp, /bitmap, $
event_func = 'quick_zoom_event', uname = 'panBackward', $
uvalue = 'panBackward', $
tooltip = 'Pan backward by a half length of the current time range')
bmp = transpose(read_bmp(bmp_dir + 'right.bmp', /rgb), [1,2,0])
right = widget_button(panbase, value = bmp, /bitmap,$
event_func = 'quick_zoom_event', uname = 'panForward', $
uvalue = 'panForward', $
tooltip = 'Pan forward by a half length of the current time range')
bmp = transpose(read_bmp(bmp_dir + 'right2.bmp', /rgb), [1,2,0])
right2 = widget_button(panbase, value = bmp, /bitmap, $
event_func = 'quick_zoom_event', uname = 'panForward2', $
uvalue = 'panForward2', $
tooltip = 'Pan forward by a full length of the current time range')
if strcmp(shape, 'box') then $
fullbase = widget_base(quickbase, column=3, frame = 0, space = 3, $
/align_center, xsize = 100) $
else fullbase = quickbase
bmp = transpose(read_bmp(bmp_dir + 'tbar.bmp', /rgb), [1,2,0])
tbar_btn = widget_button(fullbase, value = bmp, /bitmap, $
event_func = 'quick_zoom_event', uname = 'TimeBar', uvalue = 'TimeBar', $
tooltip = 'Left-click to add time bar(s); right-click to return')
bmp = transpose(read_bmp(bmp_dir + 'ybar.bmp', /rgb), [1,2,0])
ybar_btn = widget_button(fullbase, value = bmp, /bitmap, $
event_func = 'quick_zoom_event', uname = 'YBar', uvalue = 'YBar', $
tooltip = 'Left-click to add horizontal bar(s); right-click to return')
bmp = transpose(read_bmp(bmp_dir + 'yzoom_reset.bmp', /rgb), [1,2,0])
yzreset_btn = widget_button(fullbase, value = bmp, /bitmap, $
event_func = 'quick_zoom_event', uname = 'YZreset', uvalue = 'YZreset', $
tooltip = 'Remove yrange of the last y-zoomed tplot variable.')
if strcmp(shape, 'box') then $
homebase = widget_base(quickbase, column=4, frame = 0, space = 3, $
/align_center, xsize = 130) $
else homebase = quickbase
bmp = transpose(read_bmp(bmp_dir + 'cross.bmp', /rgb), [1,2,0])
cross_btn = widget_button(homebase, value = bmp, /bitmap, $
event_func = 'quick_zoom_event', uname = 'Tcross', uvalue = 'Tcross', $
tooltip = 'Remove clicked tplot panels')
bmp = transpose(read_bmp(bmp_dir + 'full.bmp', /rgb), [1,2,0])
fullspan = widget_button(homebase, value = bmp, /bitmap, $
event_func = 'quick_zoom_event', uname = 'FullSpan', uvalue = 'FullSpan', $
tooltip = 'Go back to full time range.')
bmp = transpose(read_bmp(bmp_dir + 'home.bmp', /rgb), [1,2,0])
homespan = widget_button(homebase, value = bmp, /bitmap, $
event_func = 'quick_zoom_event', uname = 'HomeSpan', uvalue = 'HomeSpan', $
tooltip = 'Go back to the home view.')
bmp = transpose(read_bmp(bmp_dir + 'pick.bmp', /rgb), [1,2,0])
pick_btn = widget_button(homebase, value = bmp, /bitmap, $
event_func = 'quick_zoom_event', uname = 'Tpick', uvalue = 'Tpick', $
tooltip = 'Pick tplot panels')
widget_control, base, /realize
xmanager, 'tplot_zoom', base, event_handler = 'tplot_zoom_event', $
no_block = 1
end