DataSourceWidget.cpp
100 lines
| 3.1 KiB
| text/x-c
|
CppLexer
Alexandre Leroux
|
r81 | #include <DataSource/DataSourceWidget.h> | ||
#include <ui_DataSourceWidget.h> | ||||
#include <DataSource/DataSourceItem.h> | ||||
Alexandre Leroux
|
r440 | #include <DataSource/DataSourceTreeWidgetHelper.h> | ||
Alexandre Leroux
|
r81 | #include <DataSource/DataSourceTreeWidgetItem.h> | ||
Alexandre Leroux
|
r134 | #include <QMenu> | ||
Alexandre Leroux
|
r81 | namespace { | ||
/// Number of columns displayed in the tree | ||||
const auto TREE_NB_COLUMNS = 1; | ||||
/// Header labels for the tree | ||||
const auto TREE_HEADER_LABELS = QStringList{QObject::tr("Name")}; | ||||
Alexandre Leroux
|
r82 | /** | ||
* Creates the item associated to a data source | ||||
* @param dataSource the data source for which to create the item | ||||
* @return the new item | ||||
*/ | ||||
DataSourceTreeWidgetItem *createTreeWidgetItem(DataSourceItem *dataSource) | ||||
{ | ||||
// Creates item for the data source | ||||
auto item = new DataSourceTreeWidgetItem{dataSource}; | ||||
// Generates items for the children of the data source | ||||
for (auto i = 0; i < dataSource->childCount(); ++i) { | ||||
item->addChild(createTreeWidgetItem(dataSource->child(i))); | ||||
} | ||||
return item; | ||||
} | ||||
Alexandre Leroux
|
r81 | } // namespace | ||
Alexandre Leroux
|
r104 | DataSourceWidget::DataSourceWidget(QWidget *parent) : QWidget{parent}, ui{new Ui::DataSourceWidget} | ||
Alexandre Leroux
|
r81 | { | ||
Alexandre Leroux
|
r104 | ui->setupUi(this); | ||
// Set tree properties | ||||
ui->treeWidget->setColumnCount(TREE_NB_COLUMNS); | ||||
ui->treeWidget->setHeaderLabels(TREE_HEADER_LABELS); | ||||
Alexandre Leroux
|
r134 | ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu); | ||
// Connection to show a menu when right clicking on the tree | ||||
connect(ui->treeWidget, &QTreeWidget::customContextMenuRequested, this, | ||||
&DataSourceWidget::onTreeMenuRequested); | ||||
Alexandre Leroux
|
r438 | |||
// Connection to filter tree | ||||
connect(ui->filterLineEdit, &QLineEdit::textChanged, this, &DataSourceWidget::filterChanged); | ||||
Alexandre Leroux
|
r81 | } | ||
Alexandre Leroux
|
r82 | |||
r216 | DataSourceWidget::~DataSourceWidget() noexcept | |||
{ | ||||
delete ui; | ||||
} | ||||
Alexandre Leroux
|
r90 | void DataSourceWidget::addDataSource(DataSourceItem *dataSource) noexcept | ||
Alexandre Leroux
|
r82 | { | ||
// Creates the item associated to the source and adds it to the tree widget. The tree widget | ||||
// takes the ownership of the item | ||||
Alexandre Leroux
|
r90 | if (dataSource) { | ||
Alexandre Leroux
|
r104 | ui->treeWidget->addTopLevelItem(createTreeWidgetItem(dataSource)); | ||
Alexandre Leroux
|
r90 | } | ||
Alexandre Leroux
|
r82 | } | ||
Alexandre Leroux
|
r134 | |||
Alexandre Leroux
|
r438 | void DataSourceWidget::filterChanged(const QString &text) noexcept | ||
{ | ||||
Alexandre Leroux
|
r440 | auto validateItem = [&text](const DataSourceTreeWidgetItem &item) { | ||
auto regExp = QRegExp{text, Qt::CaseInsensitive, QRegExp::Wildcard}; | ||||
// An item is valid if any of its metadata validates the text filter | ||||
auto itemMetadata = item.data()->data(); | ||||
auto itemMetadataEnd = itemMetadata.cend(); | ||||
auto acceptFilter | ||||
= [®Exp](const auto &variant) { return variant.toString().contains(regExp); }; | ||||
return std::find_if(itemMetadata.cbegin(), itemMetadataEnd, acceptFilter) | ||||
!= itemMetadataEnd; | ||||
}; | ||||
// Applies filter on tree widget | ||||
DataSourceTreeWidgetHelper::filter(*ui->treeWidget, validateItem); | ||||
Alexandre Leroux
|
r438 | } | ||
Alexandre Leroux
|
r134 | void DataSourceWidget::onTreeMenuRequested(const QPoint &pos) noexcept | ||
{ | ||||
// Retrieves the selected item in the tree, and build the menu from its actions | ||||
if (auto selectedItem = dynamic_cast<DataSourceTreeWidgetItem *>(ui->treeWidget->itemAt(pos))) { | ||||
QMenu treeMenu{}; | ||||
treeMenu.addActions(selectedItem->actions()); | ||||
if (!treeMenu.isEmpty()) { | ||||
treeMenu.exec(mapToGlobal(pos)); | ||||
} | ||||
} | ||||
} | ||||