module RNDK::Traverse

Public Class Methods

exit_cancel(screen) click to toggle source
# File lib/rndk/core/traverse.rb, line 96
def Traverse.exit_cancel screen
  screen.exit_status = RNDK::Screen::EXITCANCEL
end
exit_cancel_of(obj) click to toggle source
# File lib/rndk/core/traverse.rb, line 104
def Traverse.exit_cancel_of(obj)
  exit_cancel obj.screen
end
exit_ok(screen) click to toggle source
# File lib/rndk/core/traverse.rb, line 92
def Traverse.exit_ok screen
  screen.exit_status = RNDK::Screen::EXITOK
end
exit_ok_of(obj) click to toggle source
# File lib/rndk/core/traverse.rb, line 100
def Traverse.exit_ok_of(obj)
  exit_ok obj.screen
end
get_current_focus(screen) click to toggle source

Returns the widget on which the focus lies.

# File lib/rndk/core/traverse.rb, line 113
def Traverse.get_current_focus(screen)
  result = nil
  n = screen.widget_focus

  if n >= 0 && n < screen.widget_count
    result = screen.widget[n]
  end

  return result
end
once(screen, curobj, key_code, function_key, func_menu_key) click to toggle source

Traverse the screen just one time.

# File lib/rndk/core/traverse.rb, line 8
def Traverse.once(screen,
                  curobj,
                  key_code,
                  function_key,
                  func_menu_key)

  case key_code
  when Ncurses::KEY_BTAB
    switch_focus(set_previous_focus(screen), curobj)

  when RNDK::KEY_TAB
    switch_focus(set_next_focus(screen), curobj)

  when RNDK.KEY_F(10)
    # save data and exit
    exit_ok(screen)

  when RNDK.CTRL('X')
    exit_cancel screen

  when RNDK.CTRL('R')
    # reset data to defaults
    reset(screen)
    set_focus(curobj)

  when RNDK::REFRESH
    # redraw screen
    screen.refresh
    set_focus(curobj)

  else
    # not everyone wants menus, so we make them optional here
    if !(func_menu_key.nil?) &&
        (func_menu_key.call(key_code, function_key))
      # find and enable drop down menu
      screen.widget.each do |widget|
        if !(widget.nil?) && widget.widget_type == :MENU
          Traverse.handleMenu(screen, widget, curobj)
        end
      end

    else
      curobj.inject(key_code)
    end
  end
end
over(screen) click to toggle source

Traverse continuously the widgets on a screen.

# File lib/rndk/core/traverse.rb, line 56
def Traverse.over screen
  result = 0
  curobj = set_first_focus(screen)

  unless curobj.nil?
    refresh_data(screen)

    screen.exit_status = RNDK::Screen::NOEXIT

    while !((curobj = get_current_focus(screen)).nil?) &&
        screen.exit_status == RNDK::Screen::NOEXIT
      function = []
      key = curobj.getch(function)

      # TODO look at more direct way to do this
      check_menu_key = lambda do |key_code, function_key|
        Traverse.checkMenuKey(key_code, function_key)
      end


      Traverse.once(screen, curobj, key,
          function[0], check_menu_key)
    end

    if screen.exit_status == RNDK::Screen::EXITOK
      save_data(screen)
      result = 1
    end
  end
  return result
end
reset(screen) click to toggle source
# File lib/rndk/core/traverse.rb, line 88
def Traverse.reset screen
  refresh_data(screen)
end
reset_of(obj) click to toggle source
# File lib/rndk/core/traverse.rb, line 108
def Traverse.reset_of(obj)
  reset(obj.screen)
end
set_current_focus(screen, newobj) click to toggle source

Set focus to a specific widget, returning it. If the widget cannot be found, return nil.

# File lib/rndk/core/traverse.rb, line 178
def Traverse.set_current_focus(screen, newobj)
  result = nil
  curobj = nil
  n = getFocusIndex(screen)
  first = n

  while true
    n += 1
    if n >= screen.widget_count
      n = 0
    end

    curobj = screen.widget[n]
    if curobj == newobj
      result = curobj
      break
    elsif n == first
      break
    end
  end

  set_focusIndex(screen, if !(result.nil?) then n else -1 end)
  return result
end
set_first_focus(screen) click to toggle source

Set focus to the first widget in the screen.

# File lib/rndk/core/traverse.rb, line 204
def Traverse.set_first_focus(screen)
  set_focusIndex(screen, screen.widget_count - 1)
  return switch_focus(set_next_focus(screen), nil)
end
set_last_focus(screen) click to toggle source

Set focus to the last widget in the screen.

# File lib/rndk/core/traverse.rb, line 210
def Traverse.set_last_focus(screen)
  set_focusIndex(screen, 0)
  return switch_focus(set_previous_focus(screen), nil)
end
set_next_focus(screen) click to toggle source

Set focus to the next widget, returning it.

# File lib/rndk/core/traverse.rb, line 125
def Traverse.set_next_focus(screen)
  result = nil
  curobj = nil
  n = getFocusIndex(screen)
  first = n

  while true
    n+= 1
    if n >= screen.widget_count
      n = 0
    end
    curobj = screen.widget[n]
    if !(curobj.nil?) && curobj.accepts_focus
      result = curobj
      break
    else
      if n == first
        break
      end
    end
  end

  set_focusIndex(screen, if !(result.nil?) then n else -1 end)
  return result
end
set_previous_focus(screen) click to toggle source

Set focus to the previous widget, returning it.

# File lib/rndk/core/traverse.rb, line 152
def Traverse.set_previous_focus(screen)
  result = nil
  curobj = nil
  n = getFocusIndex(screen)
  first = n

  while true
    n -= 1
    if n < 0
      n = screen.widget_count - 1
    end
    curobj = screen.widget[n]
    if !(curobj.nil?) && curobj.accepts_focus
      result = curobj
      break
    elsif n == first
      break
    end
  end

  set_focusIndex(screen, if !(result.nil?) then n else -1 end)
  return result
end

Private Class Methods

checkMenuKey(key_code, function_key) click to toggle source
# File lib/rndk/core/traverse.rb, line 257
def Traverse.checkMenuKey(key_code, function_key)
  key_code == RNDK::KEY_ESC && !function_key
end
getFocusIndex(screen) click to toggle source
# File lib/rndk/core/traverse.rb, line 225
def Traverse.getFocusIndex(screen)
  return limitFocusIndex(screen, screen.widget_focus)
end
handleMenu(screen, menu, oldobj) click to toggle source
# File lib/rndk/core/traverse.rb, line 261
def Traverse.handleMenu(screen, menu, oldobj)
  done = false

  switch_focus(menu, oldobj)
  while !done
    key = menu.getch

    case key
    when RNDK::KEY_TAB
      done = true
    when RNDK::KEY_ESC
      # cleanup the menu
      menu.inject(key)
      done = true
    else
      done = (menu.inject(key) >= 0)
    end
  end

  if (newobj = Traverse.get_current_focus(screen)).nil?
    newobj = Traverse.set_next_focus(screen)
  end

  return switch_focus(newobj, menu)
end
limitFocusIndex(screen, value) click to toggle source
# File lib/rndk/core/traverse.rb, line 217
def Traverse.limitFocusIndex(screen, value)
  if value >= screen.widget_count || value < 0
    0
  else
    value
  end
end
refresh_data(screen) click to toggle source

Calls Widget#refresh_data on all widgets of ‘screen`.

# File lib/rndk/core/traverse.rb, line 295
def Traverse.refresh_data screen
  screen.widget.each do |widget|
    widget.refresh_data unless widget.nil?
  end
end
save_data(screen) click to toggle source

Calls Widget#save_data on all widgets of ‘screen`.

# File lib/rndk/core/traverse.rb, line 288
def Traverse.save_data screen
  screen.widget.each do |widget|
    widget.save_data unless widget.nil?
  end
end
set_focus(obj) click to toggle source
# File lib/rndk/core/traverse.rb, line 241
def Traverse.set_focus(obj)
  unless obj.nil?
    obj.has_focus = true
    obj.focus
  end
  RNDK::blink_cursor true
end
set_focusIndex(screen, value) click to toggle source
# File lib/rndk/core/traverse.rb, line 229
def Traverse.set_focusIndex(screen, value)
  screen.widget_focus = limitFocusIndex(screen, value)
end
switch_focus(newobj, oldobj) click to toggle source
# File lib/rndk/core/traverse.rb, line 249
def Traverse.switch_focus(newobj, oldobj)
  if oldobj != newobj
    Traverse.unset_focus(oldobj)
    Traverse.set_focus(newobj)
  end
  return newobj
end
unset_focus(obj) click to toggle source
# File lib/rndk/core/traverse.rb, line 233
def Traverse.unset_focus(obj)
  RNDK::blink_cursor false
  unless obj.nil?
    obj.has_focus = false
    obj.unfocus
  end
end