rbhex-core 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +20 -0
- data/CHANGELOG +2000 -0
- data/LICENSE +56 -0
- data/README.md +44 -0
- data/examples/abasiclist.rb +179 -0
- data/examples/alpmenu.rb +50 -0
- data/examples/app.sample +19 -0
- data/examples/atree.rb +100 -0
- data/examples/bline.rb +136 -0
- data/examples/common/file.rb +45 -0
- data/examples/data/README.markdown +9 -0
- data/examples/data/brew.txt +38 -0
- data/examples/data/color.2 +37 -0
- data/examples/data/gemlist.txt +60 -0
- data/examples/data/lotr.txt +12 -0
- data/examples/data/ports.txt +136 -0
- data/examples/data/table.txt +37 -0
- data/examples/data/tasks.csv +88 -0
- data/examples/data/tasks.txt +27 -0
- data/examples/data/todo.txt +10 -0
- data/examples/data/todo.txt.bak +10 -0
- data/examples/data/todocsv.csv +28 -0
- data/examples/data/unix1.txt +21 -0
- data/examples/data/unix2.txt +11 -0
- data/examples/dbdemo.rb +502 -0
- data/examples/dirtree.rb +94 -0
- data/examples/newtabbedwindow.rb +100 -0
- data/examples/newtesttabp.rb +92 -0
- data/examples/tabular.rb +146 -0
- data/examples/tasks.rb +178 -0
- data/examples/term2.rb +84 -0
- data/examples/testbuttons.rb +296 -0
- data/examples/testcombo.rb +102 -0
- data/examples/testfields.rb +195 -0
- data/examples/testkeypress.rb +72 -0
- data/examples/testlistbox.rb +170 -0
- data/examples/testmessagebox.rb +140 -0
- data/examples/testprogress.rb +116 -0
- data/examples/testree.rb +106 -0
- data/examples/testwsshortcuts.rb +66 -0
- data/examples/testwsshortcuts2.rb +128 -0
- data/lib/rbhex.rb +6 -0
- data/lib/rbhex/core/docs/index.txt +73 -0
- data/lib/rbhex/core/include/action.rb +80 -0
- data/lib/rbhex/core/include/actionmanager.rb +49 -0
- data/lib/rbhex/core/include/appmethods.rb +214 -0
- data/lib/rbhex/core/include/bordertitle.rb +48 -0
- data/lib/rbhex/core/include/chunk.rb +203 -0
- data/lib/rbhex/core/include/io.rb +553 -0
- data/lib/rbhex/core/include/listbindings.rb +74 -0
- data/lib/rbhex/core/include/listcellrenderer.rb +140 -0
- data/lib/rbhex/core/include/listeditable.rb +317 -0
- data/lib/rbhex/core/include/listscrollable.rb +663 -0
- data/lib/rbhex/core/include/listselectable.rb +271 -0
- data/lib/rbhex/core/include/multibuffer.rb +83 -0
- data/lib/rbhex/core/include/orderedhash.rb +77 -0
- data/lib/rbhex/core/include/ractionevent.rb +73 -0
- data/lib/rbhex/core/include/rchangeevent.rb +27 -0
- data/lib/rbhex/core/include/rhistory.rb +95 -0
- data/lib/rbhex/core/include/rinputdataevent.rb +47 -0
- data/lib/rbhex/core/include/vieditable.rb +172 -0
- data/lib/rbhex/core/include/widgetmenu.rb +66 -0
- data/lib/rbhex/core/system/colormap.rb +165 -0
- data/lib/rbhex/core/system/keyboard.rb +150 -0
- data/lib/rbhex/core/system/keydefs.rb +30 -0
- data/lib/rbhex/core/system/ncurses.rb +236 -0
- data/lib/rbhex/core/system/panel.rb +162 -0
- data/lib/rbhex/core/system/window.rb +913 -0
- data/lib/rbhex/core/util/ansiparser.rb +119 -0
- data/lib/rbhex/core/util/app.rb +1228 -0
- data/lib/rbhex/core/util/basestack.rb +410 -0
- data/lib/rbhex/core/util/bottomline.rb +1859 -0
- data/lib/rbhex/core/util/colorparser.rb +77 -0
- data/lib/rbhex/core/util/focusmanager.rb +31 -0
- data/lib/rbhex/core/util/padreader.rb +192 -0
- data/lib/rbhex/core/util/rcommandwindow.rb +604 -0
- data/lib/rbhex/core/util/rdialogs.rb +574 -0
- data/lib/rbhex/core/util/viewer.rb +149 -0
- data/lib/rbhex/core/util/widgetshortcuts.rb +506 -0
- data/lib/rbhex/core/version.rb +5 -0
- data/lib/rbhex/core/widgets/applicationheader.rb +103 -0
- data/lib/rbhex/core/widgets/box.rb +58 -0
- data/lib/rbhex/core/widgets/divider.rb +310 -0
- data/lib/rbhex/core/widgets/keylabelprinter.rb +194 -0
- data/lib/rbhex/core/widgets/rcombo.rb +253 -0
- data/lib/rbhex/core/widgets/rcontainer.rb +415 -0
- data/lib/rbhex/core/widgets/rlink.rb +30 -0
- data/lib/rbhex/core/widgets/rlist.rb +696 -0
- data/lib/rbhex/core/widgets/rmenu.rb +958 -0
- data/lib/rbhex/core/widgets/rmenulink.rb +22 -0
- data/lib/rbhex/core/widgets/rmessagebox.rb +387 -0
- data/lib/rbhex/core/widgets/rprogress.rb +118 -0
- data/lib/rbhex/core/widgets/rtabbedpane.rb +634 -0
- data/lib/rbhex/core/widgets/rtabbedwindow.rb +70 -0
- data/lib/rbhex/core/widgets/rtextarea.rb +960 -0
- data/lib/rbhex/core/widgets/rtextview.rb +739 -0
- data/lib/rbhex/core/widgets/rtree.rb +768 -0
- data/lib/rbhex/core/widgets/rwidget.rb +3277 -0
- data/lib/rbhex/core/widgets/scrollbar.rb +143 -0
- data/lib/rbhex/core/widgets/statusline.rb +113 -0
- data/lib/rbhex/core/widgets/tabular.rb +264 -0
- data/lib/rbhex/core/widgets/tabularwidget.rb +1142 -0
- data/lib/rbhex/core/widgets/textpad.rb +995 -0
- data/lib/rbhex/core/widgets/tree/treecellrenderer.rb +150 -0
- data/lib/rbhex/core/widgets/tree/treemodel.rb +428 -0
- data/rbhex-core.gemspec +32 -0
- metadata +172 -0
data/examples/dirtree.rb
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
require 'rbhex/core/util/app'
|
|
2
|
+
require 'fileutils'
|
|
3
|
+
require 'rbhex/core/widgets/tree/treemodel'
|
|
4
|
+
begin
|
|
5
|
+
require './common/file' # Allow for Ruby < 1.9.2
|
|
6
|
+
rescue LoadError
|
|
7
|
+
require_relative 'common/file'
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def _directories wd
|
|
11
|
+
$log.debug " directories got XXX: #{wd} "
|
|
12
|
+
d = Dir.new(wd)
|
|
13
|
+
ent = d.entries.reject{|e| !File.directory? File.join(wd,e)}
|
|
14
|
+
$log.debug " directories got XXX: #{ent} "
|
|
15
|
+
ent.delete(".");ent.delete("..")
|
|
16
|
+
return ent
|
|
17
|
+
end
|
|
18
|
+
App.new do
|
|
19
|
+
def help_text
|
|
20
|
+
["Press <Enter> to expand/collapse directories. Press <space> to list a directory",
|
|
21
|
+
"Press <space> on filename to page it, or <ENTER> to view it in vi",
|
|
22
|
+
"At present the PWD may not be updated, so you'll just have to be in the correct",
|
|
23
|
+
"dir to actually view the file"]
|
|
24
|
+
end
|
|
25
|
+
header = app_header "rbhex #{Rbhex::Core::VERSION}", :text_center => "Yet Another Dir Lister", :text_right =>"Directory Lister" , :color => :white, :bgcolor => :black #, :attr => Ncurses::A_BLINK
|
|
26
|
+
message "Press Enter to expand/collapse, <space> to view in lister. <F1> Help"
|
|
27
|
+
@form.help_manager.help_text = help_text()
|
|
28
|
+
|
|
29
|
+
pwd = Dir.getwd
|
|
30
|
+
entries = _directories pwd
|
|
31
|
+
patharray = pwd.split("/")
|
|
32
|
+
# we have an array of path, to add recursively, one below the other
|
|
33
|
+
nodes = []
|
|
34
|
+
nodes << TreeNode.new(patharray.shift)
|
|
35
|
+
patharray.each do |e|
|
|
36
|
+
nodes << nodes.last.add(e)
|
|
37
|
+
end
|
|
38
|
+
last = nodes.last
|
|
39
|
+
nodes.last.add entries
|
|
40
|
+
model = DefaultTreeModel.new nodes.first
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
ht = FFI::NCurses.LINES - 2
|
|
45
|
+
borderattrib = :normal
|
|
46
|
+
flow :margin_top => 1, :margin_left => 0, :width => :expand, :height => ht do
|
|
47
|
+
@t = tree :data => model, :width_pc => 30, :border_attrib => borderattrib
|
|
48
|
+
@t.bind :TREE_WILL_EXPAND_EVENT do |node|
|
|
49
|
+
path = File.join(*node.user_object_path)
|
|
50
|
+
dirs = _directories path
|
|
51
|
+
ch = node.children
|
|
52
|
+
ch.each do |e|
|
|
53
|
+
o = e.user_object
|
|
54
|
+
if dirs.include? o
|
|
55
|
+
dirs.delete o
|
|
56
|
+
else
|
|
57
|
+
# delete this child since its no longer present TODO
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
#message " #{node} will expand: #{path}, #{dirs} "
|
|
61
|
+
node.add dirs
|
|
62
|
+
end
|
|
63
|
+
@t.bind :TREE_SELECTION_EVENT do |ev|
|
|
64
|
+
if ev.state == :SELECTED
|
|
65
|
+
node = ev.node
|
|
66
|
+
path = File.join(*node.user_object_path)
|
|
67
|
+
if File.exists? path
|
|
68
|
+
files = Dir.new(path).entries
|
|
69
|
+
files.delete(".")
|
|
70
|
+
@l.list files
|
|
71
|
+
#TODO show all details in filelist
|
|
72
|
+
@current_path = path
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end # select
|
|
76
|
+
@t.expand_node last #
|
|
77
|
+
@t.mark_parents_expanded last # make parents visible
|
|
78
|
+
@l = listbox :width_pc => 70, :border_attrib => borderattrib
|
|
79
|
+
|
|
80
|
+
@l.bind :LIST_SELECTION_EVENT do |ev|
|
|
81
|
+
message ev.source.text #selected_value
|
|
82
|
+
_f = File.join(@current_path, ev.source.text)
|
|
83
|
+
file_page _f if ev.type == :INSERT
|
|
84
|
+
#TODO when selects drill down
|
|
85
|
+
#TODO when selecting, sync tree with this
|
|
86
|
+
end
|
|
87
|
+
# on pressing enter, we edit the file using vi or EDITOR
|
|
88
|
+
@l.bind :PRESS do |ev|
|
|
89
|
+
_f = File.join(@current_path, ev.source.text)
|
|
90
|
+
file_edit _f if File.exists? _f
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
status_line :row => FFI::NCurses.LINES - 1
|
|
94
|
+
end # app
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# this is a test program, tests out tabbed panes. type F1 to exit
|
|
2
|
+
#
|
|
3
|
+
require 'logger'
|
|
4
|
+
require 'rbhex'
|
|
5
|
+
require 'rbhex/core/widgets/rtabbedpane'
|
|
6
|
+
require 'rbhex/core/widgets/rcontainer'
|
|
7
|
+
require 'rbhex/core/widgets/rcombo'
|
|
8
|
+
require 'rbhex/core/widgets/rtabbedwindow'
|
|
9
|
+
|
|
10
|
+
include RubyCurses
|
|
11
|
+
class SetupTabbedPane
|
|
12
|
+
def run
|
|
13
|
+
$config_hash ||= Variable.new Hash.new
|
|
14
|
+
#configvar.update_command(){ |v| $config_hash[v.source()] = v.value }
|
|
15
|
+
|
|
16
|
+
r = Container.new nil, :suppress_borders => true
|
|
17
|
+
l1 = Label.new nil, :name => "profile", :attr => 'bold', :text => "Profile"
|
|
18
|
+
f1 = Field.new nil, :name => "name", :maxlen => 20, :display_length => 20, :bgcolor => :white,
|
|
19
|
+
:color => :black, :text => "abc", :label => ' Name: '
|
|
20
|
+
f2 = Field.new nil, :name => "email", :display_length => 20, :bgcolor => :white,
|
|
21
|
+
:color => :blue, :text => "me@google.com", :label => 'Email: '
|
|
22
|
+
f3 = RadioButton.new nil, :variable => $config_hash, :text => "red", :value => "RED", :color => :red
|
|
23
|
+
f4 = RadioButton.new nil, :variable => $config_hash, :text => "blue", :value => "BLUE", :color => :blue
|
|
24
|
+
f5 = RadioButton.new nil, :variable => $config_hash, :text => "green", :value => "GREEN", :color => :green
|
|
25
|
+
r.add(l1,f1)
|
|
26
|
+
r.add(f2)
|
|
27
|
+
r.add(f3,f4,f5)
|
|
28
|
+
|
|
29
|
+
tp = TabbedWindow.new :row => 3, :col => 7, :width => 60, :height => 20 do
|
|
30
|
+
title "User Setup"
|
|
31
|
+
button_type :ok_apply_cancel
|
|
32
|
+
tab "&Profile" do
|
|
33
|
+
item Field.new nil, :row => 2, :col => 2, :text => "enter your name", :label => ' Name: '
|
|
34
|
+
item Field.new nil, :row => 3, :col => 2, :text => "enter your email", :label => 'Email: '
|
|
35
|
+
end
|
|
36
|
+
tab "&Settings" do
|
|
37
|
+
item Label.new nil, :text => "Text", :row => 1, :col => 2, :attr => 'bold'
|
|
38
|
+
item CheckBox.new nil, :row => 2, :col => 2, :text => "Antialias text"
|
|
39
|
+
item CheckBox.new nil, :row => 3, :col => 2, :text => "Use bold fonts"
|
|
40
|
+
item CheckBox.new nil, :row => 4, :col => 2, :text => "Allow blinking text"
|
|
41
|
+
item CheckBox.new nil, :row => 5, :col => 2, :text => "Display ANSI Colors"
|
|
42
|
+
item Label.new nil, :text => "Cursor", :row => 7, :col => 2, :attr => 'bold'
|
|
43
|
+
$config_hash.set_value Variable.new, :cursor
|
|
44
|
+
item RadioButton.new nil, :row => 8, :col => 2, :text => "Block", :value => "block", :variable => $config_hash[:cursor]
|
|
45
|
+
item RadioButton.new nil, :row => 9, :col => 2, :text => "Blink", :value => "blink", :variable => $config_hash[:cursor]
|
|
46
|
+
item RadioButton.new nil, :row => 10, :col => 2, :text => "Underline", :value => "underline", :variable => $config_hash[:cursor]
|
|
47
|
+
end
|
|
48
|
+
tab "&Term" do
|
|
49
|
+
|
|
50
|
+
item Label.new nil, :text => "Arrow Key in Combos", :row => 2, :col => 2, :attr => 'bold'
|
|
51
|
+
x = Variable.new
|
|
52
|
+
$config_hash.set_value x, :term
|
|
53
|
+
item RadioButton.new nil, :row => 3, :col => 2, :text => "ignore", :value => "ignore", :variable => $config_hash[:term]
|
|
54
|
+
item RadioButton.new nil, :row => 4, :col => 2, :text => "popup", :value => "popup", :variable => $config_hash[:term]
|
|
55
|
+
item RadioButton.new nil, :row => 5, :col => 2, :text => "next", :value => "next", :variable => $config_hash[:term]
|
|
56
|
+
cb = ComboBox.new nil, :row => 7, :col => 2, :display_length => 20,
|
|
57
|
+
:list => %w[xterm xterm-color xterm-256color screen vt100 vt102],
|
|
58
|
+
:label => "Declare terminal as: "
|
|
59
|
+
#radio.update_command() {|rb| ENV['TERM']=rb.value }
|
|
60
|
+
item cb
|
|
61
|
+
x.update_command do |rb|
|
|
62
|
+
cb.arrow_key_policy=rb.value.to_sym
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
end
|
|
66
|
+
tab "Conta&iner" do
|
|
67
|
+
item r
|
|
68
|
+
end
|
|
69
|
+
# tell tabbedpane what to do if a button is pressed (ok/apply/cancel)
|
|
70
|
+
command do |eve|
|
|
71
|
+
alert "user pressed button index:#{eve.event} , Name: #{eve.action_command}, Tab: #{eve.source.current_tab} "
|
|
72
|
+
case eve.event
|
|
73
|
+
when 0,2 # ok cancel
|
|
74
|
+
throw :close, eve.event
|
|
75
|
+
when 1 # apply
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
tp.run
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
end
|
|
83
|
+
if $0 == __FILE__
|
|
84
|
+
# Initialize curses
|
|
85
|
+
begin
|
|
86
|
+
# XXX update with new color and kb
|
|
87
|
+
VER::start_ncurses # this is initializing colors via ColorMap.setup
|
|
88
|
+
$log = Logger.new((File.join(ENV["LOGDIR"] || "./" ,"rbc13.log")))
|
|
89
|
+
$log.level = Logger::DEBUG
|
|
90
|
+
tp = SetupTabbedPane.new()
|
|
91
|
+
buttonindex = tp.run
|
|
92
|
+
rescue => ex
|
|
93
|
+
ensure
|
|
94
|
+
VER::stop_ncurses
|
|
95
|
+
p ex if ex
|
|
96
|
+
p(ex.backtrace.join("\n")) if ex
|
|
97
|
+
$log.debug( ex) if ex
|
|
98
|
+
$log.debug(ex.backtrace.join("\n")) if ex
|
|
99
|
+
end
|
|
100
|
+
end
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# this is a test program, tests out tabbed panes. type F1 to exit
|
|
2
|
+
#
|
|
3
|
+
require 'logger'
|
|
4
|
+
require 'rbhex'
|
|
5
|
+
#require 'rbhex/core/widgets/newtabbedpane'
|
|
6
|
+
require 'rbhex/core/widgets/rtabbedpane'
|
|
7
|
+
require 'rbhex/core/widgets/rcontainer' # tempo FIXME remove this since we arent using afterfixing rtabbedp
|
|
8
|
+
|
|
9
|
+
class TestTabbedPane
|
|
10
|
+
def initialize
|
|
11
|
+
acolor = $reversecolor
|
|
12
|
+
#$config_hash ||= {}
|
|
13
|
+
end
|
|
14
|
+
def run
|
|
15
|
+
$config_hash ||= Variable.new Hash.new
|
|
16
|
+
#configvar.update_command(){ |v| $config_hash[v.source()] = v.value }
|
|
17
|
+
@window = VER::Window.root_window
|
|
18
|
+
@form = Form.new @window
|
|
19
|
+
r = 1; c = 30;
|
|
20
|
+
tp = RubyCurses::TabbedPane.new @form, :height => 12, :width => 50,
|
|
21
|
+
:row => 13, :col => 10 do
|
|
22
|
+
button_type :ok
|
|
23
|
+
end
|
|
24
|
+
tp.add_tab "&Language" do
|
|
25
|
+
_r = 2
|
|
26
|
+
colors = [:red, :green, :cyan]
|
|
27
|
+
%w[ ruby jruby macruby].each_with_index { |e, i|
|
|
28
|
+
item RadioButton.new nil,
|
|
29
|
+
:variable => $config_hash,
|
|
30
|
+
:name => "radio1",
|
|
31
|
+
:text => e,
|
|
32
|
+
:value => e,
|
|
33
|
+
:color => colors[i],
|
|
34
|
+
:row => _r+i,
|
|
35
|
+
:col => 5
|
|
36
|
+
}
|
|
37
|
+
end
|
|
38
|
+
tp.add_tab "&Settings" do
|
|
39
|
+
r = 2
|
|
40
|
+
butts = [ "Use &HTTP/1.0", "Use &frames", "&Use SSL" ]
|
|
41
|
+
bcodes = %w[ HTTP, FRAMES, SSL ]
|
|
42
|
+
butts.each_with_index do |t, i|
|
|
43
|
+
item RubyCurses::CheckBox.new nil,
|
|
44
|
+
:text => butts[i],
|
|
45
|
+
:variable => $config_hash,
|
|
46
|
+
:name => bcodes[i],
|
|
47
|
+
:row => r+i,
|
|
48
|
+
:col => 5
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
tp.add_tab "&Editors" do
|
|
52
|
+
butts = %w[ &Vim E&macs &Jed &Other ]
|
|
53
|
+
bcodes = %w[ VIM EMACS JED OTHER]
|
|
54
|
+
row = 2
|
|
55
|
+
butts.each_with_index do |name, i|
|
|
56
|
+
item RubyCurses::CheckBox.new nil ,
|
|
57
|
+
:text => name,
|
|
58
|
+
:variable => $config_hash,
|
|
59
|
+
:name => bcodes[i],
|
|
60
|
+
:row => row+i,
|
|
61
|
+
:col => 5
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
help = "q to quit. <TAB> through tabs, Space or Enter to select Tab."
|
|
65
|
+
RubyCurses::Label.new @form, {:text => help, :row => 1, :col => 2, :color => :yellow}
|
|
66
|
+
@form.repaint
|
|
67
|
+
@window.wrefresh
|
|
68
|
+
Ncurses::Panel.update_panels
|
|
69
|
+
while((ch = @window.getchar()) != ?q.getbyte(0) )
|
|
70
|
+
@form.handle_key(ch)
|
|
71
|
+
@window.wrefresh
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
if $0 == __FILE__
|
|
76
|
+
# Initialize curses
|
|
77
|
+
begin
|
|
78
|
+
# XXX update with new color and kb
|
|
79
|
+
VER::start_ncurses # this is initializing colors via ColorMap.setup
|
|
80
|
+
$log = Logger.new("rbc13.log")
|
|
81
|
+
$log.level = Logger::DEBUG
|
|
82
|
+
n = TestTabbedPane.new
|
|
83
|
+
n.run
|
|
84
|
+
rescue => ex
|
|
85
|
+
ensure
|
|
86
|
+
VER::stop_ncurses
|
|
87
|
+
p ex if ex
|
|
88
|
+
p(ex.backtrace.join("\n")) if ex
|
|
89
|
+
$log.debug( ex) if ex
|
|
90
|
+
$log.debug(ex.backtrace.join("\n")) if ex
|
|
91
|
+
end
|
|
92
|
+
end
|
data/examples/tabular.rb
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
require 'rbhex/core/util/app'
|
|
2
|
+
|
|
3
|
+
App.new do
|
|
4
|
+
# TODO: combine this with widget menu
|
|
5
|
+
def app_menu
|
|
6
|
+
menu = PromptMenu.new self do
|
|
7
|
+
item :e, :edit
|
|
8
|
+
item :o, :open_new
|
|
9
|
+
item :d, :delete
|
|
10
|
+
item :u, :undo_delete
|
|
11
|
+
#item :y, :yank
|
|
12
|
+
#item :p, :paste
|
|
13
|
+
item :/, :search
|
|
14
|
+
end
|
|
15
|
+
menu.display_new :title => "Menu"
|
|
16
|
+
end
|
|
17
|
+
# to execute when app_menu is invoked
|
|
18
|
+
def execute_this *cmd
|
|
19
|
+
cmd = cmd[0][0] # extract first letter of command
|
|
20
|
+
cmdi = cmd.getbyte(0)
|
|
21
|
+
case cmd
|
|
22
|
+
when 'e','o','p'
|
|
23
|
+
@window.ungetch cmdi
|
|
24
|
+
when 'y','d'
|
|
25
|
+
@window.ungetch cmdi
|
|
26
|
+
@window.ungetch cmdi
|
|
27
|
+
when 'u'
|
|
28
|
+
@window.ungetch cmd.upcase.getbyte(0)
|
|
29
|
+
when 's'
|
|
30
|
+
@window.ungetch ?\/.getbyte(0)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
def help_text
|
|
34
|
+
<<-eos
|
|
35
|
+
Help for tabular widgets
|
|
36
|
+
------------------------
|
|
37
|
+
|
|
38
|
+
Keys that can be used on header
|
|
39
|
+
|
|
40
|
+
<ENTER> - sort given field (press on header)
|
|
41
|
+
<-> - press <minus> to reduce column width
|
|
42
|
+
<+> - press <plus> to increase column width
|
|
43
|
+
|
|
44
|
+
Keys that can be used on data rows
|
|
45
|
+
|
|
46
|
+
<space> - select a row
|
|
47
|
+
<Ctr-space> - range select
|
|
48
|
+
<u> - unselect all (conflicts with vim keys!!)
|
|
49
|
+
<a> - select all
|
|
50
|
+
<*> - invert selection
|
|
51
|
+
|
|
52
|
+
</> - <slash> for searching,
|
|
53
|
+
<n> to continue searching
|
|
54
|
+
|
|
55
|
+
Keys specific to this example
|
|
56
|
+
|
|
57
|
+
<e> - edit current row
|
|
58
|
+
<dd> - delete current row or <num> rows
|
|
59
|
+
<o> - insert a row after current one
|
|
60
|
+
<U> - undo delete
|
|
61
|
+
|
|
62
|
+
Motion keys
|
|
63
|
+
|
|
64
|
+
Usual for lists and textview such as :
|
|
65
|
+
j, k, h, l
|
|
66
|
+
w and b for (next/prev) column
|
|
67
|
+
C-d and C-b
|
|
68
|
+
gg and G
|
|
69
|
+
|
|
70
|
+
eos
|
|
71
|
+
end
|
|
72
|
+
def edit_row tw
|
|
73
|
+
row = tw.current_value
|
|
74
|
+
h = tw.columns
|
|
75
|
+
_edit h, row, " Edit "
|
|
76
|
+
tw.repaint_required true
|
|
77
|
+
end
|
|
78
|
+
def insert_row tw
|
|
79
|
+
h = tw.columns
|
|
80
|
+
row = []
|
|
81
|
+
h.each { |e| row << "" }
|
|
82
|
+
ret = _edit h, row, "Insert"
|
|
83
|
+
if ret
|
|
84
|
+
tw.insert tw.real_index(), row
|
|
85
|
+
tw.repaint_required true
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# making a generic edit messagebox - quick dirty
|
|
90
|
+
def _edit h, row, title
|
|
91
|
+
_l = longest_in_list h
|
|
92
|
+
_w = _l.size
|
|
93
|
+
config = { :width => 70, :title => title }
|
|
94
|
+
bw = get_color $datacolor, :black, :white
|
|
95
|
+
mb = MessageBox.new config do
|
|
96
|
+
h.each_with_index { |f, i|
|
|
97
|
+
add Field.new :label => "%*s:" % [_w, f], :text => row[i].chomp, :name => i.to_s,
|
|
98
|
+
:bgcolor => :cyan,
|
|
99
|
+
:display_length => 50,
|
|
100
|
+
:label_color_pair => bw
|
|
101
|
+
}
|
|
102
|
+
button_type :ok_cancel
|
|
103
|
+
end
|
|
104
|
+
index = mb.run
|
|
105
|
+
return nil if index != 0
|
|
106
|
+
h.each_with_index { |e, i|
|
|
107
|
+
f = mb.widget(i.to_s)
|
|
108
|
+
row[i] = f.text
|
|
109
|
+
}
|
|
110
|
+
row
|
|
111
|
+
end
|
|
112
|
+
def resize
|
|
113
|
+
tab = @form.by_name["tab"]
|
|
114
|
+
cols = Ncurses.COLS
|
|
115
|
+
rows = Ncurses.LINES
|
|
116
|
+
tab.width_pc ||= (1.0*tab.width / $orig_cols)
|
|
117
|
+
tab.height_pc ||= (1.0*tab.height / $orig_rows)
|
|
118
|
+
tab.height = (tab.height_pc * rows).floor
|
|
119
|
+
tab.width = (tab.width_pc * cols).floor
|
|
120
|
+
end
|
|
121
|
+
header = app_header "rbhex #{Rbhex::Core::VERSION}", :text_center => "Tabular Demo", :text_right =>"Fat-free !",
|
|
122
|
+
:color => :black, :bgcolor => :green #, :attr => :bold
|
|
123
|
+
message "Press F10 to exit, F1 for help, : for menu"
|
|
124
|
+
@form.help_manager.help_text = help_text()
|
|
125
|
+
$orig_cols = Ncurses.COLS
|
|
126
|
+
$orig_rows = Ncurses.LINES
|
|
127
|
+
|
|
128
|
+
h = %w[ Id Title Priority Status]
|
|
129
|
+
file = File.expand_path("../data/table.txt", __FILE__)
|
|
130
|
+
lines = File.open(file,'r').readlines
|
|
131
|
+
arr = []
|
|
132
|
+
lines.each { |l| arr << l.split("|") }
|
|
133
|
+
flow :margin_top => 1, :height => FFI::NCurses.LINES-2 do
|
|
134
|
+
tw = tabular_widget :print_footer => true, :name => "tab"
|
|
135
|
+
tw.columns = h
|
|
136
|
+
tw.column_align 0, :right
|
|
137
|
+
tw.set_content arr
|
|
138
|
+
tw.bind_key([?d,?d], 'delete row') { tw.delete_line }
|
|
139
|
+
tw.bind_key(?U, 'undo delete') { tw.undo_delete }
|
|
140
|
+
tw.bind_key(?e, 'edit row') { edit_row tw }
|
|
141
|
+
tw.bind_key(?o, 'insert row') { insert_row tw }
|
|
142
|
+
end # stack
|
|
143
|
+
status_line :row => FFI::NCurses.LINES-1
|
|
144
|
+
@form.bind_key(?:, 'menu') { app_menu }
|
|
145
|
+
@form.bind(:RESIZE) { resize }
|
|
146
|
+
end # app
|
data/examples/tasks.rb
ADDED
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
require 'rbhex/core/util/app'
|
|
2
|
+
require 'rbhex/core/widgets/rlist'
|
|
3
|
+
|
|
4
|
+
# a simple example of how to get colored row rendering.
|
|
5
|
+
# also see rfe.rb for a more complete example
|
|
6
|
+
class CellRenderer
|
|
7
|
+
attr_accessor :display_length
|
|
8
|
+
def repaint g, r, c, crow, content, focus_type, selected
|
|
9
|
+
color = $datacolor
|
|
10
|
+
att = NORMAL
|
|
11
|
+
att = REVERSE if selected
|
|
12
|
+
color = get_color($datacolor, :yellow, :red) if content =~ /^.1/
|
|
13
|
+
color = get_color($datacolor, :red, :blue) if content =~ /^.2/
|
|
14
|
+
color = get_color($datacolor, :white, :black) if content =~ /^.3/
|
|
15
|
+
color = get_color($datacolor, :green, :black) if content =~ /^.4/
|
|
16
|
+
color = get_color($datacolor, :red, :black) if content =~ /^.5/
|
|
17
|
+
color = get_color($datacolor, :cyan, :black) if content =~ /^.6/
|
|
18
|
+
color = get_color($datacolor, :magenta, :black) if content =~ /^.[7-9]/
|
|
19
|
+
color = get_color($datacolor, :blue, :black) if content =~ /^x/
|
|
20
|
+
g.wattron(Ncurses.COLOR_PAIR(color) | att)
|
|
21
|
+
g.mvwprintw(r, c, "%s", :string, content);
|
|
22
|
+
g.wattroff(Ncurses.COLOR_PAIR(color) | att)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
App.new do
|
|
26
|
+
def resize
|
|
27
|
+
tab = @form.by_name["tasklist"]
|
|
28
|
+
cols = Ncurses.COLS
|
|
29
|
+
rows = Ncurses.LINES
|
|
30
|
+
tab.width_pc ||= (1.0*tab.width / $orig_cols)
|
|
31
|
+
tab.height_pc ||= (1.0*tab.height / $orig_rows)
|
|
32
|
+
tab.height = (tab.height_pc * rows).floor
|
|
33
|
+
tab.width = (tab.width_pc * cols).floor
|
|
34
|
+
#$log.debug "XXX: RESIZE h w #{tab.height} , #{tab.width} "
|
|
35
|
+
end
|
|
36
|
+
@default_prefix = " "
|
|
37
|
+
header = app_header "rbhex #{Rbhex::Core::VERSION}", :text_center => "Task List", :text_right =>"New Improved!"
|
|
38
|
+
|
|
39
|
+
message "Press F10 or qq to quit "
|
|
40
|
+
|
|
41
|
+
file = File.expand_path("../data/todo.txt", __FILE__)
|
|
42
|
+
alist = File.open(file,'r').readlines
|
|
43
|
+
#flow :margin_top => 1, :item_width => 50 , :height => FFI::NCurses.LINES-2 do
|
|
44
|
+
#stack :margin_top => 1, :width => :expand, :height => FFI::NCurses.LINES-4 do
|
|
45
|
+
|
|
46
|
+
#task = field :label => " Task:", :display_length => 50, :maxlen => 80, :bgcolor => :cyan, :color => :black
|
|
47
|
+
#pri = field :label => "Priority:", :display_length => 1, :maxlen => 1, :type => :integer,
|
|
48
|
+
#:valid_range => 1..9, :bgcolor => :cyan, :color => :black , :default => "5"
|
|
49
|
+
#pri.overwrite_mode = true
|
|
50
|
+
# u,se voerwrite mode for this TODO and catch exception
|
|
51
|
+
|
|
52
|
+
lb = listbox :list => alist.sort, :title => "[ todos ]", :name => "tasklist", :row => 1, :height => Ncurses.LINES-4, :width => Ncurses.COLS-1
|
|
53
|
+
lb.should_show_focus = false
|
|
54
|
+
lb.cell_renderer CellRenderer.new
|
|
55
|
+
lb.bind_key(?d, "Delete Row"){
|
|
56
|
+
if confirm("Delete #{lb.current_value} ?")
|
|
57
|
+
lb.delete_at lb.current_index
|
|
58
|
+
# TODO reposition cursor at 0. use list_data_changed ?
|
|
59
|
+
end
|
|
60
|
+
}
|
|
61
|
+
lb.bind_key(?e, "Edit Row"){
|
|
62
|
+
if ((value = get_string("Edit Task:", :width => 80, :default => lb.current_value, :maxlen => 80, :display_length => 70)) != nil)
|
|
63
|
+
|
|
64
|
+
lb[lb.current_index]=value
|
|
65
|
+
end
|
|
66
|
+
}
|
|
67
|
+
lb.bind_key(?a, "Add Record"){
|
|
68
|
+
|
|
69
|
+
# ADD
|
|
70
|
+
task = Field.new :label => " Task:", :display_length => 60, :maxlen => 80, :bgcolor => :cyan, :color => :black,
|
|
71
|
+
:name => 'task'
|
|
72
|
+
pri = Field.new :label => "Priority:", :display_length => 1, :maxlen => 1, :type => :integer,
|
|
73
|
+
:valid_range => 1..9, :bgcolor => :cyan, :color => :black , :default => "5", :name => 'pri'
|
|
74
|
+
pri.overwrite_mode = true
|
|
75
|
+
config = {}
|
|
76
|
+
config[:width] = 80
|
|
77
|
+
config[:title] = "New Task"
|
|
78
|
+
tp = MessageBox.new config do
|
|
79
|
+
item task
|
|
80
|
+
item pri
|
|
81
|
+
button_type :ok_cancel
|
|
82
|
+
default_button 0
|
|
83
|
+
end
|
|
84
|
+
index = tp.run
|
|
85
|
+
if index == 0 # OK
|
|
86
|
+
# when does this memory get released ??? XXX
|
|
87
|
+
_t = tp.form.by_name['pri'].text
|
|
88
|
+
if _t != ""
|
|
89
|
+
val = @default_prefix + tp.form.by_name['pri'].text + ". " + tp.form.by_name['task'].text
|
|
90
|
+
w = @form.by_name["tasklist"]
|
|
91
|
+
_l = w.list
|
|
92
|
+
_l << val
|
|
93
|
+
w.list(_l.sort)
|
|
94
|
+
end
|
|
95
|
+
else # CANCEL
|
|
96
|
+
#return nil
|
|
97
|
+
end
|
|
98
|
+
}
|
|
99
|
+
# decrease priority
|
|
100
|
+
lb.bind_key(?-, 'decrease priority'){
|
|
101
|
+
line = lb.current_value
|
|
102
|
+
p = line[1,1].to_i
|
|
103
|
+
if p < 9
|
|
104
|
+
p += 1
|
|
105
|
+
line[1,1] = p.to_s
|
|
106
|
+
lb[lb.current_index]=line
|
|
107
|
+
lb.list(lb.list.sort)
|
|
108
|
+
end
|
|
109
|
+
}
|
|
110
|
+
# increase priority
|
|
111
|
+
lb.bind_key(?+, 'increase priority'){
|
|
112
|
+
line = lb.current_value
|
|
113
|
+
p = line[1,1].to_i
|
|
114
|
+
if p > 1
|
|
115
|
+
p -= 1
|
|
116
|
+
line[1,1] = p.to_s
|
|
117
|
+
lb[lb.current_index]=line
|
|
118
|
+
lb.list(lb.list.sort)
|
|
119
|
+
# how to get the new row of that item and position it there. so one
|
|
120
|
+
# can do consecutive increases or decreases
|
|
121
|
+
# cursor on old row, but current has become zero. FIXME
|
|
122
|
+
# Maybe setform_row needs to be called
|
|
123
|
+
end
|
|
124
|
+
}
|
|
125
|
+
# mark as done
|
|
126
|
+
lb.bind_key(?x, 'mark done'){
|
|
127
|
+
line = lb.current_value
|
|
128
|
+
line[0,1] = "x"
|
|
129
|
+
lb[lb.current_index]=line
|
|
130
|
+
lb.list(lb.list.sort)
|
|
131
|
+
}
|
|
132
|
+
# flag task with a single character
|
|
133
|
+
lb.bind_key(?!, 'flag'){
|
|
134
|
+
line = lb.current_value.chomp
|
|
135
|
+
value = get_string("Flag for #{line}. Enter one character.", :maxlen => 1, :display_length => 1)
|
|
136
|
+
#if ((value = get_string("Edit Task:", :width => 80, :default => lb.current_value)) != nil)
|
|
137
|
+
#lb[lb.current_index]=value
|
|
138
|
+
#end
|
|
139
|
+
if value ##&& value[0,1] != " "
|
|
140
|
+
line[0,1] = value[0,1]
|
|
141
|
+
lb[lb.current_index]=line
|
|
142
|
+
lb.list(lb.list.sort)
|
|
143
|
+
end
|
|
144
|
+
}
|
|
145
|
+
#end # stack
|
|
146
|
+
s = status_line
|
|
147
|
+
@form.bind(:RESIZE) { resize }
|
|
148
|
+
|
|
149
|
+
keyarray = [
|
|
150
|
+
["F1" , "Help"], ["F10" , "Exit"],
|
|
151
|
+
["F2", "Menu"], ["F4", "View"],
|
|
152
|
+
["d", "delete item"], ["e", "edit item"],
|
|
153
|
+
["a", "add item"], ["x", "close item"],
|
|
154
|
+
["+", "inc priority"], ["-", "dec priority"],
|
|
155
|
+
|
|
156
|
+
["M-x", "Command"], nil
|
|
157
|
+
]
|
|
158
|
+
|
|
159
|
+
gw = get_color($reversecolor, 'green', 'black')
|
|
160
|
+
@adock = dock keyarray, { :row => Ncurses.LINES-2, :footer_color_pair => $datacolor,
|
|
161
|
+
:footer_mnemonic_color_pair => gw }
|
|
162
|
+
|
|
163
|
+
@window.confirm_close_command do
|
|
164
|
+
confirm "Sure you wanna quit?", :default_button => 1
|
|
165
|
+
end
|
|
166
|
+
@window.close_command do
|
|
167
|
+
w = @form.by_name["tasklist"]
|
|
168
|
+
if confirm("Save tasks?", :default_button => 0)
|
|
169
|
+
system("cp #{file} #{file}.bak")
|
|
170
|
+
File.open(file, 'w') {|f|
|
|
171
|
+
w.list.each { |e|
|
|
172
|
+
f.puts(e)
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
end # app
|