canis 0.0.11 → 0.0.13
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/README.md +21 -7
- data/examples/testdb.rb +1 -1
- data/lib/canis/core/widgets/rwidget.rb +9 -11
- data/lib/canis/core/widgets/table.rb +75 -61
- data/lib/canis/core/widgets/textpad.rb +88 -93
- data/lib/canis/version.rb +1 -1
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a5ff168e0396a8194dde1fef712068369b675a575648806182c9a5f5540198f7
|
4
|
+
data.tar.gz: 4b0b4a2e219ea2bfefcaff61a293bd47a3d5e423a4237c1d76be0f1c86857767
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f295681678c651300eeb93153df8ba6b6a751f5daacb86baa88f2e07b005159b93d933fb2c75e80ca0c7c620b92696dccd0a2237beaefef8e78b165c185b6943
|
7
|
+
data.tar.gz: f5191705d2292807e095c4f90e1740ed8b307a2e0c0a6f75f9049f44c8601009df3b0d9609f55d9145e33974ee26f8eccbeca86e1bc92cd4958ec4dace1f9bc9
|
data/README.md
CHANGED
@@ -1,7 +1,18 @@
|
|
1
1
|
# Canis
|
2
2
|
|
3
|
+
**2019-03-11**. Kindly note that `canis` is not, and will never be, production-ready.
|
4
|
+
Very few ruby programmers are using ncurses so the usage of canis is
|
5
|
+
very low if any. So kindly do not use for critical work.
|
3
6
|
|
4
|
-
|
7
|
+
That is why I made a much simpler and stripped version of `canis` called `umbra`.
|
8
|
+
I use `umbra` mostly, but that too for a screen with a few fields and a single table,
|
9
|
+
and some popups.
|
10
|
+
|
11
|
+
Umbra will be easier for you to go through, and hack (if you come across a problem) than canis. Having said that, I am perhaps the only user of `umbra`, so again it is at your own risk.
|
12
|
+
|
13
|
+
If anyone wishes to take over and maintain `canis` please contact me.
|
14
|
+
|
15
|
+
## Last update on 2018-03-05 for ruby 2.5
|
5
16
|
|
6
17
|
Everything seems to be working fine without any changes.
|
7
18
|
|
@@ -23,7 +34,7 @@ document reader, `rigel` which is based on the code of `ribhu` (which was rbcurs
|
|
23
34
|
## Usage
|
24
35
|
|
25
36
|
Until, we have better documentation, the best way to understand "canis" is to run the examples in the examples
|
26
|
-
folder. This gives a good idea of what the library does. Now you can open the source and get a feel of the
|
37
|
+
folder. This gives a good idea of what the library does. Now you can open the source and get a feel of the
|
27
38
|
structure of the code and what to study. One can also select an example that is close to the application one has in mind
|
28
39
|
and use the source as a starting point.
|
29
40
|
|
@@ -51,8 +62,8 @@ TODO: Write usage instructions here
|
|
51
62
|
|
52
63
|
Commonly used widgets and features:
|
53
64
|
|
54
|
-
- Textpad - to display non-editable multiline text. Text can be colored.
|
55
|
-
- Listbox - identical to the textpad except that it allows single or multiple selection, and has
|
65
|
+
- Textpad - to display non-editable multiline text. Text can be colored.
|
66
|
+
- Listbox - identical to the textpad except that it allows single or multiple selection, and has
|
56
67
|
some extra events such as entering and leaving or row, and selection.
|
57
68
|
- Field - user entry of a single line of data.
|
58
69
|
- Label - readonly text
|
@@ -80,7 +91,7 @@ Lesser used widgets and features:
|
|
80
91
|
Some Issues with rbcurse:
|
81
92
|
|
82
93
|
Widgets required explicit coordinates. To that effect the App class allowed for `Stack` and `Flow` (idea borrowed from
|
83
|
-
the **Shoes** project. This works well, but all stack and flow information is lost when controls are placed meaning that a
|
94
|
+
the **Shoes** project. This works well, but all stack and flow information is lost when controls are placed meaning that a
|
84
95
|
change in the window size (if user resizes) does not (and cannot) resize the application.
|
85
96
|
|
86
97
|
Canis has recently introduced Layout objects which have the ability to re-locate and resize objects when screen size
|
@@ -91,7 +102,7 @@ Currently there are three layout objects:
|
|
91
102
|
- `StackLayout` : does only stacking of objects (vertical placement)
|
92
103
|
- `FlowLayout` : does only horizontal placement of obects
|
93
104
|
- `SplitLayout` : allows for multiple stacks and flows by means of splitting a split either horizontally or vertically
|
94
|
-
and either placing an object in it, or splitting it further.
|
105
|
+
and either placing an object in it, or splitting it further.
|
95
106
|
These are based on an `AbstractLayout` which can be used to derive further layouts.
|
96
107
|
|
97
108
|
It is my intention to move usage over to these layouts since they are simpler, and allow for resizing (and to abandon
|
@@ -103,7 +114,7 @@ Issues canis would like to address:
|
|
103
114
|
I would like to do this before reaching 1.0.
|
104
115
|
|
105
116
|
- Keymapping. Currently, takes codes as integers, but i would have liked moving to strings as in vim.
|
106
|
-
Currently we have to map `?\C-a.getbytes(0)` or `[?g, ?g]`, whereas a string would allow us to map `"<C-x>s"`
|
117
|
+
Currently we have to map `?\C-a.getbytes(0)` or `[?g, ?g]`, whereas a string would allow us to map `"<C-x>s"`
|
107
118
|
or `"<F1>"` or `"gg"`. The issue is that there is too much rework within the library since each widget uses integer mappings.
|
108
119
|
Mapping and matching multiple keys would be a lot easier if stored internally as a string, currently multiple
|
109
120
|
mappings require a hash or tree at each level.
|
@@ -115,6 +126,9 @@ This tutorial needs to be updated for canis. Although, canis has diverged/forked
|
|
115
126
|
There is some on-line documentation of classes at:
|
116
127
|
http://rubydoc.info/gems/canis/0.0.8/frames
|
117
128
|
|
129
|
+
Umbra/ncumbra is at:
|
130
|
+
https://github.com/mare-imbrium/umbra
|
131
|
+
|
118
132
|
## Contributing
|
119
133
|
|
120
134
|
- Please give suggestions on how to improve the documentation.
|
data/examples/testdb.rb
CHANGED
@@ -105,7 +105,7 @@ begin
|
|
105
105
|
#file = "movies1000.txt"
|
106
106
|
|
107
107
|
arr = get_data
|
108
|
-
tv = Canis::Table.new @form, :row =>
|
108
|
+
tv = Canis::Table.new @form, :row => 2, :col => 0, :height => h, :width => w, :name => "tv", :suppress_borders => false do |b|
|
109
109
|
|
110
110
|
b.resultset $columns, arr
|
111
111
|
|
@@ -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:
|
12
|
+
* Last update: 2018-05-16 12:40
|
13
13
|
|
14
14
|
== CHANGES
|
15
15
|
* 2011-10-2 Added PropertyVetoException to rollback changes to property
|
@@ -97,15 +97,14 @@ class Module # dsl_accessor {{{
|
|
97
97
|
oldvalue = @#{sym}
|
98
98
|
tmp = val.size == 1 ? val[0] : val
|
99
99
|
newvalue = tmp
|
100
|
-
if
|
100
|
+
if @_object_created.nil?
|
101
101
|
@#{sym} = tmp
|
102
102
|
end
|
103
|
-
return(self) if
|
103
|
+
return(self) if @_object_created.nil?
|
104
104
|
|
105
105
|
if oldvalue != newvalue
|
106
106
|
# trying to reduce calls to fire, when object is being created
|
107
107
|
begin
|
108
|
-
@property_changed = true
|
109
108
|
fire_property_change("#{sym}", oldvalue, newvalue) if !oldvalue.nil?
|
110
109
|
@#{sym} = tmp
|
111
110
|
@config["#{sym}"]=@#{sym}
|
@@ -909,9 +908,9 @@ module Canis
|
|
909
908
|
# create a logger giving a path.
|
910
909
|
def create_logger path
|
911
910
|
#path = File.join(ENV["LOGDIR"] || "./" ,"canis14.log")
|
912
|
-
|
913
|
-
logg = Logger.new(
|
914
|
-
raise "Could not create logger
|
911
|
+
_path = File.open(path, File::WRONLY|File::TRUNC|File::CREAT)
|
912
|
+
logg = Logger.new(_path)
|
913
|
+
raise "Could not create logger: #{path}" unless logg
|
915
914
|
# if not set, will default to 0 which is debug. Other values are 1 - info, 2 - warn
|
916
915
|
logg.level = ENV["CANIS_LOG_LEVEL"].to_i
|
917
916
|
colors = Ncurses.COLORS
|
@@ -1023,12 +1022,11 @@ module Canis
|
|
1023
1022
|
return :NO_BLOCK
|
1024
1023
|
end # if
|
1025
1024
|
end
|
1026
|
-
## added on 2009-01-08 00:33
|
1027
1025
|
# goes with dsl_property
|
1028
|
-
# Need to inform listeners - done 2010-02-25 23:09
|
1029
1026
|
# Can throw a FieldValidationException or PropertyVetoException
|
1030
1027
|
def fire_property_change text, oldvalue, newvalue
|
1031
|
-
return if
|
1028
|
+
return if @_object_created.nil? # 2018-05-15 - removed check for nil, as object can be nil on creation
|
1029
|
+
# but set later.
|
1032
1030
|
#$log.debug " FPC #{self}: #{text} #{oldvalue}, #{newvalue}"
|
1033
1031
|
$log.debug " FPC #{self}: #{text} "
|
1034
1032
|
if @pce.nil?
|
@@ -1037,7 +1035,7 @@ module Canis
|
|
1037
1035
|
@pce.set( self, text, oldvalue, newvalue)
|
1038
1036
|
end
|
1039
1037
|
fire_handler :PROPERTY_CHANGE, @pce
|
1040
|
-
@repaint_required = true
|
1038
|
+
@repaint_required = true
|
1041
1039
|
repaint_all(true) # for repainting borders, headers etc 2011-09-28 V1.3.1
|
1042
1040
|
end
|
1043
1041
|
|
@@ -7,11 +7,11 @@
|
|
7
7
|
# Author: jkepler http://github.com/mare-imbrium/canis/
|
8
8
|
# Date: 2013-03-29 - 20:07
|
9
9
|
# License: Same as Ruby's License (http://www.ruby-lang.org/LICENSE.txt)
|
10
|
-
# Last update:
|
10
|
+
# Last update: 2019-03-12 15:17
|
11
11
|
# ----------------------------------------------------------------------------- #
|
12
12
|
# table.rb Copyright (C) 2012-2014 kepler
|
13
13
|
|
14
|
-
# == CHANGES:
|
14
|
+
# == CHANGES:
|
15
15
|
# - changed @content to @list since all multirow wids and utils expect @list
|
16
16
|
# - changed name from tablewidget to table
|
17
17
|
#
|
@@ -29,7 +29,7 @@ require 'logger'
|
|
29
29
|
require 'canis'
|
30
30
|
require 'canis/core/widgets/textpad'
|
31
31
|
|
32
|
-
##
|
32
|
+
##
|
33
33
|
# The motivation to create yet another table widget is because tabular_widget
|
34
34
|
# is based on textview etc which have a lot of complex processing and rendering
|
35
35
|
# whereas textpad is quite simple. It is easy to just add one's own renderer
|
@@ -83,8 +83,8 @@ module Canis
|
|
83
83
|
# It's a pretty simple sorter and uses sort, not sort_by.
|
84
84
|
# Improvements welcome.
|
85
85
|
# Usage: provide model in constructor or using model method
|
86
|
-
# Call toggle_sort_order(column_index)
|
87
|
-
# Call sort.
|
86
|
+
# Call toggle_sort_order(column_index)
|
87
|
+
# Call sort.
|
88
88
|
# Currently, this sorts the provided model in-place. Future versions
|
89
89
|
# may maintain a copy, or use a table that provides a mapping of model to result.
|
90
90
|
# # TODO check if column_sortable
|
@@ -123,11 +123,11 @@ module Canis
|
|
123
123
|
# with textpad, this way we avoid touching it
|
124
124
|
header = @model.delete_at 0
|
125
125
|
begin
|
126
|
-
# next line often can give error "array within array" - i think on date fields that
|
126
|
+
# next line often can give error "array within array" - i think on date fields that
|
127
127
|
# contain nils
|
128
|
-
@model.sort!{|x,y|
|
128
|
+
@model.sort!{|x,y|
|
129
129
|
res = 0
|
130
|
-
@sort_keys.each { |ee|
|
130
|
+
@sort_keys.each { |ee|
|
131
131
|
e = ee.abs-1 # since we had offsetted by 1 earlier
|
132
132
|
abse = e.abs
|
133
133
|
if ee < 0
|
@@ -173,7 +173,7 @@ module Canis
|
|
173
173
|
# internally, reverse sort is maintained by multiplying number by -1
|
174
174
|
@sort_keys ||= []
|
175
175
|
if @sort_keys.first && index == @sort_keys.first.abs
|
176
|
-
@sort_keys[0] *= -1
|
176
|
+
@sort_keys[0] *= -1
|
177
177
|
else
|
178
178
|
@sort_keys.delete index # in case its already there
|
179
179
|
@sort_keys.delete(index*-1) # in case its already there
|
@@ -241,7 +241,7 @@ module Canis
|
|
241
241
|
# and returns an array which is used for printing
|
242
242
|
#
|
243
243
|
# return an array so caller can color columns if need be
|
244
|
-
def convert_value_to_text r
|
244
|
+
def convert_value_to_text r
|
245
245
|
str = []
|
246
246
|
fmt = nil
|
247
247
|
field = nil
|
@@ -285,12 +285,12 @@ module Canis
|
|
285
285
|
def render pad, lineno, str
|
286
286
|
#lineno += 1 # header_adjustment
|
287
287
|
# header_adjustment means columns have been set
|
288
|
-
return render_header pad, lineno, 0, str if lineno == 0
|
288
|
+
return render_header pad, lineno, 0, str if lineno == 0 && @source.header_adjustment > 0
|
289
289
|
#text = str.join " | "
|
290
290
|
#text = @fmstr % str
|
291
291
|
text = convert_value_to_text str
|
292
292
|
if @_check_coloring
|
293
|
-
|
293
|
+
$log.debug "XXX: INSIDE COLORIIN"
|
294
294
|
text = colorize pad, lineno, text
|
295
295
|
return
|
296
296
|
end
|
@@ -314,7 +314,7 @@ module Canis
|
|
314
314
|
att = REVERSE
|
315
315
|
# FIXME currentl this overflows into next row
|
316
316
|
end
|
317
|
-
|
317
|
+
|
318
318
|
FFI::NCurses.wattron(pad,FFI::NCurses.COLOR_PAIR(cp) | att)
|
319
319
|
FFI::NCurses.mvwaddstr(pad, lineno, 0, text)
|
320
320
|
FFI::NCurses.wattroff(pad,FFI::NCurses.COLOR_PAIR(cp) | att)
|
@@ -323,6 +323,7 @@ module Canis
|
|
323
323
|
def render_header pad, lineno, col, columns
|
324
324
|
# I could do it once only but if user sets colors midway we can check once whenvever
|
325
325
|
# repainting
|
326
|
+
# $log.debug "INSIDE render_header XXXXX #{@source.name}, #{lineno}, #{col}"
|
326
327
|
check_colors #if @_check_coloring.nil?
|
327
328
|
#text = columns.join " | "
|
328
329
|
#text = @fmstr % columns
|
@@ -349,7 +350,7 @@ module Canis
|
|
349
350
|
}
|
350
351
|
end
|
351
352
|
def each_column
|
352
|
-
@chash.each_with_index { |c, i|
|
353
|
+
@chash.each_with_index { |c, i|
|
353
354
|
next if c.hidden
|
354
355
|
yield c,i if block_given?
|
355
356
|
}
|
@@ -395,10 +396,10 @@ module Canis
|
|
395
396
|
# focus, and should be used for row operations.
|
396
397
|
#
|
397
398
|
# In order to use Textpad easily, the first row of the table model is the column names. Data is maintained
|
398
|
-
# in an Array. Several operations are delegated to Array, or have the same name. You can get the list
|
399
|
+
# in an Array. Several operations are delegated to Array, or have the same name. You can get the list
|
399
400
|
# using `list()` to run other Array operations on it.
|
400
401
|
#
|
401
|
-
# If you modify the Array directly, you may have to use `fire_row_changed(index)` to reflect the update to
|
402
|
+
# If you modify the Array directly, you may have to use `fire_row_changed(index)` to reflect the update to
|
402
403
|
# a single row. If you delete or add a row, you will have to use `fire_dimension_changed()`. However,
|
403
404
|
# internal functions do this automatically.
|
404
405
|
#
|
@@ -418,12 +419,12 @@ module Canis
|
|
418
419
|
# When printing we should loop through chash and get the index in data
|
419
420
|
#
|
420
421
|
# should be zero here, but then we won't get textpad correct
|
421
|
-
@_header_adjustment = 0
|
422
|
+
@_header_adjustment = 0
|
422
423
|
@col_min_width = 3
|
423
424
|
|
424
425
|
self.extend DefaultListSelection
|
425
426
|
super
|
426
|
-
create_default_renderer unless @renderer # 2014-04-10 - 11:01
|
427
|
+
create_default_renderer unless @renderer # 2014-04-10 - 11:01
|
427
428
|
# NOTE listselection takes + and - for ask_select
|
428
429
|
bind_key(?w, "next column") { self.next_column }
|
429
430
|
bind_key(?b, "prev column") { self.prev_column }
|
@@ -441,9 +442,9 @@ module Canis
|
|
441
442
|
@list_selection_model = nil
|
442
443
|
@list_selection_model = Canis::DefaultListSelectionModel.new self
|
443
444
|
end
|
444
|
-
|
445
|
+
|
445
446
|
# retrieve the column info structure for the given offset. The offset
|
446
|
-
# pertains to the visible offset not actual offset in data model.
|
447
|
+
# pertains to the visible offset not actual offset in data model.
|
447
448
|
# These two differ when we move a column.
|
448
449
|
# @return ColumnInfo object containing width align color bgcolor attrib hidden
|
449
450
|
def get_column index
|
@@ -454,7 +455,7 @@ module Canis
|
|
454
455
|
@chash[index] = c
|
455
456
|
return c
|
456
457
|
end
|
457
|
-
##
|
458
|
+
##
|
458
459
|
# returns collection of ColumnInfo objects
|
459
460
|
def column_model
|
460
461
|
@chash
|
@@ -463,8 +464,8 @@ module Canis
|
|
463
464
|
# calculate pad width based on widths of columns
|
464
465
|
def content_cols
|
465
466
|
total = 0
|
466
|
-
#@chash.each_pair { |i, c|
|
467
|
-
#@chash.each_with_index { |c, i|
|
467
|
+
#@chash.each_pair { |i, c|
|
468
|
+
#@chash.each_with_index { |c, i|
|
468
469
|
#next if c.hidden
|
469
470
|
each_column {|c,i|
|
470
471
|
w = c.width
|
@@ -474,7 +475,7 @@ module Canis
|
|
474
475
|
return total
|
475
476
|
end
|
476
477
|
|
477
|
-
#
|
478
|
+
#
|
478
479
|
# This calculates and stores the offset at which each column starts.
|
479
480
|
# Used when going to next column or doing a find for a string in the table.
|
480
481
|
# TODO store this inside the hash so it's not calculated again in renderer
|
@@ -483,8 +484,8 @@ module Canis
|
|
483
484
|
@coffsets = []
|
484
485
|
total = 0
|
485
486
|
|
486
|
-
#@chash.each_pair { |i, c|
|
487
|
-
#@chash.each_with_index { |c, i|
|
487
|
+
#@chash.each_pair { |i, c|
|
488
|
+
#@chash.each_with_index { |c, i|
|
488
489
|
#next if c.hidden
|
489
490
|
each_column {|c,i|
|
490
491
|
w = c.width
|
@@ -501,10 +502,10 @@ module Canis
|
|
501
502
|
def _convert_curpos_to_column #:nodoc:
|
502
503
|
_calculate_column_offsets unless @coffsets
|
503
504
|
x = 0
|
504
|
-
@coffsets.each_with_index { |i, ix|
|
505
|
-
if @curpos < i
|
505
|
+
@coffsets.each_with_index { |i, ix|
|
506
|
+
if @curpos < i
|
506
507
|
break
|
507
|
-
else
|
508
|
+
else
|
508
509
|
x += 1
|
509
510
|
end
|
510
511
|
}
|
@@ -526,7 +527,7 @@ module Canis
|
|
526
527
|
# TODO take care of multipliers
|
527
528
|
_calculate_column_offsets unless @coffsets
|
528
529
|
c = @column_pointer.next
|
529
|
-
cp = @coffsets[c]
|
530
|
+
cp = @coffsets[c]
|
530
531
|
#$log.debug " next_column #{c} , #{cp} "
|
531
532
|
@curpos = cp if cp
|
532
533
|
down() if c < @column_pointer.last_index
|
@@ -538,13 +539,13 @@ module Canis
|
|
538
539
|
# TODO take care of multipliers
|
539
540
|
_calculate_column_offsets unless @coffsets
|
540
541
|
c = @column_pointer.previous
|
541
|
-
cp = @coffsets[c]
|
542
|
+
cp = @coffsets[c]
|
542
543
|
#$log.debug " prev #{c} , #{cp} "
|
543
544
|
@curpos = cp if cp
|
544
545
|
up() if c > @column_pointer.last_index
|
545
546
|
fire_column_event :ENTER_COLUMN
|
546
547
|
end
|
547
|
-
# a column traversal has happened.
|
548
|
+
# a column traversal has happened.
|
548
549
|
# FIXME needs to be looked into. is this consistent naming wise and are we using the correct object
|
549
550
|
# In old system it was TABLE_TRAVERSAL_EVENT
|
550
551
|
def fire_column_event eve
|
@@ -579,7 +580,7 @@ module Canis
|
|
579
580
|
end
|
580
581
|
def contract_column
|
581
582
|
x = _convert_curpos_to_column
|
582
|
-
w = get_column(x).width
|
583
|
+
w = get_column(x).width
|
583
584
|
return if w <= @col_min_width
|
584
585
|
column_width x, w-1 if w
|
585
586
|
@coffsets = nil
|
@@ -601,7 +602,7 @@ module Canis
|
|
601
602
|
|
602
603
|
##
|
603
604
|
# getter and setter for columns
|
604
|
-
# 2014-04-10 - 13:49
|
605
|
+
# 2014-04-10 - 13:49
|
605
606
|
# @param [Array] columns to set as Array of Strings
|
606
607
|
# @return if no args, returns array of column names as Strings
|
607
608
|
# NOTE
|
@@ -620,10 +621,11 @@ module Canis
|
|
620
621
|
@list << array
|
621
622
|
_init_model array
|
622
623
|
|
623
|
-
# update the names in column model
|
624
|
-
array.each_with_index { |n,i|
|
624
|
+
# update the names in column model
|
625
|
+
array.each_with_index { |n,i|
|
625
626
|
c = get_column(i)
|
626
|
-
c.name = name
|
627
|
+
#c.name = name ## 2018-05-19 - seems to be a bug
|
628
|
+
c.name = n
|
627
629
|
}
|
628
630
|
self
|
629
631
|
end
|
@@ -647,7 +649,7 @@ module Canis
|
|
647
649
|
def _init_model array
|
648
650
|
# clear the column data -- this line should be called otherwise previous tables stuff will remain.
|
649
651
|
@chash.clear
|
650
|
-
array.each_with_index { |e,i|
|
652
|
+
array.each_with_index { |e,i|
|
651
653
|
# if columns added later we could be overwriting the width
|
652
654
|
c = get_column(i)
|
653
655
|
c.width ||= 10
|
@@ -658,7 +660,7 @@ module Canis
|
|
658
660
|
# size each column based on widths of this row of data.
|
659
661
|
def model_row index
|
660
662
|
array = @list[index]
|
661
|
-
array.each_with_index { |c,i|
|
663
|
+
array.each_with_index { |c,i|
|
662
664
|
# if columns added later we could be overwriting the width
|
663
665
|
ch = get_column(i)
|
664
666
|
ch.width = c.to_s.length + 2
|
@@ -670,7 +672,7 @@ module Canis
|
|
670
672
|
# estimate columns widths based on data in first 10 or so rows
|
671
673
|
# This will override any previous widths, so put custom widths
|
672
674
|
# after calling this.
|
673
|
-
def estimate_column_widths
|
675
|
+
def estimate_column_widths
|
674
676
|
each_column {|c,i|
|
675
677
|
c.width = suggest_column_width(i)
|
676
678
|
}
|
@@ -683,7 +685,7 @@ module Canis
|
|
683
685
|
#ret = @cw[col] || 2
|
684
686
|
ret = get_column(col).width || 2
|
685
687
|
ctr = 0
|
686
|
-
@list.each_with_index { |r, i|
|
688
|
+
@list.each_with_index { |r, i|
|
687
689
|
#next if i < @toprow # this is also a possibility, it checks visible rows
|
688
690
|
break if ctr > 10
|
689
691
|
ctr += 1
|
@@ -736,7 +738,7 @@ module Canis
|
|
736
738
|
#
|
737
739
|
# table = Table.new ...
|
738
740
|
# table.filename 'contacts.tsv', :separator => '|', :columns => true
|
739
|
-
#
|
741
|
+
#
|
740
742
|
def filename name, _config = {}
|
741
743
|
arr = File.open(name,"r").read.split("\n")
|
742
744
|
lines = []
|
@@ -782,7 +784,7 @@ module Canis
|
|
782
784
|
l = @list
|
783
785
|
end
|
784
786
|
|
785
|
-
File.open(outfile, 'w') {|f|
|
787
|
+
File.open(outfile, 'w') {|f|
|
786
788
|
l.each {|r|
|
787
789
|
line = r.join "\t"
|
788
790
|
f.puts line
|
@@ -805,7 +807,7 @@ module Canis
|
|
805
807
|
end
|
806
808
|
alias :<< :add
|
807
809
|
|
808
|
-
# delete a data row at index
|
810
|
+
# delete a data row at index
|
809
811
|
#
|
810
812
|
# NOTE : This does not adjust for header_adjustment. So zero will refer to the header if there is one.
|
811
813
|
# This is to keep consistent with textpad which does not know of header_adjustment and uses the actual
|
@@ -813,7 +815,7 @@ module Canis
|
|
813
815
|
#
|
814
816
|
def delete_at ix
|
815
817
|
return unless @list
|
816
|
-
raise ArgumentError, "Argument must be within 0 and #{@list.length}" if ix < 0 or ix >= @list.length
|
818
|
+
raise ArgumentError, "Argument must be within 0 and #{@list.length}" if ix < 0 or ix >= @list.length
|
817
819
|
fire_dimension_changed
|
818
820
|
#@list.delete_at(ix + @_header_adjustment)
|
819
821
|
@list.delete_at(ix)
|
@@ -843,7 +845,7 @@ module Canis
|
|
843
845
|
fire_row_changed actrow
|
844
846
|
self
|
845
847
|
end
|
846
|
-
|
848
|
+
|
847
849
|
#------- column related methods ------#
|
848
850
|
#
|
849
851
|
# convenience method to set width of a column
|
@@ -871,11 +873,11 @@ module Canis
|
|
871
873
|
def _invalidate_width_cache #:nodoc:
|
872
874
|
@coffsets = nil
|
873
875
|
end
|
874
|
-
##
|
876
|
+
##
|
875
877
|
# should all this move into table column model or somepn
|
876
878
|
# move a column from offset ix to offset newix
|
877
879
|
def move_column ix, newix
|
878
|
-
acol = @chash.delete_at ix
|
880
|
+
acol = @chash.delete_at ix
|
879
881
|
@chash.insert newix, acol
|
880
882
|
_invalidate_width_cache
|
881
883
|
#tmce = TableColumnModelEvent.new(ix, newix, self, :MOVE)
|
@@ -894,7 +896,7 @@ module Canis
|
|
894
896
|
def calculate_column_width col, maxrows=99
|
895
897
|
ret = 3
|
896
898
|
ctr = 0
|
897
|
-
@list.each_with_index { |r, i|
|
899
|
+
@list.each_with_index { |r, i|
|
898
900
|
#next if i < @toprow # this is also a possibility, it checks visible rows
|
899
901
|
break if ctr > maxrows
|
900
902
|
ctr += 1
|
@@ -914,10 +916,22 @@ module Canis
|
|
914
916
|
sr = @startrow + top
|
915
917
|
sc = @startcol + left
|
916
918
|
# first do header always in first row
|
917
|
-
|
919
|
+
# -- prefresh arguments are:
|
920
|
+
# 1. pad
|
921
|
+
# 2. pminrow
|
922
|
+
# 3. pmincol (pad upper left)
|
923
|
+
# 4, sminrow (screen upper left row)
|
924
|
+
# 5, smincol
|
925
|
+
# 6, smaxrow
|
926
|
+
# 7, smaxcol
|
927
|
+
|
928
|
+
# 2019-03-12 - fixed bug in table, only printed header if table on row 1
|
929
|
+
retval = FFI::NCurses.prefresh(@pad, @prow, @pcol, sr, sc, sr + 1, @cols + sc)
|
930
|
+
$log.warn "XXX: PADREFRESH HEADER #{retval}, #{@prow}, #{@pcol}, #{sr}, #{sc}, #{1+sr}, #{@cols+sc}." if retval == -1
|
931
|
+
# retval = FFI::NCurses.prefresh(@pad,0,@pcol, sr , sc , 2 , @cols+ sc );
|
918
932
|
# now print rest of data
|
919
933
|
# h is header_adjustment
|
920
|
-
h = 1
|
934
|
+
h = 1
|
921
935
|
retval = FFI::NCurses.prefresh(@pad,@prow + h,@pcol, sr + h , sc , @rows + sr , @cols+ sc );
|
922
936
|
$log.warn "XXX: PADREFRESH #{retval}, #{@prow}, #{@pcol}, #{sr}, #{sc}, #{@rows+sr}, #{@cols+sc}." if retval == -1
|
923
937
|
# padrefresh can fail if width is greater than NCurses.COLS
|
@@ -930,7 +944,7 @@ module Canis
|
|
930
944
|
# set a default renderer
|
931
945
|
#--
|
932
946
|
# we were not doing this automatically, so repaint was going to TP and failing on mvaddstr
|
933
|
-
# 2014-04-10 - 10:57
|
947
|
+
# 2014-04-10 - 10:57
|
934
948
|
#++
|
935
949
|
def create_default_renderer
|
936
950
|
r = DefaultTableRenderer.new self
|
@@ -958,7 +972,7 @@ module Canis
|
|
958
972
|
end
|
959
973
|
super
|
960
974
|
end
|
961
|
-
##
|
975
|
+
##
|
962
976
|
# Find the next row that contains given string
|
963
977
|
# Overrides textpad since each line is an array
|
964
978
|
# NOTE does not go to next match within row
|
@@ -982,7 +996,7 @@ module Canis
|
|
982
996
|
# value can be numeric
|
983
997
|
col = f.to_s.index str
|
984
998
|
if col
|
985
|
-
col += @coffsets[jx]
|
999
|
+
col += @coffsets[jx]
|
986
1000
|
first ||= [ ix, col ]
|
987
1001
|
if ix > @current_index
|
988
1002
|
return [ix, col]
|
@@ -996,14 +1010,14 @@ module Canis
|
|
996
1010
|
# if yield returns true, collects index of row into array and returns the array
|
997
1011
|
# @returns array of indices which can be empty
|
998
1012
|
# Value yielded can be fixnum or date etc
|
999
|
-
def matching_indices
|
1013
|
+
def matching_indices
|
1000
1014
|
raise "block required for matching_indices" unless block_given?
|
1001
1015
|
@indices = []
|
1002
1016
|
## content can be string or Chunkline, so we had to write <tt>index</tt> for this.
|
1003
1017
|
@list.each_with_index do |fields, ix|
|
1004
1018
|
flag = yield ix, fields
|
1005
1019
|
if flag
|
1006
|
-
@indices << ix
|
1020
|
+
@indices << ix
|
1007
1021
|
end
|
1008
1022
|
end
|
1009
1023
|
#$log.debug "XXX: INDICES found #{@indices}"
|
@@ -1023,7 +1037,7 @@ module Canis
|
|
1023
1037
|
end
|
1024
1038
|
@indices = nil
|
1025
1039
|
end
|
1026
|
-
##
|
1040
|
+
##
|
1027
1041
|
# Ensure current row is visible, if not make it first row
|
1028
1042
|
# This overrides textpad due to header_adjustment, otherwise
|
1029
1043
|
# during next_match, the header overrides the found row.
|
@@ -1038,7 +1052,7 @@ module Canis
|
|
1038
1052
|
# yields non-hidden columns (ColumnInfo) and the offset/index
|
1039
1053
|
# This is the order in which columns are to be printed
|
1040
1054
|
def each_column
|
1041
|
-
@chash.each_with_index { |c, i|
|
1055
|
+
@chash.each_with_index { |c, i|
|
1042
1056
|
next if c.hidden
|
1043
1057
|
yield c,i if block_given?
|
1044
1058
|
}
|
@@ -1051,7 +1065,7 @@ module Canis
|
|
1051
1065
|
end
|
1052
1066
|
else
|
1053
1067
|
@list.each_with_index { |line, ix|
|
1054
|
-
#FFI::NCurses.mvwaddstr(@pad,ix, 0, @list[ix])
|
1068
|
+
# FFI::NCurses.mvwaddstr(@pad,ix, 0, @list[ix].to_s)
|
1055
1069
|
render @pad, ix, line
|
1056
1070
|
}
|
1057
1071
|
end
|
@@ -1063,8 +1077,8 @@ module Canis
|
|
1063
1077
|
ha = @_header_adjustment
|
1064
1078
|
# ha takes into account whether there are headers or not
|
1065
1079
|
footer = "#{@current_index+1-ha} of #{@list.length-ha} "
|
1066
|
-
@graphic.printstring( @row + @height -1 , @col+2, footer, @color_pair || $datacolor, @footer_attrib)
|
1067
|
-
@repaint_footer_required = false
|
1080
|
+
@graphic.printstring( @row + @height -1 , @col+2, footer, @color_pair || $datacolor, @footer_attrib)
|
1081
|
+
@repaint_footer_required = false
|
1068
1082
|
end
|
1069
1083
|
|
1070
1084
|
end # class Table
|
@@ -4,17 +4,17 @@
|
|
4
4
|
# ----------------------------------------------------------------------------- #
|
5
5
|
# File: textpad.rb
|
6
6
|
# Description: A class that displays text using a pad.
|
7
|
-
# The motivation for this is to put formatted text and not care about truncating and
|
7
|
+
# The motivation for this is to put formatted text and not care about truncating and
|
8
8
|
# stuff. Also, there will be only one write, not each time scrolling happens.
|
9
9
|
# I found textview code for repaint being more complex than required.
|
10
10
|
# Author: jkepler http://github.com/mare-imbrium/mancurses/
|
11
11
|
# Date: 2011-11-09 - 16:59
|
12
12
|
# License: Same as Ruby's License (http://www.ruby-lang.org/LICENSE.txt)
|
13
|
-
# Last update:
|
13
|
+
# Last update: 2019-03-12 00:17
|
14
14
|
#
|
15
15
|
# == CHANGES
|
16
16
|
# - changed @content to @list since all multirow widgets use that and so do utils etc
|
17
|
-
# == TODO
|
17
|
+
# == TODO
|
18
18
|
# Take care of 3 cases:
|
19
19
|
# 1. complete data change, then recreate pad, and call init_vars resetting row, col and curpos etc
|
20
20
|
# This is done by method text().
|
@@ -33,7 +33,7 @@ require 'forwardable'
|
|
33
33
|
include Canis
|
34
34
|
module Canis
|
35
35
|
extend self
|
36
|
-
class TextPad < Widget #
|
36
|
+
class TextPad < Widget #
|
37
37
|
include BorderTitle
|
38
38
|
extend Forwardable
|
39
39
|
|
@@ -116,17 +116,17 @@ module Canis
|
|
116
116
|
end
|
117
117
|
|
118
118
|
# calculates the dimensions of the pad which will be used when the pad refreshes, taking into account
|
119
|
-
# whether borders are printed or not. This must be called whenever there is a change in height or width
|
119
|
+
# whether borders are printed or not. This must be called whenever there is a change in height or width
|
120
120
|
# otherwise @rows will not be recalculated.
|
121
121
|
# Internal.
|
122
122
|
def __calc_dimensions
|
123
|
-
## NOTE
|
123
|
+
## NOTE
|
124
124
|
# ---------------------------------------------------
|
125
125
|
# Since we are using pads, you need to get your height, width and rows correct
|
126
126
|
# Make sure the height factors in the row, else nothing may show
|
127
127
|
# ---------------------------------------------------
|
128
|
-
|
129
|
-
|
128
|
+
|
129
|
+
|
130
130
|
raise " CALC inside #{@name} h or w is nil #{@height} , #{@width} " if @height.nil? or @width.nil?
|
131
131
|
@rows = @height
|
132
132
|
@cols = @width
|
@@ -149,13 +149,13 @@ module Canis
|
|
149
149
|
#@cols -=0
|
150
150
|
@cols -=1
|
151
151
|
@scrollatrows = @height - 1 # check this out 0 or 1
|
152
|
-
@row_offset = @col_offset = 0
|
152
|
+
@row_offset = @col_offset = 0
|
153
153
|
end
|
154
154
|
@top = @row
|
155
155
|
@left = @col
|
156
156
|
@lastrow = @row + @row_offset
|
157
157
|
@lastcol = @col + @col_offset
|
158
|
-
$log.debug " CALC_DIMENSION
|
158
|
+
$log.debug " CALC_DIMENSION r:#{@rows} , c:#{@cols}, h:#{@height} , w:#{@width} , top:#{@top} , left:#{@left} "
|
159
159
|
end
|
160
160
|
def scrollatrows
|
161
161
|
unless @suppress_borders
|
@@ -189,12 +189,12 @@ module Canis
|
|
189
189
|
## creates the pad
|
190
190
|
def create_pad
|
191
191
|
destroy if @pad
|
192
|
-
#$log.debug "XXXCP: create_pad #{@content_rows} #{@content_cols} , w:#{@width} c #{@cols} , r: #{@rows}"
|
192
|
+
#$log.debug "XXXCP: create_pad #{@content_rows} #{@content_cols} , w:#{@width} c #{@cols} , r: #{@rows}"
|
193
193
|
|
194
194
|
@content_rows = @content_cols = nil
|
195
195
|
@content_rows = pad_rows()
|
196
196
|
@content_cols = pad_cols()
|
197
|
-
$log.debug "XXXCP: create_pad :#{@content_rows} , #{@content_cols} . w:#{@width} c #{@cols} , r: #{@rows}"
|
197
|
+
$log.debug "XXXCP: create_pad :#{@content_rows} , #{@content_cols} . w:#{@width} c #{@cols} , r: #{@rows}"
|
198
198
|
raise "create_pad content_rows is nil " unless @content_rows
|
199
199
|
raise "create_pad content_cols is nil " unless @content_cols
|
200
200
|
|
@@ -204,7 +204,7 @@ module Canis
|
|
204
204
|
# content_rows can be more than size of pad, but never less. Same for cols.
|
205
205
|
# height of pad, or number of row, earlier called @content_rows
|
206
206
|
public
|
207
|
-
def pad_rows
|
207
|
+
def pad_rows
|
208
208
|
# content_rows can be more than size of pad, but never less. Same for cols.
|
209
209
|
return @content_rows if @content_rows
|
210
210
|
content_rows = @list.count
|
@@ -234,7 +234,7 @@ module Canis
|
|
234
234
|
@clearstring = nil
|
235
235
|
$log.debug " populate pad color = #{@color} , bg = #{@bgcolor} "
|
236
236
|
#cp = get_color($datacolor, color(), bgcolor())
|
237
|
-
# commenting off next line meant that textdialog had a black background 2014-05-01 - 23:37
|
237
|
+
# commenting off next line meant that textdialog had a black background 2014-05-01 - 23:37
|
238
238
|
#@cp = FFI::NCurses.COLOR_PAIR(cp)
|
239
239
|
# we seem to be clearing always since a pad is often reused. so making the variable whenever pad created.
|
240
240
|
|
@@ -271,7 +271,7 @@ module Canis
|
|
271
271
|
# REST IS REQUIRED otherwise sometimes last line of window is not cleared
|
272
272
|
# Happens in bline.rb. i think the above clears the new pad size in the window
|
273
273
|
# which if it is smaller then does not clear complete window.
|
274
|
-
## TRYING OUT COMMENTING OFF THE REMAINDER 2014-05-31 - 14:35
|
274
|
+
## TRYING OUT COMMENTING OFF THE REMAINDER 2014-05-31 - 14:35
|
275
275
|
# next part is messing up messageboxes which have a white background
|
276
276
|
# so i use this copied from print_border
|
277
277
|
# In messageboxes the border is more inside. but pad cannot clear the entire
|
@@ -292,7 +292,7 @@ module Canis
|
|
292
292
|
sp = " " * ww
|
293
293
|
#if color == $datacolor
|
294
294
|
$log.debug " clear_pad: colors #{@cp}, ( #{_bgcolor} #{_color} ) #{$datacolor} , attrib #{att} . r #{r} w #{ww}, h #{@height} top #{@window.top} "
|
295
|
-
# 2014-05-15 - 11:01 seems we were clearing an extra row at bottom.
|
295
|
+
# 2014-05-15 - 11:01 seems we were clearing an extra row at bottom.
|
296
296
|
# earlier it was r+1 but that was missing the first row, so now made it r+0 2014-06-20 - 01:15 XXX
|
297
297
|
(r+0).upto(r+@height-startcol-1) do |rr|
|
298
298
|
@window.printstring( rr, _col ,sp , color, att)
|
@@ -317,7 +317,7 @@ module Canis
|
|
317
317
|
public
|
318
318
|
def padrefresh
|
319
319
|
# sometimes padref is called directly from somewhere but dimensions have changed.
|
320
|
-
# 2014-05-27 - 11:42
|
320
|
+
# 2014-05-27 - 11:42
|
321
321
|
unless @__first_time
|
322
322
|
__calc_dimensions
|
323
323
|
@__first_time = true
|
@@ -350,7 +350,7 @@ module Canis
|
|
350
350
|
#sr -= _t
|
351
351
|
#$log.warn "XXX PADRE after correcting ser #{sr} and #{ser} "
|
352
352
|
end
|
353
|
-
# there are some freak cases where prow or pcol comes as -1, but prefresh does not return a -1. However, this
|
353
|
+
# there are some freak cases where prow or pcol comes as -1, but prefresh does not return a -1. However, this
|
354
354
|
# could affect some other calculation somewhere.
|
355
355
|
|
356
356
|
retval = FFI::NCurses.prefresh(@pad,@prow,@pcol, sr , sc , ser , sec );
|
@@ -376,10 +376,11 @@ module Canis
|
|
376
376
|
#$log.debug "XXX: PADREFRESH #{retval} #{self.class}, #{@prow}, #{@pcol}, #{sr}, #{sc}, #{ser}, #{sec}." if retval == 0
|
377
377
|
# padrefresh can fail if width is greater than NCurses.COLS
|
378
378
|
# or if height exceeds tput lines. As long as content is less, it will work
|
379
|
-
# the moment content_rows exceeds then this issue happens.
|
379
|
+
# the moment content_rows exceeds then this issue happens.
|
380
380
|
# @rows + sr < tput lines
|
381
381
|
#FFI::NCurses.prefresh(@pad,@prow,@pcol, @startrow + top, @startcol + left, @rows + @startrow + top, @cols+@startcol + left);
|
382
382
|
end
|
383
|
+
|
383
384
|
# length of longest string in array
|
384
385
|
# This will give a 'wrong' max length if the array has ansi color escape sequences in it
|
385
386
|
# which inc the length but won't be printed. Such lines actually have less length when printed
|
@@ -390,10 +391,12 @@ module Canis
|
|
390
391
|
return 0 unless longest
|
391
392
|
longest.length
|
392
393
|
end
|
394
|
+
|
393
395
|
public
|
394
|
-
|
396
|
+
|
397
|
+
# to be called with program / user has added a row or changed column widths so that
|
395
398
|
# the pad needs to be recreated. However, cursor positioning is maintained since this
|
396
|
-
# is considered to be a minor change.
|
399
|
+
# is considered to be a minor change.
|
397
400
|
# We do not call `init_vars` since user is continuing to do some work on a row/col.
|
398
401
|
# NOTE : if height and width are changed then only render_all is required
|
399
402
|
# not a reparse since content has not changed.
|
@@ -405,7 +408,7 @@ module Canis
|
|
405
408
|
fire_handler :DIMENSION_CHANGED, _method
|
406
409
|
@__first_time = nil
|
407
410
|
end
|
408
|
-
# repaint only one row since content of that row has changed.
|
411
|
+
# repaint only one row since content of that row has changed.
|
409
412
|
# No recreate of pad is done.
|
410
413
|
def fire_row_changed ix
|
411
414
|
return if ix >= @list.length
|
@@ -414,7 +417,7 @@ module Canis
|
|
414
417
|
fire_handler :ROW_CHANGED, ix
|
415
418
|
_arr = _getarray
|
416
419
|
render @pad, ix, _arr[ix]
|
417
|
-
|
420
|
+
|
418
421
|
end
|
419
422
|
# ---- end pad related ----- }}}
|
420
423
|
# ---- Section render related ----- {{{
|
@@ -447,13 +450,13 @@ module Canis
|
|
447
450
|
# in Window and Pad stuff and perhaps include it conditionally.
|
448
451
|
|
449
452
|
|
450
|
-
# before updating a single row in a table
|
453
|
+
# before updating a single row in a table
|
451
454
|
# we need to clear the row otherwise previous contents can show through
|
452
455
|
def clear_row pad, lineno
|
453
456
|
if @renderer and @renderer.respond_to? :clear_row
|
454
457
|
@renderer.clear_row pad, lineno
|
455
458
|
else
|
456
|
-
# need pad width not window width, the other clearstring uses width of
|
459
|
+
# need pad width not window width, the other clearstring uses width of
|
457
460
|
# widget to paint on window.
|
458
461
|
@_clearstring ||= " " * @content_cols
|
459
462
|
# what about bg color ??? XXX, left_margin and internal width
|
@@ -461,7 +464,7 @@ module Canis
|
|
461
464
|
cp = @cp || FFI::NCurses.COLOR_PAIR($datacolor)
|
462
465
|
att = attr() || NORMAL
|
463
466
|
FFI::NCurses.wattron(pad,cp | att)
|
464
|
-
FFI::NCurses.mvwaddstr(pad,lineno, 0, @_clearstring)
|
467
|
+
FFI::NCurses.mvwaddstr(pad,lineno, 0, @_clearstring)
|
465
468
|
FFI::NCurses.wattroff(pad,cp | att)
|
466
469
|
end
|
467
470
|
end
|
@@ -471,7 +474,7 @@ module Canis
|
|
471
474
|
return unless @print_footer
|
472
475
|
return unless @suppress_borders
|
473
476
|
footer = "R: #{@current_index+1}, C: #{@curpos+@pcol}, #{@list.length} lines "
|
474
|
-
@graphic.printstring( @row + @height -1 , @col+2, footer, @color_pair || $datacolor, @footer_attrib)
|
477
|
+
@graphic.printstring( @row + @height -1 , @col+2, footer, @color_pair || $datacolor, @footer_attrib)
|
475
478
|
=begin
|
476
479
|
if @list_footer
|
477
480
|
if false
|
@@ -480,18 +483,18 @@ module Canis
|
|
480
483
|
footer_attrib = @list_footer.config[:attrib] || Ncurses::A_REVERSE
|
481
484
|
#footer = "R: #{@current_index+1}, C: #{@curpos+@pcol}, #{@list.length} lines "
|
482
485
|
$log.debug " print_foot calling printstring with #{@row} + #{@height} -1, #{@col}+2"
|
483
|
-
@graphic.printstring( @row + @height -1 , @col+2, footer, @color_pair || $datacolor, footer_attrib)
|
486
|
+
@graphic.printstring( @row + @height -1 , @col+2, footer, @color_pair || $datacolor, footer_attrib)
|
484
487
|
end
|
485
488
|
# use default print method which only prints on left
|
486
489
|
@list_footer.print self
|
487
490
|
end
|
488
491
|
=end
|
489
|
-
@repaint_footer_required = false # 2010-01-23 22:55
|
492
|
+
@repaint_footer_required = false # 2010-01-23 22:55
|
490
493
|
end
|
491
494
|
|
492
495
|
# ---- Section render related end ----- }}}
|
493
496
|
# ---- Section data related start {{{
|
494
|
-
|
497
|
+
|
495
498
|
# supply a filename as source for textpad
|
496
499
|
# Reads up file into @list
|
497
500
|
# One can optionally send in a method which takes a filename and returns an array of data
|
@@ -553,7 +556,7 @@ module Canis
|
|
553
556
|
|
554
557
|
@document = val[0]
|
555
558
|
@document.source ||= self
|
556
|
-
@document.parse_required # added 2014-09-03 - 17:54
|
559
|
+
@document.parse_required # added 2014-09-03 - 17:54
|
557
560
|
@list = @document.text
|
558
561
|
when Array
|
559
562
|
# This is the complex case which i would like to phase out.
|
@@ -597,7 +600,7 @@ module Canis
|
|
597
600
|
|
598
601
|
@document = val
|
599
602
|
@document.source ||= self
|
600
|
-
@document.parse_required # added 2014-09-03 - 17:54
|
603
|
+
@document.parse_required # added 2014-09-03 - 17:54
|
601
604
|
@list = @document.text
|
602
605
|
end
|
603
606
|
@_populate_needed = true
|
@@ -618,8 +621,8 @@ module Canis
|
|
618
621
|
fmt = val.size == 2 ? val[1] : nil
|
619
622
|
case fmt
|
620
623
|
when Hash
|
621
|
-
#raise "textpad.text expected content_type in Hash : #{fmt}"
|
622
|
-
c = fmt[:content_type]
|
624
|
+
#raise "textpad.text expected content_type in Hash : #{fmt}"
|
625
|
+
c = fmt[:content_type]
|
623
626
|
t = fmt[:title]
|
624
627
|
@title = t if t
|
625
628
|
@content_type = c if c
|
@@ -631,11 +634,11 @@ module Canis
|
|
631
634
|
@content_type = fmt
|
632
635
|
when NilClass
|
633
636
|
else
|
634
|
-
raise "textpad.text expected symbol or content_type in Hash, got #{fmt.class} "
|
637
|
+
raise "textpad.text expected symbol or content_type in Hash, got #{fmt.class} "
|
635
638
|
end
|
636
639
|
|
637
640
|
## some programs like testlistbox which uses multibuffers calls this with a config
|
638
|
-
# in arg2 containing :content_type and :title
|
641
|
+
# in arg2 containing :content_type and :title
|
639
642
|
|
640
643
|
|
641
644
|
# added so callers can have one interface and avoid an if condition
|
@@ -708,7 +711,7 @@ module Canis
|
|
708
711
|
#@native_text[@current_index]
|
709
712
|
_getarray[@current_index]
|
710
713
|
end
|
711
|
-
## NOTE : 2014-04-09 - 14:05 i think this does not have line wise operations since we deal with
|
714
|
+
## NOTE : 2014-04-09 - 14:05 i think this does not have line wise operations since we deal with
|
712
715
|
# formatting of data
|
713
716
|
# But what if data is not formatted. This imposes a severe limitation. listbox does have linewise
|
714
717
|
# operations, so lets try them
|
@@ -723,10 +726,10 @@ module Canis
|
|
723
726
|
self
|
724
727
|
end
|
725
728
|
# @deprecated : row_count used just for compat, use length or size
|
726
|
-
def row_count ; @list.length ; end
|
729
|
+
def row_count ; @list.length ; end
|
727
730
|
|
728
731
|
## ------ LIST / ARRAY OPERATIONS ----
|
729
|
-
# All multirow widgets must use Array semantics 2014-04-10 - 17:29
|
732
|
+
# All multirow widgets must use Array semantics 2014-04-10 - 17:29
|
730
733
|
# NOTE some operations will make selected indices in selection modules invalid
|
731
734
|
# clear will need to clear indices, delete_at and insert may need to also adjust
|
732
735
|
# selection or focus index/es.
|
@@ -739,7 +742,7 @@ module Canis
|
|
739
742
|
# delegate some modify operations to Array: insert, clear, delete_at, []= <<
|
740
743
|
# However, we should check if content array is nil ?
|
741
744
|
# fire_dim is called, although it is not required in []=
|
742
|
-
%w[ insert delete_at << push].each { |e|
|
745
|
+
%w[ insert delete_at << push].each { |e|
|
743
746
|
eval %{
|
744
747
|
def #{e}(*args)
|
745
748
|
@list ||= []
|
@@ -755,7 +758,7 @@ module Canis
|
|
755
758
|
def clear
|
756
759
|
return unless @list
|
757
760
|
@list.clear
|
758
|
-
@native_text.clear if @native_text # check this line, should it be removed 2014-08-27 - 20:54
|
761
|
+
@native_text.clear if @native_text # check this line, should it be removed 2014-08-27 - 20:54
|
759
762
|
fire_dimension_changed :clear
|
760
763
|
init_vars
|
761
764
|
end
|
@@ -805,7 +808,7 @@ module Canis
|
|
805
808
|
$multiplier = 0
|
806
809
|
end
|
807
810
|
def top_of_window
|
808
|
-
@current_index = @prow
|
811
|
+
@current_index = @prow
|
809
812
|
$multiplier ||= 0
|
810
813
|
if $multiplier > 0
|
811
814
|
@current_index += $multiplier
|
@@ -884,7 +887,7 @@ module Canis
|
|
884
887
|
@prow = @current_index - @scrollatrows
|
885
888
|
end
|
886
889
|
|
887
|
-
# scrolls lines backward a window full at a time, on pressing pageup
|
890
|
+
# scrolls lines backward a window full at a time, on pressing pageup
|
888
891
|
# C-u may not work since it is trapped by form earlier. Need to fix
|
889
892
|
def scroll_backward
|
890
893
|
#@oldindex = @current_index
|
@@ -985,7 +988,7 @@ module Canis
|
|
985
988
|
# if curpos is at zero , we should be checking previous line !
|
986
989
|
$multiplier.times {
|
987
990
|
# if at start of line, go to previous line
|
988
|
-
if pos == 0
|
991
|
+
if pos == 0
|
989
992
|
if @current_index > 0
|
990
993
|
line -= 1
|
991
994
|
pos = _arr[line].to_s.size
|
@@ -1056,7 +1059,7 @@ module Canis
|
|
1056
1059
|
@curpos = _arr[@current_index].size
|
1057
1060
|
@repaint_required = true
|
1058
1061
|
end
|
1059
|
-
#
|
1062
|
+
#
|
1060
1063
|
# moves cursor to start of line, panning if required
|
1061
1064
|
def cursor_bol
|
1062
1065
|
# copy of C-a - start of line
|
@@ -1064,7 +1067,7 @@ module Canis
|
|
1064
1067
|
@pcol = 0
|
1065
1068
|
@curpos = 0
|
1066
1069
|
end
|
1067
|
-
#
|
1070
|
+
#
|
1068
1071
|
# return true if the given row is visible
|
1069
1072
|
def is_visible? index
|
1070
1073
|
j = index - @prow #@toprow
|
@@ -1117,7 +1120,7 @@ module Canis
|
|
1117
1120
|
# event when user hits ENTER on a row, user would bind :PRESS
|
1118
1121
|
# callers may use +text()+ to get the value of the row, +source+ to get parent object.
|
1119
1122
|
#
|
1120
|
-
# obj.bind :PRESS { |eve| eve.text }
|
1123
|
+
# obj.bind :PRESS { |eve| eve.text }
|
1121
1124
|
#
|
1122
1125
|
def fire_action_event
|
1123
1126
|
return if @list.nil? || @list.size == 0
|
@@ -1129,7 +1132,7 @@ module Canis
|
|
1129
1132
|
def text_action_event
|
1130
1133
|
aev = TextActionEvent.new self, :PRESS, current_value().to_s, @current_index, @curpos
|
1131
1134
|
end
|
1132
|
-
#
|
1135
|
+
#
|
1133
1136
|
# execute binding when a row is entered, used more in lists to display some text
|
1134
1137
|
# in a header or footer as one traverses
|
1135
1138
|
#
|
@@ -1137,18 +1140,15 @@ module Canis
|
|
1137
1140
|
return nil if @list.nil? || @list.size == 0
|
1138
1141
|
|
1139
1142
|
@repaint_footer_required = true
|
1140
|
-
#alert "on_enter rr #{@repaint_required}, #{@repaint_all} oi #{@oldindex}, ci #{@current_index}, or #{@oldrow} "
|
1141
1143
|
|
1142
1144
|
## can this be done once and stored, and one instance used since a lot of traversal will be done
|
1143
1145
|
require 'canis/core/include/ractionevent'
|
1144
1146
|
aev = TextActionEvent.new self, :ENTER_ROW, current_value().to_s, @current_index, @curpos
|
1145
1147
|
fire_handler :ENTER_ROW, aev
|
1146
|
-
#@repaint_required = true
|
1147
1148
|
end
|
1148
1149
|
|
1149
1150
|
#
|
1150
1151
|
# called when this widget is entered, by form
|
1151
|
-
# 2014-05-27 - 17:02 we were not calling super, so :ENTER was not triggered !!!
|
1152
1152
|
def on_enter
|
1153
1153
|
super
|
1154
1154
|
set_form_row
|
@@ -1161,11 +1161,6 @@ module Canis
|
|
1161
1161
|
def set_form_col
|
1162
1162
|
end
|
1163
1163
|
|
1164
|
-
private
|
1165
|
-
|
1166
|
-
# check that current_index and prow are within correct ranges
|
1167
|
-
# sets row (and someday col too)
|
1168
|
-
# sets repaint_required
|
1169
1164
|
|
1170
1165
|
public
|
1171
1166
|
def bounds_check
|
@@ -1198,7 +1193,7 @@ module Canis
|
|
1198
1193
|
@repaint_required = true
|
1199
1194
|
end
|
1200
1195
|
end
|
1201
|
-
#
|
1196
|
+
#
|
1202
1197
|
# save last cursor position so when reentering, cursor can be repositioned
|
1203
1198
|
def lastcurpos r,c
|
1204
1199
|
@lastrow = r
|
@@ -1228,7 +1223,7 @@ module Canis
|
|
1228
1223
|
#$log.debug " check_prow after prow #{@prow} , list count #{cc} "
|
1229
1224
|
# we still need to check the max that prow can go otherwise
|
1230
1225
|
# the pad shows earlier stuff.
|
1231
|
-
#
|
1226
|
+
#
|
1232
1227
|
return
|
1233
1228
|
end
|
1234
1229
|
public
|
@@ -1237,7 +1232,7 @@ module Canis
|
|
1237
1232
|
__calc_dimensions
|
1238
1233
|
@__first_time = true
|
1239
1234
|
end
|
1240
|
-
return unless @list # trying out since it goes into padrefresh even when no data 2014-04-10 - 00:32
|
1235
|
+
return unless @list # trying out since it goes into padrefresh even when no data 2014-04-10 - 00:32
|
1241
1236
|
@graphic = @form.window unless @graphic
|
1242
1237
|
@window ||= @graphic
|
1243
1238
|
raise "Window not set in textpad" unless @window
|
@@ -1253,16 +1248,16 @@ module Canis
|
|
1253
1248
|
#$log.debug " repaint textpad RR #{@repaint_required} #{@window.top} "
|
1254
1249
|
unless @repaint_required
|
1255
1250
|
print_foot if @repaint_footer_required # set in on_enter_row
|
1256
|
-
# trying out removing this, since too many refreshes 2014-05-01 - 12:45
|
1257
|
-
#padrefresh
|
1258
|
-
return
|
1251
|
+
# trying out removing this, since too many refreshes 2014-05-01 - 12:45
|
1252
|
+
#padrefresh
|
1253
|
+
return
|
1259
1254
|
end
|
1260
|
-
# if repaint is required, print_foot not called. unless repaint_all is set, and that
|
1255
|
+
# if repaint is required, print_foot not called. unless repaint_all is set, and that
|
1261
1256
|
# is rarely set.
|
1262
|
-
|
1257
|
+
|
1263
1258
|
preprocess_text
|
1264
1259
|
|
1265
|
-
# in textdialog, @window was nil going into create_pad 2014-04-15 - 01:28
|
1260
|
+
# in textdialog, @window was nil going into create_pad 2014-04-15 - 01:28
|
1266
1261
|
|
1267
1262
|
# creates pad and calls render_all
|
1268
1263
|
populate_pad if !@pad or @_populate_needed
|
@@ -1295,8 +1290,8 @@ module Canis
|
|
1295
1290
|
@window.print_border_only @top, @left, @height-1, @width, clr
|
1296
1291
|
print_title
|
1297
1292
|
|
1298
|
-
# oldrow changed to oldindex 2014-04-13 - 16:55
|
1299
|
-
@repaint_footer_required = true if @oldindex != @current_index
|
1293
|
+
# oldrow changed to oldindex 2014-04-13 - 16:55
|
1294
|
+
@repaint_footer_required = true if @oldindex != @current_index
|
1300
1295
|
print_foot if @print_footer && !@suppress_borders && @repaint_footer_required
|
1301
1296
|
|
1302
1297
|
@window.wrefresh
|
@@ -1314,15 +1309,15 @@ module Canis
|
|
1314
1309
|
bindings
|
1315
1310
|
=begin
|
1316
1311
|
bind_key([?g,?g], 'goto_start'){ goto_start } # mapping double keys like vim
|
1317
|
-
bind_key(279, 'goto_start'){ goto_start }
|
1318
|
-
bind_keys([?G,277], 'goto end'){ goto_end }
|
1319
|
-
bind_keys([?k,KEY_UP], "Up"){ up }
|
1320
|
-
bind_keys([?j,KEY_DOWN], "Down"){ down }
|
1321
|
-
bind_key(?\C-e, "Scroll Window Down"){ scroll_window_down }
|
1322
|
-
bind_key(?\C-y, "Scroll Window Up"){ scroll_window_up }
|
1323
|
-
bind_keys([32,338, ?\C-d], "Scroll Forward"){ scroll_forward }
|
1324
|
-
# adding CTRL_SPACE as back scroll 2014-04-14
|
1325
|
-
bind_keys([0,?\C-b,339], "Scroll Backward"){ scroll_backward }
|
1312
|
+
bind_key(279, 'goto_start'){ goto_start }
|
1313
|
+
bind_keys([?G,277], 'goto end'){ goto_end }
|
1314
|
+
bind_keys([?k,KEY_UP], "Up"){ up }
|
1315
|
+
bind_keys([?j,KEY_DOWN], "Down"){ down }
|
1316
|
+
bind_key(?\C-e, "Scroll Window Down"){ scroll_window_down }
|
1317
|
+
bind_key(?\C-y, "Scroll Window Up"){ scroll_window_up }
|
1318
|
+
bind_keys([32,338, ?\C-d], "Scroll Forward"){ scroll_forward }
|
1319
|
+
# adding CTRL_SPACE as back scroll 2014-04-14
|
1320
|
+
bind_keys([0,?\C-b,339], "Scroll Backward"){ scroll_backward }
|
1326
1321
|
# the next one invalidates the single-quote binding for bookmarks
|
1327
1322
|
#bind_key([?',?']){ goto_last_position } # vim , goto last row position (not column)
|
1328
1323
|
bind_key(?/, :ask_search)
|
@@ -1351,7 +1346,7 @@ module Canis
|
|
1351
1346
|
# ----------- end internal stuff --------------- }}}
|
1352
1347
|
public
|
1353
1348
|
# ---- Section search related start ----- {{{
|
1354
|
-
##
|
1349
|
+
##
|
1355
1350
|
# Ask user for string to search for
|
1356
1351
|
# This uses the dialog, but what if user wants the old style.
|
1357
1352
|
# Isn't there a cleaner way to let user override style, or allow user
|
@@ -1363,7 +1358,7 @@ module Canis
|
|
1363
1358
|
# the following is a change that enables callers to prompt for the string
|
1364
1359
|
# using some other style, basically the classical style and send the string in
|
1365
1360
|
str = get_string("Enter pattern: ", :title => "Find pattern") unless str
|
1366
|
-
return if str.nil?
|
1361
|
+
return if str.nil?
|
1367
1362
|
str = @last_regex if str == ""
|
1368
1363
|
return if !str or str == ""
|
1369
1364
|
str = Regexp.new str if str.is_a? String
|
@@ -1376,7 +1371,7 @@ module Canis
|
|
1376
1371
|
@curpos = ix[1]
|
1377
1372
|
ensure_visible
|
1378
1373
|
end
|
1379
|
-
##
|
1374
|
+
##
|
1380
1375
|
# Find next matching row for string accepted in ask_search
|
1381
1376
|
#
|
1382
1377
|
def find_more
|
@@ -1389,7 +1384,7 @@ module Canis
|
|
1389
1384
|
ensure_visible
|
1390
1385
|
end
|
1391
1386
|
|
1392
|
-
##
|
1387
|
+
##
|
1393
1388
|
# Find the next row that contains given string
|
1394
1389
|
# @return row and col offset of match, or nil
|
1395
1390
|
# FIXME: 2014-05-26 - 01:26 currently if there are two matches in a row skips the second
|
@@ -1429,7 +1424,7 @@ module Canis
|
|
1429
1424
|
# NOTE:
|
1430
1425
|
# startline and endline are more for internal purposes, externally we would call this only with
|
1431
1426
|
# the pattern.
|
1432
|
-
# @example
|
1427
|
+
# @example
|
1433
1428
|
# pos = next_match /abc/
|
1434
1429
|
# # pos is nil or [line, col]
|
1435
1430
|
#
|
@@ -1448,7 +1443,7 @@ module Canis
|
|
1448
1443
|
_line = to_searchable(startline)
|
1449
1444
|
_col = _line.index(str, pos) if _line
|
1450
1445
|
if _col
|
1451
|
-
return [startline, _col]
|
1446
|
+
return [startline, _col]
|
1452
1447
|
end
|
1453
1448
|
startline += 1 # FIXME check this end of file
|
1454
1449
|
end
|
@@ -1485,10 +1480,10 @@ module Canis
|
|
1485
1480
|
def to_searchable index
|
1486
1481
|
_getarray[index].to_s
|
1487
1482
|
end
|
1488
|
-
##
|
1483
|
+
##
|
1489
1484
|
# Ensure current row is visible, if not make it first row
|
1490
1485
|
# NOTE - need to check if its at end and then reduce scroll at rows, check_prow does that
|
1491
|
-
#
|
1486
|
+
#
|
1492
1487
|
# @param current_index (default if not given)
|
1493
1488
|
#
|
1494
1489
|
def ensure_visible row = @current_index
|
@@ -1502,7 +1497,7 @@ module Canis
|
|
1502
1497
|
# where the current index is actually being displayed (example if it wishes to display
|
1503
1498
|
# a popup at that row)
|
1504
1499
|
# An argument is not being taken since the index should be visible.
|
1505
|
-
def visual_index
|
1500
|
+
def visual_index
|
1506
1501
|
row = @current_index
|
1507
1502
|
row - @prow
|
1508
1503
|
end
|
@@ -1517,7 +1512,7 @@ module Canis
|
|
1517
1512
|
#
|
1518
1513
|
# This was just indicative, and is not used anywhere
|
1519
1514
|
def DEADhighlight_row index = @current_index, cfg={}
|
1520
|
-
return unless index
|
1515
|
+
return unless index
|
1521
1516
|
c = 0 # we are using pads so no col except for left_margin if present
|
1522
1517
|
# in a pad we don't need to convert index to printable
|
1523
1518
|
r = index
|
@@ -1530,7 +1525,7 @@ module Canis
|
|
1530
1525
|
end
|
1531
1526
|
##---- dead unused }}}
|
1532
1527
|
|
1533
|
-
end # class textpad
|
1528
|
+
end # class textpad
|
1534
1529
|
|
1535
1530
|
# renderer {{{
|
1536
1531
|
# Very basic renderer that only prints based on color pair of the textpad
|
@@ -1540,7 +1535,7 @@ module Canis
|
|
1540
1535
|
# content cols is the width in columns of pad
|
1541
1536
|
# list is the data array
|
1542
1537
|
attr_accessor :content_cols, :list
|
1543
|
-
# the widget this is associated with.
|
1538
|
+
# the widget this is associated with.
|
1544
1539
|
attr_accessor :source
|
1545
1540
|
|
1546
1541
|
def initialize source=nil
|
@@ -1558,7 +1553,7 @@ module Canis
|
|
1558
1553
|
alias :update_colors :pre_render
|
1559
1554
|
|
1560
1555
|
# derived classes may choose to override this.
|
1561
|
-
# However, they should set size and color and attrib at the start since these
|
1556
|
+
# However, they should set size and color and attrib at the start since these
|
1562
1557
|
# can change after the object has been created depending on the application.
|
1563
1558
|
def render_all pad, arr
|
1564
1559
|
pre_render
|
@@ -1609,7 +1604,7 @@ module Canis
|
|
1609
1604
|
end
|
1610
1605
|
# renderer }}}
|
1611
1606
|
# This is the default key handler.
|
1612
|
-
# It takes care of catching numbers so that vim's movement can use numeric args.
|
1607
|
+
# It takes care of catching numbers so that vim's movement can use numeric args.
|
1613
1608
|
# That is taken care of by multiplier. Other than that it has the key_map process the key.
|
1614
1609
|
#
|
1615
1610
|
class DefaultKeyHandler # ---- {{{
|
@@ -1649,10 +1644,10 @@ module Canis
|
|
1649
1644
|
end
|
1650
1645
|
# --- NOTE ABOUT BLACK RECT LEFT on SCREEN {{{
|
1651
1646
|
## NOTE if textpad does not handle the event and it goes to form which pops
|
1652
|
-
# up a messagebox, then padrefresh does not happen, since control does not
|
1647
|
+
# up a messagebox, then padrefresh does not happen, since control does not
|
1653
1648
|
# come back here, so a black rect is left on screen
|
1654
|
-
# please note that a bounds check will not happen for stuff that
|
1655
|
-
# is triggered by form, so you'll have to to it yourself or
|
1649
|
+
# please note that a bounds check will not happen for stuff that
|
1650
|
+
# is triggered by form, so you'll have to to it yourself or
|
1656
1651
|
# call setrowcol explicity if the cursor is not updated
|
1657
1652
|
# --- }}}
|
1658
1653
|
|
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.13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kepler
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-03-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -220,8 +220,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
220
220
|
- !ruby/object:Gem::Version
|
221
221
|
version: '0'
|
222
222
|
requirements: []
|
223
|
-
|
224
|
-
rubygems_version: 2.7.6
|
223
|
+
rubygems_version: 3.0.2
|
225
224
|
signing_key:
|
226
225
|
specification_version: 4
|
227
226
|
summary: ruby ncurses library for easy application development
|