##// END OF EJS Templates
Display of the save & cancel button next to a catalogue
trabillard -
r1142:425eece3bcf7
parent child
Show More
1 NO CONTENT: new file 100644, binary diff hidden
1 NO CONTENT: new file 100644, binary diff hidden
@@ -1,24 +1,27
1 1 #ifndef SCIQLOP_CATALOGUETREEWIDGETITEM_H
2 2 #define SCIQLOP_CATALOGUETREEWIDGETITEM_H
3 3
4 4 #include <Common/spimpl.h>
5 5 #include <QTreeWidgetItem>
6 6
7 7 #include <DBCatalogue.h>
8 8
9 9
10 10 class CatalogueTreeWidgetItem : public QTreeWidgetItem {
11 11 public:
12 12 CatalogueTreeWidgetItem(DBCatalogue catalogue, int type = QTreeWidgetItem::Type);
13 13
14 14 QVariant data(int column, int role) const override;
15 15 void setData(int column, int role, const QVariant &value) override;
16 16
17 /// Returns the catalogue represented by the item
17 18 DBCatalogue catalogue() const;
18 19
20 void setHasChanges(bool value);
21
19 22 private:
20 23 class CatalogueTreeWidgetItemPrivate;
21 24 spimpl::unique_impl_ptr<CatalogueTreeWidgetItemPrivate> impl;
22 25 };
23 26
24 27 #endif // SCIQLOP_CATALOGUETREEWIDGETITEM_H
@@ -1,29 +1,31
1 1 <RCC>
2 2 <qresource prefix="/">
3 3 <file>icones/dataSourceComponent.png</file>
4 4 <file>icones/dataSourceNode.png</file>
5 5 <file>icones/dataSourceProduct.png</file>
6 6 <file>icones/dataSourceRoot.png</file>
7 7 <file>icones/delete.png</file>
8 8 <file>icones/down.png</file>
9 9 <file>icones/openInspector.png</file>
10 10 <file>icones/next.png</file>
11 11 <file>icones/plot.png</file>
12 12 <file>icones/previous.png</file>
13 13 <file>icones/unplot.png</file>
14 14 <file>icones/up.png</file>
15 15 <file>icones/time.png</file>
16 16 <file>icones/zoom.png</file>
17 17 <file>icones/rectangle.png</file>
18 18 <file>icones/drag.png</file>
19 19 <file>icones/cursor.png</file>
20 20 <file>icones/pointer.png</file>
21 21 <file>icones/catalogue.png</file>
22 22 <file>icones/add.png</file>
23 23 <file>icones/remove.png</file>
24 24 <file>icones/chart.png</file>
25 25 <file>icones/allEvents.png</file>
26 26 <file>icones/trash.png</file>
27 27 <file>icones/database.png</file>
28 <file>icones/save.png</file>
29 <file>icones/discard.png</file>
28 30 </qresource>
29 31 </RCC>
@@ -1,199 +1,203
1 1 #include "Catalogue/CatalogueSideBarWidget.h"
2 2 #include "ui_CatalogueSideBarWidget.h"
3 3 #include <SqpApplication.h>
4 4
5 5 #include <Catalogue/CatalogueController.h>
6 6 #include <Catalogue/CatalogueTreeWidgetItem.h>
7 7 #include <CatalogueDao.h>
8 8 #include <ComparaisonPredicate.h>
9 9 #include <DBCatalogue.h>
10 10
11 11 #include <QMenu>
12 12
13 13
14 14 constexpr auto ALL_EVENT_ITEM_TYPE = QTreeWidgetItem::UserType;
15 15 constexpr auto TRASH_ITEM_TYPE = QTreeWidgetItem::UserType + 1;
16 16 constexpr auto CATALOGUE_ITEM_TYPE = QTreeWidgetItem::UserType + 2;
17 17 constexpr auto DATABASE_ITEM_TYPE = QTreeWidgetItem::UserType + 3;
18 18
19 19
20 20 struct CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate {
21 21
22 22 QHash<QTreeWidgetItem *, DBCatalogue> m_CatalogueMap;
23 23
24 24 void configureTreeWidget(QTreeWidget *treeWidget);
25 25 QTreeWidgetItem *addDatabaseItem(const QString &name, QTreeWidget *treeWidget);
26 26 QTreeWidgetItem *getDatabaseItem(const QString &name, QTreeWidget *treeWidget);
27 27 void addCatalogueItem(const DBCatalogue &catalogue, QTreeWidgetItem *parentDatabaseItem);
28 28 };
29 29
30 30 CatalogueSideBarWidget::CatalogueSideBarWidget(QWidget *parent)
31 31 : QWidget(parent),
32 32 ui(new Ui::CatalogueSideBarWidget),
33 33 impl{spimpl::make_unique_impl<CatalogueSideBarWidgetPrivate>()}
34 34 {
35 35 ui->setupUi(this);
36 36 impl->configureTreeWidget(ui->treeWidget);
37 37
38 ui->treeWidget->setColumnCount(2);
39 ui->treeWidget->header()->setStretchLastSection(false);
40 ui->treeWidget->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
41 ui->treeWidget->header()->setSectionResizeMode(0, QHeaderView::Stretch);
42
38 43 auto emitSelection = [this]() {
39 44
40 45 auto selectedItems = ui->treeWidget->selectedItems();
41 46 if (selectedItems.isEmpty()) {
42 47 emit this->selectionCleared();
43 48 }
44 49 else {
45 50 QVector<DBCatalogue> catalogues;
46 51 QStringList databases;
47 52 int selectionType = selectedItems.first()->type();
48 53
49 54 for (auto item : ui->treeWidget->selectedItems()) {
50 55 if (item->type() == selectionType) {
51 56 switch (selectionType) {
52 57 case CATALOGUE_ITEM_TYPE:
53 58 catalogues.append(
54 59 static_cast<CatalogueTreeWidgetItem *>(item)->catalogue());
55 60 break;
56 61 case DATABASE_ITEM_TYPE:
57 62 selectionType = DATABASE_ITEM_TYPE;
58 63 databases.append(item->text(0));
59 64 case ALL_EVENT_ITEM_TYPE: // fallthrough
60 65 case TRASH_ITEM_TYPE: // fallthrough
61 66 default:
62 67 break;
63 68 }
64 69 }
65 70 else {
66 71 // Incoherent multi selection
67 72 selectionType = -1;
68 73 break;
69 74 }
70 75 }
71 76
72 77 switch (selectionType) {
73 78 case CATALOGUE_ITEM_TYPE:
74 79 emit this->catalogueSelected(catalogues);
75 80 break;
76 81 case DATABASE_ITEM_TYPE:
77 82 emit this->databaseSelected(databases);
78 83 break;
79 84 case ALL_EVENT_ITEM_TYPE:
80 85 emit this->allEventsSelected();
81 86 break;
82 87 case TRASH_ITEM_TYPE:
83 88 emit this->trashSelected();
84 89 break;
85 90 default:
86 91 emit this->selectionCleared();
87 92 break;
88 93 }
89 94 }
90 95
91 96
92 97 };
93 98
94 99 connect(ui->treeWidget, &QTreeWidget::itemClicked, emitSelection);
95 100 connect(ui->treeWidget, &QTreeWidget::currentItemChanged, emitSelection);
96 101
97 102 ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
98 103 connect(ui->treeWidget, &QTreeWidget::customContextMenuRequested, this,
99 104 &CatalogueSideBarWidget::onContextMenuRequested);
100 105 }
101 106
102 107 CatalogueSideBarWidget::~CatalogueSideBarWidget()
103 108 {
104 109 delete ui;
105 110 }
106 111
107 112 void CatalogueSideBarWidget::onContextMenuRequested(const QPoint &pos)
108 113 {
109 114 QMenu menu{this};
110 115
111 116 auto currentItem = ui->treeWidget->currentItem();
112 117 switch (currentItem->type()) {
113 118 case CATALOGUE_ITEM_TYPE:
114 119 menu.addAction("Rename",
115 120 [this, currentItem]() { ui->treeWidget->editItem(currentItem); });
116 121 break;
117 122 case DATABASE_ITEM_TYPE:
118 123 break;
119 124 case ALL_EVENT_ITEM_TYPE:
120 125 break;
121 126 case TRASH_ITEM_TYPE:
122 127 menu.addAction("Empty Trash", []() {
123 128 // TODO
124 129 });
125 130 break;
126 131 default:
127 132 break;
128 133 }
129 134
130 135 if (!menu.isEmpty()) {
131 136 menu.exec(ui->treeWidget->mapToGlobal(pos));
132 137 }
133 138 }
134 139
135 140 void CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate::configureTreeWidget(
136 141 QTreeWidget *treeWidget)
137 142 {
138 143 auto allEventsItem = new QTreeWidgetItem{{"All Events"}, ALL_EVENT_ITEM_TYPE};
139 144 allEventsItem->setIcon(0, QIcon(":/icones/allEvents.png"));
140 145 treeWidget->addTopLevelItem(allEventsItem);
141 146
142 147 auto trashItem = new QTreeWidgetItem{{"Trash"}, TRASH_ITEM_TYPE};
143 148 trashItem->setIcon(0, QIcon(":/icones/trash.png"));
144 149 treeWidget->addTopLevelItem(trashItem);
145 150
146 151 auto separator = new QFrame{treeWidget};
147 152 separator->setFrameShape(QFrame::HLine);
148
149 153 auto separatorItem = new QTreeWidgetItem{};
150 154 separatorItem->setFlags(Qt::NoItemFlags);
151 155 treeWidget->addTopLevelItem(separatorItem);
152 156 treeWidget->setItemWidget(separatorItem, 0, separator);
153 157
154 158 auto &dao = sqpApp->catalogueController().getDao();
155 159 auto allPredicate = std::make_shared<ComparaisonPredicate>(QString{"uniqId"}, "-1",
156 160 ComparaisonOperation::DIFFERENT);
157 161
158 162 auto db = addDatabaseItem("Default", treeWidget);
159 163
160 164 auto catalogues = dao.getCatalogues(allPredicate);
161 165 for (auto catalogue : catalogues) {
162 166 addCatalogueItem(catalogue, db);
163 167 }
164 168
165 169 treeWidget->expandAll();
166 170 }
167 171
168 172 QTreeWidgetItem *
169 173 CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate::addDatabaseItem(const QString &name,
170 174 QTreeWidget *treeWidget)
171 175 {
172 176 auto databaseItem = new QTreeWidgetItem{{name}, DATABASE_ITEM_TYPE};
173 177 databaseItem->setIcon(0, QIcon{":/icones/database.png"});
174 178 treeWidget->addTopLevelItem(databaseItem);
175 179
176 180 return databaseItem;
177 181 }
178 182
179 183 QTreeWidgetItem *
180 184 CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate::getDatabaseItem(const QString &name,
181 185 QTreeWidget *treeWidget)
182 186 {
183 187 for (auto i = 0; i < treeWidget->topLevelItemCount(); ++i) {
184 188 auto item = treeWidget->topLevelItem(i);
185 189 if (item->type() == DATABASE_ITEM_TYPE && item->text(0) == name) {
186 190 return item;
187 191 }
188 192 }
189 193
190 194 return nullptr;
191 195 }
192 196
193 197 void CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate::addCatalogueItem(
194 198 const DBCatalogue &catalogue, QTreeWidgetItem *parentDatabaseItem)
195 199 {
196 200 auto catalogueItem = new CatalogueTreeWidgetItem{catalogue, CATALOGUE_ITEM_TYPE};
197 201 catalogueItem->setIcon(0, QIcon{":/icones/catalogue.png"});
198 202 parentDatabaseItem->addChild(catalogueItem);
199 203 }
@@ -1,46 +1,90
1 1 #include "Catalogue/CatalogueTreeWidgetItem.h"
2 2
3 #include <memory>
4
5 #include <QBoxLayout>
6 #include <QToolButton>
7
8 const auto VALIDATION_BUTTON_ICON_SIZE = 12;
9
3 10 struct CatalogueTreeWidgetItem::CatalogueTreeWidgetItemPrivate {
4 11
5 12 DBCatalogue m_Catalogue;
6 13
7 14 CatalogueTreeWidgetItemPrivate(DBCatalogue catalogue) : m_Catalogue(catalogue) {}
8 15 };
9 16
10 17
11 18 CatalogueTreeWidgetItem::CatalogueTreeWidgetItem(DBCatalogue catalogue, int type)
12 19 : QTreeWidgetItem(type),
13 20 impl{spimpl::make_unique_impl<CatalogueTreeWidgetItemPrivate>(catalogue)}
14 21 {
15 22 setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable);
16 23 }
17 24
18 25 QVariant CatalogueTreeWidgetItem::data(int column, int role) const
19 26 {
27 if (column == 0) {
20 28 switch (role) {
21 29 case Qt::EditRole: // fallthrough
22 30 case Qt::DisplayRole:
23 31 return impl->m_Catalogue.getName();
24 32 default:
25 33 break;
26 34 }
35 }
27 36
28 37 return QTreeWidgetItem::data(column, role);
29 38 }
30 39
31 40 void CatalogueTreeWidgetItem::setData(int column, int role, const QVariant &value)
32 41 {
33 42 if (role == Qt::EditRole && column == 0) {
34 43 auto newName = value.toString();
44 if (newName != impl->m_Catalogue.getName()) {
35 45 setText(0, newName);
36 46 impl->m_Catalogue.setName(newName);
47 setHasChanges(true);
48 }
37 49 }
38 50 else {
39 51 QTreeWidgetItem::setData(column, role, value);
40 52 }
41 53 }
42 54
43 55 DBCatalogue CatalogueTreeWidgetItem::catalogue() const
44 56 {
45 57 return impl->m_Catalogue;
46 58 }
59
60 void CatalogueTreeWidgetItem::setHasChanges(bool value)
61 {
62 if (value) {
63 auto widet = new QWidget{treeWidget()};
64
65 auto layout = new QHBoxLayout{widet};
66 layout->setContentsMargins(0, 0, 0, 0);
67 layout->setSpacing(0);
68
69 auto btnValid = new QToolButton{widet};
70 btnValid->setIcon(QIcon{":/icones/save"});
71 btnValid->setIconSize(QSize{VALIDATION_BUTTON_ICON_SIZE, VALIDATION_BUTTON_ICON_SIZE});
72 btnValid->setAutoRaise(true);
73 QObject::connect(btnValid, &QToolButton::clicked, [this]() { setHasChanges(false); });
74 layout->addWidget(btnValid);
75
76 auto btnDiscard = new QToolButton{widet};
77 btnDiscard->setIcon(QIcon{":/icones/discard"});
78 btnDiscard->setIconSize(QSize{VALIDATION_BUTTON_ICON_SIZE, VALIDATION_BUTTON_ICON_SIZE});
79 btnDiscard->setAutoRaise(true);
80 QObject::connect(btnDiscard, &QToolButton::clicked, [this]() { setHasChanges(false); });
81 layout->addWidget(btnDiscard);
82
83 treeWidget()->setItemWidget(this, 1, {widet});
84 treeWidget()->resizeColumnToContents(1);
85 }
86 else {
87 // Note: the widget is destroyed
88 treeWidget()->setItemWidget(this, 1, nullptr);
89 }
90 }
General Comments 0
You need to be logged in to leave comments. Login now