5

我正在试验红宝石鞋。我希望控件在您赋予它们焦点时变得可编辑,并在它们松开时再次变为文本。到目前为止,我有以下...

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被隐藏。

4

1 回答 1

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
于 2013-05-08T14:45:52.403 回答