#!/usr/bin/wish

set host [lindex $argv 0]
set port [lindex $argv 1]
set basedir [lindex $argv 2]
set file3d [lindex $argv 3]

if { $basedir == "" } {
	set basedir "."
}
if { $host == "" } {
	set host "127.0.0.1"
}
if { $port == "" } {
	set port "1234"
}

set tkimages "$basedir/tkimages"
set libdir "$basedir"

if { ! [file isdirectory $tkimages] } {
	set tkimages "$basedir/lib/eccet/tkimages"
	set libdir "$basedir/lib/eccet"
}

if { ! [file isdirectory $tkimages] } {
	puts stderr "Cannot find button images. Please give basedir."
	exit
}

set tkscripts "$basedir/scripts"

if { ! [file isdirectory $tkscripts] } {
	set tkscripts "$basedir/lib/eccet/scripts"
}

if { ! [file isdirectory $tkscripts] } {
	puts stderr "Cannot find script directory. Please give basedir."
	exit
}

set sockid [socket $host $port]
fconfigure $sockid -buffering line

proc putsock { string } {
	global sockid
	catch { puts $sockid "$string" }
}

putsock "RECORDMODE ?\n"

while { 1 == 1 } {
	catch { gets $sockid } text
	if { [string range $text 0 11] == "RECORDMODE: " } {
		set recordmodes [string range $text 12 1000000]
		break
	}
}

proc hide_grey {} {
	global greymenuvis 
	set greymenuvis 0
	wm withdraw .greymenu
}

#
# Additional windows
#
toplevel .greymenu
wm withdraw .greymenu
wm protocol .greymenu WM_DELETE_WINDOW hide_grey

frame .greymenu.window

proc setgcenter { sockid step } {
	putsock "GCENTER $step"
}

scale  .greymenu.window.gcenter -orient vertical -from 4095 -to 0 \
	-resolution 1 -length 400 -command "setgcenter $sockid"
.greymenu.window.gcenter set 1000
label  .greymenu.window.gcenterlab -text "Center"

proc setgwidth { sockid step } {
	putsock "GWIDTH $step"
}

scale  .greymenu.window.gwidth -orient vertical -from 4095 -to 1 \
	-resolution 1 -length 400 -command "setgwidth $sockid"
.greymenu.window.gwidth set 400
label  .greymenu.window.gwidthlab -text "Width"

label .greymenu.window.pvlab -text "Visible\nLayers:"

proc newlayers {layernum newstate} {
	putsock "LAYER $layernum [expr 1-$newstate]"
}

frame .greymenu.window.layers
checkbutton .greymenu.window.layers.0 -text "0" -variable layers0 -command {newlayers 0 $layers0}
checkbutton .greymenu.window.layers.1 -text "1" -variable layers1 -command {newlayers 1 $layers1}
checkbutton .greymenu.window.layers.2 -text "2" -variable layers2 -command {newlayers 2 $layers2}
checkbutton .greymenu.window.layers.3 -text "3" -variable layers3 -command {newlayers 3 $layers3}
checkbutton .greymenu.window.layers.4 -text "4" -variable layers4 -command {newlayers 4 $layers4}
checkbutton .greymenu.window.layers.5 -text "5" -variable layers5 -command {newlayers 5 $layers5}
checkbutton .greymenu.window.layers.6 -text "6" -variable layers6 -command {newlayers 6 $layers6}
checkbutton .greymenu.window.layers.7 -text "7" -variable layers7 -command {newlayers 7 $layers7}
checkbutton .greymenu.window.layers.8 -text "8" -variable layers8 -command {newlayers 8 $layers8}
checkbutton .greymenu.window.layers.9 -text "9" -variable layers9 -command {newlayers 9 $layers9}
checkbutton .greymenu.window.layers.a -text "A" -variable layersa -command {newlayers 10 $layersa}
checkbutton .greymenu.window.layers.b -text "B" -variable layersb -command {newlayers 11 $layersb}
checkbutton .greymenu.window.layers.c -text "C" -variable layersc -command {newlayers 12 $layersc}
checkbutton .greymenu.window.layers.d -text "D" -variable layersd -command {newlayers 13 $layersd}
checkbutton .greymenu.window.layers.e -text "E" -variable layerse -command {newlayers 14 $layerse}
checkbutton .greymenu.window.layers.f -text "F" -variable layersf -command {newlayers 15 $layersf}

grid config .greymenu.window.layers.0 -row 1 -column 0
grid config .greymenu.window.layers.1 -row 2 -column 0
grid config .greymenu.window.layers.2 -row 3 -column 0
grid config .greymenu.window.layers.3 -row 4 -column 0
grid config .greymenu.window.layers.4 -row 5 -column 0
grid config .greymenu.window.layers.5 -row 6 -column 0
grid config .greymenu.window.layers.6 -row 7 -column 0
grid config .greymenu.window.layers.7 -row 8 -column 0
grid config .greymenu.window.layers.8 -row 9 -column 0
grid config .greymenu.window.layers.9 -row 10 -column 0
grid config .greymenu.window.layers.a -row 11 -column 0
grid config .greymenu.window.layers.b -row 12 -column 0
grid config .greymenu.window.layers.c -row 13 -column 0
grid config .greymenu.window.layers.d -row 14 -column 0
grid config .greymenu.window.layers.e -row 15 -column 0
grid config .greymenu.window.layers.f -row 16 -column 0

grid config .greymenu.window.gcenterlab -row 0 -column 0
grid config .greymenu.window.gcenter    -row 1 -column 0
grid config .greymenu.window.gwidthlab  -row 0 -column 1
grid config .greymenu.window.gwidth     -row 1 -column 1
grid config .greymenu.window.pvlab 	-row 0 -column 2
grid config .greymenu.window.layers 	-row 1 -column 2

pack .greymenu.window -side top -fill x -padx 1

proc hide_layer {} {
	global layermenuvis
	set layermenuvis 0
	wm withdraw .layermenu
}
#
# Additional windows : Layers
#
toplevel .layermenu
wm withdraw .layermenu
wm protocol .layermenu WM_DELETE_WINDOW hide_layer

set target_layer ""

proc select_target_layer {} {

	global target_layer;

        set indx [.layermenu.layer curselection]
        if { $indx == "" } { return }
	.layermenu.selected configure -foreground "red"
	set target_layer [.layermenu.layer get $indx]
	.layermenu.selected configure -text "$target_layer"
	.layermenu.selected configure -foreground "darkgreen"
	regsub {_.*$} $target_layer {} item
	putsock "COLORIZE -$item"
}

label .layermenu.pllab -text "Select tag"
listbox .layermenu.layer -selectmode extended -listvar layers -height 5 -yscrollcommand ".layermenu.fscroll set"
scrollbar .layermenu.fscroll -command ".layermenu.layer yview"
bind .layermenu.layer <Double-Button-1> { select_target_layer }

label .layermenu.pllab2   -text "Selected tag"
label .layermenu.selected -text "none"
.layermenu.selected configure -foreground "red"

set layerfile [open "$libdir/clut/palette.txt" "r"]

set layers ""

while { [ eof $layerfile] != 1 } {
	gets $layerfile layerline
	regsub {[ 	].*[ 	]} $layerline {_} layerline
	regsub {^-.*} $layerline {} layerline
	regsub {_.*$} $layerline {} layernum
	if { $layernum >= 16 } {
		set layers "$layers $layerline"
	}
}

close $layerfile

proc getlayernum {} {

	global target_layer;
	regsub {_.*$} $target_layer {} item
	return "$item"
}

proc showrecolorinfo {} {

	global target_layer;

	putsock "COLORIZE -[getlayernum]"
	tk_messageBox -default ok -icon info \
	-message "You can retag connected components to $target_layer by \
		pointing at them with the mouse and pressing 'Shift-H'." \
	-title "Usage information" \
	-type ok -parent .layermenu
}

label  .layermenu.vislab -text "Visibility:"
button .layermenu.showbut -text "Show"   -command {putsock "LAYER [getlayernum] 0"}
button .layermenu.hidebut -text "Hide"   -command {putsock "LAYER [getlayernum] 1"}
button .layermenu.recbut  -text "Recalc" 

label  .layermenu.conlab -text "Tag connected areas:"
button  .layermenu.conbut -text "Select Area" \
	-command {showrecolorinfo}

label .layermenu.painting -text "Tag all visible voxels:"
button .layermenu.startpaint -text "Start" \
	-command {putsock "COLORIZE [getlayernum]"}
button .layermenu.stoppaint -text "Stop" \
	-command {putsock "COLORIZE -[getlayernum]"}

entry  .layermenu.rmtlayer -width 4
button .layermenu.rmtbut -text "with selected" -command {putsock "REMARK [.layermenu.rmtlayer get] [getlayernum]"}
label  .layermenu.rmtlab -text "Replace tag"

proc do_accel_rendering {} {
	set result [ tk_messageBox -default "no" -icon question \
		-message "Rendering can be accelerated considerably by \
			taking into account only currently visible \
			tags/layers.\n\
			Choosing Yes below will perform said optimization.\n\
			Please note, that after you later reenable layers \
			you must redo this to avoid erraneous display \
			results and that the calculation may take a few \
			minutes to complete."\
		-parent .layermenu \
		-title "Accelerate rendering" \
		-type yesno  ]
	if { "$result" == "yes" } {
		putsock "MAKEDIST 1"
	}
}

label  .layermenu.accellab -text "Rendering:"
button .layermenu.accelbut -text "Accelerate" -command do_accel_rendering

grid config .layermenu.pllab     -row 0 -column 0 -sticky e -padx 3 -pady 3
grid config .layermenu.layer     -row 0 -column 1 -columnspan 2 -sticky ew -padx 3 -pady 3
grid config .layermenu.fscroll   -row 0 -column 3 -sticky wns -sticky ns -padx 3 -pady 3
grid config .layermenu.pllab2    -row 1 -column 0 -sticky e -padx 3 -pady 3
grid config .layermenu.selected  -row 1 -column 1 -columnspan 3 -sticky w -padx 3 -pady 3
grid config .layermenu.vislab    -row 2 -column 0 -sticky e -padx 3 -pady 3
grid config .layermenu.showbut   -row 2 -column 1 -sticky ew -padx 3 -pady 3
grid config .layermenu.hidebut   -row 2 -column 2 -sticky ew -padx 3 -pady 3
grid config .layermenu.conlab    -row 3 -column 0 -sticky e -padx 3 -pady 3
grid config .layermenu.conbut    -row 3 -column 1 -columnspan 2 -sticky ew -padx 3 -pady 3
grid config .layermenu.rmtlab    -row 4 -column 0 -sticky e -padx 3 -pady 3
grid config .layermenu.rmtlayer  -row 4 -column 1 -sticky w -padx 3 -pady 3
grid config .layermenu.rmtbut    -row 4 -column 2 -sticky ew -padx 3 -pady 3
grid config .layermenu.painting   -row 5 -column 0 -sticky e -padx 3 -pady 3
grid config .layermenu.startpaint -row 5 -column 1 -sticky ew -padx 3 -pady 3
grid config .layermenu.stoppaint  -row 5 -column 2 -sticky ew -padx 3 -pady 3
grid config .layermenu.accellab   -row 6 -column 0 -sticky e -padx 3 -pady 3
grid config .layermenu.accelbut   -row 6 -column 1 -columnspan 2 -sticky ew -padx 3 -pady 3

#pack .layermenu -side top -fill x -padx 1

#
# Hide Main window while building it.
#
wm withdraw .

set stepsize 1

#
# Movement frame
#

frame .move -borderwidth 1 -relief sunken

frame .move.slide -borderwidth 1 -relief sunken

button .move.slide.up    -bitmap @$tkimages/Up    -command {putsock "UP $stepsize"}
button .move.slide.down  -bitmap @$tkimages/Down  -command {putsock "DOWN $stepsize"}
button .move.slide.left  -bitmap @$tkimages/Left  -command {putsock "LEFT $stepsize"}
button .move.slide.right -bitmap @$tkimages/Right -command {putsock "RIGHT $stepsize"}
label  .move.slide.lab -text "Slide"

grid config .move.slide.up    -row 0 -column 1
grid config .move.slide.down  -row 2 -column 1
grid config .move.slide.left  -row 1 -column 0
grid config .move.slide.right -row 1 -column 2
grid config .move.slide.lab   -row 1 -column 1


frame .move.go -borderwidth 1 -relief sunken

button .move.go.fwd   -bitmap @$tkimages/Up    -command {putsock "FWD $stepsize"}
button .move.go.rev   -bitmap @$tkimages/Down  -command {putsock "REV $stepsize"}
label  .move.go.lab   -text "Go"

grid config .move.go.fwd   -row 0 -column 0
grid config .move.go.lab   -row 1 -column 0
grid config .move.go.rev   -row 2 -column 0


frame .move.turn -borderwidth 1 -relief sunken

button .move.turn.up    -bitmap @$tkimages/Up    -command {putsock "TUP $stepsize"}
bind   all	   <Up>       {putsock "TUP $stepsize"}

button .move.turn.down  -bitmap @$tkimages/Down  -command {putsock "TDOWN $stepsize"}
bind   all	   <Down>     {putsock "TDOWN $stepsize"}

button .move.turn.left  -bitmap @$tkimages/Left  -command {putsock "TLEFT $stepsize"}
bind   all	   <Left>     {putsock "TLEFT $stepsize"}

button .move.turn.right -bitmap @$tkimages/Right -command {putsock "TRIGHT $stepsize"}
bind   all	   <Right>	{putsock "TRIGHT $stepsize"}

label .move.turn.lab -text "Turn"

grid config .move.turn.up    -row 0 -column 1
grid config .move.turn.down  -row 2 -column 1
grid config .move.turn.left  -row 1 -column 0
grid config .move.turn.right -row 1 -column 2
grid config .move.turn.lab   -row 1 -column 1


frame .move.turn90 -borderwidth 1 -relief sunken

button .move.turn90.up    -bitmap @$tkimages/Up    -command {putsock "TUP 90"}
button .move.turn90.down  -bitmap @$tkimages/Down  -command {putsock "TDOWN 90"}
button .move.turn90.left  -bitmap @$tkimages/Left  -command {putsock "TLEFT 90"}
button .move.turn90.right -bitmap @$tkimages/Right -command {putsock "TRIGHT 90"}
button .move.turn90.uturn -bitmap @$tkimages/Uturn -command {putsock "UTURN"}

label .move.turn90.lab -text "Turn\n90"

grid config .move.turn90.up    -row 0 -column 1
grid config .move.turn90.down  -row 2 -column 1
grid config .move.turn90.left  -row 1 -column 0
grid config .move.turn90.right -row 1 -column 2
grid config .move.turn90.lab   -row 1 -column 1
grid config .move.turn90.uturn -row 2 -column 2


frame .move.globals -borderwidth 0 -relief sunken

proc setstep { sockid step } {
	putsock "STEP $step"
}

scale  .move.globals.step -orient horizontal -from 0.1 -to 10.0 \
	-resolution 0.1 -command "setstep $sockid" -variable stepsize
.move.globals.step set 1
label  .move.globals.steplab -text "\nStep"

grid config .move.globals.steplab -row 0 -column 0
grid config .move.globals.step    -row 0 -column 1

frame .move.roll -borderwidth 1 -relief sunken

button .move.roll.left -bitmap @$tkimages/RollLeft
bind   .move.roll.left <Button-1> {putsock "RLEFT $stepsize"}
bind   all  	       <KP_Divide> {putsock "RLEFT $stepsize"}

button .move.roll.right -bitmap @$tkimages/RollRight
bind   .move.roll.right <Button-1> {putsock "RRIGHT $stepsize"}
bind   all	        <KP_Multiply> {putsock "RRIGHT $stepsize"}

label  .move.roll.lab -text "Roll"

grid config .move.roll.left  -row 0 -column 0
grid config .move.roll.lab   -row 0 -column 1
grid config .move.roll.right -row 0 -column 2

frame .move.pos -borderwidth 1 -relief sunken

label .move.pos.lab -text "Position:"
label .move.pos.xl -text "X:"
entry .move.pos.x -width 8
label .move.pos.yl -text "Y:"
entry .move.pos.y -width 8
label .move.pos.zl -text "Z:"
entry .move.pos.z -width 8
button .move.pos.set -text "Set" \
	-command {putsock "POS [.move.pos.x get] [.move.pos.y get] [.move.pos.z get]" }


grid config .move.pos.lab  -row 0 -column 0 -columnspan 2
grid config .move.pos.xl   -row 1 -column 0
grid config .move.pos.yl   -row 2 -column 0
grid config .move.pos.zl   -row 3 -column 0
grid config .move.pos.x    -row 1 -column 1
grid config .move.pos.y    -row 2 -column 1
grid config .move.pos.z    -row 3 -column 1
grid config .move.pos.set  -row 4 -column 0 -columnspan 2

set pilot_status 0
set autopilot "1 NoGrav"

proc toggle_auto { sockid } {
	global pilot_status
	global autopilot
	set pilot_status [expr 1-$pilot_status]
	if { $pilot_status == 1 } {
		putsock "AUTO $autopilot"
		.move.autopilot.lab configure -background 	    red
		.move.autopilot.lab configure -activebackground red
	} else {
		putsock "AUTO 0"
		.move.autopilot.lab configure -background 	    grey
		.move.autopilot.lab configure -activebackground grey
	}
}

frame .move.turnpt -borderwidth 0 -relief sunken

label .move.turnpt.lab -text "Pivot:"
tk_optionMenu .move.turnpt.pt turnpoint \
	"0 Camera" "1 VolCenter" "2 PicCenter" "3 PC Once" "4 CutPlane"
bind .move.turnpt <Visibility> {putsock "TMODE $turnpoint"}

grid config .move.turnpt.lab -row 0 -column 0 -sticky nesw -padx 3 -pady 3
grid config .move.turnpt.pt  -row 1 -column 0 -sticky nesw -padx 3 -pady 3

frame .move.autopilot -borderwidth 0 -relief sunken

button .move.autopilot.lab -text "   Autopilot   " \
	-command "toggle_auto $sockid"
tk_optionMenu .move.autopilot.set autopilot "1 NoGrav" "2 Grav" "3 Mouse" "4 Drop"

grid config .move.autopilot.lab -row 0 -column 0 -sticky nesw -padx 3 -pady 3
grid config .move.autopilot.set -row 1 -column 0 -sticky nesw -padx 3 -pady 3

grid config .move.slide   -row 0 -column 0 -sticky nesw -padx 3 -pady 3
grid config .move.go      -row 0 -column 1 -sticky nesw -padx 3 -pady 3
grid config .move.turn    -row 0 -column 2 -sticky nesw -padx 3 -pady 3
grid config .move.turn90  -row 0 -column 3 -sticky nesw -padx 3 -pady 3
grid config .move.pos     -row 0 -column 4 -sticky nesw -padx 3 -pady 3
grid config .move.globals -row 1 -column 0 -columnspan 2 -sticky nesw -padx 3 -pady 3
grid config .move.roll    -row 1 -column 2 -sticky nesw -padx 3 -pady 3
grid config .move.turnpt  -row 1 -column 3 -sticky nesw -padx 3 -pady 3
grid config .move.autopilot -row 1 -column 4 -sticky nesw -padx 3 -pady 3

#
# Render controls frame
#

frame .render -borderwidth 1 -relief sunken

proc setzoom { sockid step } {
	putsock "ZOOM [expr 2*tan($step*3.14159/360.0)]"
}

scale  .render.zoomscale -orient horizontal -from 160 -to 5 \
	-resolution 5 -length 300 -command "setzoom $sockid"
.render.zoomscale set 110
label  .render.zoomlab -text "Aperture-\nAngle:"
checkbutton .render.paintvisible  -text "Layer\nMenu" \
	-variable layermenuvis\
	-command {if { $layermenuvis} { wm deiconify .layermenu } else { wm withdraw .layermenu } }

grid config .render.zoomlab   -row 0 -column 0 -sticky e -padx 3 -pady 3
grid config .render.zoomscale -row 0 -column 1 -columnspan 2 -sticky w -padx 3 -pady 3
grid config .render.paintvisible -row 0 -column 3 -sticky w -padx 3 -pady 3

proc setcut { sockid step } {
	putsock "JUMP $step"
}

scale  .render.cutscale -orient horizontal -from 0 -to 1000 \
	-resolution 1 -length 300 -command "setcut $sockid"
.render.cutscale set 0
label  .render.cutlab -text "\nCut:"

set spal 0
set ipal 0
set cutplane 0
set hidehud 0

proc send_flags { sockid } {
	global spal
	global ipal
	global cutplane
	global hidehud
	putsock "FLAGS [expr $spal+2*$ipal+4*$cutplane+8*$hidehud]"
}

checkbutton .render.cutshow      -text "Show\nCutplane" \
	-variable cutplane\
	-command {send_flags $sockid}

grid config .render.cutlab   -row 1 -column 0 -sticky e -padx 3 -pady 3
grid config .render.cutscale -row 1 -column 1 -columnspan 2 -sticky w -padx 3 -pady 3
grid config .render.cutshow  -row 1 -column 3 -sticky ws -padx 3 -pady 3


proc setlight { sockid step } {
	putsock "LIGHT $step"
}

scale  .render.lightlight -orient horizontal -from 10 -to 10000.0 \
	-resolution 10 -length 300 -command "setlight $sockid"
.render.lightlight set 1500
label  .render.lightlab -text "\nLight:"

tk_optionMenu .render.lightmode lightmode "CENTER" "TOPC" "TLC" "TRC" "BRC" "BLC" "PARC" "PARALLEL"
bind .render.lightmode <Visibility> {putsock "LIGHTMODE $lightmode"}

grid config .render.lightlab   -row 2 -column 0 -sticky e -padx 3 -pady 3
grid config .render.lightlight -row 2 -column 1 -columnspan 2 -sticky w -padx 3 -pady 3
grid config .render.lightmode  -row 2 -column 3 -sticky ws -padx 3 -pady 3

label .render.optionsformatlab -text "Data Format:"
tk_optionMenu .render.optionsformat render_format "RGB" "QRG" "XYZ" "XYT" "SMN" "ZSH" "KES" "KE"
set render_format XYZ
bind .render.optionsformat <Visibility> {putsock "RENDERMODE $render_format"}

checkbutton .render.greymode  -text "Greyscale Menu" \
	-variable greymenuvis\
	-command {if { $greymenuvis} { wm deiconify .greymenu } else { wm withdraw .greymenu } }

checkbutton .render.optionshhud      -text "Hide Data" \
	-variable hidehud \
	-command {send_flags $sockid}

grid config .render.optionsformatlab -row 3 -column 0 -sticky e -padx 3 -pady 3
grid config .render.optionsformat    -row 3 -column 1 -sticky w -padx 3 -pady 3
grid config .render.greymode         -row 3 -column 2 -sticky w -padx 3 -pady 3
grid config .render.optionshhud      -row 3 -column 3 -sticky w -padx 3 -pady 3

set clut_initialdir "$libdir/clut"

proc setclutfile {sockid} {
	global clut_initialdir

	set file_types {
		{ "Palettes" { .ppm } }
		{ "All-Files" * }
	}

	set filename [ tk_getOpenFile \
		-initialdir $clut_initialdir \
		-filetypes $file_types \
		-title "Select Palette." \
		-parent . ]
	if { $filename != ""} {
		set clut_initialdir [file dirname $filename]
	}
	putsock "LOADCLUT $filename"
}

label  .render.optionspallab -text "Palette:"
button .render.optionsloadpal -text "Load" -command "setclutfile $sockid"

checkbutton .render.optionsspal      -text "Symmetric palette" \
	-variable spal\
	-command {send_flags $sockid}

checkbutton .render.optionsipal      -text "Invert palette" \
	-variable ipal\
	-command {send_flags $sockid}

grid config .render.optionspallab    -row 4 -column 0 -sticky nse -padx 3 -pady 3
grid config .render.optionsloadpal   -row 4 -column 1 -sticky nesw -padx 3 -pady 3
grid config .render.optionsspal      -row 4 -column 2 -sticky nsw -padx 3 -pady 3
grid config .render.optionsipal      -row 4 -column 3 -sticky nsw -padx 3 -pady 3


label       .render.optionsoptlab -text "Options:"
checkbutton .render.optionsfinestep -text "Exact edges" \
	-variable fine_step\
	-command {putsock "FINE $fine_step"}
checkbutton .render.optionsmedian   -text "Smooth edges" \
	-variable median\
	-command {putsock "ALIAS [expr $median+$smooth*2]"}
checkbutton .render.optionsalias    -text "Smooth surface" \
	-variable smooth\
	-command {putsock "ALIAS [expr $median+$smooth*2]"}

grid config .render.optionsoptlab    -row 5 -column 0 -sticky nse -padx 3 -pady 3
grid config .render.optionsfinestep  -row 5 -column 1 -sticky nsw -padx 3 -pady 3
grid config .render.optionsmedian    -row 5 -column 2 -sticky nsw -padx 3 -pady 3
grid config .render.optionsalias     -row 5 -column 3 -sticky nsw -padx 3 -pady 3


frame .record -borderwidth 1 -relief sunken

label  .record.sizelab -text "Size:"

proc setscale { sockid step } {
	putsock "SCALE $step"
}

scale  .record.scale -orient horizontal -from 1 -to 5 \
	-resolution 1 -variable scalevar \
	-command {setscale $sockid}

set oldsizex 123

proc set_rsize { sockid size } {

	global oldsizex

	regsub {x.*} $size "" sizex
	regsub {.*x} $size "" sizey
	if { $sizex == $oldsizex } {
		return
	}
	set oldsizex $sizex
	if { $sizex == $sizey } {
		putsock "SIZE $sizex"
	}
	putsock "SIZEX $sizex"
	putsock "SIZEY $sizey"
}

tk_optionMenu .record.list record_format HTML JPG MPEG PNG PPM POS TXT

set record_format "PNG"
bind .record.list <Visibility> {putsock "RECORDMODE $record_format"}
tk_optionMenu .record.size rendersize "96x96" "256x256" "320x240" "512x512"
set rendersize "256x256"
bind .record.size <Visibility> {set_rsize $sockid $rendersize}

set record_status 0

proc toggle_record { sockid } {
	global record_status
	global record_format
	set record_status [expr 1-$record_status]
	putsock "RECORDMODE $record_format"
	putsock "RECORD $record_status"
	if { $record_status == 1 } {
		.record.rec configure -background 	red
		.record.rec configure -activebackground red
	} else {
		.record.rec configure -background 	grey
		.record.rec configure -activebackground grey
	}
}

button .record.rec -text "Record" -command "toggle_record $sockid"

set play_initialdir [file dirname $file3d]
set is_playing 0

proc setplayfile {sockid} {
	global play_initialdir
	global is_playing

	if { $is_playing } {
		putsock "PLAY OFF"
		.record.playfile configure -text "File"
		set is_playing 0
		return
	}

	set file_types {
		{ "POS-Files" { .pos } }
		{ "All-Files" * }
	}

	set filename [ tk_getOpenFile \
		-initialdir $play_initialdir \
		-filetypes $file_types \
		-title "Select POS file to play back" \
		-parent . ]
	if { $filename != ""} {
		set play_initialdir [file dirname $filename]
	}
	putsock "PLAY $filename"
	.record.playfile configure -text "Cancel"
	set is_playing 1
}

label .record.playlab -text "Rec/Play:"
button .record.playfile -text "File" -command "setplayfile $sockid"

button .record.rfplay -bitmap @$tkimages/RFPlay -command {putsock "PLAYDIR -5"}
button .record.rplay  -bitmap @$tkimages/RPlay  -command {putsock "PLAYDIR -1"}
button .record.rstep  -bitmap @$tkimages/RStep  -command {putsock "PLAYDIR -2"}
button .record.stop   -bitmap @$tkimages/Stop   -command {putsock "PLAYDIR  0"}
button .record.step   -bitmap @$tkimages/Step   -command {putsock "PLAYDIR  2"}
button .record.play   -bitmap @$tkimages/Play   -command {putsock "PLAYDIR  1"}
button .record.fplay  -bitmap @$tkimages/FPlay  -command {putsock "PLAYDIR  5"}


grid config .record.sizelab -row 0 -column 0 -sticky es -padx 3 -pady 3
grid config .record.size    -row 0 -column 1 -sticky esw -padx 3 -pady 3
grid config .record.scale   -row 0 -column 2 -columnspan 5 -sticky nsw -padx 3 -pady 3

grid config .record.playlab  -row 1 -column 0 -sticky nesw -padx 3 -pady 3
grid config .record.playfile -row 1 -column 1 -sticky nesw -padx 3 -pady 3
grid config .record.rfplay   -row 1 -column 2
grid config .record.rplay    -row 1 -column 3
grid config .record.rstep    -row 1 -column 4
grid config .record.stop     -row 1 -column 5
grid config .record.step     -row 1 -column 6
grid config .record.play     -row 1 -column 7
grid config .record.fplay    -row 1 -column 8
grid config .record.rec      -row 1 -column 9 -sticky nesw -padx 3 -pady 3
grid config .record.list     -row 1 -column 10 -sticky nesw -padx 3 -pady 3

frame .scripts -borderwidth 1 -relief sunken

set scriptdir $tkscripts

proc exec_script {sockid parms} {
	global scriptdir
	global scriptfiles
	global tkscripts
	set indx [.scripts.file curselection]
	if { $indx != "" } {
		set item [.scripts.file get $indx]
		if { "$item" == ".." } {
			regsub {/[^/]*$} $scriptdir {} scriptdir
			if { [ string length $scriptdir] < [ string length $tkscripts] } {
				set scriptdir $tkscripts
			}
			regsub -all { [^ ]*/} ".. [lsort [glob -nocomplain $scriptdir/*]]" " " scriptfiles
			return
		}
		if { [file isdirectory $scriptdir/$item] } {
			set scriptdir $scriptdir/$item
			regsub -all { [^ ]*/} ".. [lsort [glob -nocomplain $scriptdir/*]]" " " scriptfiles
			.scripts.file see 0
			return
		}
		if { [file executable $scriptdir/$item] } {
			.scripts.exec configure -background 	  red
			.scripts.exec configure -activebackground red
			.scripts.exec flash
			set answer [exec $scriptdir/$item $parms]
			if { "$answer" != "" } {
				tk_messageBox -default ok -icon info \
					-message "$answer" -title "Process output" \
					-type ok
			}
			.scripts.exec configure -background 	  grey
			.scripts.exec configure -activebackground grey
			return
		}
	}
}

label .scripts.lab -text "Scripts:"
button .scripts.exec -text "Execute" -command {exec_script $sockid "" }
button .scripts.help -text "Help"    -command {exec_script $sockid --help}
listbox .scripts.file -listvar scriptfiles -height 4 -yscrollcommand ".scripts.fscroll set"
bind .scripts.file <Double-Button-1> { .scripts.exec invoke }
scrollbar .scripts.fscroll -command ".scripts.file yview"
regsub -all { [^ ]*/} ".. [lsort [glob -nocomplain $scriptdir/*]]" " " scriptfiles

grid config .scripts.lab -row 0 -column 0 -sticky nesw -padx 3 -pady 3
grid config .scripts.exec -row 1 -column 0 -sticky nesw -padx 3 -pady 3
grid config .scripts.help -row 2 -column 0 -sticky nesw -padx 3 -pady 3
grid config .scripts.file -row 0 -column 1 -rowspan 3 -sticky nesw -padx 3 -pady 3
grid config .scripts.fscroll -row 0 -column 2 -rowspan 3 -sticky nesw -padx 3 -pady 3

frame .command -borderwidth 1 -relief sunken

label .command.lab -text "Command:"
entry .command.entry -width 30
bind  .command.entry <Key-Return> {putsock "[.command.entry get]"}

label .command.rlab -text "Reply:"
label .command.reply -text ""

grid config .command.lab   -row 0 -column 0 -sticky nesw -padx 3 -pady 3
grid config .command.entry -row 0 -column 1 -sticky nesw -padx 3 -pady 3
grid config .command.rlab  -row 1 -column 0 -sticky nesw -padx 3 -pady 3
grid config .command.reply -row 1 -column 1 -sticky nesw -padx 3 -pady 3


frame .status -borderwidth 1 -relief sunken

proc do_quit {} {
	set result [ tk_messageBox -default "no" -icon question \
		-message "Quit program ?" -parent . -title "Quit" \
		-type yesno  ]
	if { "$result" == "yes" } {
		putsock "QUITPROGRAM 1"
		exit
	}
}

label .status.lab -text "Status:"
label .status.entry -text "$file3d"
button .status.quit -text "Quit" -command "do_quit"

grid config .status.lab -row 0 -column 0 -sticky w -padx 3 -pady 3
grid config .status.entry -row 0 -column 1 -sticky nesw -padx 3 -pady 3
grid config .status.quit -row 0 -column 2 -sticky e -padx 3 -pady 3

pack .move .render .record .scripts .command .status -side top -fill x -padx 1 -pady 1

wm deiconify .

proc on_readable {} {
	global sockid
	catch { gets $sockid } text
	.command.reply configure -text "$text"
	if { [eof $sockid] } {
		exit
	}
}

fileevent $sockid readable { on_readable }
