Оглавление

17. Графическая оболочка Photon microGUI


Графическое микроядро


Замечание

Эта глава содержит краткое описание графической среды ОС QNX Neutrino — Photon microGUI. Более подробные сведения о ней можно найти в соответствующем комплекте документации.

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

Микроядерная архитектура, которая с успехом была применена в ОС QNX Neutrino с целью создания POSIX-среды для работы встраиваемых систем, также послужила свою службу при создании оконной системы Photon microGUI.

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

Хотя на первый взгляд может показаться, что графическая система Photon строилась согласно классической парадигме "клиент-сервер", ранее использованной в X Window System, она отличается тем, что само графическое микроядро (или сервер) имеет ограниченную функциональность, в то время как большая часть GUI реализуется посредством распределения этой функциональности между другими взаимодействующими процессами.

Микроядро Photon представляет собой компактный процесс, реализующий только несколько фундаментальных примитивов, которые используют внешние, опциональные процессы для построения функциональности более высокого уровня (т. е. оконной системы). Как ни странно, для самого микроядра Photon экранные окна не существуют. Более того, оно ничего не рисует и не управляет пером, мышью или клавиатурой.

Для управления графической пользовательской средой микроядро Photon создает трехмерное пространство событий (event space) и ограничивается только тем, что управляет областями этого пространства, а также отображением и движением различных событий по мере их появления в указанных областях.

Такой принцип абстракции в общих чертах напоминает архитектуру микроядра операционной системы, внутри которого отсутствует файловая система или драйвер ввода-вывода, но работа ОС основана на взаимодействии внешних процессов, как раз и обеспечивающих эти высокоуровневые службы. Фактически, это открывает для микроядерного GUI такие же возможности масштабирования (т. е. как вверх, так и вниз) и функциональности, как и для микроядерной ОС.

Центральным звеном микроядерной абстракции, реализуемой микроядром Photon, является графическое пространство событий, которое другие процессы могут заполнять областями. Посредством известного механизма межзадачного взаимодействия, эти другие процессы взаимодействуют с микроядром Photon и управляют своими областями для реализации высокоуровневых графических служб или пользовательских приложений. За счет удаления тех или иных процессов, микроядро Photon может быть масштабировано вниз в соответствии с требованиями системы с ограниченными ресурсами, а посредством добавления необходимых процессов микроядро Photon может быть масштабировано вверх до уровня полной настольной системы.
Пространство событий
Пространство событий, управляемое микроядром Photon, можно представить в виде пустой емкости, на задней стороне которой расположена "корневая область" ("root region"). Можно представить себе, что конечный пользователь как будто заглядывает в это пространство событий с фронтальной стороны. Приложения помещают "области" в трехмерное пространство между корневой областью и взглядом конечного пользователя. Они используют эти области для генерирования и представления различных типов "событий" внутри данного пространства (рис. 17.1).

Процессы, которые реализуют драйверы устройств, помещают области перед пространством событий. Кроме управления пространством событий и корневой областью, микроядро Photon проецирует события рисования.



Рис. 17.1. Области в пространстве событий микроядра Photon

События можно представить как некие "фотоны", которые проходят сквозь это пространство (отсюда и получила свое название эта графическая система). Сами события состоят из списка прямоугольников (list of rectangles), к которым присоединены данные. По мере того как события проходят по пространству событий, связанные с ними списки прямоугольников пересекают те области, которые поместили там различные процессы (приложения).

О событиях, которые проходят по пространству событий от корневой области, говорят, что они "движутся наружу" (или в сторону пользователя), а о событиях, которые движутся от пользователя, говорят, что они "движутся внутрь", т. е. в сторону корневой области, расположенной на задней стороне пространства событий.

Взаимодействие между событиями и областями является основой для служб ввода-вывода в микроядре Photon. События, порождаемые пером, мышью или клавиатурой, движутся от пользователя к корневой плоскости. События рисования порождаются областями и движутся к плоскости устройств и плоскости пользователя.
Области
Управление областями осуществляется по иерархии, которая представлена семейством прямоугольников, определяющих их местоположение в трехмерном пространстве событий. Области также имеют атрибуты, которые определяют образ их взаимодействия с различными классами событий, пересекающих эти области. Взаимодействия, которые область может иметь с событиями, определяются двумя битовыми масками (bitmasks):
Битовая маска чувствительности использует особые типы событий, чтобы определить, о каких взаимодействиях должен получать информацию процесс, владеющий данной областью. Бит в битовой маске чувствительности определяет, является ли данная область чувствительной к каждому типу событий. Когда событие пересекает область, для которой бит установлен, копия этого события направляется прикладному процессу, владеющему данной областью, оповещая приложение о событии, пересекающем область. Такое оповещение никак не изменяет само событие.

Битовая маска непрозрачности используется для определения того, какие события могут пересекать данную область, а какие нет. Для каждого типа событий бит в битовой маске непрозрачности определяет, является данная область прозрачной или непрозрачной для данного события. Оптическое свойство "непрозрачности" реализуется посредством изменения самого события, когда оно пересекает область.

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

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

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

Когда событие пересекает область, которая является непрозрачной для него, прямоугольник этой области вырезается из списка прямоугольников данного события таким образом, чтобы список описывал только ту часть события, которая будет в конечном итоге отображаться.

Наилучшей иллюстрацией того, как работает вырезание, является пример изменений в списке прямоугольников в событии рисования, когда оно пересекает различные пересекающиеся области. Когда событие рисования впервые генерируется, список прямоугольников состоит только из одного простого прямоугольник, описывающего область, в которой данное событие возникает.

Если событие проходит через область, которая вырезает верхний левый угол из события рисования, список прямоугольников изменяется и в нем содержится только два прямоугольника, описывающих оставшуюся для рисования площадь. Эти прямоугольники называются фрагментами (tiles) (рис. 17.2).

Аналогично, всякий раз, когда событие рисования пересекает область, которая непрозрачна для них, список прямоугольников будет изменен, чтобы отобразить то, что останется от этого события после вырезания непрозрачной области. В конце концов, когда событие рисования достигнет графического драйвера для обработки, список прямоугольников точно определит только ту часть события, которая должна быть отображена.


Рис. 17.2.
Вырезание непрозрачных областей

Если событие рисования полностью вырезается при пересечении области, то такое событие исчезает. Таким образом, описанный ранее механизм, с помощью которого непрозрачные окна изменяют список прямоугольников, связанный с событием рисования, определяет, как события рисования, по мере движения к пользователю, должны вырезаться из нижележащих областей (и, значит, соответствующих процессов), чтобы быть отображенными.
Графические драйверы
Графические драйверы реализуются как процессы, которые помещают область в передней части пространства событий. В отличие от событий, порожденных пером, мышью или клавиатурой (т. е. драйвером ввода), область графического драйвера чувствительна к событиям рисования, исходящим из пространства событий. Когда события рисования пересекают эту область, они передаются процессу, реализующему графический драйвер. По сути, можно представить, что эта область как бы покрыта фосфором, который начинает светиться под воздействием фотонов.

Поскольку API рисования в микроядре Photon собирает запросы на рисование в пакеты, запускаемые как единичные события рисования, каждое полученное драйвером событие рисования содержит список отдельных графических примитивов, предназначенных для визуализации. К тому времени как событие рисования пересекает область графического драйвера, его список прямоугольников будет также содержать список действий вырезания (clip list), описывающий, какие именно части списка рисования (draw list) должны быть визуализированы. Задача драйвера состоит в том, чтобы преобразовать этот список операций вырезания в визуальное представление посредством того графического оборудования, которым драйвер управляет.

Таким образом, список операций вырезания передается драйверу вместе с событием, в результате чего каждый запрос рисования сразу содержит значительный объем работ. По мере обработки полученных данных графическим оборудованием, ему сразу передаются следующие части для визуализации. Многие контроллеры дисплеев могут обрабатывать один прямоугольник целиком, а некоторые даже несколько прямоугольников.

Хотя может показаться, что использование механизма межзадачного взаимодействия (IPC) для передачи запросов рисования от приложения графическому драйверу может привести к неприемлемым накладным расходам, наши тестирования показали, что в этом случае производительность так же высока, как и при прямой передаче вызова от приложения к графическому драйверу. Одна из причин такой производительности состоит в том, что множество вызовов рисования объединяются с помощью механизма событий в пакеты, что позволяет избежать повышения накладных расходов от межзадачного взаимодействия.
Применение множества графических драйверов
Поскольку графические драйверы просто помещают область в пространство событий микроядра Photon, а эта область описывает прямоугольник, который пересекают события рисования, возникает очевидная мысль, что можно запустить не один, а несколько графических драйверов для нескольких графических контролеров, каждый из которых может иметь свои области, чувствительные к определенным событиям и находящиеся в едином пространстве.

Все эти области могут помещаться рядом друг с другом, описывая множество рисуемых фрагментов, или же накладываться друг на друга различными способами. Так как графическое микроядро Photon обладает сетевой прозрачностью, присущей ОС QNX Neutrino, приложения и драйверы в этом микроядре могут выполняться на любом сетевом узле, что позволяет применять дополнительные графические драйверы для расширения графического пространства Photon до пределов физических мониторов множества компьютеров, объединенных в сеть. Благодаря наложению областей, относящихся к разным графическим драйверам, события рисования могут быть воспроизведены на множестве разных экранов.

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

Другой пример: встраиваемые системы без своего пользовательского интерфейса могут проецировать экранный интерфейс на любой сетевой компьютер. Такая сетевая прозрачность позволяет применять особые режимы совместной работы — например, группа людей может одновременно видеть на своих экранах одно и то же окно приложения и совместно управлять этим приложением.

В таком случае, с точки зрения приложения, возникает единое графическое пространство, а с точки зрения пользователя, группа компьютеров, прозрачным образом объединенных в сеть, в которой экранные окна можно перетаскивать из одного монитора в другой.
Цветовая модель
Цвета, обрабатываемые графическими драйверами, определяются 24-битной системой цветопередачи RGB (8 битов на каждый из цветов: красный, зеленый и синий), что дает всего 16 777 216 оттенков. В зависимости от фактических характеристик графического оборудования, драйвер либо будет создавать изображение с 24-битным цветом непосредственно основным графическим устройством, либо преобразует его в цветовое пространство графического оборудования с меньшими возможностями.

Поскольку графические драйверы выполняют отображение цвета независимо от оборудования, приложения могут быть отражены без изменений на оборудовании с разными цветовыми моделями. Это позволяет перетаскивать приложения из одного монитора в другой, не заботясь о том, какую цветовую модель он имеет.
Поддержка шрифтов
Микроядро Photon использует объектно-ориентированную технологию отображения шрифтов Font Fusion, разработанную компанией Bitstream. Эта технология обеспечивает высокую графическую точность и качество отображения шрифтов при любом разрешении и на любом устройстве, не искажая при этом изначальную форму символов.

В состав микроядра Photon входит некоторый ограниченный набор шрифтов TrueType. Другие шрифты этого стандартного типа распространены и их можно найти в различных источниках.
Штриховые шрифты
Для поддержки азиатских языков (например, китайского, японского и корейского) в графической оболочке Photon применяются штриховые шрифты компании Bitstream. Эти высокоскоростные шрифты идеально подходят для сред с ограниченными ресурсами памяти. Например, полный комплект китайского традиционного шрифта, включающего более 13 000 символов может занимать до 8 Мбайт в обычных настольных системах, тогда как штриховая версия того же самого шрифта не более 500 Кбайт!

Шрифты этого типа не только имеют компактный размер и быструю скорость растеризации, но и являются полностью масштабируемыми, что делает их идеально подходящими для различных ненастольных систем, в т. ч. жидкокристаллических мониторов, телевизоров, наладонных компьютеров и т. д.
Многоязыковая поддержка стандарта Unicode
Микроядро Photon имеет многоязыковую поддержку. В соответствии со стандартом Unicode (ISO/IEC 10646), графическая оболочка Photon обеспечивает возможность создавать приложения, способные поддерживать основные языки и алфавиты мира.

Замечание

Шрифты с правосторонним чтением (например, арабский) в настоящее время не поддерживаются.

Стандарт Unicode основан на наборе символов ASCII, но использует 16-битную (или 32-битную) кодировку для полной многоязыковой поддержки. В результате нет необходимости применять последовательности переключения кода или управляющий код при задании любого символа на любом языке. Кодировка Unicode также удобна тем, что все символы — алфавитные, идеографические или знаковые — рассматриваются в ней одинаковым образом.
Кодировка UTF-8
Преобразование UTF-8 (для 8-битной формы), которое ранее называлось UTF-2, было разработано для применения символьных данных стандарта Unicode в 8-битных UNIX-средах.

Перечислим основные характеристики кодировки UTF-8:
Поддержка анимации
Графическая оболочка Photon обеспечивает немерцающую анимацию благодаря использованию буферной видеопамяти (если возможно). Например, специальный виджет PtOSContainer создает выделенную контекстную область буферной видеопамяти для рисования изображений. Контейнер PtOSContainer использует достаточно большой блок видеопамяти, чтобы поместить в него изображение размером с его подложку (canvas). (Более подробные сведения о виджетах можно найти далее в этой главе в разделе "Библиотека виджетов".)

Графические драйверы микроядра Photon также в максимальной степени используют буферную видеопамять для достижения более высокой производительности отображения анимированных изображений. Кроме того, графические драйверы поддерживают такие технологии, как режим прямой графики (direct graphics mode), наложение полупрозрачного изображения (alpha-blending), текстурная прозрачность (chroma-key substitution) и мн. др.
Наложение видеоизображения
Кроме технологий наложения полупрозрачного изображения на фон (alpha-blending) и замещения выбранного цвета в изображении на фон (chroma-key), микроядро Photon поддерживает технологию наложения видеоизображений (video overlay), при которой видеоизображение воспроизводится в пределах интерфейсного окна, отображенного на мониторе.
Слои
Некоторые графические контроллеры позволяют прозрачным образом отображать множество экранов на одном мониторе. В этом случае создаются так называемые слои (layer).

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

Изображения на всех активных слоях экрана комбинируются посредством технологий полупрозрачного наложения и текстурной прозрачности, чтобы получить результирующую картину.
Поддержка печати
Графическая оболочка Photon имеет встроенную поддержку печати различных форматов:
Кроме того, в графической оболочке Photon предусмотрен специальный виджет/диалоговое окно для выполнения печати, который разработчики могут применять в своих приложениях.
Оконный администратор Photon
Благодаря оконному администратору (Photon Window Manager, PWM), графическая оболочка Photon превращается в полнофункциональный графический пользовательский интерфейс настольного класса. Оконный администратор является совершенно необязательным компонентом и может не использоваться в большинстве встраиваемых систем. Он позволяет пользователю управлять экранными окнами приложения посредством изменения размера, перемещения и сворачивания в пиктограммы.

Работа оконного администратора основана на принципе фильтрации событий с помощью дополнительных областей, которые помещаются за областями приложений и на которых прорисовываются заголовки окон, размерные ручки и другие интерактивные графические элементы. Оконный администратор реализует визуальное отображение программной среды, к которому можно по желанию добавлять те или иные графические элементы.
Библиотека виджетов
Графическая оболочка Photon содержит библиотеку компонентов, которые называются виджетами (widgets13) и представляют собой объекты, способные управлять большей частью своей работы на экране автоматически, без дополнительного кода. С помощью этих компонентов можно быстро собрать целое приложение, комбинируя их в различных сочетаниях и присоединяя Си-код к соответствующим функциям, предоставляемым этими виджетами.

Построитель приложений Photon (Photon Application Builder, PhAB), входящий в состав системы разработки для Photon, включает в свою среду визуальной разработки довольно широкий набор виджетов.

Виджеты, предоставляемые в PhAB, классифицируются следующим образом:
Базовые виджеты

Ярлыки (PtLabel)

Рис. 17.3. Ярлыки

Этот виджет позволяет создавать ярлыки (label) на основе растровых изображений, рисунков или текстовой информации (рис. 15.3). Виджет PtLabel является родительским объектом для всех текстовых виджетов и имеет множество настраиваемых атрибутов (например, начертание гарнитуры, функция всплывающей подсказки, цвет, границы, выравнивание, поля и т. д.), которые наследуются всеми порожденными объектами.
Экранные кнопки (PtButton)

Рис. 17.4. Экранные кнопки

Экранные кнопки (push buttons) являются необходимыми компонентами во многих оконных системах (рис. 15.4). Визуально они отображаются в виде отжатых кнопок, которые по щелчку меняют вид на нажатый, что наглядно показывает пользователю их срабатывание. Кроме того, при нажатии на кнопку автоматически производится вызов заданной функции.
Окна ввода текста (PtText, PtMultiText)


а

б

Рис. 17.5. Окна ввода текста

В графической оболочке Photon имеется два вида виджетов для создания окон текстового ввода (text-input widgets):
Кнопочные переключатели (PtToggleButton)


Рис. 17.6.
Кнопочные переключатели

Кнопочные переключатели (toggle buttons) — это объекты, которые отображают два состояния: включено или выключено. В графической оболочке Photon есть несколько типов таких переключателей, каждый из которых имеет особый вид (рис. 17.6). Кнопочные переключатели используются для отображения или запроса информации о состоянии команды или действия, которые должны произойти.
Графические виджеты (PtArc, PtPixel, PtRect, PtLine, PtPolygon, PtEllipse, PtBezier, PtGrid)



Рис. 17.7.
Графические виджеты

В графической оболочке Photon нет недостатка в виджетах для создания графических фигур, начиная от простых линий и прямоугольников и заканчивая сложными, многосоставными кривыми Безье (рис. 17.7). Графические виджеты позволяют настраивать различные атрибуты, в том числе цвет, цветовую заливку, узор, толщину линий, соединения и многое другое.
Области прокрутки (PtScrollbar)


Рис. 17.8.
Области прокрутки

Область прокрутки (scrollbar) используется для перемещения просматриваемой области (рис. 17.8). Область прокрутки может применяться в комбинации с другими виджетами для управления областью просмотра (например, PtList, PtScrollContainer).
Разделители (PtSeparator)

Рис. 17.9. Разделители


Разделитель (separator) используется для разбиения областей, например, между элементами меню (как показано на рис. 17.9). Разделители могут иметь разные стили и виды.
Бегунки (PtSlider)


Рис. 17.10.
Бегунки

Бегунки (sliders) отличаются от областей прокрутки тем, что первые определяют единственное значение, а последние определяют диапазон (рис. 17.10).
Изображения (PtLabel, PtButton)


Рис. 17.11. Изображения

Графическая оболочка Photon поддерживает все основные графические форматы, поэтому можно импортировать графические изображения для отображения их в экранных элементах (рис. 17.11). Многие виджеты в графической оболочке Photon позволяют напрямую загружать графику. Например, наиболее часто применяются виджеты PtButton (для создания панелей с экранными кнопками) и PtLabel (для отображения картинок).
Индикаторы хода процесса (PtProgress)


Рис. 17.12.
Индикаторы хода процесса

Если приложение выполняет процесс (например, загрузку файла), который требует определенного времени, оно может отобразить индикатор хода процесса (progress bar), чтобы сообщить пользователю о текущем состоянии процесса, а также (что более важно) сколько еще времени процесс будет продолжаться. Индикатор хода процесса имеет много настраиваемых атрибутов — он может быть горизонтальным или вертикальным, отображать точное значение или неопределенное (оба варианта можно видеть на рис. 17.12) и т. д.
Числовые счетчики (PtNumericInteger, PtNumericFloat)


Рис. 17.13. Числовые счетчики

Виджеты класса PtNumericInteger позволяют пользователю задать целочисленные значения в диапазоне между минимальным и максимальным значением. Виджеты класса PtNumericFloat позволяют вводить значения с плавающей запятой (рис. 17.13).
Контейнеры
Контейнер (container) — это мощный и удобный интерфейсный инструмент, который содержит другие виджеты и управляет их отображением. Контейнеры широко используются в Photon-приложениях.
Окна (PtWindow)



Рис. 17.14.
Окна

Окна (windows) — это контейнеры, используемые в приложениях. Основные компоненты пользовательских интерфейсов (такие как панели меню, панели инструментов и т. д.) отображаются с помощью окон. Данный виджет автоматически выполняет все необходимые взаимодействия с администратором окон Photon (PWM) (рис. 17.14). Все, что остается задать, — это что нужно и что не нужно визуализировать или контролировать.
Группы (PtGroup)


Рис. 17.15. Группы

Группа (group) — это очень мощный виджет, который управляет геометрией всех порожденных виджетов (рис. 17.15). Этот виджет может выравнивать включенные в него другие виджеты по горизонтали или вертикали, или вдоль рамки. У группы есть атрибуты, которые позволяет задать привязку и растягивание порожденных виджетов при изменении ее размеров.
Группы панелей (PtPanelGroup)


Рис. 17.16.
Группы панелей

Группы панелей (panel group) представляют собой контейнеры, в которых содержатся панели — полезные элементы, позволяющие организовать данные в виде диалоговых окон (рис. 17.16). Виджет PtPanelGroup не только управляет геометрией и отображением панелей, но и имеет два режима выбора панелей: выбор с множеством вкладок (каждая панель имеет свою собственную закладку) или выбор по одной вкладке (при нажатии на вкладку выскакивает меню, в котором можно выбрать другие панели).
Окна просмотра (PtScrollContainer)



Рис. 17.17.
Окна просмотра

Виджет PtScrollContainer представляет собой очень мощный инструмент для создания окна просмотра (viewport) контейнера, который может быть больше этого окна (рис. 17.17). Внутрь контейнера можно поместить сколько угодно виджетов и окно просмотра автоматически добавит области прокрутки, чтобы можно было их увидеть. Виджет PtScrollContainer можно использовать для создания средств просмотра текстовых файлов, текстовых процессоров, настраиваемых списков и т. д.

Для ускорения прокрутки по окну просмотра виджет области прокрутки использует аппаратный модуль блитирования (hardware blitter) (при условии, что графический драйвер поддерживает его).
Фоны (PtBkgd)


Рис. 17.18.
Фоны

Виджет PtBkgd позволяет создавать экранные фоны — от простых цветовых градиентных фонов до текстурных (рис. 17.18). Этот виджет может реализовать практически любые фоны.
Дополнительные виджеты
С помощью богатого набора описанных ранее виджетов разработчики могут создавать практически любые графические приложения. Тем не менее, также можно воспользоваться дополнительными, еще более мощными виджетами графической оболочки Photon.
Меню (PtMenu, PtMenuBar, PtMenuButton)


Рис. 17.19. Меню

В графической оболочке Photon есть виджет для создания меню любой сложности, а также виджет, упрощающий создание стандартной панели меню (рис. 17.19). Виджет для создания меню позволяет применять такие возможности, как всплывающие подсказки, перетаскивание, указание и выделение с помощью мыши, перемещение по элементам меню с помощью клавиатуры и т. д. Кроме того, специальный виджет позволяет создавать кнопки для отображения элементов меню.
Панели инструментов (PtToolbar, PtToolbarGroup)


Рис. 17.20.
Панели инструментов

Контейнер PtToolbar может содержать кнопки, изображения и любые другие виджеты, он позволяет выравнивать их по горизонтали или вертикали в пределах создаваемой панели инструментов (toolbar). Виджет для создания группы панелей инструментов позволяет комбинировать панель инструментов с панелью меню для получения очень гибкого графического элемента в приложении (рис. 17.20).
Списки (PtList)


Рис. 17.21.
Списки

Этот мощный виджет позволяет создавать списки элементов с различными режимами выбора, в том числе выбор только одного элемента, множества элементов или диапазона элементов (рис. 17.21). Виджет для создания списков, посредством виджета делителя (PtDivider), позволяет создавать списки, состоящие из нескольких колонок.
Выпадающие списки (PtComboBox)


Рис. 17.22.
Выпадающие списки

Виджет PtComboBox позволяет создавать выпадающие списки и сочетает в себе виджет для создания полей ввода текста PtText и кнопку для открытия списка (рис. 17.22). Когда пользователь выбирает элементы из списка, текстовый виджет автоматически обновляется в соответствии с текущим выделением. Это очень полезный инструмент для компактного отображения списка элементов. Диалоговые окна и контейнеры экономно используют графическое пространство экрана, что очень важно для встраиваемых систем.
Древовидные списки (PtTree)


Рис. 17.23.
Древовидные списки

Виджет для создания древовидных списков аналогичен предыдущему виджету. Основное отличие состоит только в том, что древовидный список отображает элементы в виде иерархической структуры (рис. 17.23). Элементы, называемые ветвями, могут быть свернуты или развернуты, а их количество может быть неограниченным. Каждая ветвь может отображаться вместе с каким-либо рисунком. Древовидные списки полезны тем, что они позволяют показать информацию в соответствии с некоторой логикой.

Photon-приложения, в которых используется этот виджет, включают в себя администратор файлов (File Manager) (для отображения каталогов), визуальный построитель графических приложений PhAB (для отображения свойств виджета), утилиту для просмотра справочных файлов (Helpviewer) и др.
Терминалы (PtTty, PtTerminal)

Рис. 17.24. Терминалы

Данный виджет создает внутри себя терминал и управляет им в полном текстовом режиме (рис. 17.24). Чтобы создать терминальный эмулятор (pterm) в графической оболочке Photon, достаточно поместить этот виджет в приложение.

Кроме того, виджет создания терминала реализует полную функциональность "вырезать-вставить" (cut-and-paste) и возможность быстрого запуска контекстной справки посредством выделения любого фрагмента текста.
Делители (PtDivider)


Рис. 17.25.
Делители

Этот мощный виджет управляет содержащимися в нем виджетами особым образом. При помещении внутрь него два или более других виджетов, он автоматически создает делители между ними. Эти делители пользователь может перемещать из одно стороны в другую, при этом виджеты, находящиеся с каждой стороны от делителя, автоматически изменяют свой размер (рис. 17.25). Данный виджет очень полезен для создания изменяемых заголовков для списков. Если поместить виджет для создания делителя в простой список, то этот список автоматически превратится в изменяемый список с несколькими колонками.

Делители работают не только с ярлыками и кнопками. В этот виджет можно поместить любые другие виджеты, чтобы создать несколько рядом расположенных изменяемых древовидных списков, областей прокрутки и т. д.
Графики трендов (PtTrend и PtMTrend)


Рис. 17.26.
Графики трендов

В некоторых системах реального времени требуется отображение графиков трендов. В графической оболочке Photon есть виджет PtTrend для создания панели отображения таких графиков. Этот виджет поддерживает одновременное отображение нескольких графиков на одной панели. Если графическое оборудование поддерживает маскированное блитирование (masked blits), то оно может даже выполнять совмещение графика с координатной сеткой (рис. 17.26). Виджет PtMTrend имеет такие дополнительные возможности, как построение линейного следа, что может применяться в медицинских приложениях.
Инструменты для выбора цвета (PtColorSel, PtColorPanel, PtColorPatch, PtColorSelGroup, PtColorWell)



Рис. 17.27. Инструменты для выбора цвета

Графическая оболочка Photon имеет несколько удобных инструментов для создания диалоговых окон выбора цвета. Этот набор удобных виджетов также включает в себя простые в использовании панели для создания смешанных цветов (PtColorPalette и PtColorPanel) (рис. 17.27).
Веб-клиенты (PtWebClient)


Рис. 17.28.
Веб-клиенты

Виджет PtWebClient используется для запуска и управления веб-браузера (рис. 17.28). Этот виджет также создает определяемую пользователем область, в которой сервер14 может форматировать и отображать веб-страницы.

Приложение управляет сервером с помощью настройки ресурсов виджета. Сервер сообщает приложению информацию о состоянии и взаимодействии с пользователем посредством вызовов из данного виджета. Виджет PtWebClient прозрачным образом поддерживает ту версию HTML, которую поддерживает сервер.
Функции настройки
После создания виджета можно воспользоваться функциями графической оболочки Photon, которые позволяют легко настраивать диалоговые окна и управлять виджетами.

Далее перечислены некоторые из диалоговых окон, создаваемых с помощью функций настройки:
Диалоговое окно выбора файла (PtFileSelection)


Рис. 17.29.
Диалоговое окно выбора файла

Функция PtFileSelection() включает в себя виджет для создания древовидного списка, отображающего файлы, каталоги, ссылки на файлы и каталоги, а также другие данные (рис. 17.29). Пользователь может не только выбирать файлы, указанные приложением, но и перемещаться по всей файловой системе и выбирать любые файлы и каталоги.
Диалоговое окно выбора шрифта (PtFontSelection)


Рис. 17.30.
Диалоговое окно выбора шрифта

Графическая оболочка Photon имеет удобный инструмент для выбора нужного шрифта из довольно большого набора. Специальное диалоговое окно отображает список всех имеющихся шрифтов и позволяет пользователю выбирать начертание и стиль (жирный, наклонный и т. д.), а также включать функцию сглаживания (anti-aliasing) (рис. 17.30).
Диалоговое окно выбора опций печати (PtPrintSelection)


Рис. 17.31.
Диалоговое окно выбора опций печати

Это диалоговое окно позволяет пользователю выбирать принтер и настраивать его (рис. 17.31). Он также может выбрать диапазон страниц для печати, а также нужное количество копий.
Диалоговое окно с предупреждением (PtAlert)

Рис. 17.32. Диалоговое окно с предупреждением

Это модальное диалоговое окно с предупреждением (alert dialog) служит для извещения пользователя о некотором важном событии и ожидает ответ от него (например, нажатие кнопки) (рис. 17.32).
Диалоговое окно с извещением (PtNotice)


Рис. 17.33.
Диалоговое окно с извещением

Диалоговое окно с извещением (notice dialog) отображает сообщение и может потребовать ответного действия от пользователя (необязательно) (рис. 17.33). Это диалоговое окно часто снабжается кнопкой OK для подтверждения пользователя.
Диалоговое окно с вводом текста (PtPrompt)


Рис. 17.34.
Диалоговое окно с вводом текста

Аналогично диалоговому окну с предупреждением, это диалоговое окно (prompt dialog) отображает сообщение и ожидает ответа пользователя. Кроме того, оно снабжается полем для ввода текста (рис. 17.34).
Комплекты разработки драйверов
Как программный продукт, предназначенный для разработчиков, графическая оболочка Photon предоставляет все необходимые инструменты для создания высокопроизводительных и высокоскоростных графических драйверов, которые можно легко приспособить под требования конкретных графических плат и чипсетов.

С помощью графической оболочки Photon разработчики могут создавать драйверы, реализующие сложные графические технологии (например, наложение полупрозрачного изображения (alpha-blending) или применение текстурной прозрачности (chroma-key substitution)) посредством всего лишь программных средств, что, безусловно, дает большие преимущества при работе с оборудованием, которое не способно напрямую применять такие технологии.

Комплект разработки графических драйверов Photon содержит полный набор исходного кода для нескольких драйверов, используемых в качестве примеров, а также подробные инструкции для решения вопросов, связанных с оборудованием, для которого выполняется разработка специализированных драйверов.

Резюме

Графическая оболочка Photon представляет собой новый подход к разработке графических пользовательских интерфейсов — посредством микроядра и межзадачного взаимодействия, а не монолитной архитектуры, характерной для других оконных систем. В результате графическая оболочка Photon имеет уникальный набор возможностей.


13 Widget — некоторое приспособление, средство, элемент управления. — Прим. перев.

14 Имеется в виду серверный процесс веб-клиента. (Веб-клиенты в графической оболочке Photon реализованы в виде пары "клиент-сервер", в которой сервер несет на себе функциональность "ядра" браузера, а клиент компонуется в приложении как виджет и отвечает за отображение информации. Такой подход позволяет в любое время заменять сервер (например, переходить с Mozilla на Opera), не внося изменений в пользовательское приложение). — Прим. научн. ред.


     Оглавление