From: Tadayoshi Funaba Date: 1998-07-25T16:14:48+09:00 Subject: [ruby-dev:3410] dialogue ----Next_Part(Sat_Jul_25_16:10:05_1998_816)-- Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit ふなばです。 擬似コードでも書いてみると、気分くらいは伝わるかもしれないので、ちょっ と書いてみようと思ったんですが、やっているうちに、ある程度までなら実装 できそうな気がしてきたので、一応、動くものを書いてみました。 dialog.tcl を参考にしましたが、いろいろ手を抜いています。 手を抜いたところは、protocol で、WM_DELETE_WINDOW を設定するところ (つ かおうとしたら、None がないと怒られた)、focus に関して、それから、グラ ブもこれで十分なのか判りません。他にもアヤシイところがありそうです。 ボタンの登録はその都度、 set_button メソッドでする、というふうにしてみ ました。デフォルトボタンは set_default メソッドでおこなっています。 --Tadayoshi Funaba ----Next_Part(Sat_Jul_25_16:10:05_1998_816)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Description: tkdialogue.rb # tkdialogue.rb (prototype): Written by Tadayoshi Funaba 1998 # $Id: tkdialogue.rb,v 1.1 1998/07/25 06:49:05 tadf Exp tadf $ require 'tk' class TkDialogue < TkToplevel def initialize super() @buttons = {} @counter = 0 @default = nil @result = -1 transient TkWinfo.toplevel(TkWinfo.parent(self)) bind 'Return', lambda { @result = @buttons[@default] @default. configure('state'=>'active', 'relief'=>'sunken') update 'idletasks' after 100, lambda{destroy}} grab end def set_button(w) @buttons[w] = @counter @counter += 1 w.command lambda { @result = @buttons[w] destroy} end def set_default(w) @default = w end def wait withdraw update 'idletasks' sw = TkWinfo.screenwidth(self) sh = TkWinfo.screenheight(self) dw = TkWinfo.reqwidth(self) dh = TkWinfo.reqheight(self) vx = TkWinfo.vrootx(TkWinfo.parent(self)) vy = TkWinfo.vrooty(TkWinfo.parent(self)) x = (sw - dw) / 2 - vx y = (sh - dh) / 2 - vy geometry "+#{x}+#{y}" deiconify wait_destroy @result end end if __FILE__ == $0 then class TkSimplestDialogue < TkDialogue def initialize super() w = TkButton.new(self, 'text'=>'OK').pack set_button w set_default w end end class TkImitationDialogue < TkDialogue def initialize super() title 'Question' iconname 'Dialogue' bot = TkFrame.new(self, 'relief'=>'raised', 'bd'=>1). pack('side'=>'bottom', 'fill'=>'both') top = TkFrame.new(self, 'relief'=>'raised', 'bd'=>1). pack('side'=>'top', 'fill'=>'both', 'expand'=>1) msg = TkLabel. new(self, 'justify'=>'left', 'text'=> %Q("tkdialog.rb" already exists.\nDo you want to overwrite it?), 'font'=>'-adobe-times-medium-r-normal--*-180-*'). pack('in'=>top, 'side'=>'right', 'expand'=>1, 'fill'=>'both', 'padx'=>'3m', 'pady'=>'3m') bitmap = TkLabel.new(self, 'bitmap'=>'questhead'). pack('in'=>top, 'side'=>'left', 'padx'=>'3m', 'pady'=>'3m') default = TkFrame.new(self, 'relief'=>'sunken', 'bd'=>1). pack('in'=>bot, 'side'=>'left', 'expand'=>1, 'padx'=>'3m', 'pady'=>'2m') button = TkButton.new(self, 'text'=>'OK'). pack('in'=>default, 'padx'=>'2m', 'pady'=>'2m') set_button button set_default button button2 = TkButton.new(self, 'text'=>'Cancel'). pack('in'=>bot, 'side'=>'left', 'expand'=>1, 'padx'=>'2m', 'pady'=>'2m') set_button button2 end end class TkTest < TkRoot def initialize super() TkButton. new(self, 'text'=>'simplest', 'command'=>lambda { p TkSimplestDialogue.new.wait}). pack TkButton. new(self, 'text'=>'imitation', 'command'=>lambda { p TkImitationDialogue.new.wait}). pack TkButton. new(self, 'text'=>'Quit', 'command'=>lambda{destroy}). pack end end TkTest.new Tk.mainloop end ----Next_Part(Sat_Jul_25_16:10:05_1998_816)----