Эмси 1.5

Как всегда не без приключений мы с Алексеем Блиновым выпустили версию 1.5. Точнее, Алексей выпустил: к этой версии я вообще оказался слабо причастен, поскольку дизайн я сформулировал в паре предложений (см. следующий абзац), а потом Алексей это реализовывал, преодолевая сопротивление ОС и Эпла.

Итак, новая версия умеет адаптироваться к свободному месту в меню. Когда полное название исполнителя и трека не влезают, Эмси теперь не пропадает, а показывает только название трека. Если не влезает даже трек, он показывает свою иконку, а весь текст переезжает в выпадающее меню. Ну, если уж даже иконка не влезает, то не судьба.

Сделать это было не так просто, потому что система никак не сообщает программам, сколько у них есть места в меню и даже не информирует о том, скрыты они или показаны. То есть система тупо скрывает все пункты меню, которые не влезают.

Алексей Блинов делится хаком (из нашей майской переписки):

Там решение настолько неизящное, что как-то неловко даже. Но написать можно все равно :-) Чтобы проверить, видно ли наш статус-айтем, я прошу у системы список всех окон, которые выше окна статус-айтема в иерархии. Если в этом списке нет несистемных окон (системные окна всегда выше всех), то значит нас видно. А когда не видно, в этом списке появляется левое окно.

К сожалению, это решение по каким-то причинам работало не совсем надёжно. Потом Алексей его поменял:

После общения с Питером Эммоном на ВВДЦ запрос «дай все окна, которые выше окна статус айтема» я заменил на запрос «дай список вообще всех видимых окон в системе» и проверку, есть ли окно статус айтема в этом списке. Про запрос всех видимых окон я не знал, это Питер мне подсказал.

А дальше самое интересное:

При получении нотификации о смене текущего приложения либо при смене трека, делаю такую проверку на видимость. Нас видно?
если да, и мы показываем всё полностью, ничего не делать;
если да, и мы показываем только название или только иконку, пробуем показать чуть больше (вдруг есть место); проверяем на видимость, и если не видно, возвращаемся к предыдущему состоянию;
если нет, значит мы показываем сликом много; пробуем показать чуть меньше, проверяем на видимость, и если видно, останавливаемся.

Это здорово работает, но при этом наш статус-айтем моргает, потому что когда показывается только название, и переключается приложение, Эмси пытается показать всё; если это все не влазит, статус-айтем на долю секунды пропадает, и потом возвращается, опять показывая только название. Поэтому я придумал следующую штуку.

Если нас видно и мы показываемся не полностью, вычисляем сколько надо места, чтобы показать всё. Вычисляем дельту между этим значением и текущей шириной. Создаем ещё один статус-айтем без содержания (чтобы его не видно было) с шириной дельта. Добавляем его в меню-бар. Проверяем этот статус-айтем на видимость (это можно сделать несмотря на то, что в нем нет содержания). Если его видно, значит новое состояние влезет. Убираем проверочный статус-айтем и рисуемся с новым состоянием.

Когда приложение было готово, Эпл его по традиции (о нелёгкой судьбе Эмси читайте в заметке про версию 1.3) не пустил в стор. Оказалось, что там всплыли какие-то проблемы с голден-мастером «Горного льва», которые не проявлялись на всех предыдущих билдах. Алексей быстро что-то подправил и переотправил приложение в стор.

Наконец, Эмси 1.5 на экранах ваших Маков! Покупайте наше прекрасное приложение за доллар!

Дальше
Мои книги