вторник, 24 мая 2011 г.

Описание настраиваемого пользователем интерфейса (ICI, Individual Customizable Interface)


Введение

            В мире создано множество вариантов пользовательского интерфейса для компьютерных программ.  Имеются в виду экранные интерфейсы с управлением разнообразными клавиатурами, компьютерными мышами, джойстиками, тачскринами и другими устройствами ввода.
            В данном случае речь идёт о настраиваемом пользователем пользовательском интерфейсе ICI (Individual Customizable Interface) . Конечно, что бы пользователь смог сам настроить интерфейс под себя, он должен иметь определённую квалификацию. Но в наше время в спецификации этого интерфейса разберётся почти любой школьник.
            Устройства с экранами меньше 640 на 480 пикселей наверно уже мало кого интересуют, как компьютер. Соответственно, если к устройству с экраном 640 на 480 и более невозможно ни как прицепить USB клавиатуру, то такое изделие тоже мало кого заинтересует как компьютер.
Идея настраиваемого интерфейса состоит в следующем. Так же, как изготавливаются панели управления в промышленности, путём набора из стандартных элементов интерфейса (в дальнейшем ЭИ) типа лампочек, кнопок, переключателей, табло, экранов и звуковых устройств типа микрофона, сирены или динамика, так и пользователь сможет собрать любой интерфейс для своих нужд из стандартных элементов.
Отличие от обычного интерфейса WIMP состоит в том, что после настройки интерфейса его достаточно перезапустить, а перекомпиляция не нужна. Это возможно потому, что элементы интерфейса и его настройки записаны в файле. Файл имеет открытый стандарт, это просто текстовый файл.
Кроме того, при переносе на другую платформу текстовый файл описания интерфейса не изменяется, используется только другой исполняемый файл интерфейса. Текстовый файл описания интерфейса можно сравнить с понятием Skin (кожа, шкура) для программ. Например, библиотека Qt имеет (в 2010 г.) всего три шкуры: Plastik, Keramik, and Windows. Однако в данном случае  предлагается открытый стандарт, что позволит любому пользователю сделать так, как ему удобно. Кроме того, обычные реализации Skin позволяют только добавлять элементы управления (controls), но не изменять их работу, их алгоритм, их отображение.
Исполняемый файл интерфейса ICI – собственно ICI-программа, осуществляющая интерфейс на конкретной платформе, нечто, похожее на java-машину. При старте или перезапуске ICI-программа читает файл с настройками интерфейса и дальше осуществляет интерфейс, описанный в файле.
            На конкретном компьютере интерфейс имеет вид исполняемого файла. Если используется Windows, то это исполняемый exe-файл.

Входы и выходы интерфейса

            Если представить интерфейс ICI в виде черного ящика, он имеет четыре группы входов и выходов. Входы/выходы со стороны компьютера, и входы/ выходы со стороны пользователя.

Со стороны компьютера

            Сначала рассмотрим входы и выходы со стороны компьютера.  Под стороной компьютера имеется в виду любая пользовательская программа, поддерживающая описываемый стандарт, вместо привычного всем оконного интерфейса. Под поддержкой стандарта понимается возможность передачи данных между ICI-программой и пользовательской программой.
            Допустим, для передачи данных между этими программами используется протокол TCP/IP. Тогда ICI-программа и пользовательская программа могут находиться на одном компьютере или на разных компьютерах. Кроме того, возможны варианты, когда одна пользовательская программа обменивается данными с неизвестным заранее количеством (например, десятки тысяч) ICI-программ. В данном случае ICI-программа играет роль, похожую на браузер, а пользовательская программа – что-то вроде web-сервера. Возможен и обратный вариант, когда одна ICI-программа связывается с сотнями пользовательских программ, то есть подобно закладкам в браузерах.
            Инициатором создания канала связи  (например, TCP-соединения) может быть только ICI-программа. Инициатором передачи данных могут быть обе программы: и ICI-программа, и пользовательская программа.
            Какие же данные получает ЭИ от программы пользователя и передаёт программе пользователя? Только такие, которые «понимает» ЭИ, в следующих сообщения будет описание атрибутов ЭИ.

Со стороны пользователя

            Со стороны пользователя возможен ввод и вывод с помощью различных устройств.

Вывод пользователю

Для вывода обычно используется экран (или экраны) и звуковой выход (или выходы). Ну, может ещё что-то, например экран для слепых с поддержкой шрифта Брайля. Для любого экрана характерно использование координат в пикселях. Для вывода многоканального звука то же может быть вывод координат источника звука.
Ограничимся пока рассмотрением одиночного плоского цветного экрана прямоугольной формы. Для отрисовки внешнего вида любого возможного интерфейса на таком экране достаточно задать рисунки и их координаты. Однако элементы интерфейса (рисунки) со временем могут изменять своё расположение (координаты), ориентацию (поворот), масштаб, цвет и прозрачность. Поэтому эти параметры должны быть описаны в текстовом файле описания интерфейса (ICI-текст) для каждого элемента интерфейса, и называются они атрибутами.

Атрибуты ЭИ
1)     Координаты X, Y, Z (X, Y – в пикселях, Z – в слоях);
2)     Скорости Ux, Uy, Uz (Ux, Uy – в пиксели на кадр, Uz – слоёв на кадр);
3)     Координаты центра вращения в плоскости экрана X, Y;
4)     Начальный угол D в плоскости экрана в радианах;
5)     Угловая скорость W в плоскости экрана в радианах на кадр;
6)     Масштабы по осям Sx и Sy в долях от 1 до 0;
7)     Изменение интенсивности каждого цвета RGB на указанный от 0 до 255;
8)     Прозрачность в долях от 1 до 0.
9)     Состояние ЭИ, целое положительное число.

Очевидно, что обобщить эти данные элемента интерфейса на 3D экраны и реализовать, например на Win API, Open GL, или Qt, особого труда не составит.

Ввод пользователя

            Ограничимся следующим набором событий, которые могут поступать ICI-программе от пользователя. Как они реализованы на различных платформах, предмет отдельного разговора. Но в целях стандартизации ограничимся следующими событиями.
           
Первый список
1)     Нажали (вариант - отпустили) клавишу на клавиатуре;
2)     Нажали на экран указателем N в точке (X,Y);
3)     Указатель N убрали с экрана.
Указателей может быть несколько. Кажется, не составит особого труда написать программу, которая, используя два типа событий  «Нажали на экран указателем N в точке (X,Y)» и «Указатель N убрали с экрана» создаст события, например такие:
Второй список
1)     «Сильно» нажали на кнопку указателем N;
2)     «Тащат» по экрану рисунок указателем N;
3)     Жест вращения рисунка;
4)     Жест уменьшения масштаба;
5)     Жест увеличения масштаба;
6)     Жест удаления;
7)     Клавиша Ctrl и «Жест уменьшения масштаба»;
и т.д. до бесконечности. Для описания событий во втором списке можно использовать комбинацию событий первого списка и описать в ICI-тексте.
События, генерируемые известными устройствами ввода, практически любые, сводятся либо к первому списку, либо к их комбинации, как во втором списке. Может быть, скоро появятся особые устройства ввода трёхмерной информации, тогда добавится координата Z.
Конечно, в общем случае, могут быть и другие события, например интерфейс распознавания жестов и гримас лицом (улыбки), или руками, даже съём мозговой активности пользователя. В этом случае всегда есть конечный список событий, которые выдаёт на выходе этот интерфейс, кроме того, некоторые события имеют привязку к координатам, уж так устроен этот мир. В этом случае соответственно расширяется первый, базовый список. Второй список и так всегда бесконечен.