Компоненты ввода и отображения текстовой, цифровой и иерархической информации. Компоненты выбора из списков
Класс ListBoxModel
Рассмотрим более сложный пример, в котором будет реализовано большинство методов подкласса ListBoxModel. Наша будущая программа, помимо отображения списка строк будет способна уже совершать над ним некоторые действия (добавлять и удалять строки — рис. 9.2).
Вначале создадим собственный класс TListBoxModel, унаследовав его от ListBoxModel ( пример 9.3).
#ifndef _TListBoxModel_h_ #define _TListBoxModel_h_ //-------------------------------------------------------- #include "../JuceLibraryCode/JuceHeader.h" //-------------------------------------------------------- class TListBoxModel : public ListBoxModel { public: TListBoxModel(); ~TListBoxModel(); // Задаём число элементов списка int getNumRows(); // Отрисовка элемента списка void paintListBoxItem(int, Graphics&, int, int, bool); // Обработка щелчка и двойного щелчка мышью по элементу void listBoxItemClicked(int, const MouseEvent&); void listBoxItemDoubleClicked(int, const MouseEvent&); // Обработка щелчка мышью по свободному пространству списка void backgroundClicked(); // Собственные функции добавления и удаления элемента списка void AddItem(String); void DeleteItem(int); private: // Массив для хранения строк списка Array<String> sItems; // Предотвращает создание копии конструктора и оператора = TListBoxModel(const TListBoxModel&); const TListBoxModel& operator= (const TListBoxModel&); }; //--------------------------------------------------------- #endifЛистинг 9.3. Объявление класса TListBoxModel (файл TListBoxModel.h)
Как видно из объявления класса, в данном примере мы рассмотрим использование ряда виртуальных методов, унаследованных от ListBoxModel:
- virtual void ListBoxModel::listBoxItemClicked(int row, const MouseEvent& e) — обрабатывает щелчок мышью пользователя по элементу (строке) списка, где row — элемент, по которому был произведён щелчок;
- virtual void ListBoxModel::listBoxItemDoubleClicked(int row, const MouseEvent& e) — то же, но обрабатывается двойной щелчок;
- virtual void ListBoxModel::backgroundClicked() — обрабатывает событие двойного щелчка мышью по области списка, где нет строк;
В данном примере мы не используем функции virtual void ListBoxModel::deleteKeyPressed(int lastRowSelected) и virtual void ListBoxModel::returnKeyPressed(int lastRowSelected), отвечающие за обработку событий нажатия на клавиши <DELETE> и <ENTER>, соответственно, поскольку события клавиатуры удобнее обрабатывать в соответствующем методе компонента содержимого, в который будет включён наш список.
Перейдём к реализации модели списка (TListBoxModel — пример 9.4).
#include "TListBoxModel.h" //-------------------------------------------------------- #define tr(s) String::fromUTF8(s) //------------------------------------------------------- TListBoxModel::TListBoxModel() { } //------------------------------------------------------- TListBoxModel::~TListBoxModel() { // Перед завершением работы удаляем хранимые строки списка sItems.clear(); } //------------------------------------------------------- int TListBoxModel::getNumRows() { // Число элементов списка - число хранимых строк return sItems.size(); } //----------------------------------------------------- void TListBoxModel::paintListBoxItem(int iRowNumber, Graphics& Painter, int iWidth, int iHeight, bool bIsRowSelected) { // Если строка выбрана, закрашиваем её голубым цветом if(bIsRowSelected) { Painter.fillAll(Colours::lightblue); } // Цвет надписи - чёрный Painter.setColour(Colours::black); // Размер шрифта - 75% от высоты строки Painter.setFont(iHeight * 0.7f); // Рисуем текст строки с заданными параметрами, исходя из её номера Painter.drawText(sItems[iRowNumber], 5, 0, iWidth, iHeight, Justification::centredLeft, true); } //------------------------------------------------------ void TListBoxModel::listBoxItemClicked(int iRowNumber, const MouseEvent& Event) { } //------------------------------------------------------ void TListBoxModel::listBoxItemDoubleClicked(int iRowNumber, const MouseEvent& Event) { // Если пользователь дважды щёлкнул по элементу списка // выводим текст соответствующей строки String sMessage = tr("Выбран элемент \""); sMessage += sItems[iRowNumber]; sMessage += "\""; AlertWindow::showMessageBox(AlertWindow::InfoIcon, tr("Информация"), sMessage, tr("Да"), 0); } //------------------------------------------------------ void TListBoxModel::backgroundClicked() { } //----------------------------------------------------- void TListBoxModel::AddItem(String sText) { // Добавляем новый элемент в массив строк sItems.add(sText); } //------------------------------------------------------- void TListBoxModel::DeleteItem(int iItem) { // Удаляем элемент из массива строк sItems.remove(iItem); } //-------------------------------------------------------Листинг 9.4. Реализация класса TListBoxModel (файл TListBoxModel.cpp)