Компоненты ввода и отображения текстовой, цифровой и иерархической информации. Компоненты отображения иерархических данных
Цель лекции: Научиться создавать и использовать редактируемые древовидные списки
К компонентам отображения иерархических данных относится древовидный список (TreeView). Кроме того, в библиотеке Juce имеется специальный компонент для отображения файлов в заданной директории в виде древовидного списка — FileTreeComponent (его класс унаследован от TreeView).
Эти компоненты служат для отображения каких-либо иерархических данных (например, структура предприятия, файлов и директорий в корневом каталоге, оглавления документов и т.п.) в виде дерева, в котором пользователь может выбрать нужный ему узел или узлы. С каждым узлом могут быть связаны какие-либо данные. Узел представляет собой элемент древовидного списка с включёнными в него дочерними элементами (субэлементами), которые могут быть видны, если узел открыт, либо скрыты. При удалении узла удаляется как родительский, так и все дочерние элементы. Тем самым, компонент с TreeView служит для управления множеством элементов.
Для создания элемента древовидного списка служит класс TreeViewItem. Это абстрактный класс, содержащий ряд виртуальных функций. Рассмотрим пример класса, наследующего TreeViewItem, — TTreeViewItem (листинги пример 10.1 и пример 10.2).
#ifndef _TTreeViewItem_h_ #define _TTreeViewItem_h_ //------------------------------------------------------- #include "../JuceLibraryCode/JuceHeader.h" //------------------------------------------------------- // Класс элемента древовидного списка class TTreeViewItem : public TreeViewItem { public: TTreeViewItem(String sItemText = String::empty); ~TTreeViewItem(); // Может содержать дочерние элементы bool mightContainSubItems(); // Функция возвращает имя элемента - отображаемый текст const String getUniqueName() const; // Ширина элемента int getItemWidth() const; // Высота элемента int getItemHeight() const; // Моэжет ли элемент быть выбран пользователем bool canBeSelected() const; // Функция, рисующая элемент void paintItem(Graphics&, int, int); // Присваивает новое имя элементу void SetNewName(String); private: // Переменная для хранения имени элемента String sItemName; }; //------------------------------------------------ #endifЛистинг 10.1. Объявление класса TTreeViewItem (файл TTreeViewItem.h)
В качестве членов нашего класса мы объявили ряд виртуальных функций, унаследованных от TreeViewItem:
- virtual bool TreeViewItem::mightContainSubItems() — чистая виртуальная функция, показывающая возможность включения в узел дочерних элементов;
- virtual const String TreeViewItem::getUniqueName() const — функция, возвращающая строку — уникальное имя элемента, отображаемое в древовидном списке;
- virtual int TreeViewItem::getItemWidth() const — возвращает ширину элемента;
- virtual int TreeViewItem::getItemHeight() const — возвращает высоту элемента;
- virtual bool TreeViewItem::canBeSelected() const — функция должна возвращать true, если элемент может быть выбран пользователем;
- virtual void TreeViewItem::paintItem(Graphics& g, int width, int height) — рисует элемент. Параметрами функции являются, соответственно, контекст, ширина и высота области рисования.
Поскольку мы хотим иметь возможность менять имя элемента, а следовательно, отображаемый текст в иерархическом списке, то объявим соответствующую функцию void TTreeViewItem::SetNewName(String). Кроме того, объявим закрытую переменную String sItemName для хранения текущего имени элемента ( пример 10.1).
Рассмотрим реализацию нашего класса ( пример 10.2).
#include "TTreeViewItem.h" //---------------------------------------------------------- TTreeViewItem::TTreeViewItem(String sItemText) : TreeViewItem() { // Сохраняем имя элемента sItemName = sItemText; // Отображаем узел (элемент) открытым setOpen(true); } //----------------------------------------------------------- TTreeViewItem::~TTreeViewItem() { } //--------------------------------------------------------- bool TTreeViewItem::mightContainSubItems() { // Может содержать дочерние элементы return true; } //---------------------------------------------------------- const String TTreeViewItem::getUniqueName() const { return sItemName; } //--------------------------------------------------------- int TTreeViewItem::getItemWidth() const { return 150; } //--------------------------------------------------------- int TTreeViewItem::getItemHeight() const { return 25; } //-------------------------------------------------------- bool TTreeViewItem::canBeSelected() const { // Может быть выбран пользователем return true; } //------------------------------------------------------- void TTreeViewItem::paintItem(Graphics& Painter, int iWidth, int iHeight) { // Если элемент выбран... if(isSelected()) { // закрашиваем его фон синим цветом Painter.fillAll(Colours::blue.withAlpha(0.3f)); } Painter.setColour(Colours::black); Painter.setFont(iHeight * 0.7f); // Рисуем текст (имя) элемента Painter.drawText(sItemName, 4, 0, iWidth - 4, iHeight, Justification::centredLeft, true); } //-------------------------------------------------------- void TTreeViewItem::SetNewName(String sNewName) { // Сохраняем новое имя элемента sItemName = sNewName; } //--------------------------------------------------------Листинг 10.2. Реализация класса TTreeViewItem (файл TTreeViewItem.cpp)