Элементы управления. Компоненты панели инструментов
Для создания и последующего отображения элементов инструментальной панели необходимо создать объект класса, унаследованного от ToolbarItemFactory, и передать его в качестве параметра в метод void Toolbar::addDefaultItems(ToolbarItemFactory& factoryToUse) ( пример 14.4).
#include "TCentralComponent.h" #include "TStatusBar.h" //--------------------------------------------- #define tr(s) String::fromUTF8(s) //--------------------------------------------- TCentralComponent::TCentralComponent() : Component ("Central Component"), pInfoLabel(0), pToolbar(0) { // Создаём панель инструментов pToolbar = new Toolbar(); addAndMakeVisible(pToolbar); // Панель инструментов - горизонтальная pToolbar->setVertical(false); // Добавляем на панель кнопки pToolbar->addDefaultItems(ToolbarFactory); // Добавляем слушатель мыши pToolbar->addMouseListener(this, true); // Добавляем слушатели кнопок ToolbarFactory.pFileNewButton->addListener(this); ToolbarFactory.pFileQuitButton->addListener(this); ToolbarFactory.pFileOpenButton->addListener(this); ToolbarFactory.pViewOrientationButton->addListener(this); pInfoLabel = new Label("Info Label", tr("Нажмите кнопку панели инструментов!")); pInfoLabel->setJustificationType(Justification::centred); pInfoLabel->setColour(Label::backgroundColourId, Colours::azure); addAndMakeVisible(pInfoLabel); // Создаём панель состояния pStatusBar = new TStatusBar(); pStatusBar->ShowHint(tr("Готов")); addAndMakeVisible(pStatusBar); setSize (400, 200); }Листинг 14.4. Реализация конструктора класса компонента содержимого TCentralComponent (файл TCentralComponent.cpp)
Библиотека Juce позволяет создавать инструментальные панели двух видов: вертикальные и горизонтальные (традиционные). Для того, чтобы задать ориентацию панели, необходимо вызвать метод void Toolbar::setVertical(bool shouldBeVertical), где shouldBeVertical — флаг того, должна ли она быть вертикальной ( пример 14.4).
В качестве завершающего этапа добавим слушатели кнопок как в саму панель инструментов, так и в каждую из её кнопок. Как и в предыдущих примерах, в качестве слушателя выступит сам компонент содержимого ( пример 14.3).
Для того, чтобы панель инструментов, будучи вертикальной, не перекрывала полосу состояния, мы рассчитываем длину первой ( пример 14.5). Узнать ориентацию инструментальной панели нам помогает метод bool Toolbar::isVertical() const throw().
void TCentralComponent::resized() { if(pToolbar->isVertical()) { pToolbar->setBounds(0, 0, 25, getHeight() - 25); pInfoLabel->setBounds(25, proportionOfHeight(0.5000f), proportionOfWidth(1.0000f), 25); } else { pToolbar->setBounds(0, 0, getWidth(), 25); pInfoLabel->setBounds(0, proportionOfHeight(0.5000f), proportionOfWidth(1.0000f), 25); } pStatusBar->setBounds(0, proportionOfHeight(1.0000f) - 25, proportionOfWidth(1.0000f), 25); }Листинг 14.5. Реализация метода resized класса компонента содержимого TCentralComponent (файл TCentralComponent.cpp)
Собственно логика работы программы приведена в листинге 14.6 и понятна без дополнительных комментариев.
void TCentralComponent::buttonClicked(Button* pButton) { if(pButton == ToolbarFactory.pFileQuitButton) { JUCEApplication::quit(); } else if(pButton == ToolbarFactory.pFileNewButton) { pInfoLabel->setText(tr("Нажата кнопка \"Новый\"."), false); } else if(pButton == ToolbarFactory.pFileOpenButton) { pInfoLabel->setText(tr("Нажата кнопка \"Открыть\"."), false); } else if(pButton == ToolbarFactory.pViewOrientationButton) { pToolbar->setVertical(!pToolbar->isVertical()); this->resized(); pInfoLabel->setText(tr("Нажата кнопка \"Ориентация\"."), false); } } //------------------------------------------------ void TCentralComponent::mouseMove(const MouseEvent& Event) { // Отработка показа подсказок кнопок панели инструментов при наведении // на них мыши if(Event.source.getComponentUnderMouse() == ToolbarFactory.pFileQuitButton) { pStatusBar->ShowHint(tr("Нажмите, чтобы завершить работу программы")); } else if(Event.source.getComponentUnderMouse() == ToolbarFactory.pFileNewButton) { pStatusBar->ShowHint(tr("Нажмите эту кнопку")); } else if(Event.source.getComponentUnderMouse() == ToolbarFactory.pFileOpenButton) { pStatusBar->ShowHint(tr("Нажмите эту кнопку")); } else if(Event.source.getComponentUnderMouse() == ToolbarFactory.pViewOrientationButton) { pStatusBar->ShowHint( tr("Нажмите эту кнопку, чтобы установить панель инструментов вертикально / горизонтально")); } else { pStatusBar->ShowHint(tr("Готов")); } }Листинг 14.6. Часть реализации класса компонента содержимого TCentralComponent (файл TCentralComponent.cpp)
При щелчке по той или иной кнопке происходит либо просто вывод соответствующего сообщения, либо выполняется ещё и какое-либо действие, например, изменение положения инструментальной панели (рисунок 14.2 ).
Краткие итоги
Для создания панели инструментов приложения нам необходимо описать набор команд и связать его с соответствующими инструментальными кнопками ToolbarButton, которые добавляются на панель объектом класса ToolbarItemFactory. За отрисовку полосы (панели), содержащей эти кнопки в порядке, определяемом ToolbarItemFactory, отвечает объект класса Toolbar.
Дополнительные материалы
Архив с исходными текстами примера Вы можете скачать здесь