summaryrefslogtreecommitdiff
path: root/ext/tk/lib/tkdialog.rb
diff options
context:
space:
mode:
Diffstat (limited to 'ext/tk/lib/tkdialog.rb')
-rw-r--r--ext/tk/lib/tkdialog.rb185
1 files changed, 153 insertions, 32 deletions
diff --git a/ext/tk/lib/tkdialog.rb b/ext/tk/lib/tkdialog.rb
index 8b8ee69128..31d50fc67b 100644
--- a/ext/tk/lib/tkdialog.rb
+++ b/ext/tk/lib/tkdialog.rb
@@ -1,13 +1,55 @@
require "tk"
-class TkDialog < TkWindow
+class TkDialog2 < TkWindow
extend Tk
+ def self.show(*args)
+ dlog = self.new(*args)
+ dlog.show
+ dlog
+ end
+
+ def _set_button_config(configs)
+ set_config = proc{|c,i|
+ if $VERBOSE && (c.has_key?('command') || c.has_key?(:command))
+ STDERR.print("Warning: cannot give a command option " +
+ "to the dialog button#{i}. It was removed.\n")
+ end
+ c.delete('command'); c.delete(:command)
+ @config << format("%s.button%s configure %s; ",
+ @path, i, hash_kv(c).join(' '))
+ }
+ case configs
+ when Proc
+ @buttons.each_index{|i|
+ if (c = configs.call(i)).kind_of? Hash
+ set_config.call(c,i)
+ end
+ }
+
+ when Array
+ @buttons.each_index{|i|
+ if (c = configs[i]).kind_of? Hash
+ set_config.call(c,i)
+ end
+ }
+
+ when Hash
+ @buttons.each_with_index{|s,i|
+ if (c = configs[s]).kind_of? Hash
+ set_config.call(c,i)
+ end
+ }
+ end
+ @config = 'after idle {' + @config + '};' if @config != ""
+ end
+ private :_set_button_config
+
# initialize tk_dialog
def initialize(keys = nil)
super()
+
@var = TkVariable.new
- id = @var.id
@title = title
@@ -20,28 +62,42 @@ class TkDialog < TkWindow
@default_button = default_button
@buttons = buttons
- @button_configs = proc{|num| button_configs num}
+ @button_configs = proc{|num| button_configs(num)}
+
+ #@config = "puts [winfo children .w0000];"
+ @config = ""
if keys.kind_of? Hash
keys = _symbolkey2str(keys)
- @title = keys['title'] if keys['title']
- @message = keys['message'] if keys['message']
- @bitmap = keys['bitmap'] if keys['bitmap']
- @default_button = keys['default'] if keys['default']
- @buttons = keys['buttons'] if keys['buttons']
+ @title = keys['title'] if keys.key? 'title'
+ @message = keys['message'] if keys.key? 'message'
+ @bitmap = keys['bitmap'] if keys.key? 'bitmap'
+ @default_button = keys['default'] if keys.key? 'default'
+ @buttons = keys['buttons'] if keys.key? 'buttons'
@command = keys['prev_command']
- @message_config = keys['message_config'] if keys['message_config']
- @bitmap_config = keys['bitmap_config'] if keys['bitmap_config']
- @button_configs = keys['button_configs'] if keys['button_configs']
+ @message_config = keys['message_config'] if keys.key? 'message_config'
+ @msgframe_config = keys['msgframe_config'] if keys.key? 'msgframe_config'
+ @bitmap_config = keys['bitmap_config'] if keys.key? 'bitmap_config'
+ @button_configs = keys['button_configs'] if keys.key? 'button_configs'
+ @btnframe_config = keys['btnframe_config'] if keys.key? 'btnframe_config'
end
if @title.include? ?\s
@title = '{' + @title + '}'
end
- @buttons = tk_split_list(@buttons) if @buttons.kind_of? String
+ if @buttons.kind_of? Array
+ _set_button_config(@buttons.collect{|cfg|
+ (cfg.kind_of? Array)? cfg[1]: nil})
+ @buttons = @buttons.collect{|cfg| (cfg.kind_of? Array)? cfg[0]: cfg}
+ end
+ if @buttons.kind_of? Hash
+ _set_button_config(@buttons)
+ @buttons = @buttons.keys
+ end
+ @buttons = tk_split_simplelist(@buttons) if @buttons.kind_of? String
@buttons = @buttons.collect{|s|
if s.kind_of? Array
s = s.join(' ')
@@ -53,34 +109,46 @@ class TkDialog < TkWindow
end
}
- config = ""
if @message_config.kind_of? Hash
- config << format("%s.msg configure %s\n",
+ @config << format("%s.msg configure %s;",
@path, hash_kv(@message_config).join(' '))
end
+
+ if @msgframe_config.kind_of? Hash
+ @config << format("%s.top configure %s;",
+ @path, hash_kv(@msgframe_config).join(' '))
+ end
+
+ if @btnframe_config.kind_of? Hash
+ @config << format("%s.bot configure %s;",
+ @path, hash_kv(@btnframe_config).join(' '))
+ end
+
if @bitmap_config.kind_of? Hash
- config << format("%s.msg configure %s\n",
+ @config << format("%s.bitmap configure %s;",
@path, hash_kv(@bitmap_config).join(' '))
end
- if @button_configs.kind_of? Proc
- @buttons.each_index{|i|
- if (c = @button_configs.call(i)).kind_of? Hash
- config << format("%s.button%s configure %s\n",
- @path, i, hash_kv(c).join(' '))
- end
- }
- end
- config = 'after idle {' + config + '};' if config != ""
+
+ _set_button_config(@button_configs) if @button_configs
if @command.kind_of? Proc
@command.call(self)
end
+ end
- INTERP._eval('eval {global '+id+';'+config+
- 'set '+id+' [tk_dialog '+
+ def show
+ if @default_button.kind_of? String
+ default_button = @buttons.index(@default_button)
+ else
+ default_button = @default_button
+ end
+ default_button = '{}' if default_button == nil
+ INTERP._eval('eval {global '+@var.id+';'+@config+
+ 'set '+@var.id+' [tk_dialog '+
@path+" "+@title+" {#{@message}} "+@bitmap+" "+
- String(@default_button)+" "+@buttons.join(' ')+']}')
+ String(default_button)+" "+@buttons.join(' ')+']}')
end
+
def value
return @var.value.to_i
end
@@ -89,22 +157,36 @@ class TkDialog < TkWindow
# these methods must be overridden for each dialog #
# #
######################################################
+ private
+
def title
+ # returns a title string of the dialog window
return "DIALOG"
end
def message
+ # returns a message text to display on the dialog
return "MESSAGE"
end
def message_config
+ # returns a Hash {option=>value, ...} for the message text
+ return nil
+ end
+ def msgframe_config
+ # returns a Hash {option=>value, ...} for the message text frame
return nil
end
def bitmap
+ # returns a bitmap name or a bitmap file path
+ # (@ + path ; e.g. '@/usr/share/bitmap/sample.xbm')
return "info"
end
def bitmap_config
+ # returns nil or a Hash {option=>value, ...} for the bitmap
return nil
end
def default_button
+ # returns a default button's number or name
+ # if nil or null string, set no-default
return 0
end
def buttons
@@ -112,21 +194,50 @@ class TkDialog < TkWindow
return ["BUTTON1", "BUTTON2"]
end
def button_configs(num)
+ # returns nil / Proc / Array or Hash (see _set_button_config)
+ return nil
+ end
+ def btnframe_config
+ # returns nil or a Hash {option=>value, ...} for the button frame
return nil
end
end
+
+#
+# TkDialog : with showing at initialize
+#
+class TkDialog < TkDialog2
+ def self.show(*args)
+ self.new(*args)
+ end
+
+ def initialize(*args)
+ super(*args)
+ show
+ end
+end
+
+
#
# dialog for warning
#
-class TkWarning < TkDialog
+class TkWarning2 < TkDialog2
def initialize(mes)
- @mes = mes
- super()
+ super(:message=>mes)
end
- def message
- return @mes
+
+ def show(mes = nil)
+ mes_bup = @message
+ @message = mes if mes
+ ret = super()
+ @message = mes_bup
+ ret
end
+
+ #######
+ private
+
def title
return "WARNING";
end
@@ -140,3 +251,13 @@ class TkWarning < TkDialog
return "OK";
end
end
+
+class TkWarning < TkWarning2
+ def self.show(*args)
+ self.new(*args)
+ end
+ def initialize(mes)
+ super(mes)
+ show
+ end
+end