如何为Ruby Shoes实现模糊事件

时间:2012-07-17 13:41:16

标签: ruby blur shoes

我正在试验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

使用

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

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

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

假设我会写一堆更多的控件,他们都必须遵守这个“一个集中控制”的规则

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

@ed ||= edit_line(value) {|e|
  @model.rename(e.text)
} 
@ed.hide()

在初始化中,让@ed隐藏。

1 个答案:

答案 0 :(得分: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