##// END OF EJS Templates
Updates data sources UI representation (1)...
Alexandre Leroux -
r1035:8c7e6cbfd659
parent child
Show More
@@ -1,120 +1,123
1 #include <DataSource/DataSourceWidget.h>
1 #include <DataSource/DataSourceWidget.h>
2
2
3 #include <ui_DataSourceWidget.h>
3 #include <ui_DataSourceWidget.h>
4
4
5 #include <DataSource/DataSourceItem.h>
5 #include <DataSource/DataSourceItem.h>
6 #include <DataSource/DataSourceTreeWidgetHelper.h>
6 #include <DataSource/DataSourceTreeWidgetHelper.h>
7 #include <DataSource/DataSourceTreeWidgetItem.h>
7 #include <DataSource/DataSourceTreeWidgetItem.h>
8
8
9 #include <QMenu>
9 #include <QMenu>
10
10
11 namespace {
11 namespace {
12
12
13 /// Number of columns displayed in the tree
13 /// Number of columns displayed in the tree
14 const auto TREE_NB_COLUMNS = 1;
14 const auto TREE_NB_COLUMNS = 1;
15
15
16 /// Header labels for the tree
16 /// Header labels for the tree
17 const auto TREE_HEADER_LABELS = QStringList{QObject::tr("Name")};
17 const auto TREE_HEADER_LABELS = QStringList{QObject::tr("Name")};
18
18
19 /**
19 /**
20 * Creates the item associated to a data source
20 * Creates the item associated to a data source
21 * @param dataSource the data source for which to create the item
21 * @param dataSource the data source for which to create the item
22 * @return the new item
22 * @return the new item
23 */
23 */
24 DataSourceTreeWidgetItem *createTreeWidgetItem(DataSourceItem *dataSource)
24 DataSourceTreeWidgetItem *createTreeWidgetItem(DataSourceItem *dataSource)
25 {
25 {
26 // Creates item for the data source
26 // Creates item for the data source
27 auto item = new DataSourceTreeWidgetItem{dataSource};
27 auto item = new DataSourceTreeWidgetItem{dataSource};
28
28
29 // Generates items for the children of the data source
29 // Generates items for the children of the data source
30 for (auto i = 0; i < dataSource->childCount(); ++i) {
30 for (auto i = 0; i < dataSource->childCount(); ++i) {
31 item->addChild(createTreeWidgetItem(dataSource->child(i)));
31 item->addChild(createTreeWidgetItem(dataSource->child(i)));
32 }
32 }
33
33
34 return item;
34 return item;
35 }
35 }
36
36
37 } // namespace
37 } // namespace
38
38
39 DataSourceWidget::DataSourceWidget(QWidget *parent)
39 DataSourceWidget::DataSourceWidget(QWidget *parent)
40 : QWidget{parent},
40 : QWidget{parent},
41 ui{new Ui::DataSourceWidget},
41 ui{new Ui::DataSourceWidget},
42 m_Root{
42 m_Root{
43 std::make_unique<DataSourceItem>(DataSourceItemType::NODE, QStringLiteral("Sources"))}
43 std::make_unique<DataSourceItem>(DataSourceItemType::NODE, QStringLiteral("Sources"))}
44 {
44 {
45 ui->setupUi(this);
45 ui->setupUi(this);
46
46
47 // Set tree properties
47 // Set tree properties
48 ui->treeWidget->setColumnCount(TREE_NB_COLUMNS);
48 ui->treeWidget->setColumnCount(TREE_NB_COLUMNS);
49 ui->treeWidget->setHeaderLabels(TREE_HEADER_LABELS);
49 ui->treeWidget->setHeaderLabels(TREE_HEADER_LABELS);
50 ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
50 ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
51
51
52 // Connection to show a menu when right clicking on the tree
52 // Connection to show a menu when right clicking on the tree
53 connect(ui->treeWidget, &QTreeWidget::customContextMenuRequested, this,
53 connect(ui->treeWidget, &QTreeWidget::customContextMenuRequested, this,
54 &DataSourceWidget::onTreeMenuRequested);
54 &DataSourceWidget::onTreeMenuRequested);
55
55
56 // Connection to filter tree
56 // Connection to filter tree
57 connect(ui->filterLineEdit, &QLineEdit::textChanged, this, &DataSourceWidget::filterChanged);
57 connect(ui->filterLineEdit, &QLineEdit::textChanged, this, &DataSourceWidget::filterChanged);
58
58
59 // First init
59 // First init
60 updateTreeWidget();
60 updateTreeWidget();
61 }
61 }
62
62
63 DataSourceWidget::~DataSourceWidget() noexcept
63 DataSourceWidget::~DataSourceWidget() noexcept
64 {
64 {
65 delete ui;
65 delete ui;
66 }
66 }
67
67
68 void DataSourceWidget::addDataSource(DataSourceItem *dataSource) noexcept
68 void DataSourceWidget::addDataSource(DataSourceItem *dataSource) noexcept
69 {
69 {
70 // Creates the item associated to the source and adds it to the tree widget. The tree widget
70 // Merges the data source (without taking its root)
71 // takes the ownership of the item
72 if (dataSource) {
71 if (dataSource) {
73 ui->treeWidget->addTopLevelItem(createTreeWidgetItem(dataSource));
72 for (auto i = 0, count = dataSource->childCount(); i < count; ++i) {
73 m_Root->merge(*dataSource->child(i));
74 }
75
76 updateTreeWidget();
74 }
77 }
75 }
78 }
76
79
77 void DataSourceWidget::updateTreeWidget() noexcept
80 void DataSourceWidget::updateTreeWidget() noexcept
78 {
81 {
79 ui->treeWidget->clear();
82 ui->treeWidget->clear();
80
83
81 auto rootItem = createTreeWidgetItem(m_Root.get());
84 auto rootItem = createTreeWidgetItem(m_Root.get());
82 ui->treeWidget->addTopLevelItem(rootItem);
85 ui->treeWidget->addTopLevelItem(rootItem);
83 rootItem->setExpanded(true);
86 rootItem->setExpanded(true);
84
87
85 // Sorts tree
88 // Sorts tree
86 ui->treeWidget->setSortingEnabled(true);
89 ui->treeWidget->setSortingEnabled(true);
87 ui->treeWidget->sortByColumn(0, Qt::AscendingOrder);
90 ui->treeWidget->sortByColumn(0, Qt::AscendingOrder);
88 }
91 }
89
92
90 void DataSourceWidget::filterChanged(const QString &text) noexcept
93 void DataSourceWidget::filterChanged(const QString &text) noexcept
91 {
94 {
92 auto validateItem = [&text](const DataSourceTreeWidgetItem &item) {
95 auto validateItem = [&text](const DataSourceTreeWidgetItem &item) {
93 auto regExp = QRegExp{text, Qt::CaseInsensitive, QRegExp::Wildcard};
96 auto regExp = QRegExp{text, Qt::CaseInsensitive, QRegExp::Wildcard};
94
97
95 // An item is valid if any of its metadata validates the text filter
98 // An item is valid if any of its metadata validates the text filter
96 auto itemMetadata = item.data()->data();
99 auto itemMetadata = item.data()->data();
97 auto itemMetadataEnd = itemMetadata.cend();
100 auto itemMetadataEnd = itemMetadata.cend();
98 auto acceptFilter
101 auto acceptFilter
99 = [&regExp](const auto &variant) { return variant.toString().contains(regExp); };
102 = [&regExp](const auto &variant) { return variant.toString().contains(regExp); };
100
103
101 return std::find_if(itemMetadata.cbegin(), itemMetadataEnd, acceptFilter)
104 return std::find_if(itemMetadata.cbegin(), itemMetadataEnd, acceptFilter)
102 != itemMetadataEnd;
105 != itemMetadataEnd;
103 };
106 };
104
107
105 // Applies filter on tree widget
108 // Applies filter on tree widget
106 DataSourceTreeWidgetHelper::filter(*ui->treeWidget, validateItem);
109 DataSourceTreeWidgetHelper::filter(*ui->treeWidget, validateItem);
107 }
110 }
108
111
109 void DataSourceWidget::onTreeMenuRequested(const QPoint &pos) noexcept
112 void DataSourceWidget::onTreeMenuRequested(const QPoint &pos) noexcept
110 {
113 {
111 // Retrieves the selected item in the tree, and build the menu from its actions
114 // Retrieves the selected item in the tree, and build the menu from its actions
112 if (auto selectedItem = dynamic_cast<DataSourceTreeWidgetItem *>(ui->treeWidget->itemAt(pos))) {
115 if (auto selectedItem = dynamic_cast<DataSourceTreeWidgetItem *>(ui->treeWidget->itemAt(pos))) {
113 QMenu treeMenu{};
116 QMenu treeMenu{};
114 treeMenu.addActions(selectedItem->actions());
117 treeMenu.addActions(selectedItem->actions());
115
118
116 if (!treeMenu.isEmpty()) {
119 if (!treeMenu.isEmpty()) {
117 treeMenu.exec(QCursor::pos());
120 treeMenu.exec(QCursor::pos());
118 }
121 }
119 }
122 }
120 }
123 }
General Comments 0
You need to be logged in to leave comments. Login now