DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
FileInfo.cpp
Go to the documentation of this file.
2#include "dbe/config_api.hpp"
4#include "dbe/FileInfo.hpp"
5#include "dbe/MainWindow.hpp"
8
9#include "ui_FileInfo.h"
10
11#include <QFileDialog>
12#include <QInputDialog>
13#include <QListWidgetItem>
14#include <QString>
15#include <QWidget>
16
18
19namespace dbe {
20
21QString FileInfo::s_schema_path{"."};
22QString FileInfo::s_data_path{"."};
23QStringList FileInfo::s_path_list{};
24QList<QUrl> FileInfo::s_path_urls{};
25std::map<QString, std::map<QString, const tref>> FileInfo::s_obj_map{};
26
28 QString DUNEDAQ_DB_PATH = getenv ( "DUNEDAQ_DB_PATH" );
29 s_path_list.clear();
30 s_path_urls.clear();
31 auto path_list = DUNEDAQ_DB_PATH.split (QLatin1Char(':'), Qt::SkipEmptyParts );
32 for ( QString & path : path_list ) {
33 char* rpath = realpath(path.toStdString().c_str(), NULL);
34 path = QString(rpath);
35 free(rpath);
36
37 if (! path.isEmpty()) {
38 if ( !path.endsWith ( "/" ) ) {
39 path.append ( "/" );
40 }
41 s_path_urls.append(QUrl::fromLocalFile(path));
42 s_path_list.append(path);
43 }
44 }
45}
46
47QString FileInfo::prune_path(QString file) {
48 if (s_path_list.isEmpty()) {
50 }
51 for (const QString& element : s_path_list) {
52 if (file.startsWith(element)) {
53 file.remove(element);
54 break;
55 }
56 }
57 return file;
58}
59
60bool FileInfo::match_path(QString& file, QStringList& includes) {
61 if (s_path_list.isEmpty()) {
63 }
64
65 QStringList candidates{file};
66 // element is a copy here, not a reference
67 for (const QString element : s_path_list) {
68 if (file.startsWith(element)) {
69 candidates.append(file.remove(element));
70 }
71 }
72
73 for (auto cand : candidates) {
74 if (includes.contains(cand)) {
75 return true;
76 }
77 }
78 return false;
79}
80
82 if (s_path_urls.isEmpty()) {
84 }
85 return s_path_urls;
86}
88 if (s_path_list.isEmpty()) {
90 }
91 return s_path_list;
92}
93
95 s_obj_map.clear();
96 for (auto const& class_name :
97 config::api::info::onclass::allnames <std::vector<std::string>>()) {
98 for (auto obj : config::api::info::onclass::objects(class_name, false)) {
99 auto file = prune_path(QString::fromStdString(obj.contained_in()));
100 auto name = QString::fromStdString(obj.full_name());
101 if (!s_obj_map.contains(file)) {
102 s_obj_map.insert({file,{}});
103 }
104 s_obj_map.at(file).insert({name, obj});
105 }
106 }
107}
108
110 QString message{};
111
113 filename));
114 if (s_obj_map.contains(prune_path(filename))) {
115 for (auto [id, obj] : s_obj_map.at(prune_path(filename))) {
116 dunedaq::conffwk::class_t const & classdef =
117 dbe::config::api::info::onclass::definition (obj.class_name(), false);
118
119 auto schema_file = QString::fromStdString(classdef.p_schema_path);
120 if (!match_path(schema_file, includes)) {
121 message += QString("Object <i>" + id + "</i> is of class <i>"
122 + QString::fromStdString(obj.class_name())
123 + "</i> defined in file <b>" + schema_file
124 + "</b> which is not included<br>");
125 }
126 std::vector<tref> relobjs;
127 for (auto rel: classdef.p_relationships) {
129 try {
130 relobjs.push_back(dbegraph::linked::through::relation<tref> (obj, rel));
131 }
132 catch ( daq::dbe::config_object_retrieval_result_is_null const & e ) {
133 // nothing needs be done to handle cases that a relation has not been set
134 }
135 }
136 else {
137 relobjs = dbegraph::linked::through::relation<std::vector<tref>> (obj, rel);
138 }
139
140 includes.append(prune_path(filename));
141 for (auto relobj : relobjs) {
142 auto file = QString::fromStdString(relobj.contained_in());
143 if (!(match_path(file, includes))) {
144 message += QString("Object <i>" + id + "</i> has relationship to <i>"
145 + QString::fromStdString(relobj.full_name())
146 + "</i> in file <b>" + file
147 + "</b> which is not included<br>");
148 }
149 }
150 }
151 }
152 }
153 return message;
154}
155
156
157FileInfo::FileInfo(QString filename, QWidget* /*parent*/)
158 : m_ui(new Ui::FileInfo), m_filename(filename), m_uuid(QUuid::createUuid()) {
159
160 QWidget::setAttribute(Qt::WA_DeleteOnClose);
161
162 m_ui->setupUi(this);
163 m_ui->filename->setText(filename);
165 m_ui->rstatus->setText(QString("RW"));
166 m_readonly = false;
167 }
168 else {
169 m_ui->rstatus->setText(QString("RO"));
170 m_readonly = true;
171 }
172
173 setObjectName(filename);
174 setWindowTitle("File: " + filename.section('/',-1));
175
176 setup_paths();
179
180 m_ui->schema_list->setContextMenuPolicy ( Qt::ContextMenuPolicy::CustomContextMenu );
181 m_ui->data_list->setContextMenuPolicy ( Qt::ContextMenuPolicy::CustomContextMenu );
182 m_ui->object_list->setContextMenuPolicy ( Qt::ContextMenuPolicy::CustomContextMenu );
183
184 connect (m_ui->add_schema, SIGNAL(pressed()), this, SLOT (add_schemafile()));
185 connect (m_ui->add_data, SIGNAL(pressed()), this, SLOT (add_datafile()));
186
187 connect (m_ui->schema_list, SIGNAL (customContextMenuRequested(QPoint)),
188 this, SLOT (activate_schema_context_menu(QPoint)));
189
190 connect (m_ui->data_list, SIGNAL (customContextMenuRequested(QPoint)),
191 this, SLOT (activate_data_context_menu(QPoint)));
192 connect (m_ui->data_list, SIGNAL (itemActivated(QListWidgetItem*)),
193 this, SLOT (file_info_slot(QListWidgetItem*)) );
194
195 connect (m_ui->object_list, SIGNAL (itemActivated(QListWidgetItem*)),
196 this, SLOT (edit_object_slot(QListWidgetItem*)) );
197 connect (m_ui->object_list, SIGNAL (customContextMenuRequested(QPoint)),
198 this, SLOT (activate_object_context_menu(QPoint)));
199
200 connect (MainWindow::findthis(), SIGNAL(signal_new_file_model()),
201 this, SLOT (filemodel_updated()));
202}
203
208
209
210
213 m_ui->object_list->clear();
214 if (s_obj_map.contains(prune_path(m_filename))) {
215 auto& omap = s_obj_map.at(prune_path(m_filename));
216 for (auto const& [obj_name, obj_ref] : omap) {
217 auto item = new QListWidgetItem(obj_name);
218 m_ui->object_list->addItem(item);
219 }
220 }
221 m_ui->object_list->update();
222
223 m_ui->warningBox->setVisible(!check_includes());
224}
225
226
228 QString message = check_file_includes(m_filename);
229 m_ui->message->setText(message);
230 return message.isEmpty();
231}
232
235 m_filename));
236 m_ui->schema_list->clear();
237 m_ui->data_list->clear();
238 for (auto inc: includes) {
239 auto item = new QListWidgetItem(inc);
240 if (!confaccessor::check_file_rw(inc)) {
241 item->setForeground(QBrush(StyleUtility::FileReadOnlyForeground));
242 item->setBackground(QBrush(StyleUtility::FileReadOnlyBackground));
243 }
244 if (inc.endsWith(".schema.xml")) {
245 m_ui->schema_list->addItem(item);
246 }
247 if (inc.endsWith(".data.xml")) {
248 m_ui->data_list->addItem(item);
249
250 }
251 }
252 m_ui->schema_list->update();
253 m_ui->data_list->update();
254}
255
256void FileInfo::keyPressEvent(QKeyEvent* event) {
257 if (event->key() == Qt::Key_Escape) {
258 close();
259 }
260 QWidget::keyPressEvent(event);
261}
262
264 close();
265}
267 close();
268}
269
271 auto item = m_ui->object_list->currentItem();
272 edit_object_slot(item);
273}
274
275void FileInfo::edit_object_slot(QListWidgetItem* item) {
276 auto name = item->text();
277 if (s_obj_map.at(prune_path(m_filename)).contains(name)) {
278 for ( QWidget * widget : QApplication::allWidgets() ) {
279 auto oe = dynamic_cast<ObjectEditor*> ( widget );
280 if ( oe != nullptr ) {
281 if (oe->objectName() == name) {
282 oe->raise();
283 oe->setVisible ( true );
284 oe->activateWindow();
285 return;
286 }
287 }
288 }
289
290 auto obj = s_obj_map.at(prune_path(m_filename)).at(name);
291 auto oe = new ObjectEditor(obj);
292 oe->show();
293 }
294}
295
297 auto name = m_ui->object_list->currentItem()->text();
298 auto file = prune_path(m_filename);
299 if (s_obj_map.at(file).contains(name)) {
301 }
303}
304
306 auto name = m_ui->object_list->currentItem()->text();
307 auto file = prune_path(m_filename);
308 if (s_obj_map.at(file).contains(name)) {
309 QInputDialog dia(this);
310 dia.setLabelText("Enter new name for " + name);
311 auto code = dia.exec();
312 if (code == QDialog::Accepted) {
313 std::string new_name = dia.textValue().toStdString();
314 config::api::commands::renobj(s_obj_map.at(file).at(name), new_name, m_uuid);
315 }
316 }
318}
319
321 if (s_data_path == ".") {
323 }
324 auto fd = new QFileDialog ( this, tr ( "Open Data File" ), s_data_path,
325 tr ( "XML data files (*.data.xml)" ) );
326 add_includefile(fd);
327 if (fd->result() == QDialog::Accepted) {
328 s_data_path = fd->directory().path();
329 }
330}
332 if (s_schema_path == ".") {
334 }
335 auto fd = new QFileDialog ( this, tr ( "Open Schema File" ), s_schema_path,
336 tr ( "XML schema files (*.schema.xml)" ) );
337 add_includefile(fd);
338 if (fd->result() == QDialog::Accepted) {
339 s_schema_path = fd->directory().path();
340 }
341}
342void FileInfo::add_includefile(QFileDialog* fd) {
343 fd->setFileMode ( QFileDialog::ExistingFiles );
344 fd->setViewMode ( QFileDialog::Detail );
345 fd->setAcceptMode ( QFileDialog::AcceptOpen );
346 fd->setSidebarUrls(s_path_urls);
347 if (fd->exec() == QDialog::Accepted) {
348 auto files = fd->selectedFiles();
349 for (auto file: files) {
350 file = prune_path(file);
352 }
355 }
356}
357
359 remove_includefile(m_ui->schema_list->currentItem()->text());
360}
362 remove_includefile(m_ui->data_list->currentItem()->text());
363}
369
370
372 show_file_info(m_ui->data_list->currentItem()->text());
373}
374
375void FileInfo::file_info_slot(QListWidgetItem* item) {
376 show_file_info(item->text());
377}
378
382
383void FileInfo::show_file_info(const QString& filename) {
384 for ( QWidget * widget : QApplication::allWidgets() ) {
385 auto fi = dynamic_cast<FileInfo *> ( widget );
386 if ( fi != nullptr ) {
387 if (fi->objectName() == filename) {
388 fi->raise();
389 fi->setVisible ( true );
390 fi->activateWindow();
391 return;
392 }
393 }
394 }
395
396 auto fi = new FileInfo(filename);
397 fi->show();
398}
399
401 if (m_schema_menu == nullptr) {
402 m_schema_menu = new QMenu(this);
403
404 if (!m_readonly) {
405 auto add = new QAction("Add include file", this);
406 connect (add, SIGNAL(triggered()), this, SLOT (add_schemafile()));
407 m_schema_menu->addAction(add);
408
409 auto remove = new QAction("Remove include file", this);
410 connect (remove, SIGNAL(triggered()), this, SLOT (remove_schemafile_slot()));
411 m_schema_menu->addAction(remove);
412 }
413 }
414
415 if (m_ui->schema_list->currentIndex().isValid()) {
416 m_schema_menu->actions().at(1)->setVisible (true);
417 }
418 m_schema_menu->exec (m_ui->schema_list->mapToGlobal(pos));
419}
420
422 if (m_data_menu == nullptr) {
423 m_data_menu = new QMenu(this);
424
425 auto info = new QAction(tr("Show file info"), this);
426 connect (info, SIGNAL(triggered()), this, SLOT (file_info_slot()));
427 m_data_menu->addAction(info);
428
429 if (!m_readonly) {
430 auto add = new QAction("Add include file", this);
431 connect (add, SIGNAL(triggered()), this, SLOT (add_datafile()));
432 m_data_menu->addAction(add);
433
434 auto remove = new QAction("Remove include file", this);
435 connect (remove, SIGNAL(triggered()), this, SLOT (remove_datafile_slot()));
436 m_data_menu->addAction(remove);
437 }
438 }
439
440 if (m_ui->data_list->currentIndex().isValid()) {
441 m_data_menu->actions().at(0)->setVisible (true);
442 m_data_menu->actions().at(2)->setVisible (true);
443 }
444 else {
445 m_data_menu->actions().at(0)->setVisible (false);
446 m_data_menu->actions().at(2)->setVisible (false);
447 }
448 m_data_menu->exec (m_ui->data_list->mapToGlobal(pos));
449}
450
452 if (m_object_menu == nullptr) {
453 m_object_menu = new QMenu(this);
454
455 auto edit_action = new QAction(tr("&Edit object"), this);
456 connect (edit_action, SIGNAL(triggered()), this, SLOT(edit_object_slot()));
457 m_object_menu->addAction(edit_action);
458
459 auto delete_action = new QAction(tr("&Delete Object"), this );
460 connect (delete_action, SIGNAL(triggered()), this, SLOT(delete_object_slot()));
461 m_object_menu->addAction(delete_action);
462
463 auto rename_action = new QAction(tr("&Rename Object"), this );
464 connect (rename_action, SIGNAL(triggered()), this, SLOT(rename_object_slot()));
465 m_object_menu->addAction(rename_action);
466 }
467
468 if (m_ui->object_list->currentIndex().isValid()) {
469 m_object_menu->exec(m_ui->object_list->mapToGlobal(pos));
470 }
471}
472
473} //namespace dbe
QString m_filename
Definition FileInfo.hpp:69
static QList< QUrl > get_path_urls()
Definition FileInfo.cpp:81
static QString prune_path(QString file)
Definition FileInfo.cpp:47
void keyPressEvent(QKeyEvent *event) override
Definition FileInfo.cpp:256
static void parse_all_objects()
Definition FileInfo.cpp:94
QMenu * m_data_menu
Definition FileInfo.hpp:72
static QStringList get_path_list()
Definition FileInfo.cpp:87
void activate_data_context_menu(QPoint point)
Definition FileInfo.cpp:421
void parse_includes()
Definition FileInfo.cpp:233
void rename_object_slot()
Definition FileInfo.cpp:305
void filemodel_updated()
Definition FileInfo.cpp:204
void add_datafile()
Definition FileInfo.cpp:320
QMenu * m_schema_menu
Definition FileInfo.hpp:71
void file_info_slot()
Definition FileInfo.cpp:371
Ui::FileInfo * m_ui
Definition FileInfo.hpp:67
bool check_includes()
Definition FileInfo.cpp:227
void remove_datafile_slot()
Definition FileInfo.cpp:361
QMenu * m_object_menu
Definition FileInfo.hpp:73
void activate_schema_context_menu(QPoint point)
Definition FileInfo.cpp:400
static bool match_path(QString &file, QStringList &includes)
Definition FileInfo.cpp:60
void edit_object_slot()
Definition FileInfo.cpp:270
void add_includefile(QFileDialog *fd)
Definition FileInfo.cpp:342
void add_schemafile()
Definition FileInfo.cpp:331
void delete_object_slot()
Definition FileInfo.cpp:296
static QStringList s_path_list
Definition FileInfo.hpp:78
void activate_object_context_menu(QPoint point)
Definition FileInfo.cpp:451
static QString check_file_includes(const QString &file)
Definition FileInfo.cpp:109
static void setup_paths()
Definition FileInfo.cpp:27
static QString s_data_path
Definition FileInfo.hpp:81
void remove_schemafile_slot()
Definition FileInfo.cpp:358
FileInfo(QString filename, QWidget *parent=0)
Definition FileInfo.cpp:157
static QList< QUrl > s_path_urls
Definition FileInfo.hpp:79
static QString s_schema_path
Definition FileInfo.hpp:80
static std::map< QString, std::map< QString, const tref > > s_obj_map
Definition FileInfo.hpp:76
static void show_file_info(const QString &filename)
Definition FileInfo.cpp:383
void remove_includefile(const QString &file)
Definition FileInfo.cpp:364
QUuid const m_uuid
Definition FileInfo.hpp:74
void parse_objects()
Definition FileInfo.cpp:211
static MainWindow * findthis()
static QColor FileReadOnlyForeground
static QColor FileReadOnlyBackground
static bool check_file_rw(const QString &FileName)
static QStringList inclusions_singlefile(QString const &)
static std::vector< dbe::inner::configobject::tref > objects(std::string const &cname, bool const keep_inherited=true)
static dunedaq::conffwk::class_t definition(std::string const &cn, bool direct_only)
void remove(QString const &db, QString const &fn)
void add(QString const &db, QString const &fn)
bool renobj(inner::configobject::tref obj, std::string const &newuuid, QUuid const &src)
bool delobj(inner::configobject::tref obj, QUuid const &src)
bool is_simple(dunedaq::conffwk::relationship_t const &)
Include QT Headers.
const std::vector< relationship_t > p_relationships
Definition Schema.hpp:164
std::string p_schema_path
Definition Schema.hpp:159