diff options
author | Jari Vetoniemi <jari.vetoniemi@indooratlas.com> | 2020-03-16 18:49:26 +0900 |
---|---|---|
committer | Jari Vetoniemi <jari.vetoniemi@indooratlas.com> | 2020-03-30 00:39:06 +0900 |
commit | fcbf63e62c627deae76c1b8cb8c0876c536ed811 (patch) | |
tree | 64cb17de3f41a2b6fef2368028fbd00349946994 /jni/ruby/ext/tk/lib/tkextlib/tcllib/chatwidget.rb |
Fresh start
Diffstat (limited to 'jni/ruby/ext/tk/lib/tkextlib/tcllib/chatwidget.rb')
-rw-r--r-- | jni/ruby/ext/tk/lib/tkextlib/tcllib/chatwidget.rb | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/jni/ruby/ext/tk/lib/tkextlib/tcllib/chatwidget.rb b/jni/ruby/ext/tk/lib/tkextlib/tcllib/chatwidget.rb new file mode 100644 index 0000000..ddb0340 --- /dev/null +++ b/jni/ruby/ext/tk/lib/tkextlib/tcllib/chatwidget.rb @@ -0,0 +1,151 @@ +# +# tkextlib/tcllib/chatwidget.rb +# by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) +# +# * Part of tcllib extension +# * chatwidget - Provides a multi-paned view suitable for display of +# chat room or irc channel information +# + +require 'tk' +require 'tkextlib/tcllib.rb' + +# TkPackage.require('chatwidget', '1.1.0') +TkPackage.require('chatwidget') + +module Tk::Tcllib + class ChatWidget < TkText + PACKAGE_NAME = 'chatwidget'.freeze + def self.package_name + PACKAGE_NAME + end + + def self.package_version + begin + TkPackage.require('chatwidget') + rescue + '' + end + end + end +end + +class Tk::Tcllib::ChatWidget + TkCommandNames = ['::chatwidget::chatwidget'.freeze].freeze + + def show_topic + tk_send_without_enc('topic', 'show') + self + end + + def hide_topic + tk_send_without_enc('topic', 'hide') + self + end + + def set_topic(topic) + tk_send('topic', 'set', topic) + end + + def list_name + tk_split_simplelist(tk_send('name', 'list')) + end + + def list_name_full + tk_split_simplelist(tk_send('name', 'list')).map{|lst| + nick, *opts = tk_split_simplelist(lst) + h_opt = {} + opts.slice(2){|k, v| h_opt[k[1..-1]] = tk_tcl2ruby(v)} + [nick, h_opt] + } + end + + def add_name(nick, opts={}) + tk_send('name', 'add', nick, *(hash_kv(opts))) + end + + def delete_name(nick) + tk_send('name', 'delete', nick) + end + + def get_name(nick) + lst = tk_send('name', 'get', nick) + return nil if lst.empty? + nick, *opts = tk_split_simplelist(lst) + h_opt = {} + opts.slice(2){|k, v| h_opt[k[1..-1]] = tk_tcl2ruby(v)} + [nick, h_opt] + end + + def message(msg, opts={}) + tk_send('message', msg, *(hash_kv(opts))) + self + end + + def _parse_hook_list(lst) + tk_split_simplelist(lst).map{|hook| + cmd, prior = tk_split_simplelist(hook) + [procedure(cmd), number(prior)] + } + end + private :_parse_hook_list + + def hook_add(type, *args, &blk) # args -> [prior, cmd], [prior], [cmd] + #type -> 'message', 'post', 'names_group', 'names_nick', 'chatstate', 'url' + + if prior = args.shift + if !prior.kind_of?(Numeric) + cmd = prior + if (prior = args.shift) && !prior.kind_of?(Numeric) # error + args.unshift(prior) + end + args.unshift(cmd) + end + prior ||= 50 # default priority + end + + cmd = args.shift || blk + + fail ArgumentError, "invalid arguments" unless args.empty? + fail ArgumentError, "no callback is given" unless cmd + + _parse_hook_list(tk_send('hook', 'add', type, cmd, prior)) + end + + def hook_remove(type, cmd) + #type -> 'message', 'post', 'names_group', 'names_nick', 'chatstate', 'url' + _parse_hook_list(tk_send('hook', 'remove', type, cmd)) + end + + def hook_run(type, *cmd_args) + #type -> 'message', 'post', 'names_group', 'names_nick', 'chatstate', 'url' + tk_send('hook', 'run', type, *cmd_args) + end + + def hook_list(type) + #type -> 'message', 'post', 'names_group', 'names_nick', 'chatstate', 'url' + _parse_hook_list(tk_send('hook', 'list', type)) + end + + def show_names + tk_send('names', 'show') + self + end + + def hide_names + tk_send('names', 'hide') + self + end + + def names_widget + window(tk_send('names')) + end + + def entry_widget + window(tk_send('entry')) + end + + def chat_widget + window(tk_send('chat')) + end +end |