class RNDK::Itemlist

Public Class Methods

new(screen, config={}) click to toggle source
Calls superclass method RNDK::Widget::new
# File lib/rndk/itemlist.rb, line 7
def initialize(screen, config={})
  super()
  @widget_type = :itemlist
  @supported_signals += [:before_input, :after_input]

  x            = 0
  y            = 0
  title        = "itemlist"
  label        = "label"
  items        = []
  default_item = 0
  box          = true
  shadow       = false

  config.each do |key, val|
    x            = val if key == :x
    y            = val if key == :y
    title        = val if key == :title
    label        = val if key == :label
    items        = val if key == :items
    default_item = val if key == :default_item
    box          = val if key == :box
    shadow       = val if key == :shadow
  end

  count = items.size
  parent_width = Ncurses.getmaxx(screen.window)
  parent_height = Ncurses.getmaxy(screen.window)
  field_width = 0

  if !self.create_list items
    self.destroy
    return nil
  end

  self.set_box(box)
  box_height = (@border_size * 2) + 1

  # Set some basic values of the item list
  @label = ''
  @label_len = 0
  @label_win = nil

  # Translate the label string to a chtype array
  if !(label.nil?) && label.size > 0
    label_len = []
    @label = RNDK.char2Chtype(label, label_len, [])
    @label_len = label_len[0]
  end

  # Set the box width. Allow an extra char in field width for cursor
  field_width = self.maximumFieldWidth + 1
  box_width = field_width + @label_len + 2 * @border_size
  box_width = self.set_title(title, box_width)
  box_height += @title_lines

  # Make sure we didn't extend beyond the dimensions of the window
  @box_width = [box_width, parent_width].min
  @box_height = [box_height, parent_height].min
  self.updateFieldWidth

  # Rejustify the x and y positions if we need to.
  xtmp = [x]
  ytmp = [y]
  RNDK.alignxy(screen.window, xtmp, ytmp, box_width, box_height)
  xpos = xtmp[0]
  ypos = ytmp[0]

  # Make the window.
  @win = Ncurses.newwin(box_height, box_width, ypos, xpos)
  if @win.nil?
    self.destroy
    return nil
  end

  # Make the label window if there was a label.
  if @label.size > 0
    @label_win = Ncurses.subwin(@win, 1, @label_len,
        ypos + @border_size + @title_lines,
        xpos + @border_size)

    if @label_win.nil?
      self.destroy
      return nil
    end
  end

  Ncurses.keypad(@win, true)

  # Make the field window.
  if !self.createFieldWin(
      ypos + @border_size + @title_lines,
      xpos + @label_len + @border_size)
    self.destroy
    return nil
  end

  # Set up the rest of the structure
  @screen = screen
  @parent = screen.window
  @shadow_win = nil
  @accepts_focus = true
  @shadow = shadow

  # Set the default item.
  if default_item >= 0 && default_item < @list_size
    @current_item = default_item
    @default_item = default_item
  else
    @current_item = 0
    @default_item = 0
  end

  # Do we want a shadow?
  if shadow
    @shadow_win = Ncurses.newwin(box_height, box_width,
        ypos + 1, xpos + 1)
    if @shadow_win.nil?
      self.destroy
      return nil
    end
  end

  # Register this baby.
  screen.register(@widget_type, self)
end

Public Instance Methods

activate(actions=[]) click to toggle source

This allows the user to play with the widget.

# File lib/rndk/itemlist.rb, line 135
def activate(actions=[])
  ret = false

  # Draw the widget.
  self.draw
  self.draw_field(true)

  if actions.nil? || actions.size == 0
    input = 0

    while true
      input = self.getch

      # Inject the character into the widget.
      ret = self.inject(input)
      if @exit_type != :EARLY_EXIT
        return ret
      end
    end
  else
    # Inject each character one at a time.
    actions.each do |action|
      ret = self.inject(action)
      if @exit_type != :EARLY_EXIT
        return ret
      end
    end
  end

  # Set the exit type and exit.
  self.set_exit_type(0)
  return ret
end
createFieldWin(ypos, xpos) click to toggle source

Make the field window.

# File lib/rndk/itemlist.rb, line 474
def createFieldWin(ypos, xpos)
  @field_win = Ncurses.subwin(@win, 1, @field_width, ypos, xpos)

  unless @field_win.nil?
    Ncurses.keypad(@field_win, true)
    @input_window = @field_win
    return true
  end
  return false
end
create_list(item) click to toggle source
# File lib/rndk/itemlist.rb, line 406
def create_list item
  count = item.size

  status = false
  new_items = []
  new_pos = []
  new_len = []
  if count >= 0
    field_width = 0

    # Go through the list and determine the widest item.
    status = true
    (0...count).each do |x|
      # Copy the item to the list.
      lentmp = []
      postmp = []
      new_items << RNDK.char2Chtype(item[x], lentmp, postmp)
      new_len << lentmp[0]
      new_pos << postmp[0]
      if new_items[0] == 0
        status = false
        break
      end
      field_width = [field_width, new_len[x]].max
    end

    # Now we need to justify the strings.
    (0...count).each do |x|
      new_pos[x] = RNDK.justifyString(field_width + 1,
          new_len[x], new_pos[x])
    end

    if status
      self.destroyInfo

      # Copy in the new information
      @list_size = count
      @item = new_items
      @item_pos = new_pos
      @item_len = new_len
    end
  else
    self.destroyInfo
    status = true
  end

  return status
end
destroy() click to toggle source

This function destroys the widget and all the memory it used.

# File lib/rndk/itemlist.rb, line 319
def destroy
  self.clean_title
  self.destroyInfo

  # Delete the windows
  RNDK.window_delete(@field_win)
  RNDK.window_delete(@label_win)
  RNDK.window_delete(@shadow_win)
  RNDK.window_delete(@win)

  # Clean the key bindings.
  self.clean_bindings

  @screen.unregister self
end
destroyInfo() click to toggle source
# File lib/rndk/itemlist.rb, line 313
def destroyInfo
  @list_size = 0
  @item = ''
end
draw() click to toggle source

This draws the widget on the screen.

# File lib/rndk/itemlist.rb, line 249
def draw
  # Did we ask for a shadow?
  Draw.drawShadow(@shadow_win) unless @shadow_win.nil?

  self.draw_title(@win)

  # Draw in the label to the widget.
  unless @label_win.nil?
    Draw.writeChtype(@label_win, 0, 0, @label, RNDK::HORIZONTAL,
        0, @label.size)
  end

  # Box the widget if asked.
  Draw.drawObjBox(@win, self) if @box

  Ncurses.wrefresh @win

  # Draw in the field.
  self.draw_field(false)
end
draw_field(highlight) click to toggle source

This function draws the contents of the field.

# File lib/rndk/itemlist.rb, line 278
def draw_field(highlight)
  # Declare local vars.
  current_item = @current_item

  # Determine how much we have to draw.
  len = [@item_len[current_item], @field_width].min

  # Erase the field window.
  Ncurses.werase(@field_win)

  # Draw in the current item in the field.
  (0...len).each do |x|
    c = @item[current_item][x]

    if highlight
      c = c.ord | RNDK::Color[:reverse]
    end

    Ncurses.mvwaddch(@field_win, 0, x + @item_pos[current_item], c)
  end

  # Redraw the field window.
  Ncurses.wrefresh(@field_win)
end
erase() click to toggle source

This function removes the widget from the screen.

# File lib/rndk/itemlist.rb, line 304
def erase
  if self.valid?
    RNDK.window_erase(@field_win)
    RNDK.window_erase(@label_win)
    RNDK.window_erase(@win)
    RNDK.window_erase(@shadow_win)
  end
end
focus() click to toggle source
# File lib/rndk/itemlist.rb, line 398
def focus
  self.draw_field(true)
end
getCurrentItem() click to toggle source
# File lib/rndk/itemlist.rb, line 378
def getCurrentItem
  return @current_item
end
getDefaultItem() click to toggle source
# File lib/rndk/itemlist.rb, line 394
def getDefaultItem
  return @default_item
end
getValues(size) click to toggle source
# File lib/rndk/itemlist.rb, line 365
def getValues(size)
  size << @list_size
  return @item
end
inject(input) click to toggle source

This injects a single character into the widget.

# File lib/rndk/itemlist.rb, line 170
def inject input
  pp_return = true
  ret = false
  complete = false

  # Set the exit type.
  self.set_exit_type(0)

  # Draw the widget field
  self.draw_field(true)

  # Check if there is a pre-process function to be called.
  keep_going = self.run_signal_binding(:before_input, input)

  if keep_going

    # Check a predefined binding.
    if self.is_bound? input
      self.run_key_binding input
      #complete = true
    else
      case input
      when Ncurses::KEY_UP, Ncurses::KEY_RIGHT, ' '.ord, '+'.ord, 'n'.ord
        if @current_item < @list_size - 1
          @current_item += 1
        else
          @current_item = 0
        end
      when Ncurses::KEY_DOWN, Ncurses::KEY_LEFT, '-'.ord, 'p'.ord
        if @current_item > 0
          @current_item -= 1
        else
          @current_item = @list_size - 1
        end
      when 'd'.ord, 'D'.ord
        @current_item = @default_item
      when '0'.ord
        @current_item = 0
      when '$'.ord
        @current_item = @list_size - 1
      when RNDK::KEY_ESC
        self.set_exit_type(input)
        complete = true
      when Ncurses::ERR
        self.set_exit_type(input)
        complete = true
      when RNDK::KEY_TAB, RNDK::KEY_RETURN, Ncurses::KEY_ENTER
        self.set_exit_type(input)
        ret = @current_item
        complete = true
      when RNDK::REFRESH
        @screen.erase
        @screen.refresh
      else
        RNDK.beep
      end
    end

    # Should we call a post-process?
    self.run_signal_binding(:after_input) if not complete
  end

  if !complete
    self.draw_field(true)
    self.set_exit_type(0)
  end

  @result_data = ret
  return ret
end
maximumFieldWidth() click to toggle source

Go through the list and determine the widest item.

# File lib/rndk/itemlist.rb, line 456
def maximumFieldWidth
  max_width = -2**30

  (0...@list_size).each do |x|
    max_width = [max_width, @item_len[x]].max
  end
  max_width = [max_width, 0].max

  return max_width
end
move(x, y, relative, refresh_flag) click to toggle source

This moves the itemlist field to the given location.

# File lib/rndk/itemlist.rb, line 242
def move(x, y, relative, refresh_flag)
  windows = [@win, @field_win, @label_win, @shadow_win]

  self.move_specific(x, y, relative, refresh_flag, windows, [])
end
position() click to toggle source
Calls superclass method RNDK::Widget#position
# File lib/rndk/itemlist.rb, line 485
def position
  super(@win)
end
set(list, count, current, box) click to toggle source

This sets multiple attributes of the widget.

# File lib/rndk/itemlist.rb, line 336
def set(list, count, current, box)
  self.set_values(list, count, current)
  self.set_box(box)
end
setCurrentItem(current_item) click to toggle source

This sets the default/current item of the itemlist

# File lib/rndk/itemlist.rb, line 371
def setCurrentItem(current_item)
  # Set the default item.
  if current_item >= 0 && current_item < @list_size
    @current_item = current_item
  end
end
setDefaultItem(default_item) click to toggle source

This sets the default item in the list.

# File lib/rndk/itemlist.rb, line 383
def setDefaultItem(default_item)
  # Make sure the item is in the correct range.
  if default_item < 0
    @default_item = 0
  elsif default_item >= @list_size
    @default_item = @list_size - 1
  else
    @default_item = default_item
  end
end
set_bg_color(attrib) click to toggle source

This sets the background attribute of the widget

# File lib/rndk/itemlist.rb, line 271
def set_bg_color(attrib)
  Ncurses.wbkgd(@win, attrib)
  Ncurses.wbkgd(@field_win, attrib)
  Ncurses.wbkgd(@label_win, attrib) unless @label_win.nil?
end
set_values(item, default_item) click to toggle source

This function sets the contents of the list

# File lib/rndk/itemlist.rb, line 342
def set_values(item, default_item)
  if self.create_list item
    old_width = @field_width

    # Set the default item.
    if default_item >= 0 && default_item < @list_size
      @current_item = default_item
      @default_item = default_item
    end

    # This will not resize the outer windows but can still make a usable
    # field width if the title made the outer window wide enough
    self.updateFieldWidth
    if @field_width > old_width
      self.createFieldWin(@field_win.getbegy, @field_win.getbegx)
    end

    # Draw the field.
    self.erase
    self.draw
  end
end
unfocus() click to toggle source
# File lib/rndk/itemlist.rb, line 402
def unfocus
  self.draw_field(false)
end
updateFieldWidth() click to toggle source
# File lib/rndk/itemlist.rb, line 467
def updateFieldWidth
  want = self.maximumFieldWidth + 1
  have = @box_width - @label_len - 2 * @border_size
  @field_width = [want, have].min
end