require 'Memcached' require 'gtk2' # clone of http://code.sixapart.com/svn/memcached/trunk/frontends/gtk2-perl/ $cmds = [] $cmd_cur = -1 $mc = Memcached.new('127.0.0.1:11211') win = Gtk::Window.new() win.signal_connect('delete-event') do Gtk.main_quit() end win.set_border_width(10) vb = Gtk::VBox::new() textview = Gtk::TextView::new() $buffer = textview.buffer() textview.set_editable(false) scroll = Gtk::ScrolledWindow::new() scroll.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC) scroll.set_shadow_type(Gtk::SHADOW_IN) scroll.add(textview) vb.pack_start(scroll, true, true, 0) textview.modify_font(Pango::FontDescription::new('monospace')) $buffer.create_tag('command', {'foreground' => 'blue' }) $buffer.create_tag('data', {'foreground' => 'black'}) $buffer.create_tag('error', {'foreground' => 'red' }) $entry = Gtk::Entry::new() $entry.signal_connect('key_press_event') do |entry, ev| case ev.keyval when 65362 $cmd_cur += 1 if $cmd_cur < ($cmds.size - 1) entry.set_text($cmds[$cmd_cur]) if $cmds[$cmd_cur] when 65364 $cmd_cur -= 1 if $cmd_cur >= 0 if $cmd_cur >= 0 and $cmds[$cmd_cur] entry.set_text($cmds[$cmd_cur]) else entry.set_text('') end end end $entry.signal_connect('activate') do |entry| text = entry.text() if text =~ /\w/ run_command(text) entry.set_text('') end end vb.pack_start($entry, false, false, 0) win.add(vb) win.set_title('MemCachedClient') win.set_default_size(400, 500) win.signal_connect('show') do $entry.grab_focus() end win.show_all() def display(level, text) $buffer.insert($buffer.end_iter(), "#{text}\n", level) end def run_command(text) $cmds.slice!(1) if $cmd_cur >= 0 and $cmds[$cmd_cur] = text $cmds.unshift(text) $cmd_cur = -1 display('command', text) case text when /^get\s+(\S+)$/i begin display('data', $mc.get($1)) rescue display('error', 'Not found.') end when /^set\s+(\S+)\s+(.*)$/i begin $mc.set($1, $2) display('data', 'Ok.') rescue display('error', 'Not found.') end when /^delete\s+(\S+)$/i begin $mc.delete($1) display('data', 'Ok.') rescue display('error', 'Not found.') end else display('error', "Unknown command '#{text}'.") end end Gtk.main()