9#include "ui_FileInfo.h"
12#include <QInputDialog>
13#include <QListWidgetItem>
15#include <QScopedValueRollback>
34 QString DUNEDAQ_DB_PATH = getenv(
"DUNEDAQ_DB_PATH");
37 auto path_list = DUNEDAQ_DB_PATH.split(QLatin1Char(
':'), Qt::SkipEmptyParts);
38 for (QString& path : path_list) {
39 char* rpath = realpath(path.toStdString().c_str(), NULL);
40 path = QString(rpath);
43 if (!path.isEmpty()) {
44 if (!path.endsWith(
"/")) {
52 dbpath.truncate(dbpath.lastIndexOf(
"/") + 1);
57 char* rpath_cd = realpath(
".", NULL);
58 auto path_cd = QString(rpath_cd);
72 if (file.startsWith(element)) {
83 if (top_file.endsWith(file)) {
91 QStringList candidates{ file };
93 if (file.startsWith(element)) {
94 auto short_name = file;
95 candidates.append(short_name.remove(element));
99 for (
auto cand : candidates) {
100 if (includes.contains(cand)) {
130 auto file =
prune_path(QString::fromStdString(obj.contained_in()));
131 auto name = QString::fromStdString(obj.full_name());
137 s_obj_map.at(file).insert({ name, obj });
163 auto schema_file = QString::fromStdString(classdef.
p_schema_path);
165 message += QString(
"Object <i>" +
id +
"</i> is of class <i>" + QString::fromStdString(obj.class_name()) +
166 "</i> defined in file <b>" + schema_file +
"</b> which is not included<br>");
169 std::vector<tref> relobjs;
174 }
catch (daq::dbe::config_object_retrieval_result_is_null
const& e) {
181 for (
auto relobj : relobjs) {
182 auto file = QString::fromStdString(relobj.contained_in());
185 QString(
"Object <i>" +
id +
"</i> has relationship to <i>" + QString::fromStdString(relobj.full_name()) +
186 "</i> in file <b>" + file +
"</b> which is not included<br>");
199 ,
m_uuid(QUuid::createUuid())
202 QWidget::setAttribute(Qt::WA_DeleteOnClose);
207 m_ui->rstatus->setText(QString(
"RW"));
210 m_ui->rstatus->setText(QString(
"RO"));
215 setWindowTitle(
"File: " +
filename.section(
'/', -1));
221 m_ui->schema_list->setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu);
222 m_ui->data_list->setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu);
223 m_ui->object_list->setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu);
235 connect(
m_ui->data_list, SIGNAL(itemActivated(QListWidgetItem*)),
this, SLOT(
file_info_slot(QListWidgetItem*)));
237 connect(
m_ui->object_list, SIGNAL(itemActivated(QListWidgetItem*)),
this, SLOT(
edit_object_slot(QListWidgetItem*)));
258 m_ui->object_list->clear();
262 for (
auto const& [obj_name, obj_ref] : omap) {
263 auto item =
new QListWidgetItem(obj_name);
264 m_ui->object_list->addItem(item);
267 m_ui->object_list->update();
279 m_ui->warningBox->setVisible(!status);
286 m_ui->message->setText(message);
287 return message.isEmpty();
294 m_ui->schema_list->clear();
295 m_ui->data_list->clear();
296 for (
auto inc : includes) {
297 auto item =
new QListWidgetItem(inc);
302 if (inc.endsWith(
".schema.xml")) {
303 m_ui->schema_list->addItem(item);
305 if (inc.endsWith(
".data.xml")) {
306 m_ui->data_list->addItem(item);
309 m_ui->schema_list->update();
310 m_ui->data_list->update();
316 if (event->key() == Qt::Key_Escape) {
319 QWidget::keyPressEvent(event);
336 auto item =
m_ui->object_list->currentItem();
343 auto name = item->text();
345 for (QWidget* widget : QApplication::allWidgets()) {
348 if (oe->objectName() == name) {
350 oe->setVisible(
true);
351 oe->activateWindow();
366 auto name =
m_ui->object_list->currentItem()->text();
377 auto name =
m_ui->object_list->currentItem()->text();
380 QInputDialog dia(
this);
381 dia.setLabelText(
"Enter new name for " + name);
382 auto code = dia.exec();
383 if (code == QDialog::Accepted) {
384 std::string new_name = dia.textValue().toStdString();
397 auto fd =
new QFileDialog(
this, tr(
"Open Data File"),
s_data_path, tr(
"XML data files (*.data.xml)"));
399 if (fd->result() == QDialog::Accepted) {
409 auto fd =
new QFileDialog(
this, tr(
"Open Schema File"),
s_schema_path, tr(
"XML schema files (*.schema.xml)"));
411 if (fd->result() == QDialog::Accepted) {
418 fd->setFileMode(QFileDialog::ExistingFiles);
419 fd->setViewMode(QFileDialog::Detail);
420 fd->setAcceptMode(QFileDialog::AcceptOpen);
422 if (fd->exec() == QDialog::Accepted) {
423 auto files = fd->selectedFiles();
424 QScopedValueRollback<bool> rb(
m_updating,
true);
425 for (
auto file : files) {
437 QScopedValueRollback<bool> rb(
m_updating,
true);
440 QMessageBox::warning(
441 this,
"Warning", QString(
"Missing schema map is corrupt and does not contain %1").arg(short_filename));
454 QScopedValueRollback<bool> rb(
m_updating,
true);
457 QMessageBox::warning(
458 this,
"Warning", QString(
"Missing data map is corrupt and does not contain %1").arg(short_filename));
507 for (QWidget* widget : QApplication::allWidgets()) {
508 auto fi =
dynamic_cast<FileInfo*
>(widget);
512 fi->setVisible(
true);
513 fi->activateWindow();
530 auto add =
new QAction(
"Add include file",
this);
534 auto remove =
new QAction(
"Remove include file",
this);
540 if (
m_ui->schema_list->currentIndex().isValid()) {
552 auto info =
new QAction(tr(
"Show file info"),
this);
557 auto add =
new QAction(
"Add include file",
this);
558 connect(add, SIGNAL(triggered()),
this, SLOT(
add_datafile()));
561 auto remove =
new QAction(
"Remove include file",
this);
567 if (
m_ui->data_list->currentIndex().isValid()) {
583 auto edit_action =
new QAction(tr(
"&Edit object"),
this);
587 auto delete_action =
new QAction(tr(
"&Delete Object"),
this);
591 auto rename_action =
new QAction(tr(
"&Rename Object"),
this);
596 if (
m_ui->object_list->currentIndex().isValid()) {
static bool match_path(const QString &file, const QString &top_file, const QStringList &includes)
static QList< QUrl > get_path_urls()
static QString prune_path(QString file)
void keyPressEvent(QKeyEvent *event) override
static void parse_all_objects()
void add_missing_datafiles()
static QStringList get_path_list()
void activate_data_context_menu(QPoint point)
void rename_object_slot()
void remove_datafile_slot()
void activate_schema_context_menu(QPoint point)
static std::map< QString, std::set< QString > > s_missing_data_map
void add_includefile(QFileDialog *fd)
void delete_object_slot()
static QStringList s_path_list
void activate_object_context_menu(QPoint point)
static std::map< QString, std::set< QString > > s_missing_schema_map
static QString check_file_includes(const QString &file)
static void setup_paths()
static QString s_data_path
void remove_schemafile_slot()
FileInfo(QString filename, QWidget *parent=0)
static QList< QUrl > s_path_urls
void add_missing_schemafiles()
static QString s_schema_path
static std::map< QString, std::map< QString, const tref > > s_obj_map
static void show_file_info(const QString &filename)
void remove_includefile(const QString &file)
static MainWindow * findthis()
ObjectEditor(QWidget *parent=nullptr)
static QColor FileReadOnlyForeground
static QColor FileReadOnlyBackground
static bool check_file_rw(const QString &FileName)
static QString dbfullname()
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)
T relation(tref item, dunedaq::conffwk::relationship_t const &relation)
bool is_simple(dunedaq::conffwk::relationship_t const &)
const std::vector< relationship_t > p_relationships
std::string p_schema_path