5 namespace eval ::search::material {}
    13 image create photo wm20 -data {
    14   R0lGODlhFAAUAMIAAH9/f7+/vz8/PwAAAP///////////////yH5BAEKAAcALAAAAAAUABQA
    15   AANweLp8cCG02cSwNB8RSACctgBAR3iDqJDd5wlidBLCHGb1CQzzx+yPDYAWyJ1gixpSwOLM
    16   CClFESSRup7RImF42zxP0Vpg0EE6SGjSCqxTKYxHN4RJ6sYETHxVNa3vM2gDQyBoGkNbhIdq
    19 image create photo bm20 -data {
    20   R0lGODlhFAAUAMIAAH9/f7+/vwAAAD8/P////////////////yH5BAEKAAcALAAAAAAUABQA
    21   AANneLp8cCG02YQYgupj+5CbEgyYAAQCuJHlNYZo1wHDo7VyOjSAebQxS69R25UCvVlmMXIp
    22   TrmhSGgB4S5LzoVQegK+YJtWwLWEFjnzGVL7ftYQMoGQggerZ3CrLealoxomXxJIX1kNCQA7
    25 image create photo p20 -data {
    26   R0lGODlh8AAUAMIAAH9/fz8/P7+/vwAAAP///////////////yH5BAEKAAcALAAAAADwABQA
    27   AAP+eLrc/jDKSau9OOvNu/8VAIBkJAhl2ohqe5xuCgTBGL/oQaMwJew30KwWhAkGA0Vv8gvk
    28   LALRUxJ9BTSAk40qFXWzkKZWCmQit5Uo2GdDW4ZuiFQ9koZ33mxZAjhjBidJFDNIRBgBhRQD
    29   Q4t9NH0NP3o1BEgEYjNTDix/SIITfQOIcROIooOFpouekV6PlQMEQ2qaK6QSsZUholGit5GA
    30   BJeAuMIixgDCnwrJAbKLsMPNsiY0VxeeyxGhnoZm2cTb4OMrP88C0X3NVWF+2CLaELnCUTRm
    31   6CfDtQuUwv7G1xb8iHUkmSV1lZy0GpErSZR9DbJVUOULCUQl3VRdPDL+rtsKRM8MxuqDjlcr
    32   FBIflkomK+CdLP8I2Ivg5NIOmxIe5RnygOSzhDKlLGqg01LCGjMhUHQpj1AhmfEYmHIy8JSJ
    33   jlZXAHIUDWRBojWcFnK1zZk/bw9oBLt09lcuMcpA7eS0CU8WVyIeMTBHD9ARdMjkjPt14BhF
    34   QEkddDuhSm7MqIUrrgJ0ZhSDvJIr+7o14x9dB3z9zTtCE3A+nHxiUpNXsFKgXj+mHPN3pKa/
    35   z5cH48LqJJwDVWoT8enYDis4W9k4cjzjliWk0p5ZBn5QcKdvOardXqqXN1nJVjFpxMTNgJw4
    36   4zypj3V6kRlxecYl7g0+mZtewcLQ/vYMjTb+U6lh5fXfJtmVNcpOj/xnGzL/kHaeO/AZ1xtN
    37   AaY3nHk9dZOHKnH0th43M1D4T2KXzebEbKKVFcoMhDEz1y8cvUjIPo3AU2MmNI0zYGEU2eiJ
    38   a3JUqF9PFT6nnnd5GHMdRrScQMeSC3Q23oCdxXaEapAdMI+Sisy1I0YyQslMgOi48iU34AzY
    39   yxlQJTfUA1hRoJMXYmJkHESOLIXIl1v+A5mAMgE2IkS9qLUGdDH9gIt0fprAaHQRxHeHeIfV
    40   eEc2CuV0Z6TrNVYcVrdEodp0ZY36WVVsPrPYb/HxmVFykfrYyJfLddTeCx15MZ8ovJlEVHx1
    41   zoNillrWICgh2zxpeluLfbZVnllK9pefNiiaSopPWLrVD0BZoqnbboOhBexxEQF7bXxuGfdg
    42   rlTEJxt9YDh1n0Dj7rOmjhtVmmmG6E2ArlRpapGmYsDa6+2qlwYcxAWHyrHwwxAX1h47EVds
    46 image create photo e20 -height 20 -width 20
    48 foreach p {wp wn wb wr wq wk bp bn bb br bq bk} {
    49   image create photo ${p}20 -width 20 -height 20
    50   ${p}20 copy p20 -from $x 0 [
expr $x + 19] 19
    63 trace variable minMoveNum w {::utils::validate::Integer 999 0}
    64 trace variable maxMoveNum w {::utils::validate::Integer 999 0}
    65 trace variable minHalfMoves w {::utils::validate::Integer 99 0}
    66 trace variable minMatDiff w {::utils::validate::Integer -99 0}
    67 trace variable maxMatDiff w {::utils::validate::Integer -99 0}
    72 array set pMin [list wq 0 bq 0 wr 0 br 0 wb 0 bb 0 wn 0 bn 0 wm 0 bm 0 wp 0 bp 0]
    73 array set pMax [list wq 2 bq 2 wr 2 br 2 wb 2 bb 2 wn 2 bn 2 wm 4 bm 4 wp 8 bp 8]
    74 for { 
set i 1} { $i <= $nMaxPatterns } { 
incr i} {
    75   set pattPiece($i) "?"  
set pattFyle($i) "?"  
set pattRank($i) "?"
    78 proc checkPieceCounts {name el op} {
    82 set wmMin [
expr {$pMin(wn) + $pMin(wb)}]
    83   set wmMax [
expr {$pMax(wn) + $pMax(wb)}]
    84   set bmMin [
expr {$pMin(bn) + $pMin(bb)}]
    85   set bmMax [
expr {$pMax(bn) + $pMax(bb)}]
    86   if {$pMin(wm) < $wmMin} { 
set pMin(wm) $wmMin}
    87   if {$pMax(wm) > $wmMax} { 
set pMax(wm) $wmMax}
    88   if {$pMin(bm) < $bmMin} { 
set pMin(bm) $bmMin}
    89   if {$pMax(bm) > $bmMax} { 
set pMax(bm) $bmMax}
    90   foreach p {wq wr wb wn wm wp bq br bb bn bm bp} {
    91     if {$pMax($p) != ""  &&  $pMax($p) < $pMin($p)} { 
set pMax($p) $pMin($p)}
    95 trace variable pMin w checkPieceCounts
    96 trace variable pMax w checkPieceCounts
    99 proc makeBoolMenu {w varName} {
   100   upvar #0 $varName var
   101   if {![
info exists var]} { 
set var "Yes"}
   102   ttk::menubutton $w -menu $w.menu -style Pad0.Small.TButton
   104   menu $w.menu -tearoff 0
   105   $w.menu add radiobutton -label Yes -image tb_tick -variable $varName -value Yes \
   106       -command "$w configure -image tb_tick"
   107 $w.menu add radiobutton -label No -image tb_cross -variable $varName -value No \
   108       -command "$w configure -image tb_cross"
   112 proc makePieceMenu {w varName} {
   114   upvar #0 $varName var
   115   if {![
info exists var]} { 
set var "?"}
   116   ttk::menubutton $w -menu $w.menu -style Pad0.Small.TButton
   117   menu $w.menu -tearoff 0
   118   $w.menu add radiobutton -label " ? " -variable $varName -value "?" \
   119       -command "$w configure -image e20"  -hidemargin 1
   120   foreach i {wk wq wr wb wn wp bk bq br bb bn bp} {
   121     $w.menu add radiobutton -label $i -image ${i}20 -value $i \
   123         -command "$w configure -image ${i}20"  -hidemargin 1
   125   foreach i {" ? " wk bk} {
   126     $w.menu entryconfigure $i -columnbreak 1
   131 proc updatePatternImages {} {
   132   global pattPiece nPatterns pattBool
   133   if {! [
winfo exists .sm]} { 
return}
   134   for {
set i 1} {$i <= $nPatterns} {
incr i} {
   135     if {$pattBool($i) == "Yes"} {
   136       .sm.mp.patt.grid.b$i configure -image tb_tick
   138       .sm.mp.patt.grid.b$i configure -image tb_cross
   140     if {$pattPiece($i) == "?"} {
   141       .sm.mp.patt.grid.p$i configure -image e20
   143       .sm.mp.patt.grid.p$i configure -image "$pattPiece($i)20"
   152 proc ::search::material::zero {} {
   154   array set pMin {wq 0 bq 0 wr 0 br 0 wb 0 bb 0 wn 0 bn 0 wm 0 bm 0 wp 0 bp 0}
   155   array set pMax {wq 0 bq 0 wr 0 br 0 wb 0 bb 0 wn 0 bn 0 wm 0 bm 0 wp 0 bp 0}
   158 proc ::search::material::any {} {
   160   array set pMin {wq 0 bq 0 wr 0 br 0 wb 0 bb 0 wn 0 bn 0 wm 0 bm 0 wp 0 bp 0}
   161   array set pMax {wq 2 bq 2 wr 2 br 2 wb 2 bb 2 wn 2 bn 2 wm 4 bm 4 wp 8 bp 8}
   166 proc clearPatterns {} {
   167   global pattPiece pattFyle pattRank pattBool nPatterns nMaxPatterns
   170   for { 
set i 1} { $i <= $nMaxPatterns } { 
incr i} {
   171     set pattPiece($i) "?"  
set pattFyle($i) "?"  
set pattRank($i) "?"
   172     set pattBool($i) "Yes"
   173     if { $i > $nPatterns } {
   174    foreach j { b p f r } {
   175        grid forget .sm.mp.patt.grid.$j$i
   179  .sm.mp.patt.b2.pattAdd configure -state enable
   183 proc showPattern { count } {
   184   global pattPiece pattFyle pattRank pattBool nPatterns nMaxPatterns
   185    set column [
expr {7 * (($count - 1) / 7)}]
   186    set row [
expr {($count - 1) % 7}]
   190    grid $f.grid.b$count -row $row -column $column -padx 0 -pady 0 
incr column
   191    grid $f.grid.p$count -row $row -column $column -padx 0 -pady 0 
incr column
   192    grid $f.grid.f$count -row $row -column $column -padx 0 -pady 0 
incr column
   193    grid $f.grid.r$count -row $row -column $column -padx "0 10" -pady 0 
incr column
   196 proc setPatterns {pattlist} {
   197   global pattPiece pattFyle pattRank pattBool nPatterns nMaxPatterns
   201   foreach patt $pattlist {
   202     if {$count > $nPatterns} {
   206     if {$count <= $nPatterns  &&  [
llength $patt] == 4} {
   207       set pattPiece($count) [
lindex $patt 0]
   208       set pattFyle($count) [
lindex $patt 1]
   209       set pattRank($count) [
lindex $patt 2]
   210       set pattBool($count) [
lindex $patt 3]
   217 set smDisplayed(Material) 1
   218 set smDisplayed(Patterns) 0
   221 proc set1Bishops { } {
   222   global pMin pMax oppBishops sameBishops
   223     if { $sameBishops || $oppBishops } {
   234 proc ::search::material {{ref_base ""}} {
   235   global dark pMin pMax ignoreColors minMoveNum maxMoveNum
   236   global pattPiece pattFyle pattRank pattBool oppBishops sameBishops nPatterns nMaxPatterns
   237   global minHalfMoves smDisplayed
   240   if {[
winfo exists $w]} {
   248   wm title $w "Scid: $::tr(MaterialSearch)"
   260   bind $w <F1> { helpWindow Searches Material }
   261   bind $w <Escape> "$w.b3.cancel invoke"
   262   bind $w <Return> "$w.b3.search invoke"
   264   pack [ttk::frame $w.refdb] -side top -fill x
   268   ttk::labelframe $w.mp.material -text $::tr(Material)
   270   grid $w.mp.material -row 0 -column 0 -rowspan 2 -columnspan 2 -sticky nswe -padx "0 10" -pady 5
   272   foreach piece {q r b n m p} {
   273     ttk::frame $w.mp.material.$piece
   274     pack $w.mp.material.$piece -side top
   277   foreach i {q r b n m p} {
   278     set f $w.mp.material.$i
   279     ttk::button $f.w0 -text "0" -command "set pMin(w$i) 0; set pMax(w$i) 0"
   280     ttk::button $f.w1 -text "1" -command "set pMin(w$i) 1; set pMax(w$i) 1"
   281     ttk::button $f.w2 -text "2" -command "set pMin(w$i) 2; set pMax(w$i) 2"
   282     ttk::button $f.wa -text "0+" -command "set pMin(w$i) 0; set pMax(w$i) 2"
   283     ttk::button $f.w1p -text "1+" -command "set pMin(w$i) 1; set pMax(w$i) 2"
   284     ttk::label $f.wi -image w${i}20 -font font_Small
   285     ttk::label $f.wto -text "-" -font font_Small -padding 0
   286     ttk::entry $f.wmin -width 2 -textvar pMin(w$i) -font font_Small -justify right
   287 ttk::entry $f.wmax -width 2 -textvar pMax(w$i) -font font_Small -justify right
   288 pack $f.w0 $f.w1 $f.w2 $f.wa $f.w1p $f.wi $f.wmin $f.wto $f.wmax -side left -pady 1
   290     pack [ttk::frame $f.space -width 20] -side left
   291     ttk::button $f.b0 -text "0" -command "set pMin(b$i) 0; set pMax(b$i) 0"
   292     ttk::button $f.b1 -text "1" -command "set pMin(b$i) 1; set pMax(b$i) 1"
   293     ttk::button $f.b2 -text "2" -command "set pMin(b$i) 2; set pMax(b$i) 2"
   294     ttk::button $f.ba -text "0+" -command "set pMin(b$i) 0; set pMax(b$i) 2"
   295     ttk::button $f.b1p -text "1+" -command "set pMin(b$i) 1; set pMax(b$i) 2"
   296     ttk::label $f.bi -image b${i}20 -font font_Small
   297     ttk::label $f.bto -text "-" -font font_Small
   298     ttk::entry $f.bmin -width 2 -textvar pMin(b$i) -font font_Small -justify right
   299 ttk::entry $f.bmax -width 2 -textvar pMax(b$i) -font font_Small -justify right
   300 pack $f.b0 $f.b1 $f.b2 $f.ba $f.b1p $f.bi $f.bmin $f.bto $f.bmax -side left -pady 1
   302     foreach b {0 1 2 a 1p} {
   303       $f.w$b configure -width 2 -takefocus 0 -style Pad0.Small.TButton
   304 $f.b$b configure -width 2 -takefocus 0 -style Pad0.Small.TButton
   306     foreach widget {wmin wmax bmin bmax} {
   310       $f.w1p configure -command "set pMin(wp) 1; set pMax(wp) 8"
   311       $f.wa configure -command "set pMin(wp) 0; set pMax(wp) 8"
   312       $f.b1p configure -command "set pMin(bp) 1; set pMax(bp) 8"
   313       $f.ba configure -command "set pMin(bp) 0; set pMax(bp) 8"
   316       $f.w1p configure -command "set pMin(wm) 1; set pMax(wm) 4"
   317       $f.wa configure -command "set pMin(wm) 0; set pMax(wm) 4"
   318       $f.b1p configure -command "set pMin(bm) 1; set pMax(bm) 4"
   319       $f.ba configure -command "set pMin(bm) 0; set pMax(bm) 4"
   324 set f $w.mp.material.b1
   325   pack [ttk::frame $f] -side top
   327   dialogbuttonsmall $f.zero [ list -textvar ::tr(Zero) -command ::search::material::zero] Pad0.Small.TButton
   328   dialogbuttonsmall $f.reset [ list -textvar ::tr(Any) -command ::search::material::any] Pad0.Small.TButton
   330     ::search::material::zero
   331     set bd [sc_pos board]
   332     for {set i 0} {$i < 64} {incr i} {
   333       set piece $::board::letterToPiece([ string index $bd $i ])
   334       if {$piece != "e"  &&  $piece != "wk"  &&  $piece != "bk"} {
   335         incr pMin($piece); set pMax($piece) $pMin($piece)
   338   }] Pad0.Small.TButton
   340   ttk::menubutton $f.common -textvar ::tr(CommonEndings...) -menu $f.common.m -style pad0.TMenubutton
   341 menu $f.common.m -font $small
   343   $m add command -label [
tr EndingPawns] -command {
   344     ::search::material::zero
   345     array set pMin {wp 1 bp 1}
   346     array set pMax {wp 8 bp 8}
   348   $m add command -label [
tr EndingRookVsPawns] -command {
   349     ::search::material::zero
   350     array set pMin {wr 1 bp 1}
   351     array set pMax {wr 1 bp 8}
   353   $m add command -label [
tr EndingRookPawnVsRook] -command {
   354     ::search::material::zero
   355     array set pMin {wr 1 br 1 wp 1}
   356     array set pMax {wr 1 br 1 wp 1}
   358   $m add command -label [
tr EndingRookPawnsVsRook] -command {
   359     ::search::material::zero
   360     array set pMin {wr 1 br 1 wp 1}
   361     array set pMax {wr 1 br 1 wp 8}
   363   $m add command -label [
tr EndingRooks] -command {
   364     ::search::material::zero
   365     array set pMin {wr 1 br 1}
   366     array set pMax {wr 1 br 1 wp 8 bp 8}
   367     set pMin(wr) 1; set pMax(wr) 1; set pMin(wp) 0; set mPax(wp) 8
   368     set pMin(br) 1; set pMax(br) 1; set pMin(bp) 0; set mPax(bp) 8
   370   $m add command -label [
tr EndingRooksPassedA] -command {
   371     ::search::material::zero
   372     array set pMin {wr 1 br 1 wp 1}
   373     array set pMax {wr 1 br 1 wp 8 bp 8}
   374     setPatterns {{wp a ? Yes} {bp a ? No} {bp b ? No}}
   377   $m add command -label [
tr EndingRooksDouble] -command {
   378     ::search::material::zero
   379     array set pMin {wr 2 br 2}
   380     array set pMax {wr 2 br 2 wp 8 bp 8}
   382   $m add command -label [
tr EndingBishops] -command {
   383     ::search::material::zero
   384     array set pMin {wb 1 bb 1 wm 1 bm 1}
   385     array set pMax {wb 1 bb 1 wm 1 bm 1 wp 8 bp 8}
   387   $m add command -label [
tr EndingBishopVsKnight] -command {
   388     ::search::material::zero
   389     array set pMin {wb 1 bn 1 wm 1 bm 1}
   390     array set pMax {wb 1 bn 1 wm 1 bm 1 wp 8 bp 8}
   392   $m add command -label [
tr EndingKnights] -command {
   393     ::search::material::zero
   394     array set pMin {wn 1 bn 1 wm 1 bm 1}
   395     array set pMax {wn 1 bn 1 wm 1 bm 1 wp 8 bp 8}
   397   $m add command -label [
tr EndingQueens] -command {
   398     ::search::material::zero
   399     array set pMin {wq 1 bq 1}
   400     array set pMax {wq 1 bq 1 wp 8 bp 8}
   402   $m add command -label [
tr EndingQueenPawnVsQueen] -command {
   403     ::search::material::zero
   404     array set pMin {wq 1 bq 1 wp 1}
   405     array set pMax {wq 1 bq 1 wp 1}
   407   $m add command -label [
tr BishopPairVsKnightPair] -command {
   408     ::search::material::zero
   409     array set pMin {wb 2 bn 2 wm 2 bm 2}
   410     array set pMax {wq 1 bq 1 wr 2 br 2 wb 2 bn 2 wm 2 bm 2 wp 8 bp 8}
   413   pack $f.zero -side left -pady 5 -padx "0 10"
   414   pack $f.reset $f.current -side left -pady 5 -padx 10
   415   pack $f.common -side left -padx "10 0" -pady 5
   420   ttk::frame $w.mp.material.mdiff
   421   set f $w.mp.material.mdiff
   422   pack $f -side left -anchor n -pady 5
   423   ttk::label $f.label -text $::tr(MaterialDiff)
   424   ttk::entry $f.min -width 3 -textvar minMatDiff -font $small -justify right
   426   ttk::label $f.sep -text "-" -font $small
   427   ttk::entry $f.max -width 3 -textvar maxMatDiff -font $small -justify right
   429   ttk::label $f.sep2 -text " " -font $small
   430   ttk::button $f.any -textvar ::tr(Any) -style Pad0.Small.TButton -command {set minMatDiff -40; set maxMatDiff +40} -width 0
   431   ttk::button $f.w1 -text " + " -style Pad0.Small.TButton -command {set minMatDiff +1; set maxMatDiff +40}  -width 0
   432   ttk::button $f.equal -text " = " -style Pad0.Small.TButton -command {set minMatDiff 0; set maxMatDiff 0}  -width 0
   433   ttk::button $f.b1 -text " - " -style Pad0.Small.TButton -command {set minMatDiff -40; set maxMatDiff -1}  -width 0
   434   ttk::label $f.explain -font $small -text "$::tr(White) - $::tr(Black) Q=9 R=5 B=3 N=3 P=1"
   436   pack $f.label -side top -anchor w
   437   pack $f.explain -side bottom
   438   pack $f.min $f.sep $f.max -side left
   439   pack $f.sep2 $f.any $f.w1 $f.equal $f.b1 -side left -padx 1 -pady 1
   441   ttk::labelframe $w.mp.patt -text $::tr(Patterns)
   443   grid $w.mp.patt -row 0 -column 2 -sticky nwe -pady 5
   456   for { 
set i 1} { $i <= $nMaxPatterns } { 
incr i} {
   459     tk_optionMenu $f.grid.f$i pattFyle($i) "?" a b c d e f g h
   460     tk_optionMenu $f.grid.r$i pattRank($i) "?" 1 2 3 4 5 6 7 8
   461     $f.grid.f$i configure -width 1 -indicatoron 0 -pady 0 -background [ttk::style lookup . -background]
   462     $f.grid.r$i configure -width 1 -indicatoron 0 -pady 0 -background [ttk::style lookup . -background]
   463     if { $i <= $nPatterns } {
   464     set column [
expr {7 * (($i - 1) / 7)}]
   465     set row [
expr {($i - 1) % 7}]
   468 grid $f.grid.b$i -row $row -column $column -padx 0 -pady 0 
incr column
   469     grid $f.grid.p$i -row $row -column $column -padx 0 -pady 0 
incr column
   470     grid $f.grid.f$i -row $row -column $column -padx 0 -pady 0 
incr column
   471     grid $f.grid.r$i -row $row -column $column -padx "0 10" -pady 0 
incr column
   479   dialogbutton $f.clearPat -textvar ::tr(Clear) -command clearPatterns
   480   ttk::menubutton $f.common -textvar ::tr(CommonPatterns...) -menu $f.common.m
   481   menu $f.common.m -font $small
   482   $f.common.m add command -label [
tr PatternWhiteIQP] -command {
   483     if {$pMin(wp) < 1} { set pMin(wp) 1 }
   484     setPatterns {{wp d ? Yes} {wp c ? No} {wp e ? No}}
   486   $f.common.m add command -label [
tr PatternWhiteIQPBreakE6] -command {
   487     if {$pMin(wp) < 1} { set pMin(wp) 1 }
   488     if {$pMin(bp) < 1} { set pMin(bp) 1 }
   489     setPatterns {{wp d 5 Yes} {wp c ? No} {wp e ? No} {wp d 4 No} \
   490           {bp e 6 Yes} {bp c ? No} {bp d ? No}}
   492   $f.common.m add command -label [
tr PatternWhiteIQPBreakC6] -command {
   493     if {$pMin(wp) < 1} { set pMin(wp) 1 }
   494     if {$pMin(bp) < 1} { set pMin(bp) 1 }
   495     setPatterns {{wp d 5 Yes} {wp c ? No} {wp e ? No} {wp d 4 No} \
   496           {bp c 6 Yes} {bp e ? No} {bp d ? No}}
   498   $f.common.m add command -label [
tr PatternBlackIQP] -command {
   499     if {$pMin(bp) < 1} { set pMin(bp) 1 }
   500     setPatterns {{bp d ? Yes} {bp c ? No} {bp e ? No}}
   502   $f.common.m add command -label [
tr PatternWhiteBlackIQP] -command {
   503     if {$pMin(wp) < 1} { set pMin(wp) 1 }
   504     if {$pMin(bp) < 1} { set pMin(bp) 1 }
   505     setPatterns {{wp d ? Yes} {wp c ? No} {wp e ? No} \
   506           {bp d ? Yes} {bp c ? No} {bp e ? No}}
   508   $f.common.m add command -label [
tr PatternCoupleC3D4] -command {
   509     set pMin(wp) 4; set pMax(wp) 6
   510     set pMin(bp) 4; set pMax(bp) 6
   511     setPatterns {{wp c 3 Yes} {wp d 4 Yes} {wp b ? No} {wp e ? No}
   512       {bp c ? No} {bp d ? No}}
   514   $f.common.m add command -label [
tr PatternHangingC5D5] -command {
   515     set pMin(bp) 4; set pMax(bp) 6
   516     set pMin(wp) 4; set pMax(wp) 6
   517     setPatterns {{bp c 5 Yes} {bp d 5 Yes} {bp b ? No} {bp e ? No}
   518       {wp c ? No} {wp d ? No}}
   520   $f.common.m add command -label [
tr PatternMaroczy] -command {
   521     if {$pMin(bp) < 1} { set pMin(bp) 1 }
   522     if {$pMax(bp) > 7} { set pMax(bp) 7 }
   523     if {$pMin(wp) < 2} { set pMin(wp) 2 }
   524     if {$pMax(wp) > 7} { set pMax(wp) 7 }
   525     setPatterns {{wp c 4 Yes} {wp e 4 Yes} {bp d ? Yes} {wp d ? No}
   526       {bp c ? No} {bp d 5 No}}
   528   $f.common.m add command -label [
tr PatternRookSacC3] -command {
   529     set pMin(br) 2; set pMax(br) 2
   530     set pMin(wr) 2; set pMax(wr) 2
   531     setPatterns { {br c 3 Yes} {wp b 2 Yes} }
   533   $f.common.m add command -label [
tr PatternKc1Kg8] -command {
   534     setPatterns { {wk c 1 Yes} {bk g 8 Yes} }
   536   $f.common.m add command -label [
tr PatternKg1Kc8] -command {
   537     setPatterns { {wk g 1 Yes} {bk c 8 Yes} }
   539   $f.common.m add command -label [
tr PatternLightFian] -command {
   540     set pMin(wb) 1; set pMin(bb) 1
   541     setPatterns { {wb g 2 Yes} {bb b 7 Yes} }
   543   $f.common.m add command -label [
tr PatternDarkFian] -command {
   544     set pMin(wb) 1; set pMin(bb) 1
   545     setPatterns { {wb b 2 Yes} {bb g 7 Yes} }
   547   $f.common.m add command -label [
tr PatternFourFian] -command {
   548     set pMin(wb) 2; set pMin(bb) 2
   549     setPatterns { {wb b 2 Yes} {wb g 2 Yes} {bb b 7 Yes} {bb g 7 Yes} }
   553 ttk::button $f.pattAdd -text " + " -command {
   554       if { $::nPatterns < $::nMaxPatterns } {
   556      showPattern $::nPatterns
   558      if { $::nPatterns == $::nMaxPatterns } { .sm.mp.patt.b2.pattAdd configure -state disabled }
   561   pack $f -side top -anchor w
   562   pack $f.common -side top -pady "0 5" -anchor w
   563   pack $f.pattAdd -side left -pady "0 5" -padx "0 10" -anchor w
   564   pack $f.clearPat -side left -anchor w -pady "0 5"
   565   pack $w.mp.patt.grid -side top -anchor w
   571   ttk::frame $w.mp.material.bishops
   572   set f $w.mp.material.bishops
   573   pack $f -side right -pady 5
   574   ttk::label $f.wb -image wb20
   575   ttk::label $f.bb -image bb20
   576   ttk::checkbutton $f.same -text $::tr(SameColor) -variable sameBishops -command set1Bishops
   577   ttk::checkbutton $f.opp -text $::tr(OppColor) -variable oppBishops -command set1Bishops
   578   pack $f.wb $f.bb -side left -anchor w
   579   foreach i { same opp } { 
pack $f.$i -side top -anchor w}
   584 pack [ ttk::frame $w.fmc] -side top -expand 1 -fill both
   587   pack [ttk::frame $f] -side top -ipady 5
   588 ttk::label $f.fromlab -textvar ::tr(MoveNumberRange:) -font font_Small
   589   ttk::entry $f.from -width 4 -textvar minMoveNum -justify right -font font_Small
   590   ttk::label $f.tolab -text "-" -font font_Small
   591   ttk::entry $f.to -width 4 -textvar maxMoveNum -justify right -font font_Small
   592   ttk::label $f.space -text "  "
   593   ttk::label $f.label1 -textvar ::tr(MatchForAtLeast) -font font_Small
   594   ttk::entry $f.hmoves -width 3 -textvar minHalfMoves -justify right -font font_Small
   595   ttk::label $f.label2 -textvar ::tr(HalfMoves) -font font_Small
   599   pack $f.fromlab $f.from $f.tolab $f.to $f.space $f.label1 $f.hmoves $f.label2 -side left
   604 ttk::frame $w.fprogress
   605   canvas $w.fprogress.progress -height 20 -width 500 -bg white -relief solid -border 1
   606   $w.fprogress.progress create rectangle 0 0 0 0 -outline blue -fill blue -tags bar
   607   $w.fprogress.progress create text 495 10 -anchor e -font font_Regular -tags time -fill black -text "0:00 / 0:00"
   612   pack [ttk::frame $f] -side top -ipady 5 -fill x
   613   ttk::checkbutton $f.ignorecol -textvar ::tr(IgnoreColors) -variable ignoreColors
   615   dialogbutton $f.save -textvar ::tr(Save...) -command ::search::material::save
   617   dialogbutton $f.stop -textvar ::tr(Stop) -command progressBarCancel
   618   $f.stop configure -state disabled
   622     set curr_base [sc_base current]
   623     sc_base switch [lindex $refDatabaseM 0]
   624     .sm.b3.stop configure -state normal
   627     if { $sameBishops } { set bishops "Same" }
   628     if { $oppBishops } { set bishops "Opposite" }
   629     if { $sameBishops && $oppBishops } { set bishops "Either" }
   630     progressBarSet .sm.fprogress.progress 501 21
   631     set str [sc_search material \
   632         -wq [list $pMin(wq) $pMax(wq)] -bq [list $pMin(bq) $pMax(bq)] \
   633         -wr [list $pMin(wr) $pMax(wr)] -br [list $pMin(br) $pMax(br)] \
   634         -wb [list $pMin(wb) $pMax(wb)] -bb [list $pMin(bb) $pMax(bb)] \
   635         -wn [list $pMin(wn) $pMax(wn)] -bn [list $pMin(bn) $pMax(bn)] \
   636         -wm [list $pMin(wm) $pMax(wm)] -bm [list $pMin(bm) $pMax(bm)] \
   637         -wp [list $pMin(wp) $pMax(wp)] -bp [list $pMin(bp) $pMax(bp)] \
   638         -flip $ignoreColors -filter $::search::filter::operation \
   639         -range [list $minMoveNum $maxMoveNum] \
   640         -length $minHalfMoves -bishops $bishops \
   641         -diff [list $minMatDiff $maxMatDiff] \
   642         -patt "$pattBool(1) $pattPiece(1) $pattFyle(1) $pattRank(1)" \
   643         -patt "$pattBool(2) $pattPiece(2) $pattFyle(2) $pattRank(2)" \
   644         -patt "$pattBool(3) $pattPiece(3) $pattFyle(3) $pattRank(3)" \
   645         -patt "$pattBool(4) $pattPiece(4) $pattFyle(4) $pattRank(4)" \
   646         -patt "$pattBool(5) $pattPiece(5) $pattFyle(5) $pattRank(5)" \
   647         -patt "$pattBool(6) $pattPiece(6) $pattFyle(6) $pattRank(6)" \
   648         -patt "$pattBool(7) $pattPiece(7) $pattFyle(7) $pattRank(7)" \
   649         -patt "$pattBool(8) $pattPiece(8) $pattFyle(8) $pattRank(8)" \
   650         -patt "$pattBool(9) $pattPiece(9) $pattFyle(9) $pattRank(9)" \
   651         -patt "$pattBool(10) $pattPiece(10) $pattFyle(10) $pattRank(10)" ]
   652     grab release .sm.b3.stop
   653     .sm.b3.stop configure -state disabled
   654     sc_base switch $curr_base
   655     .sm.fprogress.progress itemconfigure time -text $str
   656     .sm.fprogress.progress coords bar 0 0 0 0
   658     ::notify::DatabaseModified [sc_base current] dbfilter
   659     foreach {filterSz gameSz mainSz} [sc_filter sizes $curr_base dbfilter] {}
   660     set str [::windows::gamelist::formatFilterText $filterSz $gameSz]
   661     .sm.filterop configure -text "$::tr(FilterOperation) ($str)"
   665       -command { focus .; destroy .sm }
   667   pack $f.ignorecol $w.b3.save -side left -pady 5 -padx 5
   668   pack $w.b3.cancel $w.b3.search $w.b3.stop -side right -pady 5 -padx 5
   669   pack $w.fprogress.progress -side top -pady 2
   670   pack $w.fprogress -expand 1 -fill both
   678 proc ::search::material::save {} {
   679   global pMin pMax ignoreColors minMoveNum maxMoveNum minHalfMoves
   680   global pattPiece pattFyle pattRank pattBool sameBishops oppBishops nPatterns
   682   set ftype { { "Scid SearchOptions files" {".sso"} } }
   683   set fName [
tk_getSaveFile -initialdir [
pwd] -filetypes $ftype -title "Create a SearchOptions file"]
   684   if {$fName == ""} { 
return}
   686   if {[
string compare [
file extension $fName] ".sso"] != 0} {
   690   if {[
catch {
set searchF [open $fName w]}]} {
   691     tk_messageBox -title "Error: Unable to open file" -type ok -icon error \
   692         -message "Unable to create SearchOptions file: $fName"
   695   puts $searchF "\# SearchOptions File created by Scid $::scidVersion"
   696   puts $searchF "set searchType Material"
   698 foreach i {wq bq wr br wb bb wn bn wp bp} {
   699     puts $searchF "set pMin($i) $pMin($i)"
   700     puts $searchF "set pMax($i) $pMax($i)"
   704     ignoreColors minMoveNum maxMoveNum minHalfMoves sameBishops oppBishops nPatterns
   705     ::search::filter::operation
   707     puts $searchF "set $i [
set $i]"
   710 for {
set i 1} {$i <= $nPatterns} {
incr i} {
   711     puts $searchF "set pattPiece($i) $pattPiece($i)"
   712     puts $searchF "set pattFyle($i) $pattFyle($i)"
   713     puts $searchF "set pattRank($i) $pattRank($i)"
   714     puts $searchF "set pattBool($i) $pattBool($i)"
   716   tk_messageBox -type ok -icon info -title "Search Options saved" \
   717       -message "Material/pattern search options saved to: $fName"