Как создавать пользовательские интерфейсы? Вот хочу я «умный дом», где управлять светом я смогу через компьютер (и инет, с телефона и т.д.). Предположим, что аппаратная часть уже готова, как и некая liblight.so, которая принимает на себя ID лампочки и % освещенности как float-значение. А вот как это оформить в виде интерфейса пользователя?
Можно нарисовать 2 кнопки «вкл» и «выкл», но тогда чем это будет отличаться от классического выключателя? А можно нарисовать бегунок, задающий яркость лампочки в %%, но вот двигать которым - неудобно, ибо надо тянуться к мышке. Может нарисовать 2 кнопки, а между ними бегунок? Тоже вариант! Но если я не хочу включать на полную мощность каждый раз, а предпочитаю мягкий, рассеянный свет - мне от бегунка таки не уйти, да? Или добавить еще кнопок/комбобокс и поддержку профилей вида «совсем яркий, приглушенный свет, ночная подсветка»? А еще можно сделать плавное переключение между режимами, дабы лампочка дольше работала и плавно включалась/выключалась, но как это отразить в интерфейсе? Можно конечно сделать примитивную линейную интерполяцию, длительностью 0.5 секунды, но это слишком частный случай для гика. Я бы предпочел возможность задать кривую (возможно даже через кривые Безье) и длительность, но это слишком перегрузит интерфейс.
А если в люстре несколько лампочек? Дублировать ли мне все эти кнопочки/ползунки для каждой, или управлять всеми одновременно? Если всеми, то при 20% яркости будут включены все 5 ламп на 20%, или 1 на 100%? Если одна, то какая именно? Нужно будет создавать очередь для указания приоритета? А если лампочки разной мощности, как в этом случае быть? Указывать в настройках типы ламп? Или добавить в систему датчик освещенности и мерять результат в люксах? Кстати, о датчике: он может мерять не только свет от ламп, но и свет с улицы, тем самым подстраивая свет в комнате под определенное значение. Но тогда придется делать еще бегунки для управления общей яркостью, а кнопки упраления лампами придется отключить. Причем, если система будет автоматической, то нужно предусмотреть таймер, дабы отключал свет автоматически, если я уснул на клавиатуре. Но какой интерфейс для таймера сделать? Простой спинбокс «вырубить свет после NN часов», или расписание у духе гуглькалендаря, где десятки полей и кнопок? Вообще, система таймера хороша, но если я заснул на клаве, зачем лампочке гореть еще 3 часа, может взять картинку с камеры (какой умный дом дом без камер?), да искать активность на ней? Если активности нет в течении НН-минут, то выключаем свет. Для этого надо добавить еще 1 поле времени и простой графический редактор для задания маски (например, закрасить окно/шторы, дабы свет от проезжающих автомобилей не учитывался при расчете движения).
А еще раньше была популярна такая забава как «светомузыка», которая мигала 3 лампочками в такт музыки. Фактически, для реализации светомузыки нужно только разложить звук на 3 составные, просчитать мощность каждой лампы, да сделать 3 вызова системной библиотеки. Практической пользы от нее нет, но для гика будет большим упущением, если потенциал системы будет не до конца использован. Значит ли это, что нужно добавить систему «контроллеров», которые будут брать сигналы с внешних источников (плагинов, других приложений) и контролировать уровень освещения? Например, есть система телефонии Asterisk, со встроенным синтезатором азбуки Морзе. Но ведь азбуку Морзе можно подавать и светом! Пример: система «умный дом» на даче, сработала система безопасности, телефонные линии перерезаны, энергоснабжение на резервном генераторе, хозяина на месте нет. Что делать? А система может мигать всеми лампочками в доме сигнал SOS, кто-то из соседей наверняка отреагирует, особенно если была договоренность. Алсо, тут можно будет выпустить SDK, дабы другие разработчики тоже могли создавать свои типы контроллеров, ведь звук и азбука Морзе - это не единственные источники сигналов.
Так как же мне включать/выключать свет? Научите проектировать интерфейсы!