Как я могу создать скрытую кнопку в обуви? - PullRequest
3 голосов
/ 10 августа 2009

В Обувь я хотел бы создать кнопку, которая изначально скрыта. Я попытался передать: hidden => true как часть стиля кнопки, а также вызвать @ button.hide () после его создания, но он остается упрямо видимым.

Мне удалось обойти эту проблему, не создавая кнопку, пока я не хочу, чтобы она отображалась, но для этого нужно проверить, существует ли она, а не просто использовать ее.

1 Ответ

3 голосов
/ 10 августа 2009

Не в настоящее время. Кнопки все еще довольно ненадежны в обуви, особенно в Windows. Вы можете обойти эту проблему, поместив кнопку в слот и скрыв или отобразив слот, но вы можете обнаружить, что кнопка не будет скрываться снова, если ее нажать один раз:

Shoes.app do
  para 'This is some text.'

  @flow = flow :width => 50, :hidden => true do
    button 'a' do |btn|
      alert 'Hello, World!'
    end
  end

  button 'toggle' do
    @flow.toggle
  end
  para 'Blah blah blah'

end

К счастью, выход есть: слоты. Слотам может быть дано событие щелчка, которое заставляет их вести себя так же, как кнопка. На самом деле, из слотов можно сделать довольно приличные кнопки.

Вот кое-что, что я собрал вместе. Он позволяет использовать метод pesto_button для генерации кнопок, построенных на потоках. Вы можете изменить его в соответствии со своими потребностями, включая такие вещи, как использование изображения в качестве фона, изменяемый текст (с автоматически расширяемой шириной?), Возможность изменять стили на лету и т. Д .:

class PestoButton < Widget
  def initialize (text, opts = {})
    @border_color = opts[:border_color] || gray
    @border_width = opts[:border_width] || 3
    @color = opts[:up_color] || gainsboro
    @click_color = opts[:down_color] || @border_color
    @width = opts[:width] || 80
    @click = block_given? ? Proc.new { yield } : nil
    @text = text
    @visible = true
    @flow = flow :width => @width do
      background @color
      border @border_color, :strokewidth => @border_width
      para @text, :align => 'center'
    end

    @flow.click do
      @flow.clear
      @flow.append do
        background @click_color
        border @border_color, :strokewidth => @border_width
        para @text, :align => 'center'
      end
    end

    @flow.release do
      @flow.clear
      @flow.append do
        background @color
        border @border_color, :strokewidth => @border_width
        para @text, :align => 'center'
        @click.call if @click
      end
    end
  end

  def click
    @click = block_given? ? Proc.new { yield } : nil
  end

  def show
    @flow.show
  end

  def toggle
    @flow.toggle
  end

  def hide
    @flow.hide
  end
end

Shoes.app do
  para 'This is some text.'
  @btn = pesto_button 'Click me!' do
    alert 'Hello, World!'
  end

  button 'toggle' do
    @btn.toggle
  end

  button 'new block' do
    @btn.click do
      alert 'Goodbye, World!'
    end
  end

  button 'no block' do
    @btn.click  #Clears the click method
  end

  para 'Blah blah blah'
end
...