如何为Ruby Shoes实现模糊事件

Nig*_*rne 5 ruby shoes blur

我正在试验Ruby Shoes.我希望控件在你给它们焦点时变得可编辑,并在它们松开时再次变成文本.到目前为止,我有以下......

class NameBox < Shoes::Widget
  def initialize(model, opts = {})
    @model = model
    @para = para(value)
    self.click{ 
      edit
    }
    self.keypress{|key|
      display if key==:enter
    }
  end

  def display
    @ed && @ed.hide
    @para.show
    @para.text = value
  end

  def edit
    @ed ||= edit_line(value) {|e|
      @model.rename(e.text)
    }
    @para.hide
    @ed.text = value
    @ed.show
  end

  def value
    @model.name
  end
end
Run Code Online (Sandbox Code Playgroud)

用于

class Model
  attr_reader :name
  def initialize(name)
    @name = name
  end
  def rename(new_name)
    @name = new_name
  end
end

Shoes.app do
  @variable = Model.new("1 2 3")
  stack do
    10.times{ name_box(@variable) }
  end
end
Run Code Online (Sandbox Code Playgroud)

此实现意味着如果您单击多个控件,它们都将是编辑框.

我所希望的是一个模糊事件,可以让我将控制权改回"显示".这不存在,所以..你将如何实现它?

假设我将编写更多控件,他们都必须遵守"一个集中控制"的规则

**奖励积分解释了为什么我不能放:

@ed ||= edit_line(value) {|e|
  @model.rename(e.text)
} 
@ed.hide()
Run Code Online (Sandbox Code Playgroud)

在初始化中,让@ed隐藏起来.

小智 2

这个怎么样?

class NameBox < Shoes::Widget
  def initialize(model, opts = {})
    @model = model
    @para = para(value)
    self.click{ 
      edit
    }
  end

  def display
    @ed && @ed.hide
    @para.show
    @para.text = value
  end

  def edit
    @ed ||= edit_box(value, height: 30) {|e|
      e.text[-1] == "\n" ? display : @model.rename(e.text)
    }
    @para.hide
    @ed.text = value
    @ed.show
  end

  def value
    @model.name
  end
end

class Model
  attr_reader :name
  def initialize(name)
    @name = name
  end
  def rename(new_name)
    @name = new_name
  end
end

Shoes.app do
  @variable = Model.new("1 2 3")
  stack do
    10.times{ name_box(@variable) }
  end
end
Run Code Online (Sandbox Code Playgroud)