Опубликован: 13.07.2012 | Доступ: свободный | Студентов: 460 / 8 | Оценка: 5.00 / 5.00 | Длительность: 18:06:00
Специальности: Программист
Лекция 17:

Стандартные диалоги

< Лекция 16 || Лекция 17: 1234 || Лекция 18 >

Обзор файлов, имеющихся в той или иной папке, обеспечивает объект класса FileBrowserComponent. Его конструктор принимает следующие параметры:

  • int flags — флаги, описывающие поведение компонента;
  • const File& initialFileOrDirectory — начальный файл или директория, которые будут выбраны при первом открытии компонента. Если параметр принимает значение File::nonexistent, т.е. несуществующий файл, то будет открыта директория, установленная по умолчанию (в Linux это обычно домашняя папка пользователя, в Windows — папка документов);
  • const FileFilter* fileFilter — фильтр отображения тех или иных типов файлов; в том случае, если в качестве параметра конструктор FileBrowserComponent принимает нулевой указатель, будут отображаться все файлы;
  • FilePreviewComponent* previewComp — компонент предварительного просмотра свойств открываемых файлов. Может быть равен нулю; в этом случае файлы будут открываться без предварительного просмотра.
  • Флагами FileBrowserComponent являются идентификаторы перечислимого типа enum FileBrowserComponent::FileChooserFlags:
  • openMode — обозначает, что компонент позволяет пользователю выбирать существующие файлы для их последующего открытия;
  • saveMode — обозначает, что компонент позволяет пользователю указывать имя файла, который будет использован для сохранения в нём чего-либо;
  • canSelectFiles — обозначает, что пользователь может выбирать файлы;
  • canSelectDirectories — обозначает, что пользователь может выбирать директории;
  • canSelectMultipleItems — обозначает, что пользователь может одновременно выбирать несколько элементов (папок или директорий);
  • useTreeView — обозначает, что вместо простого списка файлов в файловом браузере будет отображаться древовидный;
  • filenameBoxIsReadOnly — обозначает, что пользователь сможет выбирать имя того или иного файла, но не сможет вводить его вручную.

В нашем примере в качестве стартовой директории мы задали папку "Документы" текущего пользователя, установили ранее созданный виджет ImagePreviewComponent ImageViewWidget для предварительного просмотра открываемых изображений, а с помощью флагов разрешили выбирать файлы для их открытия ( пример 17.3).

Интерфейс для принятия решения, какие именно файлы являются подходящими для выбора пользователем, реализуют классы FileFilter и WildcardFileFilter, являющийся потомком первого.

Конструктор класса FileFilter в качестве единственного параметра принимает строку — объект класса String — описывающую подходящий фильтр, например "*.jpg".

Конструктор класса WildcardFileFilter, обеспечивающего шаблоны групповых символов для файлового браузера, является более сложным и принимает три параметра:

  • const String& fileWildcardPatterns;
  • const String& directoryWildcardPatterns;
  • const String& description.

В отличие от FileFilter класс WildcardFileFilter позволяет создавать фильтры групповых символов (wildcard) как для одного, так и нескольких шаблонов. Например, если параметр fileWildcardPatterns принимает значение "*.png;*.jpg", то пользователь в файловом браузере сможет просматривать только файлы с расширениями .png и .jpg. Параметр description описывает применённые шаблоны, например "Файлы изображений", как мы это и сделали в нашем примере (см. пример 17.3).

Как упоминалось, отображает файловый браузер FileBrowserComponent и управляет им класс FileChooserDialogBox. Его конструктор принимает следующие параметры:

  • const String& title — заголовок диалогового окна;
  • const String& instructionsинструкции пользователю, отображаемые под заголовком;
  • FileBrowserComponent&; browserComponent — файловый браузер, собственно и отвечающий за выбор пользователем файлов и директорий;
  • bool warnAboutOverwritingExistingFiles — если параметр принимает значение true, пользователь будет получать предупреждение при попытке выбора для сохранения уже существующих файлов;
  • const Colour& backgroundColour — фоновый цвет диалога.

После показа диалога собственно выбор файла осуществляет метод const File FileBrowserComponent::getSelectedFile(int index) const throw(), который возвращает файл с номером index из числа выбранных пользователем.

Диалог выбора цвета

Для создания диалога выбора цвета в библиотеке Juce используется класс ColourSelector ( рис. 17.7 ), за отображение объекта которого отвечает, как и в предыдущих примерах, класс DialogWindow.

Компонент  ColourSelector

Рис. 17.7. Компонент ColourSelector

Компонент ColourSelector позволяет пользователю выбрать мышью цвет из той или иной палитры, либо ввести значения красной, зелёной и синей составляющей цвета (RGB) и прозрачности (альфа-канал) в соответствующие поля ползунков.

Внешний вид компонента можно изменять, передавая в качестве параметров конструктора его класса идентификаторы перечислимого типа enum ColourSelector::ColourSelectorOptions:

  • showAlphaChannel — флаг того, что будет меняться не только RGB, но и альфа-канал цвета;
  • showColourAtTop — показывает, что ярлык с выбранным пользователем цветом и его цифровым кодом (шестнадцатеричное число) будет отображаться в верхней части диалогового окна ( рис. 17.7);
  • showSliders — флаг отображения в диалоге ползунков, позволяющих пользователю вручную вводить значения RGB и альфа-канала;
  • showColourspace — флаг того, будет ли отображаться шкала выбора оттенка, насыщенности и яркости цвета (HSV).

По умолчанию конструктор компонента принимает следующие параметры: ColourSelector::ColourSelector(int sectionsToShow = (showAlphaChannel | showColourAtTop | showSliders | showColourspace), int edgeGap = 4, int gapAroundColourSpaceComponent = 7), где edgeGapсвободное пространство, оставляемое на границах компонента, а gapAroundColourSpaceComponentсвободное пространство вокруг поля выбора цвета ( рис. 17.7 ).

По умолчанию виджет ColourSelector создаётся с предустановленным значением текущего цвета FFFFFFFF, что соответствует белому цвету. Но это значение можно поменять, воспользовавшись методом void ColourSelector::setCurrentColour(const Colour& newColour).

Напротив, получить текущий цвет можно с помощью метода const Colour ColourSelector::getCurrentColour() const.

Рассмотрим использование компонента на простом примере. Внешний вид программы и её код с небольшими изменениями заимствуем из предыдущего примера ( пример 17.2, рис. 17.8 ).

Приложение, демонстрирующее работу диалога выбора цвета

Рис. 17.8. Приложение, демонстрирующее работу диалога выбора цвета

Ярлык программы окрашивается в цвет, выбираемый пользователем в виджете ColourSelector, который отображает DialogWindow ( пример 17.4).

void TCentralComponent::buttonClicked(Button* pButton)
{
  if(pButton == pChooseButton)
  {
    // Создаём виджет выбора цвета
    ColourSelector* pColourDialog = new ColourSelector();
    // и устанавливаем его размер
    pColourDialog->setSize(600, 400);

    // Показываем диалог с созданным виджетом
    DialogWindow::showModalDialog(tr("Выбор цвета"),
            pColourDialog,
            NULL,
            Colours::azure,
            true,
            false,
            false);
 
    // Сохраняем текущий цвет виджета в переменной 
    // после закрытия диалога
    Colour CurrentColour = pColourDialog->getCurrentColour();
    // Присваиваем этот цвет ярлыку
    pColourLabel->setColour(Label::backgroundColourId, CurrentColour);

    if(pColourDialog) delete pColourDialog;
  }
}
Листинг 17.4. Реализация метода buttonClicked класса компонента содержимого TCentralComponent (файл TCentralComponent.cpp)

Работа программы аналогична вышеописанным примерам и понятна из комментариев к исходному тексту.

Особенности Juce 2.0

Для доступа к классу ColourSelector необходимо в проекте Introjucer включить модуль juce_gui_extra.

Краткие итоги

В этой лекции вы научились использовать информационные окна (класс AlertWindow), а также создавать заготовки диалоговых окон и отображать их с помощью класса-обёртки DialogWindow.

Упражнение

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

Дополнительные материалы

Архив с исходными текстами примеров Вы можете скачать здесь

< Лекция 16 || Лекция 17: 1234 || Лекция 18 >