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