Удаление событий в Обувь - PullRequest
2 голосов
/ 08 марта 2009

Есть ли способ удалить события в туфлях? Я искал много сайтов и ссылок, но не смог найти способ удалить событие ... Я имею в виду, что мне нужно будет создать свой собственный менеджер событий ... это действительно необходимо? или есть способ отсоединить слушателей событий?

Ответы [ 4 ]

2 голосов
/ 09 апреля 2009

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

Например, это приложение «Обувь» очистит событие нажатия после однократного нажатия. Если вы удалите вызов на , нажмите внутри блока, то он будет повторяться.

Shoes.app
  @p = para "Empty"
  @click_count = 0
  click do |b,x,y| 
    @click_count += 1
    @p.replace "Clicked #{@click_count} time(s)."
    click # remove the click handler
  end
end
1 голос
/ 08 апреля 2009

Какие сочетания клавиш вы хотите удалить? Все события в приложении Обувь или только привязки по умолчанию?

Если вы хотите переопределить привязки, зарезервированные для таких ботинок, как «alt- /», «alt-.», «Alt-?», Вставьте следующий код в файл, содержащий код вашего приложения

class Shoes::App
  def Shoes.show_log # gets called on alt-/
  end

  def Shoes.show_manual # gets called on alt-?
  end

  def Shoes.show_selector # gets called on alt-.
  end
end

Приведенный выше код монтирует код обуви и, в свою очередь, ничего не делает при нажатии соответствующих клавиш.

Вы можете использовать ту же технику для остальных привязок по умолчанию. grep источник обуви для привязок клавиш, найдите соответствующий метод и определите пустой метод в вашем приложении, чтобы переопределить встроенный метод.

0 голосов
/ 08 марта 2009

Можете ли вы уточнить, что вы подразумеваете под "удалить событие"? Вы хотите игнорировать определенное событие или хотите «отключить» прослушиватель событий?

Если первое, я бы предложил написать слушателя, который просто игнорирует событие.

Если позже, почему бы не сделать тело слушателя зависимым от некоторого внешне доступного значения, предоставив себе переключатель включения / выключения.

Если вы хотите что-то еще, отредактируйте вопрос, чтобы уточнить, и я вернусь позже и отредактирую свой ответ.

В ответ на ваш комментарий я бы повторно предложил второй из вышеперечисленных вариантов. Если вы хотите стать действительно модным, вы можете написать что-то вроде этого:

$keypress_listeners = {}
keypress do |key|
    $keypress_listeners.values.each { |l| l.call(key)
    end
$keypress_listeners[:hero_controller] = lambda { |key| ... }
:
:
$keypress_listeners.delete[:hero_controller]

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

0 голосов
/ 08 марта 2009

Вы пробовали method.unbind (obj) ?

...