rbcurse-core 0.0.2 → 0.0.3

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 CHANGED
@@ -1,3 +1,11 @@
1
+ **2012-01-04**
2
+ ## 0.0.3 rbcurse-core
3
+ * ActionManager added to widgets so actions can be
4
+ used from multiple places
5
+ * changes in ncurses setting cbreak and halfdelay etc
6
+ since C-c was crashing program out
7
+ * Added history to field
8
+
1
9
  **2011-12-13**
2
10
  ## 0.0.2 rbcurse-core
3
11
  Mostly refactoring of multi-row components
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.2
1
+ 0.0.3
@@ -34,6 +34,7 @@ require 'rbcurse/core/widgets/rlist'
34
34
  # just a simple test to ensure that rbasiclistbox is running inside a container.
35
35
  App.new do
36
36
  def disp_menu
37
+ # ideally this shuld get action_manager and add_action so these are added to widgets actions
37
38
  f = @form.get_current_field
38
39
 
39
40
  if f.name == "lb1"
@@ -1,5 +1,21 @@
1
+ # ----------------------------------------------------------------------------- #
2
+ # File: action.rb
3
+ # Description: A common action class which can be used with buttons, popupmenu
4
+ # and anythign else that takes an action or command
5
+ # Author: rkumar http://github.com/rkumar/rbcurse/
6
+ # Date: been around since the beginning
7
+ # License: Same as Ruby's License (http://www.ruby-lang.org/LICENSE.txt)
8
+ # Last update: use ,,L
9
+ # NOTE: I don't like the dependence on rwidget and EventHandler. Seems it needs
10
+ # that only for fire_handler and not sure if that's used. I've not bound :FIRE
11
+ # ever.
12
+ #
13
+ # Darn, do i really need to have dsl_accessors and property This is not a
14
+ # widget and there's no repaint. Do button's and popups really repaint
15
+ # themselves when a dsl_property is modified ?
16
+ # ----------------------------------------------------------------------------- #
17
+ #
1
18
  require 'rbcurse/core/widgets/rwidget'
2
- #include Ncurses # FFI 2011-09-8
3
19
  include RubyCurses
4
20
  module RubyCurses
5
21
  ## encapsulates behaviour allowing centralization
@@ -12,8 +28,8 @@ module RubyCurses
12
28
  # ...
13
29
  # end
14
30
  class Action < Proc
15
- include EventHandler
16
- include ConfigSetup
31
+ include EventHandler # removed 2012-01-3 maybe you can bind FIRE
32
+ #include ConfigSetup # removed 2012-01-3
17
33
  # name used on button or menu
18
34
  dsl_property :name
19
35
  dsl_property :enabled
@@ -27,14 +43,38 @@ module RubyCurses
27
43
  @name = name
28
44
  @name.freeze
29
45
  @enabled = true
30
- config_setup config # @config.each_pair { |k,v| variable_set(k,v) }
46
+ # removing dependency from config
47
+ #config_setup config # @config.each_pair { |k,v| variable_set(k,v) }
48
+ @config = config
49
+ keys = @config.keys
50
+ keys.each do |e|
51
+ variable_set(e, @config[e])
52
+ end
31
53
  @_events = [:FIRE]
32
54
  end
33
55
  def call
34
56
  return unless @enabled
35
- fire_handler :FIRE, self
57
+ # seems to be here, if you've bound :FIRE no this, not on any widget
58
+ fire_handler :FIRE, self
36
59
  super
37
60
  end
61
+ # the next 3 are to adapt this to CMenuitems
62
+ def hotkey
63
+ return @mnemonic if @mnemonic
64
+ ix = @name.index('&')
65
+ if ix
66
+ return @name[ix+1, 1].downcase
67
+ end
68
+ end
69
+ # to adapt this to CMenuitems
70
+ def label
71
+ @name.sub('&','')
72
+ end
73
+ # to adapt this to CMenuitems
74
+ def action
75
+ self
76
+ end
77
+
38
78
  end # class
39
79
  end # module
40
80
 
@@ -0,0 +1,49 @@
1
+ # ----------------------------------------------------------------------------- #
2
+ # File: actionmanager.rb
3
+ # Description: a class that manages actions for a widget
4
+ #
5
+ # Author: rkumar http://github.com/rkumar/rbcurse/
6
+ # Date: 2012-01-4
7
+ # License: Same as Ruby's License (http://www.ruby-lang.org/LICENSE.txt)
8
+ # Last update: ,,L
9
+ # ----------------------------------------------------------------------------- #
10
+ #
11
+ # Maintains actions for a widget
12
+ module RubyCurses
13
+ class ActionManager
14
+ include Io
15
+ attr_reader :actions
16
+
17
+ def initialize #form, config={}, &block
18
+ @actions = []
19
+ #instance_eval &block if block_given?
20
+ end
21
+ def add_action act
22
+ @actions << act
23
+ end
24
+ def remove_action act
25
+ @actions.remove act
26
+ end
27
+ #
28
+ # insert an item at given position (index)
29
+ def insert_action pos, *val
30
+ @actions[pos] = val
31
+ end
32
+ #def create_menuitem *args
33
+ #PromptMenu.create_menuitem *args
34
+ #end
35
+
36
+ # popup the hist
37
+ #
38
+ def show_actions
39
+ return if @actions.empty?
40
+ list = @actions
41
+ menu = PromptMenu.new self do |m|
42
+ list.each { |e|
43
+ m.add *e
44
+ }
45
+ end
46
+ menu.display_new :title => 'Widget Menu (Press letter)'
47
+ end
48
+ end # class
49
+ end # mod RubyC
@@ -78,9 +78,15 @@ module RubyCurses
78
78
  # prompts user for unix command and displays output in viewer
79
79
  #
80
80
  def shell_output
81
- cmd = get_string("Enter shell command:", 50)
81
+ $shell_history ||= []
82
+ cmd = get_string("Enter shell command:", :maxlen => 50) do |f|
83
+ require 'rbcurse/core/include/rhistory'
84
+ f.extend(FieldHistory)
85
+ f.history($shell_history)
86
+ end
82
87
  if cmd && !cmd.empty?
83
88
  run_command cmd
89
+ $shell_history.push(cmd) unless $shell_history.include? cmd
84
90
  end
85
91
  end
86
92
 
@@ -314,7 +314,7 @@ module Io
314
314
  @caller = caller
315
315
  @text = text
316
316
  @options = []
317
- instance_eval &block if block_given?
317
+ yield_or_eval &block if block_given?
318
318
  end
319
319
  def add *menuitem
320
320
  item = nil
@@ -330,6 +330,14 @@ module Io
330
330
  # if user only sends key and symbol
331
331
  menuitem[3] = menuitem[1]
332
332
  item = CMenuItem.new(*menuitem.flatten)
333
+ when 1
334
+ if menuitem.first.is_a? Action
335
+ item = menuitem.first
336
+ else
337
+ raise ArgumentError, "Don't know how to handle #{menuitem.size} : #{menuitem} "
338
+ end
339
+ else
340
+ raise ArgumentError, "Don't know how to handle #{menuitem.size} : #{menuitem} "
333
341
  end
334
342
  @options << item
335
343
  end
@@ -339,6 +347,10 @@ module Io
339
347
  def create_mitem *args
340
348
  item = CMenuItem.new(*args.flatten)
341
349
  end
350
+ # Added this, since actually it could have been like this 2011-12-22
351
+ def self.create_menuitem *args
352
+ item = CMenuItem.new(*args.flatten)
353
+ end
342
354
  # create the whole thing using a MenuTree which has minimal information.
343
355
  # It uses a hotkey and a code only. We are supposed to resolve the display text
344
356
  # and actual proc from the caller using this code.
@@ -369,7 +381,7 @@ module Io
369
381
  def display_columns config={}
370
382
  prompt = config[:prompt] || "Choose: "
371
383
  require 'rbcurse/core/util/rcommandwindow'
372
- layout = { :height => 5, :width => Ncurses.COLS-1, :top => Ncurses.LINES-6, :left => 0 }
384
+ layout = { :height => 5, :width => Ncurses.COLS-0, :top => Ncurses.LINES-6, :left => 0 }
373
385
  rc = CommandWindow.new nil, :layout => layout, :box => true, :title => config[:title] || "Menu"
374
386
  w = rc.window
375
387
  r = 4
@@ -385,7 +397,11 @@ module Io
385
397
  valid = []
386
398
  labels = []
387
399
  menu.each{ |item|
388
- hk = item.hotkey.to_s
400
+ if item.respond_to? :hotkey
401
+ hk = item.hotkey.to_s
402
+ else
403
+ raise ArgumentError, "Promptmenu needs hotkey or mnemonic"
404
+ end
389
405
  labels << "%c. %s " % [ hk, item.label ]
390
406
  h[hk] = item
391
407
  valid << hk
@@ -413,11 +429,14 @@ module Io
413
429
  end
414
430
  #$log.debug " index is #{index} "
415
431
  item = h[ch]
416
- desc = item.desc
417
- #desc ||= "Could not find desc for #{ch} "
418
- desc ||= ""
419
- clear_this w, r, c, color, len
420
- print_this(w, desc, color, r,c)
432
+ # I don;t think this even shows now, its useless
433
+ if item.respond_to? :desc
434
+ desc = item.desc
435
+ #desc ||= "Could not find desc for #{ch} "
436
+ desc ||= ""
437
+ clear_this w, r, c, color, len
438
+ print_this(w, desc, color, r,c)
439
+ end
421
440
  action = item.action
422
441
  case action
423
442
  #when Array
@@ -17,7 +17,8 @@ module RubyCurses
17
17
  $log.debug "XXX: INSIDE LISTBINDING FOR #{self.class} "
18
18
  bind_key(Ncurses::KEY_LEFT, 'cursor backward'){ cursor_backward } if respond_to? :cursor_backward
19
19
  bind_key(Ncurses::KEY_RIGHT, 'cursor_forward'){ cursor_forward } if respond_to? :cursor_forward
20
- bind_key(Ncurses::KEY_UP, 'previous row'){ ret = up; get_window.ungetch(KEY_BTAB) if ret == :NO_PREVIOUS_ROW }
20
+ # very irritating when user pressed up arrow, commented off 2012-01-4 can be made optional
21
+ bind_key(Ncurses::KEY_UP, 'previous row'){ ret = up; } #get_window.ungetch(KEY_BTAB) if ret == :NO_PREVIOUS_ROW }
21
22
  # the next was irritating if user wanted to add a row ! 2011-10-10
22
23
  #bind_key(Ncurses::KEY_DOWN){ ret = down ; get_window.ungetch(KEY_TAB) if ret == :NO_NEXT_ROW }
23
24
  bind_key(Ncurses::KEY_DOWN, 'next row'){ ret = down ; }
@@ -271,12 +271,20 @@ module ListScrollable
271
271
  end
272
272
  def ask_search
273
273
  options = ["Search backwards", "case insensitive", "Wrap around"]
274
- defaults = [@search_direction_prev,@search_case,@search_wrap]
274
+ defaults = [@search_direction_prev, @search_case, @search_wrap]
275
275
  regex = @last_regex || ""
276
+ # persist search history so one can popup and see
277
+ # How does user know that there is some history here.
278
+ $list_search_history ||= []
279
+ $list_search_history << @last_regex if @last_regex && !$list_search_history.include?(@last_regex)
276
280
 
277
281
  mb = MessageBox.new :title => "Search" , :width => 70 do
278
- add Field.new :label => 'Enter regex to search', :name => "patt", :display_length => 30,
279
- :bgcolor => :cyan, :text => regex
282
+ fld = Field.new :label => 'Enter regex to search', :name => "patt", :display_length => 30,
283
+ :bgcolor => :cyan #, :text => regex
284
+ require 'rbcurse/core/include/rhistory'
285
+ fld.extend(FieldHistory)
286
+ fld.history($list_search_history)
287
+ add fld
280
288
  add CheckBox.new :text => options[0], :value => defaults[0], :name => "0"
281
289
  add CheckBox.new :text => options[1], :value => defaults[1], :name => "1"
282
290
  add CheckBox.new :text => options[2], :value => defaults[2], :name => "2"
@@ -285,7 +293,10 @@ module ListScrollable
285
293
  end
286
294
  index = mb.run
287
295
  return if index != 0
288
- regex = mb.widget("patt").text
296
+ regex = mb.widget("patt").text || regex # if user enters nothing use existing regex
297
+ regex = @last_regex if regex == ""
298
+ return if regex.nil? || regex == ""
299
+ #$list_search_history << @last_regex if @last_regex
289
300
  @search_direction_prev = mb.widget("0").value
290
301
  @search_case = mb.widget("1").value
291
302
  @search_wrap = mb.widget("2").value
@@ -391,7 +402,8 @@ module ListScrollable
391
402
  ##
392
403
  # find backwards
393
404
  # Using this to start a search or continue search
394
- def _find_prev regex=@last_regex, start = @search_found_ix
405
+ def _find_prev regex=@last_regex, start = @search_found_ix, first_time = false
406
+ #TODO the firsttime part, see find_next
395
407
  #raise "No previous search" if regex.nil?
396
408
  warn "No previous search" and return if regex.nil?
397
409
  #$log.debug " _find_prev #{@search_found_ix} : #{@current_index}"
@@ -20,16 +20,29 @@
20
20
  module RubyCurses
21
21
  extend self
22
22
  module FieldHistory
23
+ def self.extended(obj)
24
+
25
+ obj.instance_exec {
26
+ @history ||= []
27
+ $history_key ||= ?\M-h
28
+ # ensure that the field is not overriding this in handle_key
29
+ bind_key($history_key) { _show_history }
30
+ # widget should have CHANGED event, or this will either give error, or just not work
31
+ # else please update history whenever you want a value to be retrieved
32
+ bind(:CHANGED) { @history << @text if @text && (!@history.include? @text) }
33
+ }
34
+ end
35
+
23
36
  # pass the array of history values
37
+ # Trying out a change where an item can also be sent in.
38
+ # I am lost, i want the initialization to happen once.
24
39
  def history arr
25
40
  return @history unless arr
26
- @history = arr
27
- $history_key ||= ?\M-h
28
- # ensure that the field is not overriding this in handle_key
29
- bind_key($history_key) { _show_history }
30
- # widget should have CHANGED event, or this will either give error, or just not work
31
- # else please update history whenever you want a value to be retrieved
32
- bind(:CHANGED) { @history << @text if @text && (!@history.include? @text) }
41
+ if arr.is_a? Array
42
+ @history = arr
43
+ else
44
+ @history << arr unless @history.include? arr
45
+ end
33
46
  end
34
47
  def history=(x); history(x); end
35
48
 
@@ -50,7 +63,9 @@ module RubyCurses
50
63
  raise ArgumentError, "show_history got nil list" unless list
51
64
  # calculate r and c
52
65
  # col if fine, except for when there's a label.
53
- c = @_history_config[:col] || @field_col || @col # this is also dependent on window coords, as in a status_window or messagebox
66
+ wcol = 0 # taking care of when dialog uses history 2012-01-4
67
+ wcol = self.form.window.left if self.form
68
+ c = wcol + ( @field_col || @col) # this is also dependent on window coords, as in a status_window or messagebox
54
69
  sz = @history.size
55
70
  wrow = 0
56
71
  wrow = self.form.window.top if self.form
@@ -67,6 +82,7 @@ module RubyCurses
67
82
  #r = @row + 1
68
83
  #end
69
84
  r = @_history_config[:row] || r
85
+ c = @_history_config[:col] || c
70
86
  ret = popuplist(list, :row => r, :col => c, :title => " History ")
71
87
  if ret
72
88
  self.text = list[ret]
@@ -0,0 +1,66 @@
1
+ # ----------------------------------------------------------------------------- #
2
+ # File: widgetmenu.rb
3
+ # Description: a module that displays a menu for customization of a field
4
+ # e.g.,
5
+ # field.extend(WidgetMenu)
6
+ #
7
+ # Author: rkumar http://github.com/rkumar/rbcurse/
8
+ # Date: 2011-12-2x
9
+ # License: Same as Ruby's License (http://www.ruby-lang.org/LICENSE.txt)
10
+ # Last update: 2011-12-26 - 20:25
11
+ # ----------------------------------------------------------------------------- #
12
+ #
13
+ # Provide a system for us to define a menu for customizing a widget, such that
14
+ # applicatin can also add more menuitems
15
+ module RubyCurses
16
+ extend self
17
+ module WidgetMenu
18
+ include Io # added 2011-12-26
19
+ # add a menu item which can any one of
20
+ # @param key, label, desc, action | symbol
21
+ # key, symbol
22
+ # Action
23
+ # Action[] (maybe)
24
+ def self.extended(obj)
25
+ # don't want this executed each time
26
+ @objects ||= []
27
+ return if @objects.include? obj
28
+ @objects << obj
29
+
30
+ obj.instance_exec {
31
+ @_menuitems ||= []
32
+ # callign this method means that no other programs can use those actions else
33
+ # that method will be called more than once, so it must either be called in the constructor
34
+ # or else have a check that it is only called once.
35
+ obj.init_menu if obj.respond_to? :init_menu
36
+ }
37
+
38
+ end
39
+ def add_menu_item *val
40
+ #@_menuitems ||= []
41
+ @_menuitems << val
42
+ end
43
+ #
44
+ # insert an item at given position (index)
45
+ def insert_menu_item pos, *val
46
+ #@_menuitems ||= []
47
+ @_menuitems[pos] = val
48
+ end
49
+ def create_menuitem *args
50
+ PromptMenu.create_menuitem *args
51
+ end
52
+
53
+ # popup the hist
54
+ #
55
+ def _show_menu
56
+ return if @_menuitems.nil? || @_menuitems.empty?
57
+ list = @_menuitems
58
+ menu = PromptMenu.new self do |m|
59
+ list.each { |e|
60
+ m.add *e
61
+ }
62
+ end
63
+ menu.display_new :title => 'Widget Menu (Press letter)'
64
+ end
65
+ end # mod History
66
+ end # mod RubyC
@@ -7,6 +7,11 @@ module VER
7
7
  def start_ncurses
8
8
  return if $ncurses_started
9
9
  $ncurses_started = true
10
+ # in case we want a blocking getch, you may want to first
11
+ # set wtimeout to -1, and then reset it to this value.
12
+ # Please first check that we are using this.
13
+ $ncurses_wtimeout = 500 # used by windows for timeout of wgetch
14
+
10
15
  # The initscr code determines the terminal type and initializes all curses
11
16
  # data structures.
12
17
  # initscr also causes the first call to refresh to clear the screen.
@@ -59,7 +64,9 @@ module VER
59
64
  # erase/kill character-processing (interrupt and flow control characters
60
65
  # are unaffected), making characters typed by the user immediately
61
66
  # available to the program.
62
- Ncurses.cbreak
67
+ #Ncurses.cbreak
68
+ # I have removed cbreak and halfdelay since they were causing C-c
69
+ # to crash if i pressed it in succession
63
70
 
64
71
  # The echo and noecho routines control whether characters typed by the user
65
72
  # are echoed by getch as they are typed.
@@ -80,12 +87,19 @@ module VER
80
87
  # nothing has been typed.
81
88
  # The value of tenths must be a number between 1 and 255.
82
89
  # Use nocbreak to leave half-delay mode.
83
- Ncurses::halfdelay(tenths = 10)
90
+ #Ncurses::halfdelay(tenths = 10)
91
+ # See above why switched off
84
92
 
85
93
  # The nodelay option causes getch to be a non-blocking call. If no input is
86
94
  # ready, getch returns ERR. If disabled (bf is FALSE), getch waits until a
87
95
  # key is pressed.
88
- # Ncurses::nodelay(Ncurses::stdscr, bf = true)
96
+ # I am using the next line for the window when creating, this does not
97
+ # have any impact on window.
98
+ # For this to have any effect your getch should be Ncurses.getch and not
99
+ # wgetch(@window), For that do this with window.
100
+ # I am disableing this 2011-12-20 since it does not work with combinations
101
+ # such as gg. Any routine that does a getch will just immediatelt return an ERR.
102
+ #Ncurses::nodelay(stdscr.pointer, bf = true)
89
103
  end
90
104
 
91
105
  # this should happen only in outermost program that started ncurses
@@ -71,6 +71,7 @@ module VER
71
71
  $status_message ||= RubyCurses::Variable.new # in case not an App
72
72
 
73
73
  $key_map ||= :vim
74
+ $esc_esc = true; # gove me double esc as 2727 so i can map it.
74
75
  init_vars
75
76
 
76
77
 
@@ -78,6 +79,11 @@ module VER
78
79
  def init_vars
79
80
  @window_type = :WINDOW
80
81
  Ncurses::keypad(@window, true)
82
+ # Added this so we can get Esc, and also C-c pressed in succession does not crash system
83
+ # 2011-12-20 half-delay crashes system as does cbreak
84
+ #This causes us to be unable to process gg qq since getch won't wait.
85
+ #Ncurses::nodelay(@window, bf = true)
86
+ Ncurses::wtimeout(@window, $ncurses_timeout || 500) # will wait a second on wgetch so we can get gg and qq
81
87
  @stack = []
82
88
  @name ||="#{self}"
83
89
  @modified = true
@@ -327,11 +333,17 @@ module VER
327
333
 
328
334
  def getch
329
335
  #c = @window.getch
330
- c = Ncurses.getch
336
+ c = FFI::NCurses.wgetch(@window)
337
+ # 2011-12-20 - i am trying setting a timer on wgetch, see timeout
338
+ #c = FFI::NCurses.getch # this will keep waiting, nodelay won't be used on it, since
339
+ # we've put nodelay on window
331
340
  #if c == Ncurses::KEY_RESIZE
332
341
 
333
- rescue Interrupt => ex
342
+ rescue SystemExit, Interrupt
343
+ #FFI::NCurses.flushinp
334
344
  3 # is C-c
345
+ rescue StandardError
346
+ -1 # is C-c
335
347
  end
336
348
 
337
349
  # 2011-09-23 @since 1.3.1
@@ -352,8 +364,8 @@ module VER
352
364
  # 2 cases, so abandoned.
353
365
  def getchar
354
366
  while 1
355
- ch = getch
356
- $log.debug "window getchar() GOT: #{ch}" if ch != -1
367
+ ch = self.getch
368
+ #$log.debug "window getchar() GOT: #{ch}" if ch != -1
357
369
  sf = @stack.first
358
370
  if ch == -1
359
371
  # the returns escape 27 if no key followed it, so its SLOW if you want only esc
@@ -393,7 +405,8 @@ module VER
393
405
  # experimental. 2 escapes in quick succession to make exit faster
394
406
  if @stack.size == 1 && ch == 27
395
407
  @stack.clear
396
- return ch
408
+ return 2727 if $esc_esc # this is double-esc if you wanna trap it, trying out
409
+ return 27
397
410
  end
398
411
  # possible F1..F3 on xterm-color
399
412
  if ch == 79 || ch == 91
@@ -166,7 +166,7 @@ module RubyCurses
166
166
  @form.handle_key ch
167
167
  rescue => err
168
168
  $log.debug( "handle_key rescue reached ")
169
- $log.debug( err)
169
+ $log.debug( err.to_s)
170
170
  $log.debug(err.backtrace.join("\n"))
171
171
  textdialog [err.to_s, *err.backtrace], :title => "Exception"
172
172
  end
@@ -43,7 +43,12 @@ end
43
43
  # Alert user with a block of text. This will popup a textview in which the user can scroll
44
44
  # Use this if you are not sure of the size of the text, such as printing a stack trace,
45
45
  # exception
46
+ # 2011-12-25 just pass in an exceptino object and we do the rest
46
47
  def textdialog mess, config={}
48
+ if mess.is_a? Exception
49
+ mess = [mess.to_s, *mess.backtrace]
50
+ config[:title] ||= "Exception"
51
+ end
47
52
  config[:title] ||= "Alert"
48
53
  tp = MessageBox.new config do
49
54
  button_type :ok
@@ -81,8 +86,8 @@ def get_string label, config={} # yield Field
81
86
  defwid = config[:default].nil? ? 30 : config[:default].size + 13
82
87
  w = [label.size + 8, defwid, field_config[:width]+13 ].max
83
88
  config[:width] ||= w
84
- $log.debug "XXX: FIELD SIZE #{w} "
85
- $log.debug "XXX: FIELD CONFIG #{field_config} "
89
+ #$log.debug "XXX: FIELD SIZE #{w} "
90
+ #$log.debug "XXX: FIELD CONFIG #{field_config} "
86
91
  tp = MessageBox.new config do
87
92
  button_type :ok_cancel
88
93
  default_button 0
@@ -373,6 +378,9 @@ def popuplist list, config={}, &block
373
378
  end
374
379
  config.delete :relative_to
375
380
  width = config[:width] || longest_in_list(list)+2 # borders take 2
381
+ if config[:title]
382
+ width = config[:title].size + 2 if width < config[:title].size
383
+ end
376
384
  height = config[:height]
377
385
  height ||= [max_visible_items || 10+2, list.length+2].min
378
386
  #layout(1+height, width+4, row, col)
@@ -89,7 +89,7 @@ module RubyCurses
89
89
  # allow closing using q and Ctrl-q in addition to any key specified
90
90
  # user should not need to specify key, since that becomes inconsistent across usages
91
91
  while((ch = v_window.getchar()) != ?\C-q.getbyte(0) )
92
- break if ch == config[:close_key] || ch == ?q.ord
92
+ break if ch == config[:close_key] || ch == ?q.ord || ch == 2727 # added double esc 2011-12-27
93
93
  # if you've asked for ENTER then i also check for 10 and 13
94
94
  break if (ch == 10 || ch == 13) && config[:close_key] == KEY_ENTER
95
95
  v_form.handle_key ch
@@ -129,7 +129,7 @@ module RubyCurses
129
129
 
130
130
  # first print a right side vertical line
131
131
  #bc = $bottomcolor # dark blue
132
- bc = $datacolor
132
+ bc = get_color($datacolor, :cyan, :black)
133
133
  bordercolor = @border_color || bc
134
134
  borderatt = @border_attrib || Ncurses::A_REVERSE
135
135
  if @focussed
@@ -50,6 +50,7 @@ module RubyCurses
50
50
  #dsl_accessor :default_values # array of default values
51
51
  #dsl_accessor :is_popup # if it is in a popup and single select, selection closes
52
52
  attr_accessor :current_index
53
+ # selection mode multiple, single and none (none added 2011-12-26)
53
54
  dsl_accessor :selection_mode
54
55
  dsl_accessor :selected_color, :selected_bgcolor, :selected_attr
55
56
  dsl_accessor :max_visible_items # how many to display 2009-01-11 16:15
@@ -96,11 +97,11 @@ module RubyCurses
96
97
  @row_offset = @col_offset = 1
97
98
  @should_show_focus = true # Here's its on since the cellrenderer will show it on repaint
98
99
  @one_key_selection = false # use vim keys
100
+ @selection_mode = :multiple # default is multiple, anything else given becomes single
99
101
  super
100
102
  @_events.push(*[:ENTER_ROW, :LEAVE_ROW, :LIST_SELECTION_EVENT, :PRESS])
101
103
  # I have moved this here so user can override keys.
102
104
  map_keys unless @keys_mapped
103
- @selection_mode ||= :multiple # default is multiple, anything else given becomes single
104
105
  @win = @graphic # 2010-01-04 12:36 BUFFERED replace form.window with graphic
105
106
  @win_left = 0
106
107
  @win_top = 0
@@ -113,6 +114,7 @@ module RubyCurses
113
114
  if @list && !@selected_index.nil? # XXX
114
115
  set_focus_on @selected_index # the new version
115
116
  end
117
+ init_actions
116
118
  end
117
119
  # this is called several times, from constructor
118
120
  # and when list data changed, so only put relevant resets here.
@@ -138,7 +140,7 @@ module RubyCurses
138
140
  bind_key(?f, 'next row starting with char'){ ask_selection_for_char() }
139
141
  bind_key(?\M-v, 'toggle one_key_selection'){ @one_key_selection = !@one_key_selection }
140
142
  bind_key(13, 'fire action event'){ fire_action_event }
141
- list_bindings # listselectable
143
+ list_bindings unless @selection_mode == :none # listselectable
142
144
  @keys_mapped = true
143
145
 
144
146
  end
@@ -670,6 +672,13 @@ module RubyCurses
670
672
  end
671
673
  alias :selected_values :get_selected_values
672
674
 
675
+ # Define actions that can be popped up by PromptMenu or other menubar
676
+ # Currently, only PromptMenu, but we can start contextually appending to Menubar or others
677
+ def init_actions
678
+ am = action_manager()
679
+ am.add_action(Action.new("&Disable selection") { @selection_mode = :none; unbind_key(32); bind_key(32, :scroll_forward); } )
680
+ am.add_action(Action.new("&Edit Toggle") { @edit_toggle = !@edit_toggle; $status_message.value = "Edit toggle is #{@edit_toggle}" })
681
+ end
673
682
 
674
683
 
675
684
  # ADD HERE
@@ -65,7 +65,8 @@ module RubyCurses
65
65
  @bgcolor ||= :white
66
66
  @maxrow = 3
67
67
 
68
- instance_eval &block if block_given?
68
+ #instance_eval &block if block_given?
69
+ yield_or_eval &block if block_given?
69
70
 
70
71
  end
71
72
  def item widget
@@ -163,6 +164,7 @@ module RubyCurses
163
164
  @maxrow = 3
164
165
  yield message_label if block_given?
165
166
  end
167
+ alias :message= :message
166
168
 
167
169
  # This is for larger messages, or messages where the size is not known.
168
170
  # A textview object is created and yielded.
@@ -214,13 +216,15 @@ module RubyCurses
214
216
  yield message_label if block_given?
215
217
 
216
218
  end
219
+ alias :text= :text
220
+
217
221
  # returns button index (or in some cases, whatever value was thrown
218
222
  # if user did not specify any button_type but gave his own and did throw (:close, x)
219
223
  private
220
224
  def handle_keys
221
225
  buttonindex = catch(:close) do
222
226
  while((ch = @window.getchar()) != FFI::NCurses::KEY_F10 )
223
- break if ch == ?\C-q.getbyte(0)
227
+ break if ch == ?\C-q.getbyte(0) || ch == 2727 # added double esc
224
228
  begin
225
229
  @form.handle_key(ch)
226
230
  @window.wrefresh
@@ -74,6 +74,7 @@ module RubyCurses
74
74
  install_keys
75
75
  init_vars
76
76
  bordertitle_init
77
+ init_actions
77
78
  end
78
79
  def init_vars
79
80
  @repaint_required = true
@@ -945,6 +946,13 @@ module RubyCurses
945
946
  }
946
947
  rb_puts "#{name} written."
947
948
  end
949
+
950
+ def init_actions
951
+ editor = ENV['EDITOR'] || 'vi'
952
+ am = action_manager()
953
+ am.add_action(Action.new("&Edit in #{editor} ") { edit_external })
954
+ am.add_action(Action.new("&Saveas") { saveas() } )
955
+ end
948
956
  end # class textarea
949
957
  ##
950
958
  end # modul
@@ -64,6 +64,7 @@ module RubyCurses
64
64
  install_keys # do something about this nonsense FIXME
65
65
  bordertitle_init
66
66
  init_vars
67
+ init_actions
67
68
  end
68
69
  def init_vars #:nodoc:
69
70
  @curpos = @pcol = @toprow = @current_index = 0
@@ -91,8 +92,8 @@ module RubyCurses
91
92
  bind_key(32, 'scroll forward'){ scroll_forward() }
92
93
  # have placedhere so multi-bufer can override BS to prev buffer
93
94
  bind_keys([KEY_BACKSPACE,KEY_BSPACE,KEY_DELETE], :cursor_backward)
94
- bind_key(?r) { getstr("Enter a word: ") } if $log.debug?
95
- bind_key(?m, :disp_menu) if $log.debug?
95
+ #bind_key(?r) { getstr("Enter a word: ") } if $log.debug?
96
+ #bind_key(?m, :disp_menu) if $log.debug?
96
97
  end
97
98
  ##
98
99
  # send in a list
@@ -619,53 +620,6 @@ module RubyCurses
619
620
  return "" if ret != 0
620
621
  return str
621
622
  end
622
- # this is just a test of the simple "most" menu
623
- # How can application add to this, or override
624
- # TODO: use another window at bottom, statuswindow
625
- def disp_menu #:nodoc:
626
- # we need to put this into data-structure so that i can be manipulated by calling apps
627
- # This should not be at the widget level, too many types of menus. It should be at the app
628
- # level only if the user wants his app to use this kind of menu.
629
-
630
- if false
631
- #@menu = RubyCurses::MenuTree.new "Main", { s: :goto_start, r: :scroll_right, l: :scroll_left, m: :submenu }
632
- #@menu.submenu :m, "submenu", {s: :noignorecase, t: :goto_last_position, f: :next3 }
633
- #menu = PromptMenu.new self
634
- #menu.menu_tree @menu
635
- #menu.display @form.window, $error_message_row, $error_message_col, $datacolor #, menu
636
- end
637
- # trying to find a more rubyesque way of doing
638
- menu = PromptMenu.new self do
639
- item :s, :goto_start
640
- item :b, :goto_bottom
641
- item :r, :scroll_backward
642
- item :l, :scroll_forward
643
- submenu :m, "submenu..." do
644
- item :p, :goto_last_position
645
- item :r, :scroll_right
646
- item :l, :scroll_left
647
- end
648
- end
649
- #menu.display @form.window, $error_message_row, $error_message_col, $datacolor #, menu
650
- menu.display_new :title => "Menu"
651
-
652
-
653
- =begin
654
- require 'rbcurse/extras/widgets/menutree'
655
- menu = PromptMenu.new self
656
- menu.add( menu.create_mitem( 's', "Goto start ", "Going to start", Proc.new { goto_start} ))
657
- menu.add(menu.create_mitem( 'r', "scroll right", "I have scrolled ", :scroll_right ))
658
- menu.add(menu.create_mitem( 'l', "scroll left", "I have scrolled ", :scroll_left ))
659
- item = menu.create_mitem( 'm', "submenu", "submenu options" )
660
- menu1 = PromptMenu.new( self, "Submenu Options")
661
- menu1.add(menu1.create_mitem( 's', "CASE sensitive", "Ignoring Case in search" ))
662
- menu1.add(menu1.create_mitem( 't', "goto last position", "moved to previous position", Proc.new { goto_last_position} ))
663
- item.action = menu1
664
- menu.add(item)
665
- # how do i know what's available. the application or window should know where to place
666
- #menu.display @form.window, 23, 1, $datacolor #, menu
667
- =end
668
- end
669
623
  ##
670
624
  # dynamically load a module and execute init method.
671
625
  # Hopefully, we can get behavior like this such as vieditable or multibuffers
@@ -768,6 +722,12 @@ module RubyCurses
768
722
  set_content(lines, :content_type => @old_content_type)
769
723
  end
770
724
  end
725
+ def init_actions
726
+ editor = ENV['EDITOR'] || 'vi'
727
+ am = action_manager()
728
+ am.add_action( Action.new("&Edit in #{editor} ") { edit_external } )
729
+ am.add_action( Action.new("&Saveas") { saveas() })
730
+ end
771
731
 
772
732
 
773
733
  end # class textview
@@ -57,22 +57,14 @@ class Module
57
57
  if val.empty?
58
58
  @#{sym}
59
59
  else
60
- #if @frozen # 2011-10-1 prevent object from being changed # changed 2011 dts
61
- #return if @frozen && (@frozen_list.nil? || @frozen_list.include?(:#{sym}) )
62
- #end
63
60
  @#{sym} = val.size == 1 ? val[0] : val
64
61
  # i am itching to deprecate next line XXX
65
- @config["#{sym}"]=@#{sym}
62
+ # @config["#{sym}"]=@#{sym} # commented out 2011-12-18 to simplify
66
63
  self # 2011-10-2
67
64
  end
68
65
  end
69
66
  # can the next bypass validations
70
- # I don't think anyone will expect self to be returned if using = to assign
71
67
  attr_writer sym #2011-10-2
72
- #def #{sym}=(val)
73
- ##{sym}(val)
74
- # self
75
- #end
76
68
  }
77
69
  }
78
70
  end
@@ -86,7 +78,6 @@ class Module
86
78
  if val.empty?
87
79
  @#{sym}
88
80
  else
89
- #return(self) if @frozen && (@frozen_list.nil? || @frozen_list.include?(:#{sym}) )
90
81
  oldvalue = @#{sym}
91
82
  # @#{sym} = val.size == 1 ? val[0] : val
92
83
  tmp = val.size == 1 ? val[0] : val
@@ -94,7 +85,7 @@ class Module
94
85
  # i am itching to deprecate config setting
95
86
  if oldvalue.nil? || @_object_created.nil?
96
87
  @#{sym} = tmp
97
- @config["#{sym}"]=@#{sym}
88
+ # @config["#{sym}"]=@#{sym} # 2011-12-18
98
89
  end
99
90
  return(self) if oldvalue.nil? || @_object_created.nil?
100
91
 
@@ -251,11 +242,11 @@ module RubyCurses
251
242
  when S_F9
252
243
  return "S_F9"
253
244
  else
254
- others=[?\M--,?\M-+,?\M-=,?\M-',?\M-",?\M-;,?\M-:,?\M-\,, ?\M-.,?\M-<,?\M->,?\M-?,?\M-/]
245
+ others=[?\M--,?\M-+,?\M-=,?\M-',?\M-",?\M-;,?\M-:,?\M-\,, ?\M-.,?\M-<,?\M->,?\M-?,?\M-/,?\M-!]
255
246
  others.collect! {|x| x.getbyte(0) } ## added 2009-10-04 14:25 for 1.9
256
- s_others=%w[M-- M-+ M-= M-' M-" M-; M-: M-, M-. M-< M-> M-? M-/ ]
247
+ s_others=%w[M-- M-+ M-= M-' M-" M-; M-: M-, M-. M-< M-> M-? M-/ M-!]
257
248
  if others.include? keycode
258
- index = others.index keycode
249
+ index = others.index keycode
259
250
  return s_others[index]
260
251
  end
261
252
  # all else failed
@@ -364,7 +355,7 @@ module RubyCurses
364
355
  # 2010-02-24 12:43 trying to take in multiple key bindings, TODO unbind
365
356
  # TODO add symbol so easy to map from config file or mapping file
366
357
  def bind_key keycode, *args, &blk
367
- $log.debug " #{@name} bind_key received #{keycode} "
358
+ #$log.debug " #{@name} bind_key received #{keycode} "
368
359
  @key_handler ||= {}
369
360
  #
370
361
  # added on 2011-12-4 so we can pass a description for a key and print it
@@ -407,18 +398,25 @@ module RubyCurses
407
398
  @key_args[keycode] = args
408
399
 
409
400
  end
401
+ # Display key bindings for current widget and form in dialog
410
402
  def print_key_bindings *args
411
403
  f = get_current_field
412
404
  #labels = [@key_label, f.key_label]
413
- labels = [@key_label]
414
- labels << f.key_label if f.key_label
405
+ #labels = [@key_label]
406
+ #labels << f.key_label if f.key_label
407
+ labels = []
408
+ labels << (f.key_label || {}) #if f.key_label
409
+ labels << @key_label
415
410
  arr = []
411
+ if get_current_field.help_text
412
+ arr << get_current_field.help_text
413
+ end
416
414
  labels.each_with_index { |h, i|
417
415
  case i
418
416
  when 0
419
- arr << " === Form bindings ==="
417
+ arr << " === Current widget bindings ==="
420
418
  when 1
421
- arr << " === Current field bindings ==="
419
+ arr << " === Form bindings ==="
422
420
  end
423
421
 
424
422
  h.each_pair { |name, val|
@@ -459,14 +457,22 @@ module RubyCurses
459
457
  blk = @key_handler[keycode]
460
458
  return :UNHANDLED if blk.nil?
461
459
  if blk.is_a? OrderedHash
460
+ #Ncurses::nodelay(window.get_window, bf = false)
461
+ # if you set nodelay in ncurses.rb then this will not
462
+ # wait for second key press, so you then must either make it blocking
463
+ # here, or set a wtimeout here.
462
464
  ch = window.getch
465
+ #Ncurses::nodelay(window.get_window, bf = true)
466
+
467
+ $log.debug " process_key: got #{keycode} , #{ch} "
463
468
  if ch < 0 || ch > 255
464
- #next
465
469
  return nil
466
470
  end
467
- $log.debug " process_key: got #{keycode} , #{ch} "
468
471
  yn = ch.chr
469
472
  blk1 = blk[ch]
473
+ # FIXME we are only returning the second key, what if form
474
+ # has mapped first and second combo. We should unget keycode and ch. 2011-12-23
475
+ # check this out first.
470
476
  window.ungetch(ch) if blk1.nil? # trying 2011-09-27
471
477
  return :UNHANDLED if blk1.nil? # changed nil to unhandled 2011-09-27
472
478
  $log.debug " process_key: found block for #{keycode} , #{ch} "
@@ -668,6 +674,7 @@ module RubyCurses
668
674
 
669
675
 
670
676
  class Widget
677
+ require 'rbcurse/core/include/action' # added 2012-01-3 for add_action
671
678
  include EventHandler
672
679
  include ConfigSetup
673
680
  include RubyCurses::Utils
@@ -1128,7 +1135,13 @@ module RubyCurses
1128
1135
  bind :CHANGED, *args, &block
1129
1136
  end
1130
1137
  end
1131
- ##
1138
+ # return an object of actionmanager class, creating if required
1139
+ # Widgets and apps may add_action and show_menu using the same
1140
+ def action_manager
1141
+ require 'rbcurse/core/include/actionmanager'
1142
+ @action_manager ||= ActionManager.new
1143
+ end
1144
+ #
1132
1145
  ## ADD HERE WIDGET
1133
1146
  end
1134
1147
 
@@ -1230,7 +1243,7 @@ module RubyCurses
1230
1243
  mb.toggle_key ||= Ncurses.KEY_F2
1231
1244
  if !mb.toggle_key.nil?
1232
1245
  ch = mb.toggle_key
1233
- bind_key(ch) do |_form|
1246
+ bind_key(ch, 'Menu Bar') do |_form|
1234
1247
  if !@menu_bar.nil?
1235
1248
  @menu_bar.toggle
1236
1249
  @menu_bar.handle_keys
@@ -1683,13 +1696,19 @@ module RubyCurses
1683
1696
  def map_keys
1684
1697
  return if @keys_mapped
1685
1698
  bind_keys([?\M-?,?\?], 'show field help') {
1686
- if get_current_field.help_text
1687
- textdialog(get_current_field.help_text, 'title' => 'Help Text', :bgcolor => 'green', :color => :white)
1688
- else
1699
+ #if get_current_field.help_text
1700
+ #textdialog(get_current_field.help_text, 'title' => 'Help Text', :bgcolor => 'green', :color => :white)
1701
+ #else
1689
1702
  print_key_bindings
1690
- end
1703
+ #end
1691
1704
  }
1692
1705
  bind_key(FFI::NCurses::KEY_F9, "Print keys", :print_key_bindings) # show bindings, tentative on F9
1706
+ bind_key(?\M-:, 'show menu') {
1707
+ fld = get_current_field
1708
+ am = fld.action_manager()
1709
+ #fld.init_menu
1710
+ am.show_actions
1711
+ }
1693
1712
  @keys_mapped = true
1694
1713
  end
1695
1714
 
@@ -1735,7 +1754,7 @@ module RubyCurses
1735
1754
  field = get_current_field
1736
1755
  if $log.debug?
1737
1756
  keycode = keycode_tos(ch)
1738
- $log.debug " form HK #{ch} #{self}, #{@name}, #{keycode}, field: giving to: #{field}, #{field.name} " if field
1757
+ #$log.debug " form HK #{ch} #{self}, #{@name}, #{keycode}, field: giving to: #{field}, #{field.name} " if field
1739
1758
  end
1740
1759
  handled = :UNHANDLED
1741
1760
  handled = field.handle_key ch unless field.nil? # no field focussable
@@ -2158,17 +2177,17 @@ module RubyCurses
2158
2177
  end
2159
2178
  def map_keys
2160
2179
  return if @keys_mapped
2161
- bind_key(FFI::NCurses::KEY_LEFT){ cursor_backward }
2162
- bind_key(FFI::NCurses::KEY_RIGHT){ cursor_forward }
2163
- bind_key(FFI::NCurses::KEY_BACKSPACE){ delete_prev_char }
2164
- bind_key(127){ delete_prev_char }
2165
- bind_key(330){ delete_curr_char }
2166
- bind_key(?\C-a){ cursor_home }
2167
- bind_key(?\C-e){ cursor_end }
2168
- bind_key(?\C-k){ delete_eol }
2169
- bind_key(?\C-_){ undo_delete_eol }
2180
+ bind_key(FFI::NCurses::KEY_LEFT, :cursor_backward )
2181
+ bind_key(FFI::NCurses::KEY_RIGHT, :cursor_forward )
2182
+ bind_key(FFI::NCurses::KEY_BACKSPACE, :delete_prev_char )
2183
+ bind_key(127, :delete_prev_char )
2184
+ bind_key(330, :delete_curr_char )
2185
+ bind_key(?\C-a, :cursor_home )
2186
+ bind_key(?\C-e, :cursor_end )
2187
+ bind_key(?\C-k, :delete_eol )
2188
+ bind_key(?\C-_, :undo_delete_eol )
2170
2189
  #bind_key(27){ set_buffer @original_value }
2171
- bind_key(?\C-g){ set_buffer @original_value } # 2011-09-29 V1.3.1 ESC did not work
2190
+ bind_key(?\C-g, 'revert'){ set_buffer @original_value } # 2011-09-29 V1.3.1 ESC did not work
2172
2191
  @keys_mapped = true
2173
2192
  end
2174
2193
 
@@ -2537,10 +2556,10 @@ module RubyCurses
2537
2556
  # meta key
2538
2557
  mch = ?\M-a.getbyte(0) + (ch - ?a.getbyte(0)) ## 1.9
2539
2558
  if (@label_for.is_a? RubyCurses::Button ) && (@label_for.respond_to? :fire)
2540
- @form.bind_key(mch, @label_for) { |_form, _butt| _butt.fire }
2559
+ @form.bind_key(mch, "hotkey for button #{@label_for.text} ") { |_form, _butt| @label_for.fire }
2541
2560
  else
2542
2561
  $log.debug " bind_hotkey label for: #{@label_for}"
2543
- @form.bind_key(mch, @label_for) { |_form, _field| _field.focus }
2562
+ @form.bind_key(mch, "hotkey for label #{text} ") { |_form, _field| @label_for.focus }
2544
2563
  end
2545
2564
  end
2546
2565
  end
@@ -2649,6 +2668,7 @@ module RubyCurses
2649
2668
  s.slice!(ix,1)
2650
2669
  # 2011-10-20 NOTE XXX I have removed form check since bindkey is called conditionally
2651
2670
  @underline = ix #unless @form.nil? # this setting a fake underline in messageboxes
2671
+ @text = s # mnemo needs this for setting description
2652
2672
  mnemonic s[ix,1]
2653
2673
  end
2654
2674
  @text = s
@@ -2676,7 +2696,8 @@ module RubyCurses
2676
2696
  # meta key
2677
2697
  ch = ?\M-a.getbyte(0) + (ch - ?a.getbyte(0)) unless @hotkey
2678
2698
  $log.debug " #{self} setting MNEMO to #{char} #{ch}, #{@hotkey} "
2679
- @form.bind_key(ch, self) { |_form, _butt| _butt.fire }
2699
+ _t = self.text || self.name || "Unnamed #{self.class} "
2700
+ @form.bind_key(ch, "hotkey for button #{_t} ") { |_form, _butt| self.fire }
2680
2701
  end
2681
2702
 
2682
2703
  ##
@@ -2697,7 +2718,7 @@ module RubyCurses
2697
2718
  @mnemonic = _value[@underline,1]
2698
2719
  # meta key
2699
2720
  mch = ?\M-a.getbyte(0) + (ch - ?a.getbyte(0))
2700
- @form.bind_key(mch, self) { |_form, _butt| _butt.fire }
2721
+ @form.bind_key(mch, "hotkey for button #{self.text}" ) { |_form, _butt| self.fire }
2701
2722
  end
2702
2723
  def default_button tf=nil
2703
2724
  return @default_button unless tf
@@ -2706,7 +2727,7 @@ module RubyCurses
2706
2727
  @default_button = tf
2707
2728
  if tf
2708
2729
  @surround_chars = @default_chars
2709
- @form.bind_key(13, self) { |_form, _butt| _butt.fire }
2730
+ @form.bind_key(13, "fire #{self.text} ") { |_form, _butt| self.fire }
2710
2731
  else
2711
2732
  # i have no way of reversing the above
2712
2733
  end
@@ -2967,7 +2988,6 @@ module RubyCurses
2967
2988
 
2968
2989
  ##
2969
2990
  # A checkbox, may be selected or unselected
2970
- # TODO hotkey should work here too.
2971
2991
  #
2972
2992
  class CheckBox < ToggleButton
2973
2993
  dsl_accessor :align_right # the button will be on the right 2008-12-09 23:41
data/lib/rbcurse.rb CHANGED
@@ -4,5 +4,5 @@ require 'rbcurse/core/system/window'
4
4
  require 'rbcurse/core/widgets/rwidget'
5
5
  require 'rbcurse/core/util/rdialogs'
6
6
  class Rbcurse
7
- VERSION = '0.0.0'
7
+ VERSION = '0.0.3'
8
8
  end
data/rbcurse-core.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "rbcurse-core"
8
- s.version = "0.0.2"
8
+ s.version = "0.0.3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Rahul Kumar"]
12
- s.date = "2011-12-13"
12
+ s.date = "2012-01-05"
13
13
  s.description = "Ruby curses/ncurses widgets for easy application development on text terminals (ruby 1.9, 1.8)"
14
14
  s.email = "sentinel1879@gmail.com"
15
15
  s.extra_rdoc_files = [
@@ -54,6 +54,7 @@ Gem::Specification.new do |s|
54
54
  "lib/rbcurse.rb",
55
55
  "lib/rbcurse/core/docs/index.txt",
56
56
  "lib/rbcurse/core/include/action.rb",
57
+ "lib/rbcurse/core/include/actionmanager.rb",
57
58
  "lib/rbcurse/core/include/appmethods.rb",
58
59
  "lib/rbcurse/core/include/bordertitle.rb",
59
60
  "lib/rbcurse/core/include/chunk.rb",
@@ -70,6 +71,7 @@ Gem::Specification.new do |s|
70
71
  "lib/rbcurse/core/include/rhistory.rb",
71
72
  "lib/rbcurse/core/include/rinputdataevent.rb",
72
73
  "lib/rbcurse/core/include/vieditable.rb",
74
+ "lib/rbcurse/core/include/widgetmenu.rb",
73
75
  "lib/rbcurse/core/system/colormap.rb",
74
76
  "lib/rbcurse/core/system/keyboard.rb",
75
77
  "lib/rbcurse/core/system/keydefs.rb",
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbcurse-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-13 00:00:00.000000000 Z
12
+ date: 2012-01-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ffi-ncurses
16
- requirement: &70266141084420 !ruby/object:Gem::Requirement
16
+ requirement: &70102876538580 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,7 +21,7 @@ dependencies:
21
21
  version: 0.4.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70266141084420
24
+ version_requirements: *70102876538580
25
25
  description: Ruby curses/ncurses widgets for easy application development on text
26
26
  terminals (ruby 1.9, 1.8)
27
27
  email: sentinel1879@gmail.com
@@ -68,6 +68,7 @@ files:
68
68
  - lib/rbcurse.rb
69
69
  - lib/rbcurse/core/docs/index.txt
70
70
  - lib/rbcurse/core/include/action.rb
71
+ - lib/rbcurse/core/include/actionmanager.rb
71
72
  - lib/rbcurse/core/include/appmethods.rb
72
73
  - lib/rbcurse/core/include/bordertitle.rb
73
74
  - lib/rbcurse/core/include/chunk.rb
@@ -84,6 +85,7 @@ files:
84
85
  - lib/rbcurse/core/include/rhistory.rb
85
86
  - lib/rbcurse/core/include/rinputdataevent.rb
86
87
  - lib/rbcurse/core/include/vieditable.rb
88
+ - lib/rbcurse/core/include/widgetmenu.rb
87
89
  - lib/rbcurse/core/system/colormap.rb
88
90
  - lib/rbcurse/core/system/keyboard.rb
89
91
  - lib/rbcurse/core/system/keydefs.rb