悬停和菜单和按钮

时间:2009-05-01 03:12:44

标签: shoes

我想设置一个矩形/插槽,当它悬停在上面时,会创建一个悬停在rect / slot侧面的小窗口(略微重叠)。

我还想在小菜单中放一些按钮。我希望小菜单比原来的rect / slot更长(宽度),以便适应许多按钮,这意味着我不能使用slot.hover,因为如果我从直接到关闭矩形的按钮...任何帮助?

2 个答案:

答案 0 :(得分:2)

这是一个示例,应该向您展示完成此任务所需的逻辑。如果你有一堆这样的菜单,它显然会失控:

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

以上是上述解决方案的一个riff,它扩展了Shoes :: Stack和Shoes :: App类,为堆栈添加了hover?方法(我认为默认情况下它们应该支持)。在您的情况下,我会考虑创建一个自定义Widget,但这显示了您可以使用的结构类型。

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

答案 1 :(得分:0)

听起来你需要使用一些额外的东西来保持矩形在按钮上以及在插槽上时打开和可见。

这应该保留菜单,而不是任何东西。