4 namespace eval ::preport {}
5 array set ::preport::_data {}
7 set preport(MaxGames) 400
9 set ::preport::_player ""
10 set ::preport::_color white
11 set ::preport::_pos start
12 set ::preport::_clipbase 0
18 proc ::preport::preportDlg {args} {
19 if {[
sc_base numGames $::curr_db] == 0} {
20 tk_messageBox -title "Scid" -type ok -icon warning -message "No games in current base"
24 if {[
llength $args] >= 1} {
25 set ::preport::_player [
lindex $args 0]
26 if {$::preport::_player == [
sc_game info white]} {
27 set ::preport::_color white
28 }
elseif {$::preport::_player == [
sc_game info black]} {
29 set ::preport::_color black
32 if {[
llength $args] >= 2} {
33 set ::preport::_color [
lindex $args 1]
37 if {[
winfo exists $w]} {
return}
39 wm title $w "Scid: [
tr ToolsPlayerReport]"
41 pack [ttk::frame $w.g] -side top -fill x -expand yes
42 ttk::label $w.g.where -text $::tr(Player)
43 grid $w.g.where -row 0 -column 0 -sticky w
44 ttk::combobox $w.g.player -width 40 -textvariable ::preport::_player
46 grid $w.g.player -row 0 -column 1 -sticky we
47 ttk::label $w.g.has -text $::tr(ColorMarker)
48 grid $w.g.has -row 1 -column 0 -sticky w
50 ttk::radiobutton $w.g.color.white -text $::tr(White) \
51 -variable ::preport::_color -value white
52 ttk::frame $w.g.color.gap -width 5
53 ttk::radiobutton $w.g.color.black -text $::tr(Black) \
54 -variable ::preport::_color -value black
55 pack $w.g.color.white $w.g.color.gap $w.g.color.black -side left
56 grid $w.g.color -row 1 -column 1 -sticky w
57 ttk::label $w.g.pos -text $::tr(StartPos)
58 grid $w.g.pos -row 2 -column 0
59 ttk::frame $w.g.pselect
60 ttk::radiobutton $w.g.pselect.start -text "$::tr(Defaults) $::tr(StartPos)" \
61 -variable ::preport::_pos -value start
62 ttk::radiobutton $w.g.pselect.current -text $::tr(CurrentBoard) \
63 -variable ::preport::_pos -value current
64 pack $w.g.pselect.start $w.g.pselect.current -side left
65 grid $w.g.pselect -row 2 -column 1 -sticky w
66 ttk::checkbutton $w.g.clipbase -text $::tr(PReportClipbase) \
67 -variable ::preport::_clipbase
68 grid $w.g.clipbase -row 3 -column 1 -sticky w
70 pack [ttk::frame $w.b] -side bottom -fill x
71 pack [ttk::frame $w.b2] -side bottom -fill x
72 set whiteName [
sc_game info white]
73 set blackName [
sc_game info black]
74 dialogbutton $w.b2.white -text "$::tr(White) ($whiteName)" -command {
75 set ::preport::_player [sc_game info white]
76 set ::preport::_color white
78 dialogbutton $w.b2.black -text "$::tr(Black) ($blackName)" -command {
79 set ::preport::_player [sc_game info black]
80 set ::preport::_color black
82 if {$whiteName == "" || $whiteName == "?"} {
83 $w.b2.white configure -state disabled
85 if {$blackName == "" || $blackName == "?"} {
86 $w.b2.black configure -state disabled
90 -command {helpWindow Reports Player}
92 -command "catch {grab release $w}; destroy $w; ::preport::makeReportWin"
94 -command "catch {grab release $w}; destroy $w"
98 if {$whiteName != "" && $whiteName != "?"} {
101 if {$blackName != "" && $blackName != "?"} {
106 if {[
sc_base current] == $::clipbase_db} {
107 $w.g.clipbase configure -state disabled
109 bind $w <Return> [list $w.b.ok invoke]
110 bind $w <Escape> [list $w.b.cancel invoke]
116 proc ::preport::ConfigMenus {{lang ""}} {
117 if {! [
winfo exists .preportWin]} {
return}
118 if {$lang == ""} {
set lang $::language}
119 set m .preportWin.menu
120 foreach idx {0 1} tag {File Help} {
123 foreach idx {0 1 2 4 6} tag {Text Html LaTeX Options Close} {
126 foreach idx {0 1} tag {Report Index} {
132 proc ::preport::makeReportWin {args} {
134 set args [
linsert $args 0 "args"]
135 if {[lsearch -exact $args "-noprogress"] >= 0} {
set showProgress 0}
140 wm title $w "Scid: [
tr ToolsPlayerReport]"
141 bind $w <Visibility> "raiseWin $w"
143 pack [ttk::frame $w.b] -side bottom -fill x
144 set ::preport::_interrupt 0
145 ttk::button $w.b.cancel -text $::tr(Cancel) -command {
146 set ::preport::_interrupt 1
149 pack $w.b.cancel -side right -pady 5 -padx 2
151 foreach i {1 2 3} name {"Searching database for report games"
152 "Searching current board" "Generating report information"} {
153 ttk::label $w.text$i -text "$i. $name"
154 pack $w.text$i -side top
155 canvas $w.c$i -width 400 -height 20 -bg white -relief solid -border 1
156 $w.c$i create rectangle 0 0 0 0 -fill blue -outline blue -tags bar
157 $w.c$i create text 395 10 -anchor e -font font_Regular -tags time \
158 -fill black -text "0:00 / 0:00"
159 pack $w.c$i -side top -pady 10
163 set x [
winfo screenwidth $w]
set x [
expr $x - 400]
set x [
expr $x / 2]
164 set y [
winfo screenheight $w]
set y [
expr $y - 20]
set y [
expr $y / 2]
165 wm geometry $w +$x+$y
172 lappend searchArgs -filter RESET
173 lappend searchArgs "-$::preport::_color"
174 lappend searchArgs "\"$::preport::_player\""
177 if {$::preport::_interrupt} {
178 catch {grab release $w.b.cancel}
187 if {$::preport::_pos == "start"} {
sc_game push}
190 if {$::preport::_interrupt} {
192 catch {grab release $w.b.cancel}
198 sc_report player create $::preport(ExtraMoves) $::preport(MaxGames)
199 if {$::preport::_pos == "start"} {
sc_game pop}
200 if {$::preport::_clipbase} {
201 if {[
sc_base current] != $::clipbase_db} {
207 catch {grab release $w.b.cancel}
209 if {$::preport::_interrupt} {
return}
213 if {[lsearch -exact $args "-nodisplay"] >= 0} {
return}
216 if {![
winfo exists $w]} {
218 wm title $w "Scid: $::tr(PReportTitle)"
221 $w.menu add cascade -label OprepFile -menu $w.menu.file
222 $w.menu add cascade -label OprepHelp -menu $w.menu.helpmenu
223 foreach i {file helpmenu} {
224 menu $w.menu.$i -tearoff 0
226 $w.menu.file add command -label OprepFileText \
227 -command {::preport::saveReport text}
228 $w.menu.file add command -label OprepFileHtml \
229 -command {::preport::saveReport html}
230 $w.menu.file add command -label OprepFileLaTeX \
231 -command {::preport::saveReport latex}
232 $w.menu.file add separator
233 $w.menu.file add command -label OprepFileOptions \
234 -command ::preport::setOptions
235 $w.menu.file add separator
236 $w.menu.file add command -label Close \
237 -command "$w.b.close invoke"
238 $w.menu.helpmenu add command -label "Player Report Help" \
239 -accelerator F1 -command {helpWindow Reports Player}
240 $w.menu.helpmenu add command -label "Index" \
241 -command {helpWindow Index}
243 bind $w <F1> {helpWindow Reports Player}
244 bind $w <Escape> "$w.b.close invoke"
245 bind $w <Up> "$w.text yview scroll -1 units"
246 bind $w <Down> "$w.text yview scroll 1 units"
247 bind $w <Prior> "$w.text yview scroll -1 pages"
248 bind $w <Next> "$w.text yview scroll 1 pages"
249 bind $w <Key-Home> "$w.text yview moveto 0"
250 bind $w <Key-End> "$w.text yview moveto 0.99"
253 -height 30 -width 85 -font font_Small -setgrid 1 -wrap word \
254 -background white -foreground black -cursor top_left_arrow
257 ttk::button $w.b.opts -text [
tr OprepFileOptions] -command ::preport::setOptions
258 ttk::button $w.b.help -textvar ::tr(Help) -command {helpWindow Reports Player}
259 ttk::button $w.b.viewHTML -text $::tr(OprepViewHTML) \
260 -command ::preport::previewHTML
261 ttk::button $w.b.update -textvar ::tr(Update...) -command {
262 ::preport::preportDlg
264 ttk::button $w.b.close -textvar ::tr(Close) -command "focus .; destroy $w"
265 pack $w.b -side bottom -fill x
266 pack $w.scroll -side top -fill both -expand yes
267 pack $w.b.close $w.b.update -side right -padx 2 -pady 2
269 pack $w.b.viewHTML -side left -padx 2 -pady 2
271 pack $w.b.opts -side left -padx 2 -pady 2
277 $w.text configure -state normal
278 $w.text delete 1.0 end
279 regsub -all "\n" $report "<br>" report
281 $w.text configure -state disabled
288 proc ::preport::setOptions {} {
289 set w .preportOptions
290 if {[
winfo exists $w]} {
return}
292 pack [ttk::frame $w.f] -side top -fill x
294 foreach i {Stats AvgPerf Results MovesFrom Themes Endgames} {
297 foreach i {Stats Oldest Newest MostFrequentOpponents Results sep \
298 AvgPerf HighRating sep \
299 MostFrequentEcoCodes Themes Endgames sep \
300 MaxGames ExtraMoves} {
301 set from 0
set to 10
set tick 1
set res 1
302 if {$i == "MaxGames"} {
303 set from 0
set to 500
set tick 100
set res 50
306 ttk::separator $w.f.fsep$row
307 grid $w.f.fsep$row -row $row -column 0 -sticky we -columnspan 2
309 }
elseif {[
info exists yesno($i)]} {
310 ttk::checkbutton $w.f.f$i -variable ::preport($i) -offvalue 0 -onvalue 1 -text $::tr(Oprep$i)
311 grid $w.f.f$i -row $row -column 0 -sticky w -columnspan 2
314 for {
set x $from} {$x <= $to} {
incr x $res} {
317 ttk::combobox $w.f.s$i -textvariable ::preport($i) -width 3 -values $tmpcombo -justify right -state readonly
318 ttk::label $w.f.t$i -textvar ::tr(Oprep$i) -font font_Small
319 grid $w.f.s$i -row $row -column 0 -sticky we -padx "0 5"
320 grid $w.f.t$i -row $row -column 1 -sticky w
322 grid rowconfigure $w.f $row -pad 3
326 pack [ttk::frame $w.b] -side bottom -fill x
327 ttk::button $w.b.defaults -textvar ::tr(Defaults) -command {
328 array set ::preport [array get ::preportDefaults]
330 ttk::button $w.b.ok -text "OK" -command {
331 destroy .preportOptions
332 catch {set ::preport::_data(yview) [lindex [.preportWin.text yview] 0]}
333 ::preport::makeReportWin
334 catch {.preportWin.text yview moveto $::preport::_data(yview)}
336 ttk::button $w.b.cancel -textvar ::tr(Cancel) -command {
337 array set ::preport [array get ::preport::backup]
338 destroy .preportOptions
340 pack $w.b.defaults -side left -padx 5 -pady "15 5"
342 array set ::preport::backup [
array get ::preport]
344 wm title $w "Scid: [
tr ToolsPlayerReport]: [
tr Options]"
345 bind $w <Escape> "$w.b.cancel invoke"
353 proc ::preport::previewHTML {} {
355 set tmpdir $::scidLogDir
356 set tmpfile "TempPlayerReport"
357 set fname [
file join $tmpdir $tmpfile]
358 if {[
catch {
set tempfile [open $fname.html w]}]} {
359 tk_messageBox -title "Scid: Error writing report" -type ok -icon warning \
360 -message "Unable to write the file: $fname.html"
364 if {[
string match $::tcl_platform(os) "Windows NT"]} {
365 catch {
exec $::env(COMSPEC) /c start $fname.html &}
367 catch {
exec start $fname.html &}
372 proc ::preport::saveReport {fmt} {
375 { "Text files" {".txt"} }
376 { "All files" {"*"} }
378 if {$fmt == "latex"} {
381 { "LaTeX files" {".tex" ".ltx"} }
382 { "All files" {"*"} }
384 }
elseif {$fmt == "html"} {
387 { "HTML files" {".html" ".htm"} }
388 { "All files" {"*"} }
392 set fname [
tk_getSaveFile -initialdir [
pwd] -filetypes $ftype \
393 -defaultextension $default -title "Scid: Save opening report"]
394 if {$fname == ""} {
return}
397 if {[
catch {
set tempfile [open $fname w]}]} {
398 tk_messageBox -title "Scid: Error writing report" -type ok -icon warning \
399 -message "Unable to write the file: $fname\n\n"
402 if {$::hasEncoding && $::langEncoding($::language) != ""} {
403 catch {
set report [encoding convertto $::langEncoding($::language) $report]}
405 puts $tempfile $report
411 proc ::preport::_reset {} {
412 set ::preport::_data(sec) 0
413 set ::preport::_data(subsec) 0
416 proc ::preport::_title {} {
417 set fmt $::preport::_data(fmt)
418 set title $::tr(PReportTitle)
419 if {$fmt == "latex"} {
420 return "\\begin{center}{\\LARGE \\bf $title}\\end{center}\n\n"
421 }
elseif {$fmt == "html"} {
422 return "<h1><center>$title</center></h1>\n\n"
423 }
elseif {$fmt == "ctext"} {
424 return "<h1><center>$title</center></h1>\n\n"
426 set r "--------------------------------------------------------------"
427 append r "\n [
string toupper $title]\n"
428 append r "--------------------------------------------------------------"
433 proc ::preport::_sec {text} {
434 set fmt $::preport::_data(fmt)
435 incr ::preport::_data(sec)
436 set ::preport::_data(subsec) 0
437 if {$fmt == "latex"} {
438 return "\n\n\\section{$text}\n"
439 }
elseif {$fmt == "html"} {
440 return "\n<h2>$::preport::_data(sec). $text</h2>\n"
441 }
elseif {$fmt == "ctext"} {
442 return "<h4>$::preport::_data(sec). $text</h4>"
444 set line "$::preport::_data(sec). [
string toupper $text]"
445 set underline "-----------------------------------------------------"
446 return "\n\n$line\n[
string range $underline 1 [
string length $line]]\n"
449 proc ::preport::_subsec {text} {
450 set fmt $::preport::_data(fmt)
451 incr ::preport::_data(subsec)
452 if {$fmt == "latex"} {
453 return "\n\\subsection{$text}\n\n"
454 }
elseif {$fmt == "html"} {
455 return "\n<h3>$::preport::_data(sec).$::preport::_data(subsec) $text</h3>\n\n"
456 }
elseif {$fmt == "ctext"} {
457 return "\n<maroon><b>$::preport::_data(sec).$::preport::_data(subsec) $text</b></maroon>\n\n"
459 return "\n$::preport::_data(sec).$::preport::_data(subsec) $text\n\n"
463 proc ::preport::report {fmt {withTable 1}} {
466 set fmt [
string tolower $fmt]
467 set ::preport::_data(fmt) $fmt
477 sc_report player notes $withTable $numRows
479 set n "\n"
set p "\n\n"
set preText ""
set postText ""
480 set percent "%"
set bullet " * "
481 if {$fmt == "latex"} {
482 set n "\\\\\n"
set p "\n\n"
485 set percent "\\%"
set bullet "\\hspace{0.5cm}\$\\bullet\$"
486 }
elseif {$fmt == "html"} {
487 set n "<br>\n"
set p "<p>\n\n"
488 set preText "<pre>\n"
set postText "</pre>\n"
489 }
elseif {$fmt == "ctext"} {
490 set preText "<tt>"
set postText "</tt>"
497 set rgames [
lindex $counts 0]
498 set tgames [
lindex $counts 1]
501 append r $::optable::_docStart($fmt)
502 set r [
string map [list "\[OprepTitle\]" $tr(PReportTitle)] $r]
504 append r "$tr(Player): \"$::preport::_player\""
505 if {$::preport::_color == "white"} {
506 append r " $tr(PReportColorWhite)"
508 append r " $tr(PReportColorBlack)"
511 if {$::preport::_pos == "current" && ![
sc_pos isAt start]} {
512 append r " [
format $tr(PReportMoves) [
sc_report player line]]"
516 if {$fmt == "ctext"} {
517 append r "<darkblue><run sc_report player select all 0; ::notify::DatabaseModified $::curr_db dbfilter>"
520 if {$fmt == "ctext"} {
append r "</run></darkblue>" }
521 append r " $games)$n"
522 append r "$tr(Database): [
file tail [
sc_base filename $::curr_db]] "
525 append r "$tr(ECO): $eco$n"
529 if {$preport(Stats) || $preport(Oldest) > 0 || $preport(Newest) > 0 ||
530 $preport(MostFrequentOpponents) > 0 || $preport(Results)} {
533 if {$preport(Stats)} {
537 if {$preport(Oldest) > 0} {
539 append r [
sc_report player best o $preport(Oldest)]
541 if {$preport(Newest) > 0} {
543 append r [
sc_report player best n $preport(Newest)]
545 if {$preport(MostFrequentOpponents) > 0} {
547 if {$::preport::_color == "white"} {
548 append r [
sc_report player players black $preport(MostFrequentOpponents)]
550 append r [
sc_report player players white $preport(MostFrequentOpponents)]
553 if {$preport(Results)} {
558 if {$preport(AvgPerf) || $preport(HighRating)} {
561 if {$preport(AvgPerf)} {
564 set welo [
lindex $e 0]
set wng [
lindex $e 1]
565 set bpct [
lindex $e 2]
set bperf [
lindex $e 3]
567 set belo [
lindex $e 0]
set bng [
lindex $e 1]
568 set wpct [
lindex $e 2]
set wperf [
lindex $e 3]
569 append r "$tr(OprepWRating): $welo ($wng $games); "
570 append r "$tr(OprepWPerf): $wperf ($wpct$percent vs $belo)$n"
571 append r "$tr(OprepBRating): $belo ($bng $games); "
572 append r "$tr(OprepBPerf): $bperf ($bpct$percent vs $welo)$n"
574 if {$preport(HighRating) > 0} {
576 append r [
sc_report player best a $preport(HighRating)]
579 if {$preport(Themes) || $preport(MostFrequentEcoCodes) > 0 ||
580 $preport(Endgames)} {
583 if {$preport(MostFrequentEcoCodes) > 0} {
585 append r [
sc_report player eco $preport(MostFrequentEcoCodes)]
587 if {$preport(Themes)} {
589 append r [
sc_report player themes $tr(OprepThemeDescription:) \
590 $tr(OprepThemeSameCastling:) $tr(OprepThemeOppCastling:) \
591 $tr(OprepThemeKPawnStorm:) $tr(OprepThemeQueenswap:) \
592 $tr(OprepTheme1BishopPair:) \
593 $tr(OprepThemeWIQP:) $tr(OprepThemeBIQP:) \
594 $tr(OprepThemeWP567:) $tr(OprepThemeBP234:) \
595 $tr(OprepThemeOpenCDE:)]
597 if {$preport(Endgames)} {
599 append r "$tr(OprepEndClass:)$n"
603 if {$withTable && $::preport(MaxGames) > 0} {
606 if {$tgames > $::preport(MaxGames)} {
607 set comment [
format $tr(OprepTableComment) $::preport(MaxGames)]
609 append r [
sc_report player print $numRows $sec $comment]
611 append r $::optable::_docEnd($fmt)
615 if {$fmt == "latex"} { regsub -all ß $r {{\\ss}} r}