diff options
Diffstat (limited to 'vendor/x11iraf/ximtool/gui/panel.tcl')
-rw-r--r-- | vendor/x11iraf/ximtool/gui/panel.tcl | 835 |
1 files changed, 835 insertions, 0 deletions
diff --git a/vendor/x11iraf/ximtool/gui/panel.tcl b/vendor/x11iraf/ximtool/gui/panel.tcl new file mode 100644 index 00000000..257f253c --- /dev/null +++ b/vendor/x11iraf/ximtool/gui/panel.tcl @@ -0,0 +1,835 @@ + +################################################################################ +# MAIN CONTROL PANEL +################################################################################ + + +# Global control panel buttons. +# ------------------------------- +proc cpInitialize args \ +{ + send imagewin setCursorType busy + send client initialize + send imagewin setCursorType idle +} +send initializeButton addCallback cpInitialize +send normalizeButton addCallback normalize + +# Temporarily deactivate some buttons. +send optimizeButton setSensitive false + +#----------------------------------------------------------------------------- + +foreach i $frames {set saveView($i) "1 1"} + +send prevFrame set bitmap larrow +send nextFrame set bitmap rarrow +send contrastLabel set bitmap contrast +send brightnessLabel set bitmap brightness +send contrastSlider resizeThumb 0.1 1.0 +send brightnessSlider resizeThumb 0.1 1.0 +send focusSlider "resizeThumb 0.1 1.0 ; moveThumb 1.0" + + +# panel -- Toggle control panel display. +proc panel args \ +{ + global panel_up + if {$panel_up} { + send panelShell unmap + set panel_up 0 + } else { + send panelShell map + set panel_up 1 + } +} + +proc pbTracePanel {name element op} \ +{ + catch { + upvar $name panel_up + send controlButton set state $panel_up + } +} ; trace variable panel_up w pbTracePanel + + +# resetPanel -- Calling during startup or in an initialize, to reset things. +proc resetPanel {param old new} \ +{ + global frame nframes frames + global displayPanner displayMagnifier displayCoords + global blinkFrames warnings peakCentroid + + switch $new { + startup { + } + restart { foreach i $frames { + send frame$frame set on 0 + } + + # Initialize to hide the extra frames. + send frlistBox set width 30 + } + done { if {$frame} { + send frame$frame set on 1 + } + + cpResetBlink + set button 1 + foreach i {1 2 3 4} { + send blinkFrame$button set label $i + incr button + } + for {set i 1} {$i <= 16} {incr i} { + send brFrame$i set label $i + } + + cpResetEnhance + send pannerButton set on [true $displayPanner] + send magnifierButton set on [true $displayMagnifier] + send coordsBoxButton set on [true $displayCoords] + send warningsButton set on $warnings + send peakupButton set on [true $peakCentroid] + } + } +}; send initialize addCallback resetPanel + + + +# Control Panel Tabs widget procedures. +#---------------------------------------- + +set cpTabs { display_panel print_panel load_panel save_panel \ + info_panel wcs_panel tile_panel} +set tabTop "display_panel" + + +# Resize the control panel depending on the Tab selected. +proc cpResizeCB { widget event a b c d e args } \ +{ + global tabTop fileList + + # Handle only the first exposure event generated. + if { $a == 0 && $b == 0 && $c == 0 && $d == 0 && $e == 0 } { + set tabTop $widget + + switch $widget { + display_panel { send panel set height 595 } + print_panel { send panel set height 545 } + load_panel { send panel set height 485 + if { [send browseHdrs get on] } { + send imageList setList $fileList resize + } else { + send client setLoadOption rescan + } + } + save_panel { send panel set height 325 } + info_panel { send panel set height 380 } + tile_panel { send panel set height 405 } + wcs_panel { setCoordPanelHeight } + } + } +} ; foreach w $cpTabs { send $w addEventHandler cpResizeCB exposureMask } + + +proc panelDismiss args \ +{ + global panel_up + send panelShell unmap + set panel_up 0 +} ; send panelClose addCallback panelDismiss + + +proc panelTabToggle { panel args } \ +{ + global tabTop panel_up TabToWidget + + if {$tabTop == $panel && $panel_up} { + send panelShell unmap + send $TabToWidget($panel) set state 0 + set panel_up 0 + + } else { + # Special cases for each panel. + if {$panel == "load_panel"} { + send client setLoadOption rescan + } + + send panelTabs setTop $panel + set tabTop $panel + + # Now fire it up if it's not already open. + if {$panel_up == 0} { + send panelShell map + set panel_up 1 + } + + } +} + +proc displayPanel args { panelTabToggle display_panel } +proc infoPanel args { panelTabToggle info_panel } +proc loadPanel args { panelTabToggle load_panel } +proc savePanel args { panelTabToggle save_panel } +proc printPanel args { panelTabToggle print_panel } +proc tilePanel args { panelTabToggle tile_panel } +proc wcsPanel args { panelTabToggle wcs_panel } + + + + +# Frame selection. +# ------------------------------- +proc cpSetFrame {widget args} \ +{ + send $widget set on 0 + send client setFrame [send $widget get label] +} + +proc cpFrameChanged {param old new} \ +{ + global frameCache + + if {$old > 0} { + send frame$old set on 0 + } + if {$new > 0} { + send frame$new set on 1 + } + + # The first time we request frame 5 or higher reset + # the extra frame buttons on the control panel to make + # them visible. + if {$new >= 5} { + send frlistBox set width 49 + } + + # Update the header panel object list. + catch { + # Only update when the header panel is open. + if {[info exists frameCache($new)] && [send imageHeader get on]} { + setHdrObjMenu $new + getHeader [lindex $frameCache($new) 0] [lindex $frameCache($new) 1] + } + } +} + +send prevFrame addCallback prevFrame +send nextFrame addCallback nextFrame +send frame addCallback cpFrameChanged +for {set i 1} {$i <= 16} {incr i} {send frame$i addCallback cpSetFrame} + +# Initialize to hide the extra frames. +send frlistBox set width 30 + +proc blinkPanelCB { widget type state args } \ +{ + if {$state} { + send blink_panel map + } else { + send blink_panel unmap + } +} ; send blinkPanel addCallback blinkPanelCB + +proc blinkPanelClose args \ +{ + send blink_panel unmap + send blinkPanel set state 0 +} ; send brClose addCallback blinkPanelClose + + + +# Frame buttons. +proc cpFrameAction {widget args} \ +{ + global frameZoomX frameZoomY frame + switch $widget { + aspect { set xmag $frameZoomX($frame) + set ymag $frameZoomY($frame) + set zoom [expr round (($xmag + $ymag) / 2.0)] + cpZoom $zoom $zoom fixed + } + flipX { send client flip x } + flipY { send client flip y } + flipXY { send client flip x y } + clearFrame { clearFrame } + fitFrame { fitFrame } + } +} +foreach widget {aspect flipX flipY flipXY clearFrame fitFrame} { + send $widget addCallback cpFrameAction +} + +# clearFrame -- Clear the current display frame. +proc clearFrame args \ +{ + global warnings + if {$warnings} { + Wexec client \ + "Clearing the frame will destroy\n\ + all data in the frame" \ + clearFrame + } else { + send client clearFrame + } +} + +# fitFrame -- Resize the display window to fit the frame buffer. +proc fitFrame args \ +{ + global frameWidth frameHeight winWidth winHeight + set dw [expr [send display get width] - $winWidth] + set dh [expr [send display get height] - $winHeight] + send display "resize [expr $frameWidth + $dw] [expr $frameHeight + $dh]" +} + +proc initFitFrame { param old new } \ +{ + if { [lindex $new 0] == "resize"} { + fitFrame + } + pannerMapImage init +}; send frameFit addCallback initFitFrame + + + +# Zoom and pan buttons. +# ------------------------------- +proc cpZoomAction {widget args} \ +{ + global frameWidth frameHeight + + switch $widget { + x1 { cpZoom 1 1 fixed } + z2 { cpZoom 2 2 fixed } + z3 { cpZoom 3 3 fixed } + z4 { cpZoom 4 4 fixed } + z5 { cpZoom 5 5 fixed } + z8 { cpZoom 8 8 fixed } + + d2 { cpZoom [expr 1.0/2] [expr 1.0/2] fixed } + d3 { cpZoom [expr 1.0/3] [expr 1.0/3] fixed } + d4 { cpZoom [expr 1.0/4] [expr 1.0/4] fixed } + d5 { cpZoom [expr 1.0/5] [expr 1.0/5] fixed } + d8 { cpZoom [expr 1.0/8] [expr 1.0/8] fixed } + + zoomIn { cpZoom 2.0 2.0 relative } + zoomOut { cpZoom 0.5 0.5 relative } + + centerFrame { send client pan \ + [expr $frameWidth/2.0] \ + [expr $frameHeight/2.0] + } + toggleZoom { toggleZoom } + } +} + +proc cpZoom {zoom_x zoom_y mode} \ +{ + global frameZoomX frameZoomY zoomindex frame + global frameOffsetX frameOffsetY frameCenterX frameCenterY + + if {$mode == "fixed"} { + #send client zoom $zoom_x $zoom_y + send client zoomAbs $zoom_x $zoom_y \ + $frameCenterX($frame) $frameCenterY($frame) \ + $frameOffsetX($frame) $frameOffsetY($frame) + } else { + #send client zoom \ + # [expr $frameZoomX($frame) * $zoom_x] \ + # [expr $frameZoomY($frame) * $zoom_y] + send client zoomAbs \ + [expr $frameZoomX($frame) * $zoom_x] \ + [expr $frameZoomY($frame) * $zoom_y] \ + $frameCenterX($frame) $frameCenterY($frame) \ + $frameOffsetX($frame) $frameOffsetY($frame) + } + + set zoomindex($frame) 0 +} + +proc toggleZoom args \ +{ + global frameZoomX frameZoomY frameCenterX frameCenterY + global frameWidth frameHeight saveView frame + + if {$frameZoomX($frame) != 1 && $frameZoomY($frame) != 1} { + set saveView($frame) \ + "$frameZoomX($frame) $frameZoomY($frame) \ + $frameCenterX($frame) $frameCenterY($frame)" + send client zoom 1 1 \ + [expr $frameWidth/2.0] \ + [expr $frameHeight/2.0] + } else { + send client zoom $saveView($frame) + } +} + +foreach widget { toggleZoom centerFrame zoomIn zoomOut \ + x1 z2 z3 z4 z5 z8 d2 d3 d4 d5 d8 } { + send $widget addCallback cpZoomAction +} + +# Frame data display. +# ------------------------------- +set cpFrame 0 +set cpXcen 0 +set cpYcen 0 +set cpXmag 0 +set cpYmag 0 +set cpXscale 0 +set cpYscale 0 +set cpXoff 0 +set cpYoff 0 + +proc cpDisplayFrameData {name old new} \ +{ + global cpFrame cpXcen cpYcen cpXoff cpYoff + global cpXmag cpYmag cpXscale cpYscale + + set update 0 + switch $name { + frame { if {$new != $cpFrame} { + set cpFrame $new + set update 1 + } + } + frameView { # Parse the frameView input. + set xmag [lindex $new 0]; set ymag [lindex $new 1] + set xcen [lindex $new 2]; set ycen [lindex $new 3] + set xnorm [lindex $new 4]; set ynorm [lindex $new 5] + set xoff [lindex $new 6]; set yoff [lindex $new 7] + + # We need client coords and the overall scale factors. + set text [send client encodewcs $xcen $ycen] + set xcen [lindex $text 0] + set ycen [lindex $text 1] + set xscale [expr $xmag * $xnorm] + set yscale [expr $ymag * $ynorm] + + if {$xcen != $cpXcen || $ycen != $cpYcen || + $xmag != $cpXmag || $ymag != $cpYmag || + $xoff != $cpXoff || $yoff != $cpYoff || + $xscale != $cpXscale || $yscale != $cpYscale} { + + set cpXcen $xcen; set cpXscale $xscale + set cpYcen $ycen; set cpYscale $yscale + set cpXmag $xmag; set cpXoff $xoff; + set cpYmag $ymag; set cpYoff $yoff; + set update 1 + } + } + } + + if {$update} { + set header [format "-- Frame %d --" $cpFrame] + set center [format "X center: %0.1f\nY center: %0.1f" $cpXcen $cpYcen] + if {int($cpXmag) >= 10} { + set zoom1 [format " X zoom: %0.1f" $cpXmag] + set zoom2 [format " Y zoom: %0.1f" $cpYmag] + } else { + set zoom1 [format "X zoom: %0.1f" $cpXmag] + set zoom2 [format "Y zoom: %0.1f" $cpYmag] + } + if {int($cpXscale) >= 10} { + set scale1 [format "X scale: %0.1f" $cpXscale] + set scale2 [format "Y scale: %0.1f" $cpYscale] + } else { + set scale1 [format "X scale: %0.2f" $cpXscale] + set scale2 [format "Y scale: %0.2f" $cpYscale] + } + set offset [format " Offset: (%0.1f,%0.1f)" $cpXoff $cpYoff] + + send frameData set label [format "%s\n%s\n%s\n%s\n%s\n%s\n%s" \ + $header $center $scale1 $scale2 $zoom1 $zoom2 $offset \ + ] + } +}; foreach p {frame frameView} {send $p addCallback cpDisplayFrameData} + + +# Frame enhancement. +# ------------------------------- +set cpEnhanceDisable 0 +set cpEnhanceId 0 +set cpEnhanceMode none +set cpEnhanceVal 0 +set cpListItem none + +# Windowing the colormap is slow when the mouse is not in the image window, +# so it is necessary to execute the windowColormap in a work procedure. +# This allows any number of slider motion events to be processed for each +# windowColormap, preventing slider events from queueing up. + +proc cpResetEnhance args \ +{ + global cpListItem cpEnhanceId + set cpListItem none + set cpEnhanceId 0 +} + +proc cpSetEnhancement {widget cbtype x y} \ +{ + global cpEnhanceMode cpEnhanceVal cpEnhanceId cpEnhanceDisable + set cpEnhanceMode $widget + set cpEnhanceVal $x + if {!$cpEnhanceId && !$cpEnhanceDisable} { + set cpEnhanceId [postWorkProc cpEnhanceProc] + } +} +proc cpEnhanceProc args \ +{ + global cpEnhanceMode cpEnhanceVal cpEnhanceId + global enhancement frame maxContrast + set val $cpEnhanceVal + + if {$cpEnhanceMode == "contrastSlider"} { + set contrast [lindex $enhancement($frame) 2] + send client windowColormap [lindex $enhancement($frame) 1] \ + [expr (($contrast < 0) ? -$val : $val) * $maxContrast] + } else { + send client windowColormap $val + } + + set cpEnhanceId 0 + return done +} + +proc cpInvert args \ +{ + global enhancement frame + set contrast [lindex $enhancement($frame) 2] + send client updateColormap [lindex $enhancement($frame) 1] \ + [expr -1.0 * $contrast] +} + +proc cpDisplayEnhancement {param old new} \ +{ + global cpEnhanceId maxContrast cpEnhanceDisable + global cpListItem enhancement frame + + if {!$frame} \ + return + set enhance $enhancement($frame) + if {[llength $enhance] < 3} \ + return + + set colortable [lindex $enhance 0] + set offset [lindex $enhance 1] + set scale [lindex $enhance 2] + + send colordata set label [format "-- %s --\nCon %0.2f Brt %0.2f" \ + $colortable $scale $offset] + + if {$colortable != $cpListItem} { + send colorlist highlight $colortable + set cpListItem $colortable + } + + if {!$cpEnhanceId && !$cpEnhanceDisable} { + set cpEnhanceDisable 1 + send contrastSlider moveThumb [expr abs($scale) / $maxContrast] + send brightnessSlider moveThumb $offset + set cpEnhanceDisable 0 + } +} + +foreach i {enhancement frame} { + send $i addCallback cpDisplayEnhancement +} +send contrastSlider addCallback cpSetEnhancement scroll +send brightnessSlider addCallback cpSetEnhancement scroll +send invertButton addCallback cpInvert + + +# Colortable display and selection. +# ------------------------------- +set colorTables {} + +proc cpSetColorList {param old new} \ +{ + set colorTables $new + send colorlist setList $new resize +}; send colortables addCallback cpSetColorList + +proc colorlistResize args \ +{ + global colorTables + send colorlist setList $colorTables resize +}; send colorlist addEventHandler colorlistResize ResizeRedirectMask + +proc cpSelectColor {widget cbtype selections indices} \ +{ + global colortable + foreach selection $selections { + send client setColormap $selection + } +}; send colorlist addCallback cpSelectColor + + +# Frame blink. +# ------------------------------- +send BRtext set label $blinkRate +send brBRtext set label $blinkRate + +proc cpSetBlinkRate {w args} \ +{ + global blinkRate + if {$w == "BRincrease" || $w == "brBRincrease"} { + if {$blinkRate < 0.01} { + set blinkRate 0.125 + } else { + set blinkRate [expr $blinkRate * 2.0] + } + } else { + set blinkRate [expr $blinkRate / 2.0] + if {$blinkRate < 0.01} { + set blinkRate 0 + } + } + send BRtext set label $blinkRate + send brBRtext set label $blinkRate +} +foreach w {BRincrease BRdecrease brBRincrease brBRdecrease} { + send $w addCallback cpSetBlinkRate +} + +proc cpSetBlinkFrame {widget args} \ +{ + global blinkFrames frames nframes + + set frame [send $widget get label] + if {$frame == " "} { + set frame 1 + } else { + incr frame + if {$frame > $nframes} { + set frame " " + } + } + send $widget set label $frame + + set blinkFrames {} + foreach i {1 2 3 4} { + set frame [send blinkFrame$i get label] + if {$frame != " "} { + lappend blinkFrames $frame + } + } +}; foreach i {1 2 3 4} {send blinkFrame$i addCallback cpSetBlinkFrame} + +proc cpBlink {widget args} \ +{ + global blinkRate blinkId + + if {$blinkRate < 0.01} { + send blinkButton set on False + send brBlinkButton set on False + blink + } elseif {($blinkId != 0) != [send $widget get on]} { + toggleBlink + } +} ; foreach w {blinkButton brBlinkButton} {send $w addCallback cpBlink} + + +proc cpAutoRegister {widget type state args} \ +{ + global auto_reg frame frames blinkFrames + global frameZoomX frameZoomY frameOffsetX frameOffsetY + + set auto_reg $state + if {$auto_reg == 1} { + send autoregButton set on True + send brAregButton set on True + } else { + send autoregButton set on False + send brAregButton set on False + } + + # Register the frames to zero the offsets. + send client registerFrames \{$blinkFrames\} + foreach f $frames { + set frameOffsetX($f) 0 + set frameOffsetY($f) 0 + } +} ; foreach w {autoregButton brAregButton} {send $w addCallback cpAutoRegister} + + +proc toggleAutoReg args \ +{ + global auto_reg + if {$auto_reg} { + cpAutoRegister autoregButton dummy 0 + set auto_reg 0 + } else { + cpAutoRegister autoregButton dummy 1 + set auto_reg 1 + } +} + +proc resetAutoReg args \ +{ + global auto_reg + if {$auto_reg} \ + toggleAutoReg +}; send initialize addCallback resetAutoReg + + +proc cpResetBlink args \ +{ + global blinkRate blinkFrames blinkIndex frames + global defaultBlinkRate + + foreach i {1 2 3 4} { + send blinkFrame$i set label " " + } + for {set i 1} {$i <= 16} {incr i} { + send brFrame$i set label $i + } + set blinkRate $defaultBlinkRate + send BRtext set label $blinkRate + send brBRtext set label $blinkRate + set blinkIndex 0 +} +send blinkReset addCallback cpResetBlink +send brReset addCallback cpResetBlink + +proc cpTraceBlink {name element op} \ +{ + upvar $name blinkId + send blinkButton set on [expr $blinkId != 0] + send brBlinkButton set on [expr $blinkId != 0] +}; trace variable blinkId w cpTraceBlink + +proc cpSetBlinkFrames {param old new} \ +{ + global blinkFrames frames + + set blinkFrames {} + foreach i $frames { + if {$i <= $new} { + lappend blinkFrames $i + } + } + cpResetBlink + set button 1 + for {set i 1} {$i <= $new} {incr i} { + if {$i <= 4} { + send blinkFrame$button set label $i + } + send brFrame$button set label $i + incr button + } +}; send nframes addCallback cpSetBlinkFrames + +proc cpRegisterFrames args \ +{ + global frames blinkFrames + global frameOffsetX frameOffsetY + + foreach f $frames { + set frameOffsetX($f) 0 + set frameOffsetY($f) 0 + } + send client registerFrames \{$blinkFrames\} +} +send registerButton addCallback cpRegisterFrames +send brRegButton addCallback cpRegisterFrames + +proc cpMatchFrames args \ +{ + global blinkFrames + send client matchFrames \{$blinkFrames\} +} +send matchButton addCallback cpMatchFrames +send brMatchButton addCallback cpMatchFrames + + +# Options buttons. +# ------------------------------- +proc cpSetPanner {widget args} \ +{ + setPanner [send $widget get on] +}; send pannerButton addCallback cpSetPanner + +proc cpTracePanner {name element op} \ +{ + upvar $name panner_enable + send pannerButton set on $panner_enable +}; trace variable panner_enable w cpTracePanner + +proc cpSetMagnifier {widget args} \ +{ + setMagnifier [send $widget get on] +}; send magnifierButton addCallback cpSetMagnifier + +proc cpTraceMagnifier {name element op} \ +{ + upvar $name magnifier_enable + send magnifierButton set on $magnifier_enable +}; trace variable magnifier_enable w cpTraceMagnifier + +proc cpSetCoordsBox {widget args} \ +{ + setTrack [send $widget get on] +}; send coordsBoxButton addCallback cpSetCoordsBox + +proc cpTraceCoordsBox {name element op} \ +{ + upvar $name track_enable + send coordsBoxButton set on $track_enable +}; trace variable track_enable w cpTraceCoordsBox + +proc cpSetWarnings args \ +{ + global warnings + set warnings [send warningsButton get on] +}; send warningsButton addCallback cpSetWarnings + +proc cpSetAutoscale args \ +{ + set value [send autoscaleButton get on] + send client setOption autoscale [expr {$value ? "True" : "False"}] +}; send autoscaleButton addCallback cpSetAutoscale + +proc cpTrackAutoscale {param old new} \ +{ + send autoscaleButton set on [true $new] +}; send autoscale addCallback cpTrackAutoscale + +proc cpSetAntialias args \ +{ + set value [send antialiasButton get on] + send client setOption antialias [expr {$value ? "True" : "False"}] +}; send antialiasButton addCallback cpSetAntialias + +proc cpTrackAntialias {param old new} \ +{ + send antialiasButton set on [true $new] +}; send antialias addCallback cpTrackAntialias + +proc cpSetTileFrames { widget type state args } \ +{ + global tile_frames tileOpt + + set value [send tileFramesButton get on] + if {$value} { + selectTileOrientation junk junk [tileSelToLabel $tileOpt] + } else { + selectTileOrientation junk junk Disabled + } + send client setOption tileFrames \ + [expr {$value ? "True" : "False"}] \{ $tile_frames \} +} ; send tileFramesButton addCallback cpSetTileFrames + +proc cpTrackTileFrames {param old new} \ +{ + send tileFramesButton set on [true $new] +}; send tileFrames addCallback cpTrackTileFrames + +proc tileFramesToggle args \ +{ + set value [send tileFramesButton get on] + send tileFramesButton set on [expr !$value] + cpSetTileFrames +} + |