1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
# -*- coding: utf-8 -*-
#
# widet demo 'puzzle' (called by 'widget')
#
# toplevel widget ãåå¨ããã°åé¤ãã
if defined?($puzzle_demo) && $puzzle_demo
$puzzle_demo.destroy
$puzzle_demo = nil
end
# demo ç¨ã® toplevel widget ãçæ
$puzzle_demo = TkToplevel.new {|w|
title("15-Puzzle Demonstration")
iconname("15-Puzzle")
positionWindow(w)
}
base_frame = TkFrame.new($puzzle_demo).pack(:fill=>:both, :expand=>true)
# label çæ
msg = TkLabel.new(base_frame) {
font $font
wraplength '4i'
justify 'left'
text "ä¸ã®15-ããºã«ã¯ãã¿ã³ãéãã¦ã§ãã¦ãã¾ãã空ãã¦ããæã®é£ã®ãã¼ã¹ãã¯ãªãã¯ããã¨ããã®ãã¼ã¹ããã®ç©ºãã¦ããå ´æã«ã¹ã©ã¤ããã¾ãããã®æä½ãç¶ãããã¼ã¹ããã®æ°ã®é ã«ä¸ããä¸ãå·¦ããå³ã«ä¸¦ã¶ããã«ãã¦ãã ããã"
}
msg.pack('side'=>'top')
# frame çæ
TkFrame.new(base_frame) {|frame|
TkButton.new(frame) {
#text 'äºè§£'
text 'éãã'
command proc{
tmppath = $puzzle_demo
$puzzle_demo = nil
tmppath.destroy
}
}.pack('side'=>'left', 'expand'=>'yes')
TkButton.new(frame) {
text 'ã³ã¼ãåç
§'
command proc{showCode 'puzzle'}
}.pack('side'=>'left', 'expand'=>'yes')
}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m')
# frame çæ
#
# Special trick: scrollbar widget ãçæãã¦ãã® trough color ãç¨ãããã¨ã§
# 空ç½é¨åã®ããã®æè²ãé¸æãï¼è¨å®ãã
#
begin
if Tk.windowingsystem() == 'aqua'
frameWidth = 168
frameHeight = 168
elsif Tk.default_widget_set == :Ttk
frameWidth = 148
frameHeight = 124
else
frameWidth = 120
frameHeight = 120
end
rescue
frameWidth = 120
frameHeight = 120
end
# depend_on_button_width = true
depend_on_button_width = false
s = TkScrollbar.new(base_frame)
base = TkFrame.new(base_frame) {
width frameWidth
height frameHeight
borderwidth 2
relief 'sunken'
bg s['troughcolor']
}
s.destroy
base.pack('side'=>'top', 'padx'=>'1c', 'pady'=>'1c')
# proc ã®ã¹ã³ã¼ããéããããï¼proc çæã¡ã½ãããç¨æ
# ãããã¦ãããã°ï¼ã«ã¼ãä¸ã§å¤ãå¤åãã num ã®å½±é¿ãåãã¦
# puzzleSwitch ã®ç¬¬ 2 å¼æ°ãå¤åãã¦ãã¾ãï¼æå¾
éãã«ã¯ãªããªãï¼
def def_puzzleswitch_proc(w, num)
proc{puzzleSwitch w, num}
end
$xpos = {}
$ypos = {}
order = [3,1,6,2,5,7,15,13,4,11,8,9,14,10,12]
(0..14).each{|i|
num = order[i]
$xpos[num] = (i % 4) * 0.25
$ypos[num] = (i / 4) * 0.25
TkButton.new(base) {|w|
relief 'raised'
text num
highlightthickness 0
command def_puzzleswitch_proc(w, num)
if depend_on_button_width && (w.winfo_reqwidth * 4 > base.width)
base.width = w.winfo_reqwidth * 4
end
}.place('relx'=>$xpos[num], 'rely'=>$ypos[num],
'relwidth'=>0.25, 'relheight'=>0.25)
}
$xpos['space'] = 0.75
$ypos['space'] = 0.75
############
def puzzleSwitch(w, num)
if ( ($ypos[num] >= ($ypos['space'] - 0.01)) \
&& ($ypos[num] <= ($ypos['space'] + 0.01)) \
&& ($xpos[num] >= ($xpos['space'] - 0.26)) \
&& ($xpos[num] <= ($xpos['space'] + 0.26))) \
|| (($xpos[num] >= ($xpos['space'] - 0.01)) \
&& ($xpos[num] <= ($xpos['space'] + 0.01)) \
&& ($ypos[num] >= ($ypos['space'] - 0.26)) \
&& ($ypos[num] <= ($ypos['space'] + 0.26)))
tmp = $xpos['space']
$xpos['space'] = $xpos[num]
$xpos[num] = tmp
tmp = $ypos['space']
$ypos['space'] = $ypos[num]
$ypos[num] = tmp
w.place('relx'=>$xpos[num], 'rely'=>$ypos[num])
end
end
|