Files
qt-migration-legatus/qt6-after/qt6-migrated-legatus/Lts/Viewer/LtsFileDialog/lts_file_dialog_widget.cpp
T
berrux-dev 9c1ac7cbef Merge feature/lts-viewer-validation-testing-phase into feature/qt6-migration-basis-modules-merge
Resolves 1 conflict (new_docker_build.sh, union of viewer-only + codification options); folds in fixes for pre-existing defects surfaced by the validation runs (KDReports-qt6 wiring, LtsSession RTI linking, LtsFileDialog/WLS/BSM Qt6/RTI API migration, GROUP4 target list, new --cmake_build_flags option); validated with BUILD_RTI=ON BUILD_GRANTLEE=ON in 3 Docker runs (run 3: build green, 6 base-state first-run CTest failures documented).
2026-09-27 07:33:29 +02:00

393 lines
13 KiB
C++
Executable File

/**
* @RDE_HEADER@
* LtsFileDialogWidget and LtsFileDialog - custom widgets
* $Id$
* $HeadURL$
* $Author$
*
* Created by Iuliana Ojog & Mike Wille, SLSE, 2017-09-15
*/
#include "lts_file_dialog_widget.h"
#include "lts_file_dialog.h"
#include "lts_dialog_model_file.h"
#include "lts_dialog_model_folder.h"
#include "ui_lts_file_dialog.h"
#include <LtsSession/lts_session.h>
#include <LtsSession/lts_session_data.h>
#include <nglwidgets/ngltreeitem.h>
#include <FileManagement/flm_db.h>
#include <FileManagement/flm_translation.h>
#include <ConnectDialog/connect_dialog_nt.h>
#include <LtsUtilsCore/dds_vector.h>
#include <QtCore/QItemSelectionModel>
namespace LtsWidgets
{
//-----------------------------------------------------------------------------------------------------------
LtsFileDialogWidget::LtsFileDialogWidget(QWidget *parent)
: QWidget(parent)
, m_ui(new Ui::LtsFileDialogWidget)
, m_selectedFileContent(FileManagement::FileContent())
{
m_ui->setupUi(this);
}
//-----------------------------------------------------------------------------------------------------------
LtsFileDialogWidget::~LtsFileDialogWidget()
{
delete m_ui;
}
//-----------------------------------------------------------------------------------------------------------
bool LtsFileDialogWidget::init(LtsSession::LtsSession *session,
const std::shared_ptr<FileManagement::Interface::Dtc> &dtc,
const std::shared_ptr<OperatorManagement::Interface::Dtc> &opmDtc,
const std::shared_ptr<ExerciseManagement::Interface::Dtc> &exmDtc,
const FileDialogMode &dlgMode,
const QVector<FileManagement::MainFolder> &mainFolders,
const QVector<FileManagement::FileType> &fileTypes,
const int &folderId,
const QString &xmlType)
{
m_session = session;
m_dtc = dtc;
m_opmDtc = opmDtc;
m_exmDtc = exmDtc;
m_dialogMode = dlgMode;
m_fileTypes = fileTypes;
m_selectedFolderId = folderId;
m_xmlType = xmlType;
m_mainFolders = mainFolders;
if ((dtc.get() == nullptr) || (opmDtc.get() == nullptr))
return false;
m_dtc->enableFolder();
m_dtc->waitForHistoricalDataFolder();
m_dtc->enableFileContent();
m_dtc->waitForHistoricalDataFileContent();
m_opmDtc->enableUser();
m_opmDtc->waitForHistoricalDataUser();
m_exmDtc->enableExercise();
m_exmDtc->waitForHistoricalDataExercise();
m_exmDtc->enableExercisePhase();
m_exmDtc->waitForHistoricalDataExercisePhase();
// DDS connects
connect(m_dtc.get(), &FileManagement::Interface::Dtc::folderChanged, this, &LtsFileDialogWidget::onFolderChanged);
connect(m_dtc.get(), &FileManagement::Interface::Dtc::fileContentChanged, this, &LtsFileDialogWidget::onFileChanged);
// model folder
QVariant data;
FileManagement::Folder dummyFolder;
data.setValue(dummyFolder);
NGLTreeItem *rootItem = new NGLTreeItem(data, QIcon());
m_modelFolder = new DialogModelFolder(this, rootItem, m_dtc, m_exmDtc,
QStringList()
<< tr("Name") << tr("Id"));
m_modelFolder->initModel(m_session->exerciseId(), m_mainFolders);
m_proxyModelFolder = new DialogModelProxyFolder(this);
m_proxyModelFolder->setOperatorId(LtsSessionData::LtsSessionData::getInstance()->getOperatorId());
m_proxyModelFolder->setSourceModel(m_modelFolder);
m_proxyModelFolder->sort(DialogModelFolder::Columns::ID, Qt::AscendingOrder);
// UI
m_ui->tvFolder->setModel(m_proxyModelFolder);
m_ui->tvFolder->expandAll();
m_ui->tvFolder->setExpanded(m_proxyModelFolder->index(0,0),true);
m_ui->tvFolder->hideColumn(DialogModelFolder::Columns::ID);
// SelectionModel Folder
QItemSelectionModel *selectionModelFolder = m_ui->tvFolder->selectionModel();
connect(selectionModelFolder, &QItemSelectionModel::selectionChanged, this, &LtsFileDialogWidget::onFolderSelectionChanged);
// model file
m_modelFile = new DialogModelFile(this);
// initial all valid, not-deleted files
auto predicate = [](const FileManagement::FileContent &fc, const QString &xmlType)
{
return (!fc.isDeleted && fc.fileStatus == FileManagement::FileStatus::Valid &&
(xmlType.isEmpty() || fc.properties.find(xmlType.toStdString()) != std::string::npos));
};
m_modelFile->initModel(m_dtc, m_opmDtc, xmlType, predicate);
// auto predicate = [](const FileManagement::FileContent &fc)
// {
// return (!fc.isDeleted() && fc.fileStatus() == FileManagement::FileStatus::Valid);
// };
// m_modelFile->initModel(m_dtc, m_opmDtc, m_xmlType, predicate);
// UI file
m_ui->widgetFiles->seamless();
m_proxyModelFile = new DialogFileProxyModel(this);
m_proxyModelFile->setSourceModel(m_modelFile);
m_ui->widgetFiles->setModel(m_proxyModelFile);
m_ui->widgetFiles->hideColumn(FOLDER);
// double click to select file
connect(m_ui->widgetFiles, &LtsDataView::LtsDataView::signalDoubleClicked, this, &LtsFileDialogWidget::onSelectFile);
// initial folder selection
selectFolder();
// selection changed File
connect(m_ui->widgetFiles, &LtsDataView::LtsDataView::signalSelectionChanged, this, &LtsFileDialogWidget::enaDisa);
// enable filename edit
if (m_dialogMode == FileDialogMode::modeSaveFile)
{
m_ui->leFile->setEnabled(true);
connect(m_ui->leFile, &QLineEdit::textChanged, this, &LtsFileDialogWidget::saveFileName);
}
// filtering on fileTypes
if (m_fileTypes.contains(FileManagement::FileType::Unknown)) // no filtering
m_ui->lblFilter->setVisible(false);
else
{
QString labelFilter = tr("Filtering:") + QLatin1String(" <b>");
QStringList types;
types.reserve(m_fileTypes.size());
for (auto &ft : m_fileTypes)
types << toString(ft);
labelFilter += types.join(QLatin1String(", "));
labelFilter += QLatin1String("</b>");
m_ui->lblFilter->setText(labelFilter);
}
enaDisa();
return true;
}
//-----------------------------------------------------------------------------------------------------------
void LtsFileDialogWidget::selectFolder()
{
QModelIndex idx;
QItemSelectionModel *selectionModelFolder = m_ui->tvFolder->selectionModel();
if (m_selectedFolderId > 0)
idx = m_proxyModelFolder->mapFromSource(m_modelFolder->getIndex(m_selectedFolderId));
if (idx.isValid())
selectionModelFolder->setCurrentIndex(idx, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows);
else
selectionModelFolder->setCurrentIndex(m_modelFolder->index(0,0), QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows);
}
//-----------------------------------------------------------------------------------------------------------
void LtsFileDialogWidget::onFolderSelectionChanged(const QItemSelection& /*selected*/,
const QItemSelection& /*deselected*/)
{
enaDisa();
auto predicate = [this](const FileManagement::FileContent & fc, const QString &xmlType)
{
return showFile(fc, xmlType);
};
m_modelFile->initModel(m_dtc, m_opmDtc, m_xmlType, predicate);
}
//-----------------------------------------------------------------------------------------------------------
void LtsFileDialogWidget::requestReadingSelectedFile()
{
emit readSelectedFile(m_selectedFileContent.id);
}
//-----------------------------------------------------------------------------------------------------------
FileManagement::FileContent LtsFileDialogWidget::onSelectFile()
{
QModelIndex selIndex = m_ui->widgetFiles->currentIndex();
if (!selIndex.isValid())
return FileManagement::FileContent();
m_selectedFileContent = m_modelFile->getRowData(selIndex.row());
emit accepted();
return m_selectedFileContent;
}
//-----------------------------------------------------------------------------------------------------------
void LtsFileDialogWidget::onChooseFileName()
{
if ((m_dialogMode == FileDialogMode::modeSaveFile) && (!m_fileName.isEmpty()))
{
emit accepted();
}
}
//----------------------------------------------------------------------------
void LtsFileDialogWidget::onFolderChanged(const FileManagement::Folder &data, DataModification modType)
{
Q_UNUSED(data);
Q_UNUSED(modType);
m_modelFolder->initModel(m_session->exerciseId(), m_mainFolders);
m_ui->tvFolder->expandAll();
m_ui->tvFolder->setExpanded(m_proxyModelFolder->index(0,0),true);
// select last selected folder
selectFolder();
}
//----------------------------------------------------------------------------
void LtsFileDialogWidget::onFileChanged(const FileManagement::FileContent &data, DataModification modType)
{
bool condition = showFile(data, m_xmlType);
int row = 0;
QModelIndex selIndex = m_ui->widgetFiles->currentIndex();
if (selIndex.isValid())
row = selIndex.row();
if (modType == DataModification::eRemoved)
{
m_modelFile->removeRow(row);
return;
}
if (modType == DataModification::eAdded && condition)
{
m_modelFile->insertRow(data);
return;
}
if (modType == DataModification::eModified && condition)
{
m_modelFile->setRowData(row, data);
return;
}
}
//-----------------------------------------------------------------------------------------------------------
QString LtsFileDialogWidget::dragMimeType() const
{
return (m_modelFile) ? m_modelFile->mimeTypes().value(0) : QString{};
}
//-----------------------------------------------------------------------------------------------------------
void LtsFileDialogWidget::saveFileName(const QString &name)
{
m_fileName = name;
m_selectedFileContent = FileManagement::FileContent();
emit enableButtons();
}
//-----------------------------------------------------------------------------------------------------------
QModelIndex LtsFileDialogWidget::selectedIndexViewFolder()
{
QItemSelectionModel *selectionModel = m_ui->tvFolder->selectionModel();
QModelIndexList indexL = selectionModel->selectedRows(0);
if(indexL.size() == 0)
return {};
return m_proxyModelFolder->mapToSource(indexL.at(0));
}
//-----------------------------------------------------------------------------------------------------------
void LtsFileDialogWidget::enaDisa()
{
QModelIndex idxFolder = selectedIndexViewFolder();
if (idxFolder.isValid())
{
QString folderName = m_modelFolder->getFolderName(m_modelFolder->getFolder(idxFolder));
m_ui->lblSelectedFolder->setText(folderName);
m_selectedFolderId = m_modelFolder->getFolder(idxFolder).id;
}
else
{
m_ui->lblSelectedFolder->setText(tr("None"));
m_selectedFolderId = 0;
}
// files
QModelIndex idxFile = m_ui->widgetFiles->currentIndex();
if (idxFile.isValid())
{
m_selectedFileContent = m_modelFile->getRowData(m_ui->widgetFiles->currentIndex().row());
m_fileName = QString::fromStdString(m_selectedFileContent.name);
m_ui->leFile->setText(m_fileName);
}
else
{
m_selectedFileContent = FileManagement::FileContent();
if (m_dialogMode != FileDialogMode::modeSaveFile)
{
m_fileName = QString{};
m_ui->leFile->setText(m_fileName);
}
}
emit enableButtons();
}
//--------------------------------------------------------------------------
bool LtsFileDialogWidget::showFile(const FileManagement::FileContent &fc, const QString &xmlType)
{
if (fc.isDeleted)
return false;
if (fc.folderId != m_selectedFolderId)
return false;
if (!m_fileTypes.isEmpty() && !m_fileTypes.contains(fc.fileType))
return false;
if (fc.fileStatus != FileManagement::FileStatus::Valid)
return false;
// get folder selected
const QModelIndex selIndex = selectedIndexViewFolder();
const NGLTreeItem *item = m_modelFolder->privateData(selIndex);
const FileManagement::Folder fld = item->data().value<FileManagement::Folder>();
const auto &fldPath = fld.path;
// filter in USER DOCUMENTS folder and subfolders
if (LtsUtils::isInVector(fldPath, static_cast<int>(FileManagement::MainFolder::UserDocuments)))
{
const int operatorId = LtsSessionData::LtsSessionData::getInstance()->getOperatorId();
// filter on User Category and OperatorId
if (fc.fileCategory == FileManagement::FileCategory::User &&
fc.operatorId != operatorId)
return false;
}
// filter in EXERCISE DOCUMENTS folder and subfolders
if (LtsUtils::isInVector(fldPath, static_cast<int>(FileManagement::MainFolder::ExerciseDocuments)))
{
// filter on Category = Exercise
if (fc.fileCategory != FileManagement::FileCategory::Exercise)
return false;
if (m_session->exerciseId() > 0)
{
// filter on exact exerciseId (optional member, no comparison operator)
if (!fc.exerciseId.has_value() || fc.exerciseId.value() != m_session->exerciseId())
return false;
}
}
// filter on XmlType
if (fc.fileType == FileManagement::FileType::Xml && !xmlType.isEmpty() && fc.properties.size() > 0)
{
const QString &prop = QString::fromStdString(fc.properties);
if (!prop.contains(xmlType, Qt::CaseSensitive))
{
return false;
}
}
return true;
}
} // namespace LtsWidgets