aboutsummaryrefslogtreecommitdiffstats
path: root/ext/tk/sample/demos-jp/puzzle.rb
diff options
context:
space:
mode:
authornagai <nagai@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-07-31 20:52:40 +0000
committernagai <nagai@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-07-31 20:52:40 +0000
commit75362fbd47cedf4b4906a361a6c54bc4ad8ea5ec (patch)
tree33e458bfb8dcf84face1eb34acede77b68ff5d8d /ext/tk/sample/demos-jp/puzzle.rb
parent0cdf0d99c1e5164c53676a39265ff99120c8a026 (diff)
downloadruby-75362fbd47cedf4b4906a361a6c54bc4ad8ea5ec.tar.gz
* (IMPORTANT BUG FIX) scan of event keywords doesn't work on recent
versions of Tck/Tk * (bug fix) initialize error of instance variable on TkComposite * (bug fix) initialize error on encoding-system on MultiTkIp * (bug fix) trouble on destroying widgets * (new) add JP and EN version of Ruby/Tk widget demos git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4249 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/tk/sample/demos-jp/puzzle.rb')
-rw-r--r--ext/tk/sample/demos-jp/puzzle.rb105
1 files changed, 105 insertions, 0 deletions
diff --git a/ext/tk/sample/demos-jp/puzzle.rb b/ext/tk/sample/demos-jp/puzzle.rb
new file mode 100644
index 0000000000..7e7aafac2f
--- /dev/null
+++ b/ext/tk/sample/demos-jp/puzzle.rb
@@ -0,0 +1,105 @@
+#
+# 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)
+}
+
+# label 生成
+msg = TkLabel.new($puzzle_demo) {
+ font $font
+ wraplength '4i'
+ justify 'left'
+ text "下の15-パズルはボタンを集めてできています。空いている所の隣のピースをクリックすると、そのピースがその空いている場所にスライドします。この操作を続け、ピースがその数の順に上から下、左から右に並ぶようにしてください。"
+}
+msg.pack('side'=>'top')
+
+# frame 生成
+TkFrame.new($puzzle_demo) {|frame|
+ TkButton.new(frame) {
+ 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 を用いることで
+# 空白部分のための暗色を選択し,設定する
+#
+s = TkScrollbar.new($puzzle_demo)
+base = TkFrame.new($puzzle_demo) {
+ width 120
+ height 120
+ 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)
+ }.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
+