class CyberarmEngine::Element::EditLine

Public Class Methods

new(text, options = {}, block = nil) click to toggle source
Calls superclass method CyberarmEngine::Element::Button::new
# File lib/cyberarm_engine/ui/elements/edit_line.rb, line 4
def initialize(text, options = {}, block = nil)
  @filter = options.delete(:filter)
  super(text, options, block)

  @type = default(:type)

  @caret_width = default(:caret_width)
  @caret_height = @text.textobject.height
  @caret_color = default(:caret_color)
  @caret_interval = default(:caret_interval)
  @caret_last_interval = Gosu.milliseconds
  @show_caret = true

  @text_input = Gosu::TextInput.new
  @text_input.text = text
  @last_text_value = text

  if @filter && @filter.respond_to?(:call)
    @text_input.instance_variable_set(:@filter, @filter)

    def @text_input.filter(text_in)
      @filter.call(text_in)
    end
  end

  @offset_x = 0
  @offset_y = 0

  event(:begin_drag)
  event(:drag_update)
  event(:end_drag)
end

Public Instance Methods

begin_drag(_sender, x, _y, _button) click to toggle source
# File lib/cyberarm_engine/ui/elements/edit_line.rb, line 229
def begin_drag(_sender, x, _y, _button)
  @drag_start = x
  @offset_drag_start = @offset_x
  @drag_caret_position = @text_input.caret_pos

  :handled
end
blur(_sender) click to toggle source
Calls superclass method
# File lib/cyberarm_engine/ui/elements/edit_line.rb, line 218
def blur(_sender)
  super
  window.text_input = nil

  :handled
end
button_down(id) click to toggle source
# File lib/cyberarm_engine/ui/elements/edit_line.rb, line 87
def button_down(id)
  handle_keyboard_shortcuts(id)
end
caret_position() click to toggle source
# File lib/cyberarm_engine/ui/elements/edit_line.rb, line 171
def caret_position
  text_input_position_for(:caret_pos)
end
caret_position_under_mouse(mouse_x) click to toggle source
# File lib/cyberarm_engine/ui/elements/edit_line.rb, line 131
def caret_position_under_mouse(mouse_x)
  1.upto(@text.text.length) do |i|
    return i - 1 if mouse_x < @text.x - @offset_x + @text.width(@text.text[0...i])
  end

  @text_input.text.length
end
drag_update(_sender, x, _y, _button) click to toggle source
# File lib/cyberarm_engine/ui/elements/edit_line.rb, line 237
def drag_update(_sender, x, _y, _button)
  @text_input.caret_pos = caret_position_under_mouse(x)

  :handled
end
draggable?(button) click to toggle source
# File lib/cyberarm_engine/ui/elements/edit_line.rb, line 225
def draggable?(button)
  button == :left
end
draw_caret() click to toggle source
# File lib/cyberarm_engine/ui/elements/edit_line.rb, line 51
def draw_caret
  Gosu.draw_rect(caret_position, @text.y, @caret_width, @caret_height, @caret_color, @z)
end
draw_selection() click to toggle source
# File lib/cyberarm_engine/ui/elements/edit_line.rb, line 55
def draw_selection
  selection_width = caret_position - selection_start_position

  Gosu.draw_rect(selection_start_position, @text.y, selection_width, @text.height, default(:selection_color), @z)
end
draw_text() click to toggle source
# File lib/cyberarm_engine/ui/elements/edit_line.rb, line 47
def draw_text
  @text.draw(:draw_text)
end
end_drag(_sender, _x, _y, _button) click to toggle source
# File lib/cyberarm_engine/ui/elements/edit_line.rb, line 243
def end_drag(_sender, _x, _y, _button)
  :handled
end
enter(sender) click to toggle source
Calls superclass method
# File lib/cyberarm_engine/ui/elements/edit_line.rb, line 208
def enter(sender)
  _has_focus = @focus

  super

  @focus = _has_focus

  :handled
end
focus(sender) click to toggle source
Calls superclass method
# File lib/cyberarm_engine/ui/elements/edit_line.rb, line 199
def focus(sender)
  super

  window.text_input = @text_input
  @text_input.caret_pos = @text_input.selection_start = @text_input.text.length

  :handled
end
handle_keyboard_shortcuts(id) click to toggle source
# File lib/cyberarm_engine/ui/elements/edit_line.rb, line 91
def handle_keyboard_shortcuts(id)
  return unless @focus && @enabled

  if Gosu.button_down?(Gosu::KB_LEFT_CONTROL) || Gosu.button_down?(Gosu::KB_RIGHT_CONTROL)
    case id
    when Gosu::KB_A
      @text_input.selection_start = 0
      @text_input.caret_pos = @text_input.text.length

    when Gosu::KB_C
      if @text_input.selection_start < @text_input.caret_pos
        Clipboard.copy(@text_input.text[@text_input.selection_start...@text_input.caret_pos])
      else
        Clipboard.copy(@text_input.text[@text_input.caret_pos...@text_input.selection_start])
      end

    when Gosu::KB_X
      chars = @text_input.text.chars

      if @text_input.selection_start < @text_input.caret_pos
        Clipboard.copy(@text_input.text[@text_input.selection_start...@text_input.caret_pos])
        chars.slice!(@text_input.selection_start, @text_input.caret_pos)
      else
        Clipboard.copy(@text_input.text[@text_input.caret_pos...@text_input.selection_start])
        chars.slice!(@text_input.caret_pos, @text_input.selection_start)
      end

      @text_input.text = chars.join

    when Gosu::KB_V
      if instance_of?(EditLine) # EditLine assumes a single line of text
        @text_input.text = @text_input.text.insert(@text_input.caret_pos,
                                                   Clipboard.paste.encode("UTF-8").gsub("\n", ""))
      else
        @text_input.text = @text_input.text.insert(@text_input.caret_pos, Clipboard.paste.encode("UTF-8"))
      end
    end
  end
end
keep_caret_visible() click to toggle source
# File lib/cyberarm_engine/ui/elements/edit_line.rb, line 143
def keep_caret_visible
  caret_pos = (caret_position - @text.x) + @caret_width

  @last_text ||= "/\\"
  @last_pos ||= -1

  @last_text = @text.text
  @last_pos = caret_pos

  if caret_pos.between?(@offset_x, @width + @offset_x)
    # Do nothing

  elsif caret_pos < @offset_x
    @offset_x = if caret_pos > @width
                  caret_pos + @width
                else
                  0
                end

  elsif caret_pos > @width
    @offset_x = caret_pos - @width

  else
    # Reset to Zero
    @offset_x = 0
  end
end
left_mouse_button(sender, x, y) click to toggle source
Calls superclass method
# File lib/cyberarm_engine/ui/elements/edit_line.rb, line 187
def left_mouse_button(sender, x, y)
  super
  window.text_input = @text_input

  @caret_last_interval = Gosu.milliseconds
  @show_caret = true

  move_caret_to_mouse(x, y)

  :handled
end
move_caret_to_mouse(mouse_x, _mouse_y) click to toggle source
# File lib/cyberarm_engine/ui/elements/edit_line.rb, line 139
def move_caret_to_mouse(mouse_x, _mouse_y)
  @text_input.caret_pos = @text_input.selection_start = caret_position_under_mouse(mouse_x)
end
recalculate() click to toggle source
# File lib/cyberarm_engine/ui/elements/edit_line.rb, line 247
def recalculate
  super

  @width = dimensional_size(@style.width, :width) || default(:width)
  update_background
end
render() click to toggle source
# File lib/cyberarm_engine/ui/elements/edit_line.rb, line 37
def render
  Gosu.clip_to(@text.x, @text.y, @width, @height) do
    Gosu.translate(-@offset_x, -@offset_y) do
      draw_selection
      draw_caret if @focus && @show_caret
      draw_text
    end
  end
end
selection_start_position() click to toggle source
# File lib/cyberarm_engine/ui/elements/edit_line.rb, line 175
def selection_start_position
  text_input_position_for(:selection_start)
end
text_input_position_for(method) click to toggle source
# File lib/cyberarm_engine/ui/elements/edit_line.rb, line 179
def text_input_position_for(method)
  if @type == :password
    @text.x + @text.width(default(:password_character) * @text_input.text[0...@text_input.send(method)].length)
  else
    @text.x + @text.width(@text_input.text[0...@text_input.send(method)])
  end
end
update() click to toggle source
# File lib/cyberarm_engine/ui/elements/edit_line.rb, line 61
def update
  @style_event = :active if @focus

  @text.text = if @type == :password
                 default(:password_character) * @text_input.text.length
               else
                 @text_input.text
               end

  if @last_text_value != value
    @last_text_value = value
    @show_caret = true
    @caret_last_interval = Gosu.milliseconds

    publish(:changed, value)
  end

  if Gosu.milliseconds >= @caret_last_interval + @caret_interval
    @caret_last_interval = Gosu.milliseconds

    @show_caret = !@show_caret
  end

  keep_caret_visible
end
value() click to toggle source
# File lib/cyberarm_engine/ui/elements/edit_line.rb, line 254
def value
  @text_input.text
end
value=(string) click to toggle source
# File lib/cyberarm_engine/ui/elements/edit_line.rb, line 258
def value=(string)
  @text_input.text = string
end