5

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

この実装は、複数のコントロールをクリックすると、両方とも編集ボックスになることを意味します。

私が望んでいたのは、コントロールを「表示」に戻すぼかしイベントでした。これは存在しないので、どのように実装しますか?

さらに多くのコントロールを作成し、それらすべてが「1 つの集中コントロール」というこの規則に従う必要があるとします。

**ボーナスポイントについては、私が入れられない理由を説明してください:

@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 に答える