Компоненты ввода и отображения текстовой, цифровой и иерархической информации. Компоненты отображения иерархических данных
Цель лекции: Научиться создавать и использовать редактируемые древовидные списки
К компонентам отображения иерархических данных относится древовидный список (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)