class Canis::CommandWindow
Creates a window at the bottom of the screen for some operations. Used for some operations such as:
- display a menu - display some interactive text - display some text
Attributes
Public Class Methods
# File lib/canis/core/util/rcommandwindow.rb, line 138 def initialize form=nil, aconfig={}, &block # --- {{{ @config = aconfig @config.each_pair { |k,v| instance_variable_set("@#{k}",v) } instance_eval &block if block_given? if @layout.nil? set_layout(1,Ncurses.COLS, -1, 0) end @height = @layout[:height] @width = @layout[:width] @window = Canis::Window.new(@layout) @start = 0 # row for display of text with paging @list = [] draw_box @window.wrefresh @panel = @window.panel Ncurses::Panel.update_panels @window.wrefresh @row_offset = 0 if @box @row_offset = 1 end end
Public Instance Methods
# File lib/canis/core/util/rcommandwindow.rb, line 297 def OLDdestroy $log.debug "DESTROY : rcommandwindow" if @window begin panel = @window.panel Ncurses::Panel.del_panel(panel.pointer) if panel @window.delwin rescue => exc end end end
# File lib/canis/core/util/rcommandwindow.rb, line 271 def cget param @config[param] end
clears the window, leaving the title line as is, from row 1 onwards
# File lib/canis/core/util/rcommandwindow.rb, line 315 def clear @window.wmove 1,1 @window.wclrtobot #@window.box 0,0 if @box == :border draw_box # lower line of border will get erased currently since we are writing to # last line FIXME end
might as well add more keys for paging.
# File lib/canis/core/util/rcommandwindow.rb, line 261 def configure(*val , &block) case val.size when 1 return @config[val[0]] when 2 @config[val[0]] = val[1] instance_variable_set("@#{val[0]}", val[1]) end instance_eval &block if block_given? end
# File lib/canis/core/util/rcommandwindow.rb, line 294 def destroy @window.destroy end
draw the box, needed to redo this upon clear since clearing of windows was removing the top border 2014-05-04 - 20:14
# File lib/canis/core/util/rcommandwindow.rb, line 163 def draw_box if @box == :border @window.box 0,0 elsif @box @window.attron(Ncurses.COLOR_PAIR($normalcolor) | Ncurses::A_REVERSE) # 2016-01-14 - replacing 1 with space since junk is showing up in some cases. space_char = " ".codepoints.first #@window.mvhline 0,0,1,@width @window.mvhline 0,0,space_char,@width @window.printstring 0,0,@title, $normalcolor #, 'normal' if @title @window.attroff(Ncurses.COLOR_PAIR($normalcolor) | Ncurses::A_REVERSE) else #@window.printstring 0,0,@title, $normalcolor, 'reverse' if @title title @title end end
todo handle mappings, so user can map keys TODO
# File lib/canis/core/util/rcommandwindow.rb, line 207 def handle_keys begin while((ch = @window.getchar()) != 999 ) case ch when -1 next else press ch break if @stop yield ch if block_given? end end ensure destroy end return #@selected_index end
this really helps if we are creating another window over this and we find the lower window still showing through. destroy does not often work so this clears current window. However, lower window may still have a black region. FIXME
# File lib/canis/core/util/rcommandwindow.rb, line 290 def hide @window.hide Window.refresh_all end
handles a key, commandline
# File lib/canis/core/util/rcommandwindow.rb, line 226 def press ch ch = ch.getbyte(0) if ch.class==String ## 1.9 $log.debug " XXX press #{ch} " if $log.debug? case ch when -1 return when KEY_F1, 27, ?\C-q.getbyte(0) @stop = true return when KEY_ENTER, 10, 13 #$log.debug "popup ENTER : #{@selected_index} " #$log.debug "popup ENTER : #{field.name}" if !field.nil? @stop = true return when ?\C-d.getbyte(0) @start += @height-1 bounds_check when KEY_UP @start -= 1 @start = 0 if @start < 0 when KEY_DOWN @start += 1 bounds_check when ?\C-b.getbyte(0) @start -= @height-1 @start = 0 if @start < 0 when 0 @start = 0 end Ncurses::Panel.update_panels(); Ncurses.doupdate(); @window.wrefresh end
not sure if this is really required. print_string is just fine. print a string. config can be :x :y :color_pair
# File lib/canis/core/util/rcommandwindow.rb, line 184 def print_str text, config={} win = config.fetch(:window, @window) # assuming its in App x = config.fetch :x, 0 y = config.fetch :y, 0 color = config[:color_pair] || $datacolor raise "no window for ask print in #{self.class} name: #{name} " unless win color=Ncurses.COLOR_PAIR(color); win.attron(color); win.mvprintw(x, y, "%s" % text); win.attroff(color); win.refresh end
refresh whatevers painted onto the window
# File lib/canis/core/util/rcommandwindow.rb, line 309 def refresh Ncurses::Panel.update_panels(); Ncurses.doupdate(); @window.wrefresh end
# File lib/canis/core/util/rcommandwindow.rb, line 275 def set_layout(height=0, width=0, top=0, left=0) # negative means top should be n rows from last line. -1 is last line if top < 0 top = Ncurses.LINES-top end @layout = { :height => height, :width => width, :top => top, :left => left } @height = height @width = width end
# File lib/canis/core/util/rcommandwindow.rb, line 284 def show @window.show end
—- windowing functions {{{
message box
# File lib/canis/core/util/rcommandwindow.rb, line 202 def stopping? @stop end
modify the window title, or get it if no params passed.
# File lib/canis/core/util/rcommandwindow.rb, line 326 def title t=nil # --- {{{ return @title unless t @title = t @window.printstring 0,0,@title, $normalcolor, 'reverse' if @title end