X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.db-test.git;a=blobdiff_plain;f=pctb%2Fdictionary-manager;h=105490d5817eb9549bca6ebf2a7644618a75923d;hp=1845b8f2c8847d31b48ffc5a3b626b72b747fd67;hb=3b77f87531d0429325ca1adfa27d62f642e3643c;hpb=e7959cf0f4f2a59aeeb094ae335c0cd1bc03a36c diff --git a/pctb/dictionary-manager b/pctb/dictionary-manager index 1845b8f..105490d 100755 --- a/pctb/dictionary-manager +++ b/pctb/dictionary-manager @@ -140,7 +140,7 @@ static unsigned char csr_bits[] = { } proc resize_widgets_core {} { - global mulcols mulrows csrh gotsh ctxh glyphsdone + global mulcols mulrows csrh gotsh ctxh global unk_l unk_contexts foreach w {.d.csr .d.got .d.ctx} { @@ -245,7 +245,8 @@ proc do_database_update {im def} { } proc required/char {} { - global mulrows glyphsdone unk_l unk_r unk_contexts rows unk_context + global mulrows glyphsdone unk_l unk_r unk_contexts rows new_context + global all_contexts must_gets stdin l @@ -255,31 +256,34 @@ proc required/char {} { char_read_xpm stdin + catch { unset all_contexts } + resize_widgets_core foreach w {0 1} { .d.mi.csr_$w configure -height $mulrows } set maxh 0 - foreach {min max contexts got} $glyphsdone { - show_context maxh $min $contexts + foreach {min max context contexts got} $glyphsdone { + show_context maxh $min $context + foreach ctx $contexts { set all_contexts($ctx) 1 } } + foreach ctx $unk_contexts { set all_contexts($ctx) 1 } - destroy [winfo children .d.selctx] + eval destroy [winfo children .d.selctx] label .d.selctx.title -text \ - {Select match context for new dictionary entry:} + {Select match context for altering dictionary:} pack .d.selctx.title -side left - set unk_context [lindex $unk_contexts 0] - set ci 0; foreach ctx $unk_contexts { - radiobutton .d.selctx.c$ci -variable unk_context \ - -value $ctx -text $ctx - pack .d.selctx.c$ci -side left + set new_context [lindex $unk_contexts 0] + + set ci 0; foreach ctx [lsort [array names all_contexts]] { + set all_contexts($ctx) $ci + set selw .d.selctx.c$ci + set seltxt $ctx + radiobutton $selw -variable new_context -value $ctx -text $seltxt + pack $selw -side left incr ci } - set ci [expr {[llength $unk_contexts]-1}] - .d.selctx.c$ci configure -text [lindex $unk_contexts $ci]. - if {[llength $unk_contexts]==1} { - foreach w [winfo children .d.selctx] { $w configure -state disabled } - } + $selw configure -text "$seltxt." label .d.selctx.warning -text {See README.charset.} pack .d.selctx.warning -side left @@ -368,11 +372,13 @@ proc pixmap_maybe_ok {} { } proc pixmap_ok {} { global database ppm pixmap_selcol pixmap_selrow mainkind alloptions + + return_result_start foreach_pixmap_col col { .d.pe.grid.l$col configure -state disabled } .d.pe.ok configure -state disabled - helptext {{{ Processing }}} + manyset [lrange $alloptions [expr {$pixmap_selcol*3}] end] \ colname coldesc rows manyset [lrange $rows [expr {$pixmap_selrow*2}] end] \ @@ -381,7 +387,8 @@ proc pixmap_ok {} { debug "UPDATE PIXMAP AS >$result<" do_database_update $ppm $result - done/$mainkind + + return_result_finish } proc required/pixmap {} { @@ -593,11 +600,11 @@ proc char_read_xpm {f} { set unk_l [expr {$unk_l - $chop_l}] set unk_r [expr {$unk_r - $chop_l}] set ngd {} - foreach {min max contexts got} $glyphsdone { + foreach {min max context contexts got} $glyphsdone { lappend ngd \ [expr {$min-$chop_l}] \ [expr {$max-$chop_l}] \ - $contexts $got + $context $contexts $got } set glyphsdone $ngd @@ -639,7 +646,7 @@ proc char_read_xpm {f} { set how q } else { set ab 0 - foreach {min max contexts got} $glyphsdone { + foreach {min max context contexts got} $glyphsdone { set rhsmost_max $max if {$x >= $min && $x <= $max} { set how [lindex {a b} $ab] @@ -691,7 +698,7 @@ proc show_context {maxhv x ctxs} { proc draw_glyphsdone {} { global glyphsdone mul inter eval destroy [winfo children .d.got] - foreach {min max contexts got} $glyphsdone { + foreach {min max context contexts got} $glyphsdone { frame .d.got.m$min -bd 0 -background \#888 label .d.got.m$min.l -text "$got" -fg white -bg black -bd 0 pack .d.got.m$min.l -padx 1 -pady 1 @@ -703,7 +710,7 @@ proc startup_cursor {} { global cur_already cur_mode cur_0 cur_1 last_ht global glyphsdone unk_l unk_r - set cur_already [expr {[llength $glyphsdone]/4-1}] + set cur_already [expr {[llength $glyphsdone]/5-1}] set cur_mode 1 ;# one of: 0 1 already text set cur_0 $unk_l @@ -714,13 +721,31 @@ proc startup_cursor {} { #---------- character set runtime display and keystroke handling ---------- +proc char_exactly_selctxts {contexts} { + global all_contexts + foreach ctx [array names all_contexts] { + set ci $all_contexts($ctx) + set selw .d.selctx.c$ci + if {[lsearch -exact $contexts $ctx]>=0} { + set state normal + } else { + set state disabled + } + $selw configure -state $state + } +} + proc recursor/0 {} { recursor//01 0 } proc recursor/1 {} { recursor//01 1 } proc recursor//01 {z1} { - global mul rhsmost_max cols glyphsdone + global mul rhsmost_max cols glyphsdone cur_0 cur_1 upvar #0 cur_$z1 cur .d.csr.csr.l configure -text {adjust} place .d.csr.csr -x [expr {$cur*$mul - 7}] + + manyset [char_get_definition_info $cur_0 $cur_1] contexts + char_exactly_selctxts $contexts + bind_key space { othercursor } bind_leftright_q cur_$z1 0 [expr {$cols-1}] if {[llength $glyphsdone]} { @@ -729,11 +754,7 @@ proc recursor//01 {z1} { bind_key BackSpace {} } bind_key Return { - if {$cur_0 != $cur_1} { - .d.csr.csr.e delete 0 end - set cur_mode text - recursor - } + char_start_define_text } helptext { {{<- ->} {move cursor, adjusting area to define}} @@ -749,7 +770,17 @@ proc othercursor {} { recursor } +proc char_start_define_text {} { + global cur_0 cur_1 cur_mode + if {$cur_0 == $cur_1} return + .d.csr.csr.e delete 0 end + set cur_mode text + recursor +} + proc recursor/text {} { + global all_contexts + helptext { {Return {confirm entry of new glyph}} {Escape {abandon entry}} @@ -775,19 +806,21 @@ proc recursor/text {} { proc recursor/already {} { global mul - global glyphsdone global cur_already mul global glyphsdone cur_already mul + + char_exactly_selctxts [lindex $glyphsdone [expr {$cur_already*5+2}]] + .d.csr.csr.l configure -text {correct} - set rmax [lindex $glyphsdone [expr {$cur_already*4}]] + set rmax [lindex $glyphsdone [expr {$cur_already*5}]] place .d.csr.csr -x [expr {$rmax*$mul-3}] bind_key Return {} - bind_leftright_q cur_already 0 [expr {[llength $glyphsdone]/4-1}] + bind_leftright_q cur_already 0 [expr {[llength $glyphsdone]/5-1}] bind_key space { bind_key Delete {}; set cur_mode 1; recursor } bind_key Delete { RETURN_RESULT DELETE [lrange $glyphsdone \ - [expr $cur_already*4] \ - [expr $cur_already*4+2]] + [expr $cur_already*5] \ + [expr $cur_already*5+2]] } helptext { {{<- ->} {move cursor, selecting glyph to correct}} @@ -871,46 +904,64 @@ proc dbkey {ctx l r} { return $bm } -proc update_database/DEFINE {c0 c1 strq} { +proc char_get_definition_info {c0 c1} { + # => ncontexts cl cr global glyphsdone unk_l unk_contexts wordmap database + if {$c0 > $c1} { manyset [list $c0 $c1] c1 c0 } + if {$c0 == $unk_l} { set ncontexts $unk_contexts } else { - foreach {l r contexts got} $glyphsdone { + foreach {l r context contexts got} $glyphsdone { if {$l==$c0} { set ncontexts $contexts; break } } if {![info exists ncontexts]} { - puts stderr "must start at letter LHS!" - return + set ncontexts {} } } incr c1 -1 - foreach c $ncontexts { - set bm [dbkey $c $c0 $c1] - do_database_update $bm $strq + set r [list $ncontexts $c0 $c1] + debug "CDGI $r" + return $r +} + +proc update_database/DEFINE {c0 c1 strq} { + global new_context + manyset [char_get_definition_info $c0 $c1] ncontexts c0 c1 + debug "DEFINE $c0 $c1 $new_context {$ncontexts}" + if {[llength $ncontexts]==1} { + set c [lindex $ncontexts 0] + } elseif {[lsearch -exact $new_context $ncontexts]>=0} { + set c $new_context + } else { + puts stderr "Selected context is not one of the many possibilities." + return; } + set bm [dbkey $c $c0 $c1] + do_database_update $bm $strq } proc update_database/DELETE {l r ctxs} { global database + if {[llength $ctxs]!=1} { error "$ctxs ?" } foreach ctx $ctxs { set bm [dbkey $ctx $l $r] catch { unset database($bm) } } write_database } - + proc RETURN_RESULT {how what} { - global mainkind + return_result_start + place forget .d.csr.csr pack forget .d.csr.csr.e - helptext {{{ Processing }}} - unbind_all_keys - update idletasks + debug "$how $what" eval update_database/$how $what - done/$mainkind + + return_result_finish } #========== server for approving updates ========== @@ -1235,6 +1286,16 @@ proc approve_show_page {delta} { #========== main program ========== +proc return_result_start {} { + helptext {{{ Processing }}} + unbind_all_keys + update idletasks +} +proc return_result_finish {} { + global mainkind + done/$mainkind +} + proc main/default {} { puts stderr "Do not run this program directly." exit 12