rbcurse 1.4.1 → 1.5.0.pre1
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.
- data/CHANGELOG +31 -0
- data/README.markdown +69 -11
- data/VERSION +1 -1
- data/lib/rbcurse.rb +5 -5
- metadata +10 -198
- data/Makefile +0 -21
- data/Manifest.txt +0 -91
- data/TODO +0 -372
- data/TODO2.txt +0 -118
- data/examples/README.txt +0 -67
- data/examples/abasiclist.rb +0 -33
- data/examples/alpmenu.rb +0 -42
- data/examples/app.rb +0 -859
- data/examples/app.sample +0 -10
- data/examples/appdirtree.rb +0 -75
- data/examples/appemail.rb +0 -191
- data/examples/appemaillb.rb +0 -308
- data/examples/appgcompose.rb +0 -315
- data/examples/atree.rb +0 -64
- data/examples/common/file.rb +0 -40
- data/examples/common/rmail.rb +0 -257
- data/examples/data.txt +0 -683
- data/examples/data/README.markdown +0 -9
- data/examples/data/brew.txt +0 -38
- data/examples/data/color.2 +0 -37
- data/examples/data/gemlist.txt +0 -60
- data/examples/data/lotr.txt +0 -12
- data/examples/data/ports.txt +0 -136
- data/examples/data/tasks.txt +0 -27
- data/examples/data/todocsv.csv +0 -28
- data/examples/data/unix1.txt +0 -21
- data/examples/data/unix2.txt +0 -11
- data/examples/dbdemo.rb +0 -495
- data/examples/deprecated/appgmail.rb +0 -952
- data/examples/deprecated/splitp.rb +0 -56
- data/examples/deprecated/testscrolllb.rb +0 -86
- data/examples/deprecated/testscrollp.rb +0 -88
- data/examples/deprecated/testscrollta.rb +0 -80
- data/examples/deprecated/testscrolltable.rb +0 -165
- data/examples/deprecated/testsplit.rb +0 -87
- data/examples/deprecated/testsplit2.rb +0 -123
- data/examples/deprecated/testsplit3.rb +0 -215
- data/examples/deprecated/testsplit3_1.rb +0 -244
- data/examples/deprecated/testsplit3a.rb +0 -215
- data/examples/deprecated/testsplit3b.rb +0 -237
- data/examples/deprecated/testsplitta.rb +0 -148
- data/examples/deprecated/testsplittv.rb +0 -142
- data/examples/deprecated/testsplittvv.rb +0 -144
- data/examples/deprecated/testtpane.rb +0 -215
- data/examples/deprecated/testtpane2.rb +0 -145
- data/examples/deprecated/testtpanetable.rb +0 -203
- data/examples/dirtree.rb +0 -88
- data/examples/experimental/resultsetdemo.rb +0 -280
- data/examples/experimental/testmform.rb +0 -35
- data/examples/experimental/testscroller.rb +0 -117
- data/examples/experimental/teststackflow.rb +0 -111
- data/examples/menu1.rb +0 -112
- data/examples/multispl.rb +0 -86
- data/examples/newmessagebox.rb +0 -130
- data/examples/newtabbedwindow.rb +0 -100
- data/examples/newtesttabp.rb +0 -121
- data/examples/qdfilechooser.rb +0 -68
- data/examples/rfe.rb +0 -1195
- data/examples/rfe_renderer.rb +0 -121
- data/examples/sqlc.rb +0 -454
- data/examples/sqlm.rb +0 -437
- data/examples/sqlt.rb +0 -408
- data/examples/status.txt +0 -68
- data/examples/table1.rb +0 -24
- data/examples/term2.rb +0 -84
- data/examples/test1.rb +0 -239
- data/examples/test2.rb +0 -674
- data/examples/testapp.rb +0 -44
- data/examples/testapp2.rb +0 -58
- data/examples/testchars.rb +0 -137
- data/examples/testcombo.rb +0 -91
- data/examples/testkeypress.rb +0 -66
- data/examples/testlistbox.rb +0 -113
- data/examples/testmenu.rb +0 -101
- data/examples/testmulticomp.rb +0 -70
- data/examples/testmulticontainer.rb +0 -94
- data/examples/testmultispl.rb +0 -199
- data/examples/testree.rb +0 -106
- data/examples/testtable.rb +0 -263
- data/examples/testtabp.rb +0 -107
- data/examples/testtodo.rb +0 -584
- data/examples/testvimsplit.rb +0 -112
- data/examples/testwsshortcuts.rb +0 -64
- data/examples/testwsshortcuts2.rb +0 -126
- data/examples/todo.db +0 -0
- data/examples/todo.yml +0 -191
- data/examples/viewtodo.rb +0 -574
- data/lib/rbcurse/action.rb +0 -40
- data/lib/rbcurse/app.rb +0 -1374
- data/lib/rbcurse/applicationheader.rb +0 -102
- data/lib/rbcurse/celleditor.rb +0 -112
- data/lib/rbcurse/checkboxcellrenderer.rb +0 -57
- data/lib/rbcurse/colormap.rb +0 -159
- data/lib/rbcurse/comboboxcellrenderer.rb +0 -30
- data/lib/rbcurse/common/ansiparser.rb +0 -117
- data/lib/rbcurse/common/appmethods.rb +0 -112
- data/lib/rbcurse/common/basestack.rb +0 -407
- data/lib/rbcurse/common/bordertitle.rb +0 -41
- data/lib/rbcurse/common/chunk.rb +0 -177
- data/lib/rbcurse/common/colorparser.rb +0 -71
- data/lib/rbcurse/common/keydefs.rb +0 -30
- data/lib/rbcurse/common/widgetshortcuts.rb +0 -302
- data/lib/rbcurse/defaultlistselectionmodel.rb +0 -79
- data/lib/rbcurse/deprecated/README.markdown +0 -12
- data/lib/rbcurse/deprecated/rscrollpane.rb +0 -512
- data/lib/rbcurse/deprecated/rsplitpane.rb +0 -894
- data/lib/rbcurse/deprecated/rsplitpane2.rb +0 -1009
- data/lib/rbcurse/deprecated/rviewport.rb +0 -204
- data/lib/rbcurse/experimental/README.markdown +0 -14
- data/lib/rbcurse/experimental/resultsettextview.rb +0 -585
- data/lib/rbcurse/experimental/stackflow.rb +0 -478
- data/lib/rbcurse/extras/bottomline.rb +0 -1850
- data/lib/rbcurse/extras/box.rb +0 -58
- data/lib/rbcurse/extras/directorylist.rb +0 -467
- data/lib/rbcurse/extras/directorytree.rb +0 -69
- data/lib/rbcurse/extras/divider.rb +0 -310
- data/lib/rbcurse/extras/focusmanager.rb +0 -31
- data/lib/rbcurse/extras/horizlist.rb +0 -203
- data/lib/rbcurse/extras/listselectable.rb +0 -264
- data/lib/rbcurse/extras/masterdetail.rb +0 -166
- data/lib/rbcurse/extras/menutree.rb +0 -63
- data/lib/rbcurse/extras/multiform.rb +0 -330
- data/lib/rbcurse/extras/multilinelabel.rb +0 -142
- data/lib/rbcurse/extras/newmessagebox.rb +0 -328
- data/lib/rbcurse/extras/newtabbedpane.rb +0 -612
- data/lib/rbcurse/extras/newtabbedwindow.rb +0 -68
- data/lib/rbcurse/extras/padreader.rb +0 -189
- data/lib/rbcurse/extras/rcomboedit.rb +0 -256
- data/lib/rbcurse/extras/resultsetbrowser.rb +0 -281
- data/lib/rbcurse/extras/rlink.rb +0 -27
- data/lib/rbcurse/extras/rmenulink.rb +0 -21
- data/lib/rbcurse/extras/scrollbar.rb +0 -143
- data/lib/rbcurse/extras/statusline.rb +0 -94
- data/lib/rbcurse/extras/stdscrwindow.rb +0 -309
- data/lib/rbcurse/extras/tableextended.rb +0 -40
- data/lib/rbcurse/extras/tabular.rb +0 -264
- data/lib/rbcurse/extras/tabularwidget.rb +0 -1150
- data/lib/rbcurse/extras/textpad.rb +0 -516
- data/lib/rbcurse/extras/viewer.rb +0 -136
- data/lib/rbcurse/io.rb +0 -850
- data/lib/rbcurse/keylabelprinter.rb +0 -178
- data/lib/rbcurse/listcellrenderer.rb +0 -140
- data/lib/rbcurse/listeditable.rb +0 -310
- data/lib/rbcurse/listkeys.rb +0 -37
- data/lib/rbcurse/listscrollable.rb +0 -564
- data/lib/rbcurse/listselectable.rb +0 -142
- data/lib/rbcurse/mapper.rb +0 -130
- data/lib/rbcurse/orderedhash.rb +0 -77
- data/lib/rbcurse/ractionevent.rb +0 -67
- data/lib/rbcurse/rbasiclistbox.rb +0 -768
- data/lib/rbcurse/rchangeevent.rb +0 -27
- data/lib/rbcurse/rcombo.rb +0 -238
- data/lib/rbcurse/rcommandwindow.rb +0 -587
- data/lib/rbcurse/rcontainer.rb +0 -415
- data/lib/rbcurse/rdialogs.rb +0 -451
- data/lib/rbcurse/rinputdataevent.rb +0 -47
- data/lib/rbcurse/rlistbox.rb +0 -1196
- data/lib/rbcurse/rmenu.rb +0 -939
- data/lib/rbcurse/rmessagebox.rb +0 -348
- data/lib/rbcurse/rmulticontainer.rb +0 -304
- data/lib/rbcurse/rmultisplit.rb +0 -722
- data/lib/rbcurse/rmultitextview.rb +0 -306
- data/lib/rbcurse/rpopupmenu.rb +0 -755
- data/lib/rbcurse/rprogress.rb +0 -118
- data/lib/rbcurse/rscrollform.rb +0 -418
- data/lib/rbcurse/rtabbedpane.rb +0 -1158
- data/lib/rbcurse/rtabbedwindow.rb +0 -167
- data/lib/rbcurse/rtable.rb +0 -1718
- data/lib/rbcurse/rtextarea.rb +0 -920
- data/lib/rbcurse/rtextview.rb +0 -761
- data/lib/rbcurse/rtree.rb +0 -780
- data/lib/rbcurse/rvimsplit.rb +0 -763
- data/lib/rbcurse/rwidget.rb +0 -2915
- data/lib/rbcurse/scrollable.rb +0 -301
- data/lib/rbcurse/table/tablecellrenderer.rb +0 -86
- data/lib/rbcurse/table/tabledatecellrenderer.rb +0 -98
- data/lib/rbcurse/tree/treecellrenderer.rb +0 -150
- data/lib/rbcurse/tree/treemodel.rb +0 -428
- data/lib/rbcurse/undomanager.rb +0 -188
- data/lib/rbcurse/vieditable.rb +0 -144
- data/lib/ver/keyboard.rb +0 -150
- data/lib/ver/keyboard2.rb +0 -170
- data/lib/ver/ncurses.rb +0 -218
- data/lib/ver/panel.rb +0 -162
- data/lib/ver/rpad.rb +0 -375
- data/lib/ver/window.rb +0 -882
- data/test/test_rbcurse.rb +0 -0
@@ -1,117 +0,0 @@
|
|
1
|
-
# ----------------------------------------------------------------------------- #
|
2
|
-
# File: colorparser.rb
|
3
|
-
# Description: Default parse for our tmux format
|
4
|
-
# The aim is to be able to specify parsers so different kinds
|
5
|
-
# of formatting or documents can be used, such as ANSI formatted
|
6
|
-
# manpages.
|
7
|
-
# Author: rkumar http://github.com/rkumar/rbcurse/
|
8
|
-
# Date: 07.11.11 - 13:17
|
9
|
-
# License: Same as Ruby's License (http://www.ruby-lang.org/LICENSE.txt)
|
10
|
-
# Last update: use ,,L
|
11
|
-
# ----------------------------------------------------------------------------- #
|
12
|
-
# == TODO
|
13
|
-
# - perhaps we can compile the regexp once and reuse
|
14
|
-
#
|
15
|
-
|
16
|
-
class AnsiParser
|
17
|
-
|
18
|
-
# NOTE: Experimental and minimal
|
19
|
-
# parses the formatted string and yields either an array of color, bgcolor and attrib
|
20
|
-
# or the text. This will be called by convert_to_chunk.
|
21
|
-
#
|
22
|
-
# Currently, assumes colors and attributes are correct. No error checking or fancy stuff.
|
23
|
-
# s="#[fg=green]hello there#[fg=yellow, bg=black, dim]"
|
24
|
-
# @since 1.4.1 2011-11-3 experimental, can change
|
25
|
-
# @return [nil] knows nothign about output format.
|
26
|
-
|
27
|
-
def parse_format s # yields attribs or text
|
28
|
-
## set default colors
|
29
|
-
color = :white
|
30
|
-
bgcolor = :black
|
31
|
-
attrib = FFI::NCurses::A_NORMAL
|
32
|
-
text = ""
|
33
|
-
|
34
|
-
## split #[...]
|
35
|
-
#a = s.split /(#\[[^\]]*\])/
|
36
|
-
a = s.split /(\x1b\[\d*(?:;\d+)*?[a-zA-Z])/
|
37
|
-
a.each { |e|
|
38
|
-
## process color or attrib portion
|
39
|
-
#[ "", "\e[1m", "", "\e[34m", "", "\e[47m", "Showing all items...", "\e[0m", "", "\e[0m", "\n"]
|
40
|
-
if e[0] == "\x1b" && e[-1] == "m"
|
41
|
-
|
42
|
-
#e.each { |f| x=/^.\[(.*).$/.match(f)
|
43
|
-
$log.debug "XXX: ANSI e #{e} "
|
44
|
-
x=/^.\[(.*).$/.match(e)
|
45
|
-
color, bgcolor, attrib = nil, nil, nil
|
46
|
-
$log.debug "XXX: ANSI #{x} ..... #{x[1]} "
|
47
|
-
args = x[1].split ';'
|
48
|
-
## first split on commas to separate fg, bg and attr
|
49
|
-
# http://ascii-table.com/ansi-escape-sequences.php
|
50
|
-
args.each { |att|
|
51
|
-
$log.debug "XXX: ANSI att: #{att} "
|
52
|
-
case att.to_i
|
53
|
-
when 0
|
54
|
-
color, bgcolor, attrib = nil, nil, nil
|
55
|
-
yield :reset # actually this resets all so we need an endall or clearall reset
|
56
|
-
|
57
|
-
when 1
|
58
|
-
attrib = 'bold'
|
59
|
-
when 2
|
60
|
-
attrib = 'dim'
|
61
|
-
when 4
|
62
|
-
attrib = 'underline'
|
63
|
-
when 5
|
64
|
-
attrib = 'blink'
|
65
|
-
when 7
|
66
|
-
attrib = 'reverse'
|
67
|
-
when 8
|
68
|
-
attrib = 'hidden' # XXX
|
69
|
-
when 30
|
70
|
-
color = 'black'
|
71
|
-
when 31
|
72
|
-
color = 'red'
|
73
|
-
when 32
|
74
|
-
color = 'green'
|
75
|
-
when 33
|
76
|
-
color = 'yellow'
|
77
|
-
when 34
|
78
|
-
color = 'blue'
|
79
|
-
when 35
|
80
|
-
color = 'magenta'
|
81
|
-
when 36
|
82
|
-
color = 'cyan'
|
83
|
-
when 37
|
84
|
-
color = 'white'
|
85
|
-
|
86
|
-
#Background colors
|
87
|
-
when 40
|
88
|
-
bgcolor = 'black'
|
89
|
-
when 41
|
90
|
-
bgcolor = 'red'
|
91
|
-
when 42
|
92
|
-
bgcolor = 'green'
|
93
|
-
when 43
|
94
|
-
bgcolor = 'yellow'
|
95
|
-
when 44
|
96
|
-
bgcolor = 'blue'
|
97
|
-
when 45
|
98
|
-
bgcolor = 'magenta'
|
99
|
-
when 46
|
100
|
-
bgcolor = 'cyan'
|
101
|
-
when 47
|
102
|
-
bgcolor = 'white'
|
103
|
-
else
|
104
|
-
$log.warn "XXX: WARN ANSI not used #{att} "
|
105
|
-
end
|
106
|
-
} # args.ea
|
107
|
-
#} # e.each
|
108
|
-
$log.debug "XXX: ANSI YIELDING #{color} , #{bgcolor} , #{attrib} "
|
109
|
-
yield [color,bgcolor,attrib] if block_given?
|
110
|
-
else
|
111
|
-
text = e
|
112
|
-
yield text if block_given?
|
113
|
-
end
|
114
|
-
} # a.each
|
115
|
-
end
|
116
|
-
|
117
|
-
end
|
@@ -1,112 +0,0 @@
|
|
1
|
-
module RubyCurses
|
2
|
-
module Utils
|
3
|
-
private
|
4
|
-
def _suspend clear=true
|
5
|
-
return unless block_given?
|
6
|
-
Ncurses.def_prog_mode
|
7
|
-
if clear
|
8
|
-
Ncurses.endwin
|
9
|
-
# NOTE: avoid false since screen remains half off
|
10
|
-
# too many issues
|
11
|
-
else
|
12
|
-
system "/bin/stty sane"
|
13
|
-
end
|
14
|
-
yield if block_given?
|
15
|
-
Ncurses.reset_prog_mode
|
16
|
-
if !clear
|
17
|
-
# Hope we don't screw your terminal up with this constantly.
|
18
|
-
VER::stop_ncurses
|
19
|
-
VER::start_ncurses
|
20
|
-
#@form.reset_all # not required
|
21
|
-
end
|
22
|
-
@form.repaint if @form
|
23
|
-
@window.wrefresh if @window
|
24
|
-
Ncurses::Panel.update_panels
|
25
|
-
end
|
26
|
-
#
|
27
|
-
# Suspends to shell so user can execute commands.
|
28
|
-
# Maybe not be able to get your prompt correctly.
|
29
|
-
#
|
30
|
-
public
|
31
|
-
def suspend
|
32
|
-
_suspend(false) do
|
33
|
-
system("tput cup 26 0")
|
34
|
-
system("tput ed")
|
35
|
-
system("echo Enter C-d to return to application")
|
36
|
-
system (ENV['PS1']='\s-\v\$ ') if ENV['SHELL']== '/bin/bash'
|
37
|
-
system(ENV['SHELL']);
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
#
|
42
|
-
# Displays application help using either array provided
|
43
|
-
# or checking for :help_text method
|
44
|
-
# @param [Array] help text
|
45
|
-
def display_app_help help_array= nil
|
46
|
-
if help_array
|
47
|
-
arr = help_array
|
48
|
-
elsif respond_to? :help_text
|
49
|
-
arr = help_text
|
50
|
-
else
|
51
|
-
arr = []
|
52
|
-
arr << " NO HELP SPECIFIED FOR APP #{self} "
|
53
|
-
arr << " "
|
54
|
-
arr << " --- General help --- "
|
55
|
-
arr << " F10 - exit application "
|
56
|
-
arr << " Alt-x - select commands "
|
57
|
-
arr << " : - select commands "
|
58
|
-
arr << " "
|
59
|
-
end
|
60
|
-
case arr
|
61
|
-
when String
|
62
|
-
arr = arr.split("\n")
|
63
|
-
when Array
|
64
|
-
end
|
65
|
-
w = arr.max_by(&:length).length
|
66
|
-
|
67
|
-
require 'rbcurse/extras/viewer'
|
68
|
-
RubyCurses::Viewer.view(arr, :layout => [2, 10, [4+arr.size, 24].min, w+2],:close_key => KEY_RETURN, :title => "<Enter> to close", :print_footer => true) do |t|
|
69
|
-
# you may configure textview further here.
|
70
|
-
#t.suppress_borders true
|
71
|
-
#t.color = :black
|
72
|
-
#t.bgcolor = :white
|
73
|
-
# or
|
74
|
-
t.attr = :reverse
|
75
|
-
end
|
76
|
-
end
|
77
|
-
#
|
78
|
-
# prompts user for unix command and displays output in viewer
|
79
|
-
#
|
80
|
-
def shell_output
|
81
|
-
cmd = get_string("Enter shell command:", 50)
|
82
|
-
if cmd && !cmd.empty?
|
83
|
-
run_command cmd
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
#
|
88
|
-
# executes given command and displays in viewer
|
89
|
-
# @param [String] unix command, e.g., git -st
|
90
|
-
def run_command cmd
|
91
|
-
# http://whynotwiki.com/Ruby_/_Process_management#What_happens_to_standard_error_.28stderr.29.3F
|
92
|
-
require 'rbcurse/extras/viewer'
|
93
|
-
begin
|
94
|
-
res = `#{cmd} 2>&1`
|
95
|
-
rescue => ex
|
96
|
-
res = ex.to_s
|
97
|
-
res << ex.backtrace.join("\n")
|
98
|
-
end
|
99
|
-
res.gsub!("\t"," ")
|
100
|
-
RubyCurses::Viewer.view(res.split("\n"), :close_key => KEY_RETURN, :title => "<Enter> to close, M-l M-h to scroll")
|
101
|
-
end
|
102
|
-
def shell_out command
|
103
|
-
@window.hide
|
104
|
-
Ncurses.endwin
|
105
|
-
system command
|
106
|
-
Ncurses.refresh
|
107
|
-
#Ncurses.curs_set 0 # why ?
|
108
|
-
@window.show
|
109
|
-
end
|
110
|
-
end # utils
|
111
|
-
end # module RubyC
|
112
|
-
include RubyCurses::Utils
|
@@ -1,407 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Common stack flow functionality
|
3
|
-
# * Name: basestack.rb
|
4
|
-
# * Description: Classes that allow user to stack and flow components
|
5
|
-
#
|
6
|
-
# * Date: 30.10.11 - 12:57
|
7
|
-
# * Last update: 30.10.11 - 12:57
|
8
|
-
#
|
9
|
-
module RubyCurses
|
10
|
-
module ModStack
|
11
|
-
#
|
12
|
-
# Base class for stacks and flows.
|
13
|
-
# Will manage determining row col and width height of objects
|
14
|
-
# Stacks place objects one below another. Flows place objects to the
|
15
|
-
# right of the previous. Orientation can be reversed.
|
16
|
-
#
|
17
|
-
class BaseStack
|
18
|
-
attr_accessor :components
|
19
|
-
attr_reader :config
|
20
|
-
attr_accessor :form
|
21
|
-
def initialize config={}, components=[]
|
22
|
-
@config = config
|
23
|
-
config.each do |k, v|
|
24
|
-
instance_variable_set "@#{k}", v
|
25
|
-
end
|
26
|
-
@components = components
|
27
|
-
@calc_needed = true
|
28
|
-
end
|
29
|
-
# XXX if user sets later, we won't be checking the config
|
30
|
-
# We check the actual variables which config sets in init
|
31
|
-
%w[ parent_component width height weight row col orientation].each { |e|
|
32
|
-
eval(
|
33
|
-
"def #{e}
|
34
|
-
@config[:#{e}]
|
35
|
-
end
|
36
|
-
def #{e}=(val)
|
37
|
-
@config[:#{e}]=val
|
38
|
-
instance_variable_set \"@#{e}\", val
|
39
|
-
@calc_needed = true
|
40
|
-
end"
|
41
|
-
)
|
42
|
-
}
|
43
|
-
alias :parent :parent_component
|
44
|
-
#alias :parent= :parent_component
|
45
|
-
def repaint # stack
|
46
|
-
$log.debug "XXX: stack repaint recalc #{@calc_needed} "
|
47
|
-
@components.each { |e| e.form = @form unless e.form } #unless @calc_needed
|
48
|
-
recalc if @calc_needed
|
49
|
-
@components.each { |e| e.repaint }
|
50
|
-
end
|
51
|
-
def repaint_all x
|
52
|
-
@calc_needed = true
|
53
|
-
end
|
54
|
-
def override_graphic gr
|
55
|
-
@graphic = gr
|
56
|
-
end
|
57
|
-
def focusable; false; end
|
58
|
-
# Calculates row col and width height
|
59
|
-
# for each subc-omponent based on coords of Container
|
60
|
-
# This is to be called only when the container has got its coordinates (i.e
|
61
|
-
# Containers repaint). This should be in this objects repaint.
|
62
|
-
def recalc
|
63
|
-
@calc_needed = false
|
64
|
-
comp = self
|
65
|
-
if comp.is_a? BaseStack
|
66
|
-
check_coords comp
|
67
|
-
@margin_left ||= 0
|
68
|
-
@margin_right ||= 0
|
69
|
-
@margin_top ||= 0
|
70
|
-
@margin_bottom ||= 0
|
71
|
-
if comp.is_a? Stack
|
72
|
-
r = row + @margin_top
|
73
|
-
rem = 0
|
74
|
-
ht = height - (@margin_top + @margin_bottom)
|
75
|
-
if @orientation == :bottom
|
76
|
-
mult = -1
|
77
|
-
comps = @components.reverse
|
78
|
-
r = row + height - @margin_bottom
|
79
|
-
|
80
|
-
else
|
81
|
-
mult = 1
|
82
|
-
comps = @components
|
83
|
-
|
84
|
-
end
|
85
|
-
comps.each { |e|
|
86
|
-
# should only happen if expandable FIXME
|
87
|
-
e.height = 0.01 * e.weight * (ht - (e.margin_top + e.margin_bottom))
|
88
|
-
hround = e.height.floor
|
89
|
-
rem += e.height - hround
|
90
|
-
e.height = hround #- (@margin_top + @margin_bottom)
|
91
|
-
# rounding creates a problem, since 0.5 gets rounded up and we can exceed bound
|
92
|
-
# So i floor, and maintain the lost space, and add it back when it exceeds 1
|
93
|
-
# This way the last components gets stretched to meet the end, which is required
|
94
|
-
# when the height of the stack is odd and there's a left-over row
|
95
|
-
if rem >= 1
|
96
|
-
e.height += 1
|
97
|
-
rem = 0
|
98
|
-
end
|
99
|
-
# Item level margins have not been accounted for when calculating weightages, and
|
100
|
-
# should not be used on the weightage axis
|
101
|
-
r += e.margin_top
|
102
|
-
if @orientation == :bottom
|
103
|
-
r += e.height * mult
|
104
|
-
e.row = r
|
105
|
-
else
|
106
|
-
e.row = r
|
107
|
-
r += e.height + 0
|
108
|
-
end
|
109
|
-
e.width = width - (@margin_left + @margin_right + e.margin_left + e.margin_right)
|
110
|
-
e.col = col + @margin_left + e.margin_left # ??? XXX
|
111
|
-
$log.debug "XXX: recalc stack #{e.widget.class} r:#{e.row} c:#{e.col} h:#{e.height} = we:#{e.weight} * h:#{height} "
|
112
|
-
#e.col_offset = col_offset # ??? XXX
|
113
|
-
check_coords e
|
114
|
-
e.repaint_all(true)
|
115
|
-
e.recalc if e.is_a? BaseStack
|
116
|
-
}
|
117
|
-
elsif comp.is_a? Flow
|
118
|
-
c = col + @margin_left #+ col_offset
|
119
|
-
rem = 0
|
120
|
-
wd = width - (@margin_left + @margin_right)
|
121
|
-
# right_to_left orientation
|
122
|
-
if @orientation == :right
|
123
|
-
mult = -1
|
124
|
-
comps = @components.reverse
|
125
|
-
c = col + width - @margin_right
|
126
|
-
$log.debug "XXX: ORIENT1f recalc #{@orientation} "
|
127
|
-
else
|
128
|
-
mult = 1
|
129
|
-
comps = @components
|
130
|
-
$log.debug "XXX: ORIENT2f recalc #{@orientation} "
|
131
|
-
end
|
132
|
-
comps.each { |e|
|
133
|
-
e.width = e.weight * wd * 0.01
|
134
|
-
wround = e.width.floor
|
135
|
-
rem += e.width - wround
|
136
|
-
e.width = wround
|
137
|
-
# see comment in prev block regarding remaininder
|
138
|
-
if rem >= 1
|
139
|
-
e.width += 1
|
140
|
-
rem = 0
|
141
|
-
end
|
142
|
-
e.height = height - (@margin_top + @margin_bottom) #* weight * 0.01
|
143
|
-
#e.height = e.height.round
|
144
|
-
if @orientation == :right
|
145
|
-
c += e.width * mult # mult 1 or -1
|
146
|
-
e.col = c
|
147
|
-
else
|
148
|
-
e.col = c
|
149
|
-
c += e.width * mult # mult 1 or -1
|
150
|
-
end
|
151
|
-
e.row = row + @margin_top
|
152
|
-
check_coords e
|
153
|
-
$log.debug "XXX: recalc flow #{e.widget.class} r:#{e.row} c:#{e.col} h:#{e.height} = we:#{e.weight} * w:#{width} "
|
154
|
-
e.repaint_all(true) # why not happening when we change row, hieght etc
|
155
|
-
e.recalc if e.is_a? BaseStack
|
156
|
-
}
|
157
|
-
end
|
158
|
-
else
|
159
|
-
alert "in else recalc DOES NOT COME HERE "
|
160
|
-
comp.col = comp.parent.col
|
161
|
-
comp.row = comp.parent.row
|
162
|
-
comp.height = comp.parent.height
|
163
|
-
comp.width = comp.parent.width
|
164
|
-
$log.debug "XXX: recalc else #{comp.class} r #{comp.row} c #{comp.col} . h #{comp} height w #{comp.width} "
|
165
|
-
end
|
166
|
-
end
|
167
|
-
# Traverses the comopnent tree and calculates weightages for all components
|
168
|
-
# based on what has been specified by user
|
169
|
-
def check_coords e # stack
|
170
|
-
r = e.row
|
171
|
-
c = e.col
|
172
|
-
if r >= row + height
|
173
|
-
$log.warn "XXX: WARN e.class is out of bounds row #{r} "
|
174
|
-
e.visible = false
|
175
|
-
end
|
176
|
-
if c >= col + width
|
177
|
-
$log.warn "XXX: WARN e.class is out of bounds col #{c} "
|
178
|
-
e.visible = false
|
179
|
-
end
|
180
|
-
end
|
181
|
-
def increase c=@current_component
|
182
|
-
p = self #c.parent_component
|
183
|
-
ci = p.components.index(c)
|
184
|
-
ni = ci + 1
|
185
|
-
if p.components[ni].nil?
|
186
|
-
ni = nil
|
187
|
-
end
|
188
|
-
case p
|
189
|
-
when Flow
|
190
|
-
# increase width of current and reduce from neighbor
|
191
|
-
if ni
|
192
|
-
n = p.components[ni]
|
193
|
-
$log.debug "XXX: INC fl current #{ci}, total#{p.components.count}, next #{n} "
|
194
|
-
|
195
|
-
c.width += 1
|
196
|
-
n.width -= 1
|
197
|
-
n.col += 1
|
198
|
-
end
|
199
|
-
|
200
|
-
when Stack
|
201
|
-
if ni
|
202
|
-
n = p.components[ni]
|
203
|
-
$log.debug "XXX: INC fl current #{ci}, total#{p.components.count}, next #{n} "
|
204
|
-
|
205
|
-
c.height += 1
|
206
|
-
n.height -= 1
|
207
|
-
n.row += 1
|
208
|
-
end
|
209
|
-
$log.debug "XXX: INC st current #{ci}, total#{p.components.count} "
|
210
|
-
end
|
211
|
-
|
212
|
-
end
|
213
|
-
def decrease c=@current_component
|
214
|
-
p = self #c.parent_component
|
215
|
-
ci = p.components.index(c)
|
216
|
-
ni = ci + 1
|
217
|
-
if p.components[ni].nil?
|
218
|
-
ni = nil
|
219
|
-
end
|
220
|
-
case p
|
221
|
-
when Flow
|
222
|
-
# increase width of current and reduce from neighbor
|
223
|
-
if ni
|
224
|
-
n = p.components[ni]
|
225
|
-
$log.debug "XXX: INC fl current #{ci}, total#{p.components.count}, next #{n} "
|
226
|
-
|
227
|
-
c.width -= 1
|
228
|
-
n.width += 1
|
229
|
-
n.col -= 1
|
230
|
-
end
|
231
|
-
|
232
|
-
when Stack
|
233
|
-
if ni
|
234
|
-
n = p.components[ni]
|
235
|
-
$log.debug "XXX: INC fl current #{ci}, total#{p.components.count}, next #{n} "
|
236
|
-
|
237
|
-
c.height -= 1
|
238
|
-
n.height += 1
|
239
|
-
n.row -= 1
|
240
|
-
end
|
241
|
-
$log.debug "XXX: INC st current #{ci}, total#{p.components.count} "
|
242
|
-
end
|
243
|
-
|
244
|
-
end
|
245
|
-
def to_s
|
246
|
-
@components
|
247
|
-
end
|
248
|
-
end # class Base
|
249
|
-
# A stack positions objects one below the other
|
250
|
-
class Stack < BaseStack; end
|
251
|
-
# A flow positions objects in a left to right
|
252
|
-
class Flow < BaseStack; end
|
253
|
-
#
|
254
|
-
# A wrapper over widget mostly because it adds weight and margins
|
255
|
-
#
|
256
|
-
class Item
|
257
|
-
attr_reader :config, :widget
|
258
|
-
attr_reader :margin_top, :margin_left, :margin_bottom, :margin_right
|
259
|
-
def initialize config={}, widget
|
260
|
-
@config = config
|
261
|
-
config.each do |k, v|
|
262
|
-
instance_variable_set "@#{k}", v
|
263
|
-
end
|
264
|
-
@margin_left ||= 0
|
265
|
-
@margin_right ||= 0
|
266
|
-
@margin_top ||= 0
|
267
|
-
@margin_bottom ||= 0
|
268
|
-
@widget = widget
|
269
|
-
end
|
270
|
-
def weight; @config[:weight]||100; end
|
271
|
-
def weight=(val); @config[:weight]=val; end
|
272
|
-
def repaint; @widget.repaint; end
|
273
|
-
%w[ form parent parent_component width height row col row_offset col_offset focusable].each { |e|
|
274
|
-
eval(
|
275
|
-
"def #{e}
|
276
|
-
@widget.#{e}
|
277
|
-
end
|
278
|
-
def #{e}=(val)
|
279
|
-
@widget.#{e}=val
|
280
|
-
end"
|
281
|
-
)
|
282
|
-
}
|
283
|
-
def method_missing(sym, *args, &block)
|
284
|
-
@widget.send sym, *args, &block
|
285
|
-
end
|
286
|
-
end # class Item
|
287
|
-
|
288
|
-
# --------------------- module level ------------------------------#
|
289
|
-
# General routin to traverse components and their components
|
290
|
-
def traverse c, &block
|
291
|
-
if c.is_a? BaseStack
|
292
|
-
yield c
|
293
|
-
c.components.each { |e|
|
294
|
-
yield e
|
295
|
-
}
|
296
|
-
c.components.each { |e| traverse(e, &block) }
|
297
|
-
@ctr -= 1
|
298
|
-
else
|
299
|
-
end
|
300
|
-
end
|
301
|
-
|
302
|
-
# traverse the components and their children
|
303
|
-
#
|
304
|
-
def each &block
|
305
|
-
@components.each { |e| traverse e, &block }
|
306
|
-
end
|
307
|
-
# module level
|
308
|
-
private
|
309
|
-
def _stack type, config={}, &block
|
310
|
-
case type
|
311
|
-
when :stack
|
312
|
-
s = Stack.new(config)
|
313
|
-
when :flow
|
314
|
-
s = Flow.new(config)
|
315
|
-
end
|
316
|
-
_add s
|
317
|
-
@active << s
|
318
|
-
yield_or_eval &block if block_given?
|
319
|
-
@active.pop
|
320
|
-
# if active is empty then this is where we could calculate
|
321
|
-
# percentatges and do recalc, thus making it independent
|
322
|
-
end
|
323
|
-
# module level
|
324
|
-
private
|
325
|
-
private
|
326
|
-
def _add s
|
327
|
-
if @active.empty?
|
328
|
-
$log.debug "XXX: ADDING TO components #{s} "
|
329
|
-
unless s.is_a? BaseStack
|
330
|
-
raise "No stack or flow to add to. Results may not be what you want"
|
331
|
-
end
|
332
|
-
@components << s
|
333
|
-
else
|
334
|
-
@active.last.components << s
|
335
|
-
end
|
336
|
-
__add s
|
337
|
-
end
|
338
|
-
|
339
|
-
# module level
|
340
|
-
private
|
341
|
-
public
|
342
|
-
def stack config={}, &block
|
343
|
-
_stack :stack, config, &block
|
344
|
-
end
|
345
|
-
def flow config={}, &block
|
346
|
-
_stack :flow, config, &block
|
347
|
-
end
|
348
|
-
# module level
|
349
|
-
private
|
350
|
-
def add w, config={}
|
351
|
-
i = Item.new config, w
|
352
|
-
_add i
|
353
|
-
end
|
354
|
-
alias :add_widget :add
|
355
|
-
# module level
|
356
|
-
private
|
357
|
-
def calc_weightages2 components, parent
|
358
|
-
#puts " #{@ctr} --> #{c.type}, wt: #{c.config[:weight]} "
|
359
|
-
@ctr += 1
|
360
|
-
wt = 0
|
361
|
-
cnt = 0
|
362
|
-
sz = components.count
|
363
|
-
$log.debug "XXX: calc COMP COUNT #{sz} "
|
364
|
-
# calculate how much weightage has been given by user
|
365
|
-
# so we can allocate average to other components
|
366
|
-
components.each { |e|
|
367
|
-
if e.config[:weight]
|
368
|
-
wt += e.config[:weight]
|
369
|
-
cnt += 1
|
370
|
-
end
|
371
|
-
$log.debug "XXX: INC setting parent #{parent} to #{e} "
|
372
|
-
e.config[:parent] = parent
|
373
|
-
e.config[:level] = @ctr
|
374
|
-
}
|
375
|
-
used = sz - cnt
|
376
|
-
$log.debug "XXX: ADDING calc COMP COUNT #{sz} - #{cnt} "
|
377
|
-
if used > 0
|
378
|
-
avg = (100-wt)/used
|
379
|
-
# Allocate average to other components
|
380
|
-
components.each { |e| e.config[:weight] = avg unless e.config[:weight] }
|
381
|
-
end
|
382
|
-
components.each { |e| calc_weightages2(e.components, e) if e.respond_to? :components }
|
383
|
-
@ctr -= 1
|
384
|
-
end
|
385
|
-
# module level
|
386
|
-
private
|
387
|
-
# given an widget, return the item, so we can change weight or some other config
|
388
|
-
def item_for widget
|
389
|
-
each do |e|
|
390
|
-
if e.is_a? Item
|
391
|
-
if e.widget == widget
|
392
|
-
return e
|
393
|
-
end
|
394
|
-
end
|
395
|
-
end
|
396
|
-
return nil
|
397
|
-
end
|
398
|
-
# module level
|
399
|
-
# returns the parent (flow or stack) for a given widget
|
400
|
-
# allowing user to change configuration such as weight
|
401
|
-
def parent_of widget
|
402
|
-
f = item_for widget
|
403
|
-
return f.config[:parent] if f
|
404
|
-
return nil
|
405
|
-
end
|
406
|
-
end # mod modstack
|
407
|
-
end # mod
|