canis 0.0.4 → 0.0.5
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 +4 -4
- data/CHANGES +5 -0
- data/examples/testkeypress.rb +1 -1
- data/lib/canis/core/include/appmethods.rb +7 -0
- data/lib/canis/core/system/colormap.rb +24 -0
- data/lib/canis/core/system/window.rb +49 -17
- data/lib/canis/core/util/app.rb +16 -13
- data/lib/canis/core/util/extras/padreader.rb +12 -1
- data/lib/canis/core/util/promptmenu.rb +2 -1
- data/lib/canis/core/util/rdialogs.rb +17 -2
- data/lib/canis/core/widgets/applicationheader.rb +22 -2
- data/lib/canis/core/widgets/rwidget.rb +20 -8
- data/lib/canis/core/widgets/statusline.rb +15 -6
- data/lib/canis/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d5a775dee6fbf1b0f9bc371c1e11ec5822241396
|
4
|
+
data.tar.gz: ac9799e0d5419870a54b30f388b0e56984def45e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f261dc96bb4b87476193966e16cbf8c417de1cd49f4b4e99a173837045ea527dc6e503916c06a868c2e9598fa981c30eaf7f749b58c7d730e5c4e2c06fb1aa3a
|
7
|
+
data.tar.gz: 992fe5d6546ece188d6b5599a03d94b6f3b35e86fb40e878dcda350107a389f51edd31929a522546a3d3ac6fd26ea263d194f766eb64fe14aba61be2f96f956b
|
data/CHANGES
CHANGED
@@ -50,3 +50,8 @@ Built 0.0.2 but i did not release it.
|
|
50
50
|
This way an app can have its own logger and not bother about canis' logging.
|
51
51
|
Or it can merge the two.
|
52
52
|
- Moved helpmanager from rwidgets to its own file. Needs to be refactored and cleaned up.
|
53
|
+
|
54
|
+
2014-08-18 - 17:11
|
55
|
+
- for 0.0.5
|
56
|
+
- fixed a bug in handling of multiple key assignments due to which extra keys pushed onto stack
|
57
|
+
- App keyblock yields string of key without changing or converting to symbol
|
data/examples/testkeypress.rb
CHANGED
@@ -62,7 +62,7 @@ if $0 == __FILE__
|
|
62
62
|
str = keycode_tos ch if ch.is_a? Fixnum
|
63
63
|
#str1 = @window.key_tos ch if ch.is_a? Fixnum
|
64
64
|
str1 = $key_chr
|
65
|
-
$log.debug "#{ch} got (#{str}
|
65
|
+
$log.debug "#{ch} got (#{str} $key_chr:#{str1})"
|
66
66
|
texta << "#{ch} got (#{str}) #{str1}"
|
67
67
|
if ch == 99999
|
68
68
|
name = get_string "Add a name for #{$key_chr}?"
|
@@ -28,6 +28,9 @@ module Canis
|
|
28
28
|
# Maybe not be able to get your prompt correctly.
|
29
29
|
#
|
30
30
|
public
|
31
|
+
#
|
32
|
+
# suspends current program and puts user on unix prompt
|
33
|
+
#
|
31
34
|
def suspend
|
32
35
|
_suspend(false) do
|
33
36
|
system("tput cup 26 0")
|
@@ -70,6 +73,10 @@ module Canis
|
|
70
73
|
# Earlier close key was ENTER but we need that to execute or fire
|
71
74
|
Canis::Viewer.view(res.split("\n"), :close_key => 'q', :title => "<q> to close, M-l M-h to scroll")
|
72
75
|
end
|
76
|
+
#
|
77
|
+
# takes a unix command (system) and executes the same. No output
|
78
|
+
# @return return value of system command
|
79
|
+
#
|
73
80
|
def shell_out command
|
74
81
|
w = @window || @form.window
|
75
82
|
w.hide
|
@@ -1,5 +1,20 @@
|
|
1
1
|
require 'canis/core/system/ncurses'
|
2
2
|
|
3
|
+
# 2014-08-11 - 09:54
|
4
|
+
# There is a limit to the number of color pairs one can make 0 .. COLOR_PAIRS - 1
|
5
|
+
# which i why i get junk colors after 255. In my program, color_pairs is 32767 ???
|
6
|
+
#
|
7
|
+
# curses.init_pair(pair_number, fg, bg)
|
8
|
+
#
|
9
|
+
# Change the definition of a color-pair. It takes three arguments: the
|
10
|
+
# number of the color-pair to be changed, the foreground color number, and the
|
11
|
+
# background color number. The value of pair_number must be between 1 and
|
12
|
+
# COLOR_PAIRS - 1 (the 0 color pair is wired to white on black and cannot be
|
13
|
+
# changed). The value of fg and bg arguments must be between 0 and COLORS. If the
|
14
|
+
# color-pair was previously initialized, the screen is refreshed and all
|
15
|
+
# occurrences of that color-pair are changed to the new definition.
|
16
|
+
# - https://docs.python.org/2/library/curses.html
|
17
|
+
|
3
18
|
module Canis
|
4
19
|
module ColorMap
|
5
20
|
# 2010-09-20 12:22 changed colors from string to symbol
|
@@ -17,6 +32,8 @@ module Canis
|
|
17
32
|
def ColorMap.install_color fgc, bgc
|
18
33
|
#$log.debug " install_color found #{fgc} #{@bgc} "
|
19
34
|
@color_id += 1
|
35
|
+
# testing to see, since i get junk after 255 or so
|
36
|
+
#@color_id = 255 if @color_id > 255
|
20
37
|
fg = ColorMap.get_color_const fgc
|
21
38
|
bg = ColorMap.get_color_const bgc
|
22
39
|
FFI::NCurses.init_pair(@color_id, fg, bg);
|
@@ -93,6 +110,13 @@ module Canis
|
|
93
110
|
|
94
111
|
# $log.debug " colormap SETUP: #{$datacolor} #{$reversecolor} "
|
95
112
|
end
|
113
|
+
# reset the color_id to zero so one can create colors from scratch.
|
114
|
+
# This is only to be used in the case of a color demo when you don't want the colors
|
115
|
+
# we originally made, since there seems to be a shortage of slots.
|
116
|
+
def ColorMap.reset_color_id
|
117
|
+
@color_id = 0
|
118
|
+
$color_map = {}
|
119
|
+
end
|
96
120
|
|
97
121
|
end # modul
|
98
122
|
if $0 == __FILE__
|
@@ -4,7 +4,7 @@
|
|
4
4
|
# Author: jkepler http://github.com/mare-imbrium/canis/
|
5
5
|
# Date: Around for a long time
|
6
6
|
# License: Same as Ruby's License (http://www.ruby-lang.org/LICENSE.txt)
|
7
|
-
# Last update: 2014-
|
7
|
+
# Last update: 2014-08-15 12:12
|
8
8
|
#
|
9
9
|
# == CHANGED
|
10
10
|
# removed dead or redudant code - 2014-04-22 - 12:53
|
@@ -18,16 +18,6 @@
|
|
18
18
|
#
|
19
19
|
require 'canis/core/system/ncurses'
|
20
20
|
require 'canis/core/system/panel'
|
21
|
-
# this is since often windows are declared with 0 height or width and this causes
|
22
|
-
# crashes in the most unlikely places. This prevceents me from having to write ternary
|
23
|
-
# e.g.
|
24
|
-
# @layout[:width].ifzero(FFI::NCurses::LINES-2)
|
25
|
-
class Fixnum
|
26
|
-
def ifzero v
|
27
|
-
return self if self != 0
|
28
|
-
return v
|
29
|
-
end
|
30
|
-
end
|
31
21
|
# This class is to be extended so that it can be called by anyone wanting to implement
|
32
22
|
# chunks ot text with color and attributes. Chunkline consists of multiple chunks of colored text
|
33
23
|
# and should implement a +each_with_color+.
|
@@ -36,21 +26,51 @@ end
|
|
36
26
|
class AbstractChunkLine; end
|
37
27
|
|
38
28
|
module Canis
|
29
|
+
# A Basic class of this library, all output is eventually done on a window.
|
30
|
+
# Root windows and dialogs use this class.
|
31
|
+
# A root window covers the entire screen, and is the basis of an application usually.
|
32
|
+
#
|
33
|
+
# == Examples
|
34
|
+
#
|
35
|
+
# w = Canis::Window.root_window
|
36
|
+
#
|
37
|
+
# w = Canis::Window.create_window( ht, wid, top, left)
|
38
|
+
#
|
39
|
+
# w = Canis::Window.new( ht, wid, top, left)
|
40
|
+
#
|
41
|
+
# layout = { :height => ht, :width => w, :top => t, :left => l }
|
42
|
+
# w = Canis::Window.new( layout )
|
43
|
+
#
|
44
|
+
# == Commonly used methods
|
45
|
+
#
|
46
|
+
# - destroy
|
47
|
+
# - printstring
|
48
|
+
# - wrefresh
|
49
|
+
# - getchar
|
50
|
+
# - print_border
|
51
|
+
#
|
39
52
|
class Window
|
53
|
+
# dimensions of window
|
40
54
|
attr_reader :width, :height, :top, :left
|
55
|
+
# hash containing dimensions
|
41
56
|
attr_accessor :layout # hash containing hwtl
|
57
|
+
# panel related to window, used to delete it in the end
|
42
58
|
attr_reader :panel # reader requires so he can del it in end
|
43
59
|
attr_accessor :name # more for debugging log files. 2010-02-02 19:58
|
44
60
|
#attr_accessor :modified # has it been modified and may need a refresh 2014-04-22 - 10:23 CLEANUP
|
61
|
+
#
|
45
62
|
# for root windows we need to know the form so we can ask it to update when
|
46
63
|
# there are overlapping windows.
|
47
64
|
attr_accessor :form
|
48
65
|
|
49
|
-
#
|
66
|
+
# window init {{{
|
67
|
+
# creation and layout related.
|
50
68
|
# @param [Array, Hash] window coordinates (ht, w, top, left)
|
69
|
+
#
|
51
70
|
# or
|
71
|
+
#
|
52
72
|
# @param [int, int, int, int] window coordinates (ht, w, top, left)
|
53
|
-
#
|
73
|
+
#
|
54
74
|
def initialize(*args)
|
55
75
|
|
56
76
|
case args.size
|
@@ -109,7 +129,8 @@ module Canis
|
|
109
129
|
$catch_alt_digits ||= false # is this where is should put globals ? 2010-03-14 14:00 XXX
|
110
130
|
end
|
111
131
|
##
|
112
|
-
# this is an alternative constructor
|
132
|
+
# this is an alternative constructor, which by default creates a window that covers the entire
|
133
|
+
# screen
|
113
134
|
def self.root_window(layout = { :height => 0, :width => 0, :top => 0, :left => 0 })
|
114
135
|
|
115
136
|
@layout = layout
|
@@ -131,6 +152,11 @@ module Canis
|
|
131
152
|
# NOTE : if there are too many root windows, this could get expensive since we are updating all.
|
132
153
|
# We may need to have a way to specify which window to repaint.
|
133
154
|
# If there are non-root windows above, we may have manually refresh only the previous one.
|
155
|
+
# FIXME NOTE current our examples have lists and textpads that cover the root window so the
|
156
|
+
# refresh all is fine, but if there is screen area vacant then that will still be left black
|
157
|
+
# Similarly in the case of a dialog below, the window and box will not be painted.
|
158
|
+
# We may need a key for refreshing the entire window, such as ^L in which the form and the window
|
159
|
+
# is repainted.
|
134
160
|
#
|
135
161
|
def self.refresh_all current_win=nil
|
136
162
|
#Ncurses.touchwin(FFI::NCurses.stdscr)
|
@@ -220,7 +246,9 @@ module Canis
|
|
220
246
|
def wrefresh
|
221
247
|
Ncurses.wrefresh(@window)
|
222
248
|
end
|
223
|
-
|
249
|
+
#
|
250
|
+
# called by destroy()
|
251
|
+
def delwin
|
224
252
|
Ncurses.delwin(@window)
|
225
253
|
end
|
226
254
|
def attron *args
|
@@ -251,6 +279,8 @@ module Canis
|
|
251
279
|
#end
|
252
280
|
# since include FFI is taking over, i need to force it here. not going into
|
253
281
|
# method_missing
|
282
|
+
|
283
|
+
# move window to row and col
|
254
284
|
def wmove y,x
|
255
285
|
#Ncurses.wmove @window, y, x
|
256
286
|
FFI::NCurses.wmove @window, y, x
|
@@ -366,6 +396,7 @@ module Canis
|
|
366
396
|
|
367
397
|
# Ncurses panel
|
368
398
|
|
399
|
+
# hide the window
|
369
400
|
def hide
|
370
401
|
#return unless visible? # added 2011-10-14 these 2 are not behaving properly
|
371
402
|
Ncurses::Panel.hide_panel @panel.pointer
|
@@ -374,6 +405,7 @@ module Canis
|
|
374
405
|
@visible = false
|
375
406
|
end
|
376
407
|
|
408
|
+
# show the window
|
377
409
|
def show
|
378
410
|
#return if visible? # added 2011-10-14 these 2 are not behaving properly
|
379
411
|
Ncurses::Panel.show_panel @panel.pointer
|
@@ -413,7 +445,6 @@ module Canis
|
|
413
445
|
end
|
414
446
|
|
415
447
|
#
|
416
|
-
# 2011-11-13 since 1.4.1
|
417
448
|
# Widgets can get window to create a pad for them. This way when the window
|
418
449
|
# is destroyed, it will delete all the pads. A widget wold not be able to do this.
|
419
450
|
# The destroy method of the widget will be called.
|
@@ -680,6 +711,7 @@ module Canis
|
|
680
711
|
# take some actions
|
681
712
|
# end
|
682
713
|
# end
|
714
|
+
# @see +command+ (alias)
|
683
715
|
def close_command *args, &block
|
684
716
|
@close_command ||= []
|
685
717
|
@close_args ||= []
|
@@ -743,7 +775,7 @@ module Canis
|
|
743
775
|
class DefaultKeyReader # --- {{{
|
744
776
|
def initialize win
|
745
777
|
@window = win
|
746
|
-
|
778
|
+
#@stack = []
|
747
779
|
end
|
748
780
|
|
749
781
|
# return an int for the key read. this is just a single int, and is not interpreted
|
data/lib/canis/core/util/app.rb
CHANGED
@@ -120,6 +120,9 @@ module Canis
|
|
120
120
|
end
|
121
121
|
$log.debug " CLOSING APP"
|
122
122
|
end
|
123
|
+
|
124
|
+
# This method is called by run, and thus in most cases this is what is used.
|
125
|
+
# +run+ calls this without a block
|
123
126
|
# not sure, but user shuld be able to trap keystrokes if he wants
|
124
127
|
# but do i still call handle_key if he does, or give him total control.
|
125
128
|
# But loop is already called by framework
|
@@ -142,9 +145,17 @@ module Canis
|
|
142
145
|
break
|
143
146
|
end
|
144
147
|
|
148
|
+
# execute a code block so caller program can handle keys from a hash or whatever.
|
149
|
+
# Currently this has the issue that the key is still evaluated again in the next block
|
150
|
+
# - A double evaluation can happen
|
151
|
+
# - these keys will not appear in help
|
152
|
+
# FIXME
|
145
153
|
if @keyblock
|
146
154
|
str = keycode_tos ch
|
147
|
-
|
155
|
+
# why did we ever want to convert to a symbol. why not just pass it as is.
|
156
|
+
#@keyblock.call(str.gsub(/-/, "_").to_sym) # not used ever
|
157
|
+
ret = @keyblock.call(str)
|
158
|
+
@form.repaint if ret
|
148
159
|
end
|
149
160
|
|
150
161
|
yield ch if block # <<<----
|
@@ -191,6 +202,9 @@ module Canis
|
|
191
202
|
# returns a symbol of the key pressed
|
192
203
|
# e.g. :C_c for Ctrl-C
|
193
204
|
# :Space, :bs, :M_d etc
|
205
|
+
# NOTE 2014-08-15 Trying with just string returned by keycode_tos
|
206
|
+
# This should allow for simpler apps that want to handle keys perhaps taken from a config file
|
207
|
+
# rather than bind each key manually.
|
194
208
|
def keypress &block
|
195
209
|
@keyblock = block
|
196
210
|
end
|
@@ -198,7 +212,6 @@ module Canis
|
|
198
212
|
# a label so it can be printed.
|
199
213
|
def message text
|
200
214
|
$status_message.value = text # trying out 2011-10-9
|
201
|
-
#@message.value = text # 2011-10-17 14:07:01
|
202
215
|
end
|
203
216
|
|
204
217
|
# used only by LiveConsole, if enables in an app, usually only during testing.
|
@@ -366,17 +379,6 @@ module Canis
|
|
366
379
|
#colorlabel = Label.new @form, {'text' => "Select a color:", "row" => row, "col" => col, "color"=>"cyan", "mnemonic" => 'S'}
|
367
380
|
alias :text :label
|
368
381
|
|
369
|
-
# print a title on first row -- this is so bad, not even a label
|
370
|
-
def title string, config={}
|
371
|
-
raise "don't use DELETE dead code"
|
372
|
-
## TODO center it
|
373
|
-
@window.printstring 1, 30, string, $normalcolor, 'reverse'
|
374
|
-
end
|
375
|
-
# print a sutitle on second row, center and use a label, if this is even used.
|
376
|
-
def subtitle string, config={}
|
377
|
-
raise "don't use DELETE"
|
378
|
-
@window.printstring 2, 30, string, $datacolor, 'normal'
|
379
|
-
end
|
380
382
|
# menu bar
|
381
383
|
|
382
384
|
# displays a horizontal line
|
@@ -446,6 +448,7 @@ module Canis
|
|
446
448
|
matches = opts.grep Regexp.new("^#{cmd}")
|
447
449
|
end
|
448
450
|
|
451
|
+
# This is the method that is called by all apps usually that define an App block
|
449
452
|
def run &block
|
450
453
|
begin
|
451
454
|
|
@@ -4,7 +4,7 @@
|
|
4
4
|
* Author: jkepler (http://github.com/mare-imbrium/canis/)
|
5
5
|
* Date: 22.10.11 - 20:35
|
6
6
|
* License: Same as Ruby's License (http://www.ruby-lang.org/LICENSE.txt)
|
7
|
-
* Last update:
|
7
|
+
* Last update: 2014-08-09 20:25
|
8
8
|
|
9
9
|
== CHANGES
|
10
10
|
== TODO
|
@@ -14,6 +14,17 @@
|
|
14
14
|
NOTE: I have continued this in textpad which is a widget that uses pads to scroll.
|
15
15
|
This is very rough, i may work on this more later.
|
16
16
|
=end
|
17
|
+
# this is since often windows are declared with 0 height or width and this causes
|
18
|
+
# crashes in the most unlikely places. This prevceents me from having to write ternary
|
19
|
+
# e.g.
|
20
|
+
# @layout[:width].ifzero(FFI::NCurses::LINES-2)
|
21
|
+
class Fixnum
|
22
|
+
def ifzero v
|
23
|
+
return self if self != 0
|
24
|
+
return v
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
17
28
|
require 'canis'
|
18
29
|
|
19
30
|
include Canis
|
@@ -5,7 +5,7 @@
|
|
5
5
|
# Author: j kepler http://github.com/mare-imbrium/canis/
|
6
6
|
# Date: 2014-04-25 - 12:32
|
7
7
|
# License: MIT
|
8
|
-
# Last update: 2014-
|
8
|
+
# Last update: 2014-08-09 18:55
|
9
9
|
# ----------------------------------------------------------------------------- #
|
10
10
|
# promptmenu.rb Copyright (C) 2012-2014 j kepler
|
11
11
|
# Depends on rcommandwindow for display_menu
|
@@ -42,6 +42,7 @@ module Canis
|
|
42
42
|
# and the rest are ordinary characters.
|
43
43
|
#
|
44
44
|
# == Example
|
45
|
+
#
|
45
46
|
# menu = PromptMenu.new self do
|
46
47
|
# item :s, :goto_start
|
47
48
|
# item :b, :goto_bottom
|
@@ -358,18 +358,33 @@ class StatusWindow # --- {{{
|
|
358
358
|
end # }}}
|
359
359
|
# returns instance of a status_window for sending multiple
|
360
360
|
# statuses during some process
|
361
|
+
# TODO FIXME block got ignored
|
361
362
|
def status_window aconfig={}, &block
|
362
|
-
|
363
|
+
sw = StatusWindow.new aconfig
|
364
|
+
return sw unless block_given?
|
365
|
+
begin
|
366
|
+
yield sw
|
367
|
+
ensure
|
368
|
+
sw.destroy if sw
|
369
|
+
end
|
363
370
|
end
|
364
371
|
# this is a popup dialog box on which statuses can be printed as a process is taking place.
|
365
372
|
# I am reusing StatusWindow and so there's an issue since I've put a box, so in clearing
|
366
373
|
# the line, I might overwrite the box
|
367
374
|
def progress_dialog aconfig={}, &block
|
368
375
|
aconfig[:layout] = [10,60,10,20]
|
376
|
+
# since we are printing a border
|
377
|
+
aconfig[:row_offset] ||= 4
|
378
|
+
aconfig[:col_offset] ||= 5
|
369
379
|
window = status_window aconfig
|
370
380
|
height = 10; width = 60
|
371
381
|
window.win.print_border_mb 1,2, height, width, $normalcolor, FFI::NCurses::A_REVERSE
|
372
|
-
return window
|
382
|
+
return window unless block_given?
|
383
|
+
begin
|
384
|
+
yield window
|
385
|
+
ensure
|
386
|
+
window.destroy if window
|
387
|
+
end
|
373
388
|
end
|
374
389
|
#
|
375
390
|
# Display a popup and return the seliected index from list
|
@@ -8,7 +8,7 @@
|
|
8
8
|
# Author: jkepler http://github.com/mare-imbrium/canis-core/
|
9
9
|
# Date:
|
10
10
|
# License: Same as Ruby's License (http://www.ruby-lang.org/LICENSE.txt)
|
11
|
-
# Last update:
|
11
|
+
# Last update: 2014-08-10 14:53
|
12
12
|
#
|
13
13
|
# CHANGES:
|
14
14
|
# For some terminals, like xterm-256color which were not printing spaces
|
@@ -19,13 +19,27 @@
|
|
19
19
|
require 'canis/core/widgets/rwidget'
|
20
20
|
include Canis
|
21
21
|
module Canis
|
22
|
+
# Maintain an application header on the top of an application.
|
23
|
+
# Application related text may be placed in the left, center or right slots.
|
24
|
+
#
|
25
|
+
# == Example
|
26
|
+
# a = ApplicationHeader.new "MyApp v1.0", :text_center => "Application Name", :text_right => "module",
|
27
|
+
# :color => :white, :bgcolor => :blue
|
28
|
+
#
|
29
|
+
# # Later as user traverses a list or table, update row number on app header
|
30
|
+
# a.text_right "Row #{n}"
|
31
|
+
#
|
22
32
|
class ApplicationHeader < Widget
|
33
|
+
# text on left of header
|
23
34
|
dsl_property :text1
|
35
|
+
# text on left of header, after text1
|
24
36
|
dsl_property :text2
|
37
|
+
# text in center of header
|
25
38
|
dsl_property :text_center
|
39
|
+
# text on right side of header
|
26
40
|
dsl_property :text_right
|
27
41
|
|
28
|
-
|
42
|
+
# @param text1 String text on left of header
|
29
43
|
def initialize form, text1, config={}, &block
|
30
44
|
|
31
45
|
@name = "header"
|
@@ -47,6 +61,7 @@ module Canis
|
|
47
61
|
@text_center ||= ""
|
48
62
|
@text_right ||= ""
|
49
63
|
end
|
64
|
+
# returns value of text1, i.e. text on left of header
|
50
65
|
def getvalue
|
51
66
|
@text1
|
52
67
|
end
|
@@ -56,6 +71,8 @@ module Canis
|
|
56
71
|
def repaint
|
57
72
|
return unless @repaint_required
|
58
73
|
|
74
|
+
# 2014-08-10 - 14:53 changing bgcolor or color resets color_pair, so this must be reset if nil
|
75
|
+
@color_pair ||= get_color $bottomcolor, @color, @bgcolor
|
59
76
|
#print_header(htext, posy = 0, posx = 0)
|
60
77
|
att = get_attrib @attr
|
61
78
|
len = @window.width
|
@@ -73,6 +90,7 @@ module Canis
|
|
73
90
|
print_top_right(@text_right)
|
74
91
|
@repaint_required = false
|
75
92
|
end
|
93
|
+
# internal method, called by repain to print text1 and text2 on left side
|
76
94
|
def print_header(htext, r = 0, c = 0)
|
77
95
|
#win = @window
|
78
96
|
#len = @window.width
|
@@ -81,6 +99,7 @@ module Canis
|
|
81
99
|
#@form.window.printstring r, c, "%-*s" % [len, htext], @color_pair, @attr
|
82
100
|
@form.window.printstring r, c, htext, @color_pair, @attr
|
83
101
|
end
|
102
|
+
# internal method, called by repaint to print text_center in the center
|
84
103
|
def print_center(htext, r = 0, c = 0)
|
85
104
|
win = @window
|
86
105
|
len = win.getmaxx
|
@@ -89,6 +108,7 @@ module Canis
|
|
89
108
|
#@form.window.printstring r, c, "%-*s" % [len, htext], @color_pair, @attr
|
90
109
|
win.printstring r, ((len-htext.length)/2).floor, htext, @color_pair, @attr
|
91
110
|
end
|
111
|
+
# internal method to print text_right
|
92
112
|
def print_top_right(htext)
|
93
113
|
hlen = htext.length
|
94
114
|
len = @window.getmaxx # width was not changing when resize happens
|
@@ -9,7 +9,7 @@
|
|
9
9
|
* Author: jkepler (ABCD)
|
10
10
|
* Date: 2008-11-19 12:49
|
11
11
|
* License: Same as Ruby's License (http://www.ruby-lang.org/LICENSE.txt)
|
12
|
-
* Last update: 2014-
|
12
|
+
* Last update: 2014-08-18 14:58
|
13
13
|
|
14
14
|
== CHANGES
|
15
15
|
* 2011-10-2 Added PropertyVetoException to rollback changes to property
|
@@ -576,9 +576,13 @@ module Canis
|
|
576
576
|
$log.debug " got node #{n} with #{e} "
|
577
577
|
# instead of just nil, we need to go back up, but since not recursive ...
|
578
578
|
#return nil unless n
|
579
|
-
|
580
|
-
|
581
|
-
|
579
|
+
unless n
|
580
|
+
# testing shift otherwise it seems current key evaluated twice
|
581
|
+
unconsumed.shift
|
582
|
+
$log.debug "push unconsumed:#{unconsumed} " unless n
|
583
|
+
unconsumed.each {|e| window.ungetch(e)} unless n
|
584
|
+
return actions.last unless n
|
585
|
+
end
|
582
586
|
mp = n.map
|
583
587
|
# there are no more keys, only an action
|
584
588
|
if mp.nil? or mp.empty?
|
@@ -766,7 +770,7 @@ module Canis
|
|
766
770
|
# so that if block does not handle, the key can still be handled
|
767
771
|
# e.g. table last row, last col does not handle, so it will auto go to next field
|
768
772
|
# 2010-02-24 13:45 handles 2 key combinations, copied from Form, must be identical in logic
|
769
|
-
# except maybe for window pointer.
|
773
|
+
# except maybe for window pointer.
|
770
774
|
def _process_key keycode, object, window
|
771
775
|
return :UNHANDLED if @_key_map.nil?
|
772
776
|
chr = nil
|
@@ -1513,7 +1517,13 @@ module Canis
|
|
1513
1517
|
end # }}}
|
1514
1518
|
|
1515
1519
|
##
|
1520
|
+
# Manages the controls/widgets on a screen.
|
1521
|
+
# Manages traversal, rendering and events of all widgets that are associated with it
|
1522
|
+
# via the +add_widget+ method.
|
1516
1523
|
#
|
1524
|
+
# Passes keys pressed by user to the current field.
|
1525
|
+
# Any keys that are not handled by the current field, are handled by the form if the application
|
1526
|
+
# has bound the key via +bind_key+.
|
1517
1527
|
# TODO: we don't have an event for when form is entered and exited.
|
1518
1528
|
class Form # {{{
|
1519
1529
|
include EventHandler
|
@@ -1872,7 +1882,10 @@ module Canis
|
|
1872
1882
|
end
|
1873
1883
|
f = @widgets[@active_index]
|
1874
1884
|
index = @focusables.index(f)
|
1875
|
-
|
1885
|
+
# 2014-08-09 - 13:09 f may be status_line esp if ai is -1, so it is not found in focusables
|
1886
|
+
# why are we first checking widgets and then focusables.
|
1887
|
+
#index += 1
|
1888
|
+
index = index ? index+1 : 0
|
1876
1889
|
f = @focusables[index]
|
1877
1890
|
if f
|
1878
1891
|
select_field f
|
@@ -2118,8 +2131,7 @@ module Canis
|
|
2118
2131
|
$log.debug " form RESIZE HK #{ch} #{self}, #{@name} "
|
2119
2132
|
repaint_all_widgets
|
2120
2133
|
return
|
2121
|
-
|
2122
|
-
when FFI::NCurses::KEY_RESIZE # SIGWINCH # FFI
|
2134
|
+
when FFI::NCurses::KEY_RESIZE # SIGWINCH
|
2123
2135
|
lines = Ncurses.LINES
|
2124
2136
|
cols = Ncurses.COLS
|
2125
2137
|
x = Ncurses.stdscr.getmaxy
|
@@ -4,8 +4,15 @@ module Canis
|
|
4
4
|
|
5
5
|
#
|
6
6
|
# A vim-like application status bar that can display time and various other statuses
|
7
|
-
# at the bottom, typically above the dock (3rd line from last).
|
7
|
+
# at the bottom, typically above the dock (3rd line from last), or else the last line.
|
8
8
|
#
|
9
|
+
# == Example
|
10
|
+
#
|
11
|
+
# require 'canis/core/widgets/statusline'
|
12
|
+
# @status_line = Canis::StatusLine.new @form, :row => Ncurses.LINES-2
|
13
|
+
# @status_line.command {
|
14
|
+
# "F1 Help | F2 Menu | F3 View | F4 Shell | F5 Sh | %20s" % [message_label.text]
|
15
|
+
# }
|
9
16
|
class StatusLine < Widget
|
10
17
|
#attr_accessor :row_relative # lets only advertise this when we've tested it out
|
11
18
|
|
@@ -36,9 +43,10 @@ module Canis
|
|
36
43
|
#
|
37
44
|
# command that returns a string that populates the status line (left aligned)
|
38
45
|
# @see :right
|
39
|
-
#
|
40
|
-
#
|
41
|
-
#
|
46
|
+
# @see dbdemo.rb
|
47
|
+
# == Example
|
48
|
+
#
|
49
|
+
# @l.command { "%-20s [DB: %-s | %-s ]" % [ Time.now, $current_db || "None", $current_table || "----"] }
|
42
50
|
#
|
43
51
|
def command *args, &blk
|
44
52
|
@command = blk
|
@@ -47,7 +55,7 @@ module Canis
|
|
47
55
|
alias :left :command
|
48
56
|
|
49
57
|
#
|
50
|
-
#
|
58
|
+
# Procedure for text to be right aligned in statusline
|
51
59
|
def right *args, &blk
|
52
60
|
@right_text = blk
|
53
61
|
@right_args = args
|
@@ -105,7 +113,8 @@ module Canis
|
|
105
113
|
|
106
114
|
@repaint_required = false
|
107
115
|
end
|
108
|
-
|
116
|
+
# not used since not focusable
|
117
|
+
def handle_keys ch
|
109
118
|
return :UNHANDLED
|
110
119
|
end
|
111
120
|
|
data/lib/canis/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: canis
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kepler
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-08-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|