Столкнулся с тем что нельзя сделать шоткаты для меню, при использовании accesskey.
(либо я опять не разобрался в чем либо )
Образец html который не работает (по сути это html_samples\menu\menu-bar.htm):
<ul id="menu-bar"> <!-- top level - menu bar, it must match ul#menu-bar selector, see std-menu.css -->
<li>File
<menu class="cool">
<li accesskey="^N" id="New">New<span class="accesskey">Ctrl+N</span></li>
<hr/>
<li id="Load">Load</li>
<li id="Save">Save</li>
<hr/>
<li id="Exit">Exit</li>
</menu>
</li>
</ul>
Первая причина в том, что в behavior_accesskeys есть проверка на то,
что элемент, для которого задан данный accesskey, является enabled и visible.
Соответственно условие на visible не выполняется, так как это элемент меню,
и обычно при нажатии горячих клавиш он скрыт (меню закрыто).
Вторая причина (если раскрыть меню File и нажать Ctrl+N) в том,
что в behavior_accesskeys отправляет DO_CLICK в элемент
или ACTIVATE_CHILD в родительский элемент, если элемент не обработал DO_CLICK.
Лично я обрабатываю меню по MENU_ITEM_CLICK, так что у меня
при таких событиях соответственно ничего не обрабатывалось.
Помимо всего прочего отсутствие возможности задать шоткаты
в виде Shift+Ctrl+N, или Shift+Alt+N меня не устраивала.
В итоге создал свой behavior_shortcuts.
Пример использования:
<ul id="menu-bar"> <!-- top level - menu bar, it must match ul#menu-bar selector, see std-menu.css -->
<li>File
<menu class="cool">
<li shortcut="S+1" id="Test1">Shift+N</li>
<hr/>
<li shortcut="S+C+2" id="Test2">Shift+Ctrl+N</li>
<li shortcut="S+C+A+3" id="Test3">Shift+Ctrl+Alt+N</li>
<hr/>
<li shortcut="A+X" id="Exit">Alt+X</li>
</menu>
</li>
</ul>
Если используется несколько модификаторов, то они должны идти
в порядке Shift, Ctrl, Alt. например S+A+2, C+A+2, нельзя так A+S+2.
Событие MENU_ITEM_CLICK всегда отправляется в родительский элемент.
Еще важно не забывать, что если задать шоткат вида S+N,
то, например, если пользователь хочет набрать заглавную N в поле ввода,
у него ничего не выйдет, если вы обработаете данный шоткат .
Здравствуйте, 8bit, Вы писали:
8>Столкнулся с тем что нельзя сделать шоткаты для меню, при использовании accesskey. 8>(либо я опять не разобрался в чем либо )
Нормально разобрался.
И это как раз та причина почему accesskey это внешний behavior.
8>Образец html который не работает (по сути это html_samples\menu\menu-bar.htm):
8>
8><ul id="menu-bar"> <!-- top level - menu bar, it must match ul#menu-bar selector, see std-menu.css -->
8> <li>File
8> <menu class="cool">
8> <li accesskey="^N" id="New">New<span class="accesskey">Ctrl+N</span></li>
8> <hr/>
8> <li id="Load">Load</li>
8> <li id="Save">Save</li>
8> <hr/>
8> <li id="Exit">Exit</li>
8> </menu>
8> </li>
8></ul>
8>
8>Первая причина в том, что в behavior_accesskeys есть проверка на то, 8>что элемент, для которого задан данный accesskey, является enabled и visible. 8>Соответственно условие на visible не выполняется, так как это элемент меню, 8>и обычно при нажатии горячих клавиш он скрыт (меню закрыто).
В качестве альтернативной идеи (вернее идеи в развитие) для твоего shortcuts.
Можно перепрофилировать твой behavior на обработку только элементов вида:
<span.accesskey>Ctrl+N</span>
Т.е. искать find_all("span.accesskey") анализировать их текст и делать то что ты делаешь сейчас.
Обрати внимание что в SDK появился файл json_parse.h
Здравствуйте, c-smile, Вы писали:
CS>Можно перепрофилировать твой behavior на обработку только элементов вида:
CS>
CS><span.accesskey>Ctrl+N</span>
CS>
CS>Т.е. искать find_all("span.accesskey") анализировать их текст и делать то что ты делаешь сейчас.
Забыл добавить:
Если обрабатывать только span.accesskey которые встречаются и имеют смысл только в menu alike элементах (и tooltip кстати)
То твой behavior переименованный в скажем menu-shortcuts можно использовать с accesskeys.
Здравствуйте, c-smile, Вы писали:
CS>В качестве альтернативной идеи (вернее идеи в развитие) для твоего shortcuts. CS>Можно перепрофилировать твой behavior на обработку только элементов вида: CS>
CS><span.accesskey>Ctrl+N</span>
CS>
CS>Т.е. искать find_all("span.accesskey") анализировать их текст и делать то что ты делаешь сейчас. CS>Обрати внимание что в SDK появился файл json_parse.h
Я 14.12.2007 скачивал, еще не было
Да, согласен, отличная идея .
Я тоже подумал о том как избавиться от лишней писанины с дублированием,
сначала шоткаты указывать, потом этот span с описанием. Мне правда
показалось, что анализ span с описанием шотката это не совсем оптимально будет.
Но ведь как намного проще писать вот так, да и напутать меньше вероятность
<ul id="menu-bar"> <!-- top level - menu bar, it must match ul#menu-bar selector, see std-menu.css -->
<li>File
<menu class="cool">
<li id="New">New<span class="shortcut">Shift+N</span></li>
<hr/>
<li id="Load">Load<span class="shortcut">Shift+Ctrl+2</span></li>
<li id="Save">Save<span class="shortcut">Alt+Ctrl+3</span></li>
<hr/>
<li id="Exit">Exit<span class="shortcut">Alt+X</span></li>
</menu>
</li>
</ul>
Особенность:
Всегда ищется родительский элемент с тегом li для span.shortcut
MENU_ITEM_CLICK шлется родителю li элемента, и этот li передается как параметр.
поэтому id для menu item надо задавать у li элемента.
c-smile wrote:
> В качестве альтернативной идеи (вернее идеи в развитие) для твоего > shortcuts. > Можно перепрофилировать твой behavior на обработку только элементов вида: > <span.accesskey>Ctrl+N</span>
> Т.е. искать find_all("span.accesskey") анализировать их текст и делать > то что ты делаешь сейчас.
Вообще говоря, правильнее делать наоборот.
<li accesskey="^N" id="New">New<span class="accesskey"></span></li>
и используя аттрибут accesskey устанавливать текст span.accesskey. Ведь тогда легко можно будет задавать форматы отображения (Скажем "Ctrl-N" или "Ctrl+N" или "Ctrl + N" и т.п.) и на будущее, если портируется на Mac, то там будет не Ctrl а тот их крендель.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, ., Вы писали:
.>Вообще говоря, правильнее делать наоборот. .><li accesskey="^N" id="New">New<span class="accesskey"></span></li> .>и используя аттрибут accesskey устанавливать текст span.accesskey. Ведь тогда легко можно будет задавать форматы отображения (Скажем "Ctrl-N" или "Ctrl+N" или "Ctrl + N" и т.п.) и на будущее, если портируется на Mac, то там будет не Ctrl а тот их крендель.
Ctrl+N по русски например будет Ctrl+Т
Как тогда устанавливать текст?
По всякому мы к этому подходили, и самым надежным/универсальным оказалось задавать явно. К сожалению.
c-smile wrote:
> .>Вообще говоря, правильнее делать наоборот. > .><li accesskey="^N" id="New">New<span class="accesskey"></span></li> > .>и используя аттрибут accesskey устанавливать текст span.accesskey. > Ведь тогда легко можно будет задавать форматы отображения (Скажем > "Ctrl-N" или "Ctrl+N" или "Ctrl + N" и т.п.) и на будущее, если > портируется на Mac, то там будет не Ctrl а тот их крендель. > > Ctrl+N по русски например будет Ctrl+Т > Как тогда устанавливать текст?
Эм... В крайнем случае — если текст не задан, то генерить как-нибудь (возможно вызывая какой-нибудь переопределяемый callback), если задан — то просто показывать.
А с русским — в @accesskey всегда задаётся VKEY, там нет русского, просто маппинг нужен из VKEY в русскую букву, думаю это можно из keyboard layout вытягивать, или в крайнем случае тупо прописывать таблицы в "файлах локализации".
> По всякому мы к этому подходили, и самым надежным/универсальным > оказалось задавать явно. К сожалению.
А как распознаётся Ctrl+Т?
В принципе, мне кажется совсем неверным подход, когда парсится текст, который показывается юзерам и может меняться в зависимости от кучи причин, правильнее генерить этот текст, используя внутреннее, программное представление, которое может быть раз и навсегда зафиксированно.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, ., Вы писали:
>> По всякому мы к этому подходили, и самым надежным/универсальным >> оказалось задавать явно. К сожалению. .>А как распознаётся Ctrl+Т? .>В принципе, мне кажется совсем неверным подход, когда парсится текст, который показывается юзерам и может меняться в зависимости от кучи причин, правильнее генерить этот текст, используя внутреннее, программное представление, которое может быть раз и навсегда зафиксированно.
Да, данный подход не совсем верен если учитывать переносимость на другие платформы.
(погоду тут портит Мак, у которого вместо Ctrl имеется Command)
В такой случае подход с генерацией текста более правильный, да и не проблема это.
Вот только не видать нам еще долго порта на мак и никсы. (это я о наболевшем )
> Ctrl+N по русски например будет Ctrl+Т > Как тогда устанавливать текст?
кстати, как мне кажется, текст шотката так и должен быть Ctrl+N вне зависимости от языка,
но должен срабатывать и при включенной русской раскладке.
Так сделано в Firefox, в том же стандартном блокноте и т.д.
На данный момент это все работает.
Для меня кстати всегда останется загадкой, почему фотошоп (CS 8 по крайней мере, если не ошибаюсь),
не обрабатывает шоткаты, если включить русскую раскладку
8bit wrote:
> Да, данный подход не совсем верен если учитывать переносимость на другие > платформы. > (погоду тут портит Мак, у которого вместо Ctrl имеется Command) > В такой случае подход с генерацией текста более правильный, да и не > проблема это. > Вот только не видать нам еще долго порта на мак и никсы. (это я о > наболевшем )
Надо верить в лучшее. А тут не только мак, но и заказчик, если захочет, чтобы рисовалось не Ctrl+LeftArrow, а Ctrl-[<].
>> Ctrl+N по русски например будет Ctrl+Т >> Как тогда устанавливать текст? > кстати, как мне кажется, текст шотката так и должен быть Ctrl+N вне > зависимости от языка,
Нет, текст может меняться, не все знают английский алфавит , но срабатывать шоткат должен в любой раскладке, не важно какая там буква.
> но должен срабатывать и при включенной русской раскладке. > Так сделано в Firefox, в том же стандартном блокноте и т.д. > На данный момент это все работает. > > Для меня кстати всегда останется загадкой, почему фотошоп (CS 8 по > крайней мере, если не ошибаюсь), > не обрабатывает шоткаты, если включить русскую раскладку
Ага, меня это очень раздражает. Кстати, и в винде alt-буква тоже с русским глючит, тоже бесит.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай