Scid  4.7.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
material.tcl
Go to the documentation of this file.
1 ###
2 ### search/material.tcl: Material Search routine for Scid.
3 ###
4 
5 namespace eval ::search::material {}
6 
7 ##########
8 # Size 20 is only used in Material search window, not for boards.
9 # It has two special extra images, wm20 and bm20, which contain a
10 # bishop and knight, for indicating a minor piece.
11 #
12 
13 image create photo wm20 -data {
14  R0lGODlhFAAUAMIAAH9/f7+/vz8/PwAAAP///////////////yH5BAEKAAcALAAAAAAUABQA
15  AANweLp8cCG02cSwNB8RSACctgBAR3iDqJDd5wlidBLCHGb1CQzzx+yPDYAWyJ1gixpSwOLM
16  CClFESSRup7RImF42zxP0Vpg0EE6SGjSCqxTKYxHN4RJ6sYETHxVNa3vM2gDQyBoGkNbhIdq
17  FHRBZyAaCQA7}
18 
19 image create photo bm20 -data {
20  R0lGODlhFAAUAMIAAH9/f7+/vwAAAD8/P////////////////yH5BAEKAAcALAAAAAAUABQA
21  AANneLp8cCG02YQYgupj+5CbEgyYAAQCuJHlNYZo1wHDo7VyOjSAebQxS69R25UCvVlmMXIp
22  TrmhSGgB4S5LzoVQegK+YJtWwLWEFjnzGVL7ftYQMoGQggerZ3CrLealoxomXxJIX1kNCQA7
23 }
24 
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
43  8cUYZ6xxBwkAADs=
44 }
45 
46 image create photo e20 -height 20 -width 20
47 set x 0
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
51  incr x 20
52 }
53 
54 set ignoreColors 0
55 set minMoveNum 1
56 set maxMoveNum 999
57 set minHalfMoves 1
58 set oppBishops 0
59 set sameBishops 0
60 set minMatDiff -40
61 set maxMatDiff +40
62 
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}
68 
69 set nPatterns 3
70 set nMaxPatterns 10
71 
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) "?"
76 }
77 
78 proc checkPieceCounts {name el op} {
79  global pMin pMax
80  ::utils::validate::Integer 9 0 $name $el $op
81  # Now make sure minor piece counts fit with bishop/knight counts:
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)}
92  }
93 }
94 
95 trace variable pMin w checkPieceCounts
96 trace variable pMax w checkPieceCounts
97 
98 
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
103 
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" ;# -hidemargin 1
107  $w.menu add radiobutton -label No -image tb_cross -variable $varName -value No \
108  -command "$w configure -image tb_cross" ;# -hidemargin 1
109  return $w.menu
110 }
111 
112 proc makePieceMenu {w varName} {
113  global dark
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 \
122  -variable $varName \
123  -command "$w configure -image ${i}20" -hidemargin 1
124  }
125  foreach i {" ? " wk bk} {
126  $w.menu entryconfigure $i -columnbreak 1
127  }
128  return $w.menu
129 }
130 
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
137  } else {
138  .sm.mp.patt.grid.b$i configure -image tb_cross
139  }
140  if {$pattPiece($i) == "?"} {
141  .sm.mp.patt.grid.p$i configure -image e20
142  } else {
143  .sm.mp.patt.grid.p$i configure -image "$pattPiece($i)20"
144  }
145  }
146 }
147 
148 # ::search::material::zero
149 #
150 # Called to clear all material minimum/maximum values to zero.
151 #
152 proc ::search::material::zero {} {
153  global pMin pMax
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}
156 }
157 
158 proc ::search::material::any {} {
159  global pMin pMax
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}
162  set ::minMatDiff -40
163  set maxMatDiff +40
164 }
165 
166 proc clearPatterns {} {
167  global pattPiece pattFyle pattRank pattBool nPatterns nMaxPatterns
168 
169  set nPatterns 3
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
176  }
177  }
178  }
179  .sm.mp.patt.b2.pattAdd configure -state enable
181 }
182 
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}]
187 # set column 0
188 # set row $count
189  set f .sm.mp.patt
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
194 }
195 
196 proc setPatterns {pattlist} {
197  global pattPiece pattFyle pattRank pattBool nPatterns nMaxPatterns
198 
200  set count 1
201  foreach patt $pattlist {
202  if {$count > $nPatterns} {
203  showPattern $count
204  set nPatterns $count
205  }
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]
211  incr count
212  }
213  }
215 }
216 
217 set smDisplayed(Material) 1
218 set smDisplayed(Patterns) 0
219 
220 
221 proc set1Bishops { } {
222  global pMin pMax oppBishops sameBishops
223  if { $sameBishops || $oppBishops } {
224  set pMin(wb) 1
225  set pMax(wb) 1
226  set pMin(bb) 1
227  set pMax(bb) 1
228  }
229 }
230 # ::search::material
231 #
232 # Opens the window for searching by material or patterns.
233 #
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
238 
239  set w .sm
240  if {[winfo exists $w]} {
241  wm deiconify $w
242  raiseWin $w
243  return
244  }
245  set small font_Small
246 
248  wm title $w "Scid: $::tr(MaterialSearch)"
249  # button $w.piecelabel -font font_Bold -textvar ::tr(Material:) -command {
250  # if {$smDisplayed(Material)} {
251  # set smDisplayed(Material) 0
252  # pack forget .sm.q .sm.r .sm.b .sm.n .sm.m .sm.p .sm.b1 .sm.mdiff
253  # } else {
254  # set smDisplayed(Material) 1
255  # pack .sm.q .sm.r .sm.b .sm.n .sm.m .sm.p .sm.b1 .sm.mdiff \
256  # -after .sm.piecelabel
257  # }
258  # }
259 
260  bind $w <F1> { helpWindow Searches Material }
261  bind $w <Escape> "$w.b3.cancel invoke"
262  bind $w <Return> "$w.b3.search invoke"
263 
264  pack [ttk::frame $w.refdb] -side top -fill x
265  CreateSelectDBWidget "$w.refdb" "refDatabaseM" "$ref_base"
266 
267  ttk::frame $w.mp
268  ttk::labelframe $w.mp.material -text $::tr(Material)
269  pack $w.mp -side top
270  grid $w.mp.material -row 0 -column 0 -rowspan 2 -columnspan 2 -sticky nswe -padx "0 10" -pady 5
271 
272  foreach piece {q r b n m p} {
273  ttk::frame $w.mp.material.$piece
274  pack $w.mp.material.$piece -side top
275  }
276 
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 ;#-relief sunken
287  ttk::entry $f.wmax -width 2 -textvar pMax(w$i) -font font_Small -justify right ;#-relief sunken
288  pack $f.w0 $f.w1 $f.w2 $f.wa $f.w1p $f.wi $f.wmin $f.wto $f.wmax -side left -pady 1
289 
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 ;#-relief sunken
299  ttk::entry $f.bmax -width 2 -textvar pMax(b$i) -font font_Small -justify right ;#-relief sunken
300  pack $f.b0 $f.b1 $f.b2 $f.ba $f.b1p $f.bi $f.bmin $f.bto $f.bmax -side left -pady 1
301 
302  foreach b {0 1 2 a 1p} {
303  $f.w$b configure -width 2 -takefocus 0 -style Pad0.Small.TButton ;# -font $small -pady 0 -padx 1
304  $f.b$b configure -width 2 -takefocus 0 -style Pad0.Small.TButton ;# -font $small -pady 0 -padx 1
305  }
306  foreach widget {wmin wmax bmin bmax} {
307  bindFocusColors $f.$widget
308  }
309  if {$i == "p"} {
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"
314  }
315  if {$i == "m"} {
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"
320  }
321  }
322 
323  # Buttons that manipulate material settings:
324  set f $w.mp.material.b1
325  pack [ttk::frame $f] -side top
326 
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
329  dialogbuttonsmall $f.current [ list -textvar ::tr(CurrentBoard) -command {
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)
336  }
337  }
338  }] Pad0.Small.TButton
339 
340  ttk::menubutton $f.common -textvar ::tr(CommonEndings...) -menu $f.common.m -style pad0.TMenubutton ;# -font $small -relief raised
341  menu $f.common.m -font $small
342  set m $f.common.m
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}
347  }
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}
352  }
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}
357  }
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}
362  }
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
369  }
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}}
375  set ignoreColors 1
376  }
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}
381  }
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}
386  }
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}
391  }
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}
396  }
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}
401  }
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}
406  }
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}
411  }
412 
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
416  #if {! $smDisplayed(Material)} {
417  # pack forget .sm.q .sm.r .sm.b .sm.n .sm.m .sm.p .sm.b1 .sm.mdiff
418  #}
419 
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 ;#-relief sunken
425  bindFocusColors $f.min
426  ttk::label $f.sep -text "-" -font $small
427  ttk::entry $f.max -width 3 -textvar maxMatDiff -font $small -justify right ;#-relief sunken
428  bindFocusColors $f.max
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"
435 
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
440 
441  ttk::labelframe $w.mp.patt -text $::tr(Patterns)
442  set f $w.mp.patt
443  grid $w.mp.patt -row 0 -column 2 -sticky nwe -pady 5
444 
445  #dialogbutton $w.pattl -font font_Bold -textvar ::tr(Patterns:) -command {
446  # if {$smDisplayed(Patterns)} {
447  # set smDisplayed(Patterns) 0
448  # pack forget .sm.patt .sm.b2
449  # } else {
450  # set smDisplayed(Patterns) 1
451  # pack .sm.patt .sm.b2 -after .sm.pattl
452  # }
453  #}
454 
455  ttk::frame $f.grid
456  for { set i 1} { $i <= $nMaxPatterns } { incr i} {
457  makeBoolMenu $f.grid.b$i pattBool($i)
458  set menuPiece1 [ makePieceMenu $f.grid.p$i pattPiece($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}]
466 # set column 0
467 # set row $i
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
472  }
473  }
475 
476  ### Buttons that manipulate patterns:
477  set f $w.mp.patt.b2
478  ttk::frame $f
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}}
485  }
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}}
491  }
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}}
497  }
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}}
501  }
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}}
507  }
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}}
513  }
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}}
519  }
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}}
527  }
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} }
532  }
533  $f.common.m add command -label [tr PatternKc1Kg8] -command {
534  setPatterns { {wk c 1 Yes} {bk g 8 Yes} }
535  }
536  $f.common.m add command -label [tr PatternKg1Kc8] -command {
537  setPatterns { {wk g 1 Yes} {bk c 8 Yes} }
538  }
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} }
542  }
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} }
546  }
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} }
550  }
551 
552 # ttk::button $f.pattAdd -text $::tr(GlistAddField) -command {}
553  ttk::button $f.pattAdd -text " + " -command {
554  if { $::nPatterns < $::nMaxPatterns } {
555  incr ::nPatterns
556  showPattern $::nPatterns
557  updatePatternImages
558  if { $::nPatterns == $::nMaxPatterns } { .sm.mp.patt.b2.pattAdd configure -state disabled }
559  }
560  }
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 ;# -fill both -expand 1
566  #if {! $smDisplayed(Patterns)} {
567  # pack forget $w.patt $w.b2
568  #}
570 
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}
580 
582 
583  ### Now the move counter:
584  pack [ ttk::frame $w.fmc] -side top -expand 1 -fill both
585 
586  set f $w.fmc.move
587  pack [ttk::frame $f] -side top -ipady 5 ;# -expand 1 -fill both
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
596  bindFocusColors $f.from
597  bindFocusColors $f.to
598  bindFocusColors $f.hmoves
599  pack $f.fromlab $f.from $f.tolab $f.to $f.space $f.label1 $f.hmoves $f.label2 -side left
600 
602 
603  ### Progress bar:
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"
608 
609  ### Last of all, the buttons frame:
610 
611  set f $w.b3
612  pack [ttk::frame $f] -side top -ipady 5 -fill x
613  ttk::checkbutton $f.ignorecol -textvar ::tr(IgnoreColors) -variable ignoreColors ;# -padx 4
614 
615  dialogbutton $f.save -textvar ::tr(Save...) -command ::search::material::save
616 
617  dialogbutton $f.stop -textvar ::tr(Stop) -command progressBarCancel
618  $f.stop configure -state disabled
619 
620  dialogbutton $f.search -textvar ::tr(Search) -command {
621  busyCursor .
622  set curr_base [sc_base current]
623  sc_base switch [lindex $refDatabaseM 0]
624  .sm.b3.stop configure -state normal
625  grab .sm.b3.stop
626  set bishops "Either"
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
657  unbusyCursor .
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)"
662  }
663 
664  dialogbutton $f.cancel -textvar ::tr(Close) \
665  -command { focus .; destroy .sm }
666 
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
671 
672  # update
673  wm resizable $w 0 0
675  focus $f.search
676 }
677 
678 proc ::search::material::save {} {
679  global pMin pMax ignoreColors minMoveNum maxMoveNum minHalfMoves
680  global pattPiece pattFyle pattRank pattBool sameBishops oppBishops nPatterns
681 
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}
685 
686  if {[string compare [file extension $fName] ".sso"] != 0} {
687  append fName ".sso"
688  }
689 
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"
693  return
694  }
695  puts $searchF "\# SearchOptions File created by Scid $::scidVersion"
696  puts $searchF "set searchType Material"
697  # First write the material counts:
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)"
701  }
702  # Now write other numeric values:
703  foreach i {
704  ignoreColors minMoveNum maxMoveNum minHalfMoves sameBishops oppBishops nPatterns
705  ::search::filter::operation
706  } {
707  puts $searchF "set $i [set $i]"
708  }
709  # Last, write the patterns:
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)"
715  }
716  tk_messageBox -type ok -icon info -title "Search Options saved" \
717  -message "Material/pattern search options saved to: $fName"
718  close $searchF
719 }
720