пятница, 6 ноября 2009 г.

Умное меню

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

  • наблюдаем на экране команды меню. Пока вроде все обычно, не правда ли!?!
  • Щелкаем по командам меню. Опять же, не что-то из ряда вон выходящее. Знаем, плавали!

И вдруг, вуаля! Команды меню реагирует на щелчки мыши, но меню автоматически не закрывается. См. скриншот ниже.

Умное меню: команды реагируют на щелчок, но меню НЕ закрывается автоматом!

Поясню фишку! Это меню для выбора показываемых столбцов в таблице. Стандартное виндовское меню при щелчке по команде с галочкой обычно галочку поставит или уберет, но в любом случае меню закроет автоматом. Но обратите внимание – здесь задача другая: в большинстве случаев нужно за один раз отметить ни один столбец, а несколько. В обычном случае придется открывать меню столько раз, сколько нужно столбцов. Здесь же всё иначе: команды с названиями столбцов реагируют на щелчок, но меню не закрывается! Вы можете продолжать отмечать столбцы. Ну, а изменения в свою очередь вступят в силу, когда вообще уйдем из меню.

Но! Стандартное меню в винде такого делать не позволяет. Не верите? Попробуйте такое закодить! Традиционно подобный выбор реализуется через отдельный диалог, но любой диалог изначально уже само по себе полное гавно! не лучшее решение. Здесь же реализовано просто зергутно: и диалога никакого нет, и наглядность соблюдена, и меню всегда под рукой, и наконец решена главная проблема меню – сделан этот самый множественный выбор без закрытия.

Как увидел, аж позеленел от зависти и губы сами начали произносить “сцуки… но умные!” (есть мнение что иногда в этом блоге бывал и автор этой софтины, и уж скриншот-то свой , он узнает… Иван, в данном случае это комплимент – решение на пятерку с плюсом).

В прошлом посте аккурат писал про отложенные фичи в Aml Pages. Дык вот одна из отложенных фич – категории, аккурат и уперлась в возможность множественного выбора. В прошлых версиях выбор как раз был одиночным, и под него было написано ух какое умное меню: все из себя owner-draw, с иконками, с цветами, шрифтами и все такое. И меню это решало свои задачи выбора на раз, пользователи были вполне довольны. Возможность же выбрать несколько элементов одновременно в проблему пользовательского интерфейса и уперлась. В бизнес-логике никаких проблем с этим нет, все продумано, все написано. Но вот UI… Весь прошлый одиночный выбор был завязан именно на меню, а меню мульти-выбора не дает. Так что оставалось перепроектировать пользовательский интерфейс, причем достаточно объемную его часть. А это задачка не простая и не быстрая – поведение-то поменяется напрочь, надо полностью переанализировать требования пользователя. На этом-то все и застряло.

А тут на тебе такое-растакое меню :) И если удастся его сделать – то не придется переписывать мерено-немеренно пользовательского интерфейса, а просто доточить уже имеющееся до ума, тем более, что этим меню пользователям как раз довольны. Тут только два варианта: или все же сделать аналог, или разочароваться в себе и запить с тоски, причем надолго.

Но у этого меню есть нюансы: так хитро реагирует на щелчки только само подменю “столбцы”. Все остальное меню ведет себе стандартно – клик и закрылось. Выглядит “умное” подменю, точно также, как и все остальные. А это очень не просто эмулировать внешний вид полностью, всегда есть 33 нюанса, какой-нибудь да будет упущен. Так что для полного сходства остается только одно – не подменять бутафорским муляжом, а делать именно меню. Вот тогда и будет выглядеть все идентично безо всяких лишних усилий.

И э-эх, давненько я не брал в руки шашки. В общем, крутил так, крутил эдак и все таки взял за жопу решил эту задачку. Любопытная, доложу вам, хреновина получилась. Разве что пока мой вариант, не умеет обрабатывать клаву, хотя для контекстного меню, да к тому же с множественным выбором это не столь критично. Ну, и это доточим.

Вот такой вот бывает развеселый ГУЙ. Причем не бутафорский, не эмуляция в стиле “нарисуем очень похоже”, а самый что ни на есть разнастоящий, родной, можно даже сказать влитой, ГУЙ. Он и “выглядит как утка”, и “крякает как утка”, и “летает как утка”, да потому что он и есть разновидность “утки обыкновенной”, а разница только в способе “захода на посадку”. Вот такие любопытнейшие головоломки преподносит иногда пользовательский интерфейс.

Век живи, век учись! Давненько так не оттягивался в разработке, какая-то хоть и мудреная, но рутина всё больше была. Вот за такие сюрпрайзы я и обожаю свою профессию.

6 комментариев:

  1. А чё за прога то? Ссылку давай!

    ОтветитьУдалить
  2. Ну так расскажите как такое реализовать?

    ОтветитьУдалить
  3. Через хуки. Правда и там есть подводные камни, не все пока ясно до конца - есть нюансы.

    ОтветитьУдалить
  4. Воды налил много, а главным не поделился. Может раскроете секрет как?

    ОтветитьУдалить
  5. Это делается через хуки (SetWindowsHookEx).

    ОтветитьУдалить