Menu shortcuts
От: 8bit  
Дата: 16.12.07 20:00
Оценка: 129 (6)
Столкнулся с тем что нельзя сделать шоткаты для меню, при использовании 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 в поле ввода,
у него ничего не выйдет, если вы обработаете данный шоткат .

Надеюсь будет кому полезно, кроме меня.
behavior_shortcuts.cpp
Re: Menu shortcuts
От: c-smile Канада http://terrainformatica.com
Дата: 16.12.07 20:33
Оценка: 11 (1) +1
Здравствуйте, 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

wchars w = chars_of( el.get_text() );

if(w.like("*Ctrl+*")) ...
if(w.like("*Alt+*")) ...
if(w.like("*Shift+*")) ...
Re[2]: Menu shortcuts
От: c-smile Канада http://terrainformatica.com
Дата: 16.12.07 20:40
Оценка:
Здравствуйте, 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.

Еще можно наверное что-то делать с вариантом:

<button><u.accesskey>O</u>pen</button>
Re[2]: Menu shortcuts
От: 8bit  
Дата: 16.12.07 23:00
Оценка:
Здравствуйте, 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>


Вот код:
behavior_shortcuts2.cpp

Особенность:
Всегда ищется родительский элемент с тегом li для span.shortcut
MENU_ITEM_CLICK шлется родителю li элемента, и этот li передается как параметр.
поэтому id для menu item надо задавать у li элемента.
Re[2]: Menu shortcuts
От: . Великобритания  
Дата: 17.12.07 08:35
Оценка:
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
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: Menu shortcuts
От: c-smile Канада http://terrainformatica.com
Дата: 18.12.07 01:12
Оценка:
Здравствуйте, ., Вы писали:

.>Вообще говоря, правильнее делать наоборот.

.><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+Т
Как тогда устанавливать текст?

По всякому мы к этому подходили, и самым надежным/универсальным оказалось задавать явно. К сожалению.
Re[4]: Menu shortcuts
От: . Великобритания  
Дата: 18.12.07 07:26
Оценка:
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
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[5]: Menu shortcuts
От: 8bit  
Дата: 18.12.07 08:20
Оценка:
Здравствуйте, ., Вы писали:

>> По всякому мы к этому подходили, и самым надежным/универсальным

>> оказалось задавать явно. К сожалению.
.>А как распознаётся Ctrl+Т?
.>В принципе, мне кажется совсем неверным подход, когда парсится текст, который показывается юзерам и может меняться в зависимости от кучи причин, правильнее генерить этот текст, используя внутреннее, программное представление, которое может быть раз и навсегда зафиксированно.
Да, данный подход не совсем верен если учитывать переносимость на другие платформы.
(погоду тут портит Мак, у которого вместо Ctrl имеется Command)
В такой случае подход с генерацией текста более правильный, да и не проблема это.
Вот только не видать нам еще долго порта на мак и никсы. (это я о наболевшем )

> Ctrl+N по русски например будет Ctrl+Т

> Как тогда устанавливать текст?
кстати, как мне кажется, текст шотката так и должен быть Ctrl+N вне зависимости от языка,
но должен срабатывать и при включенной русской раскладке.
Так сделано в Firefox, в том же стандартном блокноте и т.д.
На данный момент это все работает.

Для меня кстати всегда останется загадкой, почему фотошоп (CS 8 по крайней мере, если не ошибаюсь),
не обрабатывает шоткаты, если включить русскую раскладку
Re[6]: Menu shortcuts
От: . Великобритания  
Дата: 18.12.07 09:38
Оценка:
8bit wrote:

> Да, данный подход не совсем верен если учитывать переносимость на другие

> платформы.
> (погоду тут портит Мак, у которого вместо Ctrl имеется Command)
> В такой случае подход с генерацией текста более правильный, да и не
> проблема это.
> Вот только не видать нам еще долго порта на мак и никсы. (это я о
> наболевшем )
Надо верить в лучшее. А тут не только мак, но и заказчик, если захочет, чтобы рисовалось не Ctrl+LeftArrow, а Ctrl-[<].

>> Ctrl+N по русски например будет Ctrl+Т

>> Как тогда устанавливать текст?
> кстати, как мне кажется, текст шотката так и должен быть Ctrl+N вне
> зависимости от языка,
Нет, текст может меняться, не все знают английский алфавит , но срабатывать шоткат должен в любой раскладке, не важно какая там буква.

> но должен срабатывать и при включенной русской раскладке.

> Так сделано в Firefox, в том же стандартном блокноте и т.д.
> На данный момент это все работает.
>
> Для меня кстати всегда останется загадкой, почему фотошоп (CS 8 по
> крайней мере, если не ошибаюсь),
> не обрабатывает шоткаты, если включить русскую раскладку
Ага, меня это очень раздражает. Кстати, и в винде alt-буква тоже с русским глючит, тоже бесит.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.