X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.db-live.git;a=blobdiff_plain;f=yarrg%2Fwhere-vessels;h=ec4394b1e2aaef66b8b10c0fc1ecab1e6caa521e;hp=c382c6a4b92f913218c2e6c73e40401723a19feb;hb=c0e46c32d792391156c62358f3d92e630ffcd9ed;hpb=db4874bfb640a5a7d6b66a74955ecb9983c6e9db diff --git a/yarrg/where-vessels b/yarrg/where-vessels index c382c6a..ec4394b 100755 --- a/yarrg/where-vessels +++ b/yarrg/where-vessels @@ -200,7 +200,7 @@ proc display-note-infos {} { debug "display-note-infos $nmissing [array size notes]" if {[llength $note_infos]} { - set tiny "[llength $note_infos] warnings" + set tiny "[llength $note_infos] warning(s)" } elseif {$nmissing && [array size notes]} { set tiny "$nmissing missing" } else { @@ -232,7 +232,7 @@ proc display-note-infos {} { } } - parser-control-failed-core .ctrl.notes notes \ + parser-control-failed-core .cp.ctrl.notes notes \ white blue 0 \ $tiny \ "[llength $note_infos] warning(s);\ @@ -264,6 +264,7 @@ proc vesselclasses-init {} { set vc_game2code($game) $code set vc_code2abbrev($code) $abbrev set vc_code2full($code) $full + image create bitmap ship-icon/$abbrev -file icons/$abbrev.xbm } } @@ -273,20 +274,50 @@ proc code2abbrev-lock {lockown} { append abbrev [lindex {= - ?} [regsub {\D} $notown 2]] } -proc code2abbrev {code} { +proc canvas-horiz-stack {xvar y bind type args} { + upvar 1 $xvar x + upvar 1 canvas canvas + set id [eval $canvas create $type $x $y $args] + set bbox [$canvas bbox $id] + set x [lindex $bbox 2] + $canvas bind $id $bind + return $id +} + +proc code2canvas {code canvas x yvar qty qtylen bind} { global vc_code2abbrev + upvar 1 $yvar y manyset [split $code _] inport class subclass lockown xabbrev - set abbrev {} - append abbrev [lindex {? {}} $inport] - append abbrev $vc_code2abbrev($class) - append abbrev $subclass - append abbrev [code2abbrev-lock $lockown] - append abbrev $xabbrev + set stackx $x + incr stackx 2 + + append qty [lindex {? {}} $inport] + set qty [format "%${qtylen}s" $qty] + + set qtyid [canvas-horiz-stack stackx $y $bind \ + text -anchor nw -font fixed -text $qty] + + incr stackx -1 + canvas-horiz-stack stackx [expr {$y+2}] $bind \ + image -anchor nw -image ship-icon/$vc_code2abbrev($class) + incr stackx - debug "CODE2ABBREV $code $abbrev" - return $abbrev + canvas-horiz-stack stackx $y $bind \ + text -anchor nw -font fixed -text \ + "$subclass[code2abbrev-lock $lockown]$xabbrev" + + set bbox [$canvas bbox $qtyid] + set ny [lindex $bbox 3] + set bid [$canvas create rectangle \ + $x $y $stackx $ny \ + -fill white] + + set y $ny + $canvas lower $bid $qtyid + + $canvas bind $bid $bind } proc show-report-decode {code} { @@ -327,23 +358,17 @@ proc show-report-decode {code} { set filters {} -#proc make-size-filter {minmax minmaxdesc} { -# set n [llength $vc_codes] -# $w configure - -# make-filter size${minmax} "$minmaxdesc size" scale \ -# [list \ -# -tickinterval 0 \ -# -variable filter_size{$minmax} \ -# -from 0 -to [expr {$n-1}] \ -# -resolution 1 \ -# -length [expr {$n*5}] \ -# ] - - proc filter-values/size {} { global vc_codes; return $vc_codes } -proc filter-map/size {code} { upvar #0 vc_code2abbrev($code) abb; return $abb } +proc filter-icon/size {code} { + upvar #0 vc_code2abbrev($code) abb + return ship-icon/$abb +} proc filter-default/size {code} { return 1 } +proc filter-says-yes/size {codel} { + set sizecode [lindex $codel 1] + upvar #0 filter_size($sizecode) yes + return $yes +} proc filter-values/lockown {} { foreach lv {0 1 2} { @@ -357,6 +382,12 @@ proc filter-map/lockown {lockown} { return [code2abbrev-lock $lockown] } proc filter-default/lockown {lockown} { return [regexp {^[01]|^2[^1]} $lockown] } +proc filter-says-yes/lockown {codel} { + set lockown [lindex $codel 3] + regsub -all {\D} $lockown X lockown + upvar #0 filter_lockown($lockown) yes + return $yes +} proc filter-validate/xabbre {re} { if {[catch { @@ -368,6 +399,11 @@ proc filter-validate/xabbre {re} { } return {} } +proc filter-says-yes/xabbre {codel} { + global filter_xabbre + set xabbrev [lindex $codel 4] + return [regexp -- $filter_xabbre $xabbrev] +} proc filter-tickbox-flip {fil} { upvar #0 filter_$fil vars @@ -375,7 +411,7 @@ proc filter-tickbox-flip {fil} { foreach val $values { set vars($val) [expr {!$vars($val)}] } - refilter-needed + redraw-needed } proc make-tickbox-filter {fil label rows inrow} { @@ -386,13 +422,17 @@ proc make-tickbox-filter {fil label rows inrow} { if {!$inrow} { set inrow [expr {($nvalues + $rows) / $rows}] } - + set noicons [catch { info args filter-icon/$fil }] for {set ix 0} {$ix < $nvalues} {incr ix} { set val [lindex $values $ix] set vars($val) [filter-default/$fil $val] checkbutton $fw.$ix -variable filter_${fil}($val) \ - -text [filter-map/$fil $val] -font fixed \ - -command refilter-needed + -font fixed -command redraw-needed + if {!$noicons} { + $fw.$ix configure -image [filter-icon/$fil $val] -height 16 + } else { + $fw.$ix configure -text [filter-map/$fil $val] + } grid configure $fw.$ix -sticky sw \ -row [expr {$ix / $inrow}] \ -column [expr {$ix % $inrow}] @@ -417,7 +457,7 @@ proc entry-filter-changed {fw fil n1 n2 op} { } else { $fw.error configure -text { } -background $def_background set realvar $entryvar - refilter-needed + redraw-needed } } emsg]} { puts stderr "FILTER CHECK ERROR $emsg $errorInfo" @@ -437,15 +477,11 @@ proc make-entry-filter {fil label def} { pack $fw.entry $fw.error -side top -anchor w } -proc refilter-needed {} { - debug "REFILTER NEEDED" -} - proc make-filter {kind fil label ekind} { global filters label .filter.lab_$fil -text $label -justify left $ekind .filter.$fil - lappend filters [list $kind $fil] + lappend filters $fil set nfilters [llength $filters] grid configure .filter.lab_$fil -row $nfilters -column 0 -sticky nw -pady 4 grid configure .filter.$fil -row $nfilters -column 1 -sticky w -pady 3 @@ -457,6 +493,15 @@ proc make-filters {} { make-tickbox-filter lockown "Lock/\nowner" 2 6 make-entry-filter xabbre "Flags\n regexp" {} } + +proc filters-say-yes {code} { + global filters + debug "filters-say-yes $code" + foreach fil $filters { + if {![filter-says-yes/$fil [split $code _]]} { return 0 } + } + return 1 +} #---------- loading and parsing the clipboard (vessel locations) ---------- @@ -631,8 +676,18 @@ proc chart-got/league {x1 y1 x2 y2 kind} { } } +proc redraw-needed {} { + global redraw_after + debug "REDRAW NEEDED" + if {[info exists redraw_after]} return + set redraw_after [after 250 draw] +} + proc draw {} { - global chart found isleloc canvas + global chart found isleloc canvas redraw_after + + catch { after cancel $redraw_after } + catch { unset redraw_after } $canvas delete all @@ -648,8 +703,8 @@ proc draw {} { # debug "SHOWING $key $c" regexp {^(.*) (\S+)$} $key dummy islandname code - set abbrev [code2abbrev $code] - + if {![filters-say-yes $code]} continue + if {[string compare $lastislandname $islandname]} { manyset $isleloc($islandname) x y set x [coord $x] @@ -657,26 +712,14 @@ proc draw {} { set lastislandname $islandname # debug "START Y $y" } - set text $abbrev - regsub -all {[0-9]} $text {} text - if {$c > 1} { - set text [format "%2d%s" $c $text] - } else { - set text [format " %s" $text] - } - set id [$canvas create text $x $y \ - -anchor nw -font fixed \ - -text $text] - set bbox [$canvas bbox $id] - set bid [eval $canvas create rectangle $bbox -fill white] - $canvas lower $bid $id - $canvas bind $id [list show-report $islandname $code] - $canvas bind $bid [list show-report $islandname $code] - manyset $bbox dummy dummy dummy y + + if {$c > 1} { set qty [format %d $c] } else { set qty {} } + code2canvas $code $canvas $x y $qty 2 \ + [list show-report $islandname $code] # debug "NEW Y $y" } - panner::updatecanvas-bbox .ctrl.pan + panner::updatecanvas-bbox .cp.ctrl.pan } @@ -804,13 +847,13 @@ proc reparse {base varname old fulldesc okshow noneshow parse ok} { manyset [errexpect-catch { uplevel 1 $parse if {[string length [string trim $var]]} { - parser-control-ok .ctrl.$base $base $okshow + parser-control-ok .cp.ctrl.$base $base $okshow } else { - parser-control-none .ctrl.$base $base $noneshow + parser-control-none .cp.ctrl.$base $base $noneshow } }] failed emsg lno ei if {$failed} { - parser-control-failed-expected .ctrl.$base $base \ + parser-control-failed-expected .cp.ctrl.$base $base \ $emsg $lno $ei $fulldesc $var set var $old uplevel 1 $parse @@ -835,96 +878,96 @@ proc widgets-setup {} { pack $canvas -expand 1 -fill both pack .f -expand 1 -fill both -side left - #----- filter ----- + #----- control panels and filter ----- + frame .cp frame .filter -relief groove -bd 2 - pack .filter -side bottom + pack .cp .filter -side top label .filter.title -text Filter grid configure .filter.title -row 0 -column 0 -columnspan 2 #----- control panel ----- - frame .ctrl - pack .ctrl -side left -anchor n + frame .cp.ctrl + pack .cp.ctrl -side left -anchor n debug "BBOX [$canvas bbox all]" panner::canvas-scroll-bbox .f.c - panner::create .ctrl.pan .f.c 120 120 $debug + panner::create .cp.ctrl.pan .f.c 120 120 $debug - pack .ctrl.pan -side top -pady 10 -padx 5 - frame .ctrl.zoom - pack .ctrl.zoom -side top + pack .cp.ctrl.pan -side top -pady 10 -padx 5 + frame .cp.ctrl.zoom + pack .cp.ctrl.zoom -side top - button .ctrl.zoom.out -text - -font {Courier 16} -command {zoom /2} - button .ctrl.zoom.in -text + -font {Courier 16} -command {zoom *2} - pack .ctrl.zoom.out .ctrl.zoom.in -side left + button .cp.ctrl.zoom.out -text - -font {Courier 16} -command {zoom /2} + button .cp.ctrl.zoom.in -text + -font {Courier 16} -command {zoom *2} + pack .cp.ctrl.zoom.out .cp.ctrl.zoom.in -side left - parser-control-create .ctrl.acquire \ + parser-control-create .cp.ctrl.acquire \ acquire Acquire \ "Clipboard parsing error" \ - pack .ctrl.acquire -side top -pady 2 + pack .cp.ctrl.acquire -side top -pady 2 - parser-control-create .ctrl.notes \ + parser-control-create .cp.ctrl.notes \ notes "Reload notes" \ "Vessel notes loading report" \ - pack .ctrl.notes -side top -pady 2 + pack .cp.ctrl.notes -side top -pady 2 #----- decoding etc. report ----- - frame .report - pack .report -side left -anchor n + frame .cp.report + pack .cp.report -side left -anchor n - label .report.island -text { } + label .cp.report.island -text { } - frame .report.abbrev -background black - glset report_abbrev { } - entry .report.abbrev.abbrev -state readonly \ - -textvariable report_abbrev \ - -borderwidth 0 -relief flat -width 0 \ - -highlightbackground white \ - -readonlybackground white -foreground black - pack .report.abbrev.abbrev -side left -padx 1 -pady 1 + canvas .cp.report.abbrev -width 1 -height 15 - frame .report.code - label .report.code.lab -text Code: + frame .cp.report.code + label .cp.report.code.lab -text Code: glset report_code { } - entry .report.code.code -state readonly -textvariable report_code -width 15 - pack .report.code.lab .report.code.code -side left - frame .report.details -bd 2 -relief groove -padx 2 -pady 2 + entry .cp.report.code.code -state readonly \ + -textvariable report_code -width 15 + pack .cp.report.code.lab .cp.report.code.code -side left + frame .cp.report.details -bd 2 -relief groove -padx 2 -pady 2 - listbox .report.list -height 5 + listbox .cp.report.list -height 5 - pack .report.island .report.abbrev .report.details \ - .report.list .report.code -side top - pack configure .report.details -fill x + pack .cp.report.island .cp.report.abbrev .cp.report.details \ + .cp.report.list .cp.report.code -side top + pack configure .cp.report.details -fill x foreach sw {inport class subclass lock own xabbrev} { - label .report.details.$sw -text { } - pack .report.details.$sw -side top -anchor w + label .cp.report.details.$sw -text { } + pack .cp.report.details.$sw -side top -anchor w } } -proc report-set {sw val} { .report.details.$sw configure -text $val } +proc report-set {sw val} { .cp.report.details.$sw configure -text $val } proc show-report {islandname code} { - .report.island configure -text $islandname - glset report_code $code - glset report_abbrev [code2abbrev $code] + .cp.report.island configure -text $islandname + .cp.report.abbrev delete all + set y 2 + code2canvas $code .cp.report.abbrev 5 y {} 0 {} + manyset [.cp.report.abbrev bbox all] minx dummy maxx dummy + .cp.report.abbrev configure -width [expr {$maxx-$minx+4}] + + glset report_code $code show-report-decode $code set kk "$islandname $code" upvar #0 found($kk) k - .report.list delete 0 end + .cp.report.list delete 0 end foreach entry $k { manyset $entry vid name - .report.list insert end $name + .cp.report.list insert end $name } } @@ -944,7 +987,7 @@ proc invoke_acquire {} { if {[catch { set clipboard [clipboard get] } emsg]} { - parser-control-failed-unexpected .ctrl.acquire acquire \ + parser-control-failed-unexpected .cp.ctrl.acquire acquire \ $emsg "fetching clipboard:\n\n$errorInfo" return } @@ -965,7 +1008,7 @@ proc invoke_notes {} { if {[catch { load-notes } emsg]} { - parser-control-failed-unexpected .ctrl.notes notes \ + parser-control-failed-unexpected .cp.ctrl.notes notes \ $emsg "loading $notes_loc:\n\n$errorInfo" return }