diff options
Diffstat (limited to 'ipl/gprogs/profile.icn')
-rw-r--r-- | ipl/gprogs/profile.icn | 305 |
1 files changed, 305 insertions, 0 deletions
diff --git a/ipl/gprogs/profile.icn b/ipl/gprogs/profile.icn new file mode 100644 index 0000000..8b89a2d --- /dev/null +++ b/ipl/gprogs/profile.icn @@ -0,0 +1,305 @@ +############################################################################ +# +# File: profile.icn +# +# Subject: Program to display scrolling histogram +# +# Author: Ralph E. Griswold +# +# Date: January 21, 1999 +# +############################################################################ +# +# This file is in the public domain. +# +############################################################################ +# +# This program displays successive numbers by lines of corresponding +# height. When the display area is full, it scrolls from right to +# left. +# +# If a line has a number followed by a blank and a string, the string +# is interpreted as a color. +# +############################################################################ +# +# Requires: Version 9 graphics +# +############################################################################ +# +# Links: interact, navitrix, vsetup +# +############################################################################ + +link interact +link vsetup + +global animate # animation toggle +global count # frame count +global height # height of scrolling area +global input # input file +global name # input file name +global offset # base-line offset +global pause # pause vidget +global prefix # image file name prefix +global rate # sample rate +global reset # reset switch +global scale # vertical scale +global state # pause/run state +global strip # graphics context for display +global width # width of scrolling area +global vidgets +global root + +procedure main() + local value, n, color + + init() + + color := "black" # default color + + while value := read() do { + if (*Pending() > 0) | \state then + ProcessEvent(root, , shortcuts) + value ? { + n := tab(upto(' \t') | 0) + if tab(many(' \t')) then color := tab(0) + } + n := (scale * numeric(n)) | { + Fg("black") + Notice("Nonnumeric data; terminating.") + exit() + } + n >:= height # clip to avoid window-manager bugs + CopyArea(strip, 1, 0, width - 1, height, 0, 0) + EraseArea(strip, width - 1, 0, width, height) + Fg(strip, color) | stop("bad color: ", image(color)) + DrawLine(strip, width - 1, height - n - offset, width - 1, + height - offset) + if \animate then + WriteImage(strip, prefix || right(count +:= 1, 4, "0") || ".gif", + 0, 0, width, height) + } + + Fg("black") + + case TextDialog("End of stream.", , , , ["Quit", "Snapshot", "Hold"]) of { + "Quit" : exit() + "Snapshot" : snapshot(strip, 0, 0, width, height) + "Hold" : WDone() + } + +end + +procedure init() + + vidgets := ui() + + root := vidgets["root"] + pause := vidgets["pause"] + VSetState(pause, 1) # initially paused + + name := "" + rate := 1 + scale := 1 + offset := 0 + + count := 0 + prefix := "image" + + width := vidgets["strip"].uw + height := vidgets["strip"].uh + + strip := Clone("dx=" || vidgets["strip"].ux, "dy=" || vidgets["strip"].uy) + Clip(strip, 0, 0, width, height) + + return + +end + +procedure animation_cb(vidget, value) + + case value[1] of { + "prefix" : set_prefix() + "rate" : set_frame_rate() + } + +end + +procedure set_prefix() + + return + +end + +procedure set_frame_rate() + + return + +end + +procedure animate_cb(vidget, value) + + animate := value + + return + +end + +procedure parameters_cb(vidget, value) + + case value[1] of { + "scale @V" : set_scale() + "offset @F" : set_offset() + "rate @R" : set_rate() + } + + fail + +end + +procedure file_cb(vidget, value) + + case value[1] of { + "snapshot @S" : return snapshot(strip, 0, 0, width, height) + "quit @Q" : exit() + } + +end + +procedure pause_cb(vidget, value) + + state := value + + return + +end + +procedure clear_cb() + + EraseArea(strip) + + return + +end + +procedure set_rate() + + repeat { + if TextDialog(, "sample rate", rate, 10) == "Okay" then { + rate := (0 < numeric(dialog_value[1])) | { + Notice("Invalid sample rate.") + next + } + clear_cb() + return + } + else fail # user canceled + } + +end + +procedure set_offset() + + repeat { + if TextDialog(, "vertical offset", offset, 10) == "Okay" then { + offset := numeric(dialog_value[1]) | { + Notice("Invalid offset.") + next + } + clear_cb() + return + } + else fail # user canceled + } + +end + +procedure set_scale() + + repeat { + if TextDialog(, "vertical scale", scale, 10) == "Okay" then { + scale := (0 < numeric(dialog_value[1])) | { + Notice("Invalid scale value.") + next + } + clear_cb() + return + } + else fail # user canceled + } + +end + +procedure shortcuts(e) + + if &meta then + case map(e) of { + "c" : clear_cb() + "f" : set_offset() + "p" : if \state then VSetState(pause) else VSetState(pause, 1) + "q" : exit() + "r" : set_rate() + "s" : snapshot(strip, 0, 0, width, height) + "v" : set_scale() + } + + return + +end + +#===<<vib:begin>>=== modify using vib; do not remove this marker line +procedure ui_atts() + return ["size=651,305", "bg=pale gray", "label=Scrolling Histogram"] +end + +procedure ui(win, cbk) +return vsetup(win, cbk, + [":Sizer:::0,0,651,305:Scrolling Histogram",], + ["animate:Button:regular:1:21,189,56,20:movie",animate_cb], + ["animation:Menu:pull::113,1,71,21:Animation",animation_cb, + ["prefix","rate","clear"]], + ["clear:Button:regular::21,88,56,20:clear",clear_cb], + ["file:Menu:pull::0,1,36,21:File",file_cb, + ["snapshot @S","quit @q"]], + ["label1:Label:::619,144,21,13:100",], + ["label10:Label:::90,269,21,13:500",], + ["label11:Label:::584,269,21,13: 0",], + ["label2:Label:::619,195,21,13: 50",], + ["label3:Label:::619,94,21,13:150",], + ["label4:Label:::619,45,21,13:200",], + ["label5:Label:::619,247,21,13: 0",], + ["label6:Label:::489,269,21,13:100",], + ["label7:Label:::388,269,21,13:200",], + ["label8:Label:::287,269,21,13:300",], + ["label9:Label:::188,269,21,13:400",], + ["line10:Line:::501,253,501,262:",], + ["line11:Line:::200,255,200,264:",], + ["line12:Line:::500,40,500,49:",], + ["line13:Line:::200,40,200,49:",], + ["line14:Line:::615,51,604,51:",], + ["line15:Line:::615,253,604,253:",], + ["line16:Line:::603,256,603,265:",], + ["line17:Line:::101,255,101,264:",], + ["line18:Line:::101,253,90,253:",], + ["line19:Line:::100,51,89,51:",], + ["line2:Line:::90,151,99,151:",], + ["line20:Line:::603,40,603,49:",], + ["line21:Line:::101,40,101,49:",], + ["line22:Line:::400,255,400,264:",], + ["line23:Line:::400,40,400,49:",], + ["line3:Line:::90,200,99,200:",], + ["line4:Line:::90,100,99,100:",], + ["line5:Line:::615,100,604,100:",], + ["line6:Line:::615,151,604,151:",], + ["line7:Line:::615,201,604,201:",], + ["line8:Line:::300,255,300,264:",], + ["line9:Line:::300,40,300,49:",], + ["menu line:Line:::0,23,655,23:",], + ["parameters:Menu:pull::35,1,78,21:Parameters",parameters_cb, + ["scale @V","offset @F","rate @R"]], + ["pause:Button:regular:1:21,41,56,20:pause",pause_cb], + ["strip:Rect:grooved::100,50,504,204:",], + ) +end +#===<<vib:end>>=== end of section maintained by vib |