我想设置一个矩形/插槽,当它悬停时,会创建一个小窗口悬停在矩形/插槽的侧面(有点重叠)。
我还想在小菜单中添加一些按钮。我希望这个小菜单比原来的矩形/插槽更长(宽度方向),以适应许多按钮,这意味着我不能使用 slot.hover,因为如果我从rect to the button thats off the rect... 有什么帮助吗?
我想设置一个矩形/插槽,当它悬停时,会创建一个小窗口悬停在矩形/插槽的侧面(有点重叠)。
我还想在小菜单中添加一些按钮。我希望这个小菜单比原来的矩形/插槽更长(宽度方向),以适应许多按钮,这意味着我不能使用 slot.hover,因为如果我从rect to the button thats off the rect... 有什么帮助吗?
这是一个示例,应该向您展示完成此操作所需的逻辑。如果你有一堆这样的菜单,它显然会失控:
Shoes.app :title => "Test", :width => 1000, :height => 600 do
@menu_hover = false
@zone_hover = false
@menu = nil
@zone = stack :width => 200, :height => 100 do
background '#DFA'
end
@zone.hover do
@zone_hover = true
app.append do
break if not @menu.nil?
@menu = stack :width => 230, :height => 35, :top => 50, :left => 150 do
background '#F00'
flow :margin => 5 do
button 'OK'
button 'Cancel'
button 'Ponies!'
end
end
@menu.hover {@menu_hover = true}
@menu.leave do
@menu_hover = false
break if @menu.nil? or @menu_hover or @zone_hover
@menu.remove
@menu = nil
end
end
end
@zone.leave do
@zone_hover = false
break if @menu.nil? or @menu_hover or @zone_hover
@menu.remove
@menu = nil
end
end
这是上述解决方案的一个重复,它扩展了 Shoes::Stack 和 Shoes::App 类以hover?
向堆栈添加方法(我认为他们应该默认支持)。在您的情况下,我会考虑创建一个自定义小部件,但这显示了您可能可以使用的那种结构。
class Shoes::Stack
def hover?
@hover ||= false
end
alias_method :default_hover, :hover
alias_method :default_leave, :leave
def hover(*args, &block)
new_block = lambda { @hover = true; block.call }
default_hover(*args, &new_block)
end
def leave(*args, &block)
new_block = lambda { @hover = false; block.call }
default_leave(*args, &new_block)
end
end
class Shoes::App
alias_method :default_stack, :stack
def stack(*args, &block)
s = default_stack(*args, &block)
s.hover {}
s.leave {}
s
end
end
Shoes.app :title => "Test", :width => 1000, :height => 600 do
@menu = nil
@zone = stack :width => 200, :height => 100 do
background '#DFA'
end
@zone.hover do
app.append do
break if not @menu.nil?
@menu = stack :width => 230, :height => 35, :top => 50, :left => 150 do
background '#F00'
flow :margin => 5 do
button 'OK'
button 'Cancel'
button 'Ponies!'
end
end
@menu.leave do
break if @menu.nil? or @menu.hover? or @zone.hover?
@menu.remove
@menu = nil
end
end
end
@zone.leave do
break if @menu.nil? or @menu.hover? or @zone.hover?
@menu.remove
@menu = nil
end
end
听起来您需要使用一些额外的东西来保持该矩形在按钮上和插槽上时保持打开和可见。
那应该在任何事情上都保留菜单。