Files
qt5-legatus-legacy/Lts/Viewer/SituationMap/SymbologyGui/base_symbol_lookup_dialog.cpp
T
2026-08-13 18:33:10 +02:00

211 lines
6.9 KiB
C++
Executable File

/**
* @RDE_HEADER@
* Dialog for selecting (base) symbols
* $Id$
* $HeadURL$
* $Author$
* Created by Norbert Thoden, NLE, 12.12.2019
*/
#include "base_symbol_lookup_dialog.h"
#include "base_symbol_lookup_widget.h"
#include <LtsWidgets/lts_dialog_button_box.h>
#include <LtsUtilsSettings/settings.h>
#include <Symbology/symbol_dictionary.h>
#include <SymbologyImpl/symbol_dictionary_impl.h>
#include <SymbologyImpl/base_symbol_model.h>
#include <Symbology/sidc_builder_base.h> // for baseSymbolCodeToSidc
#include <QVBoxLayout>
#include <QHash>
#include <QPointer>
namespace AdvancedSymbology
{
namespace Gui
{
//------------------------------------------------------------------------------
// BaseSymbolLookupDialog::Private
//------------------------------------------------------------------------------
struct BaseSymbolLookupDialog::Private
{
public:
Private() = default;
~Private()
{
delete m_baseSymbolWidget;
delete m_buttonBox;
}
BaseSymbolLookupWidget *m_baseSymbolWidget = nullptr;
LtsWidgets::LtsDialogButtonBox *m_buttonBox = nullptr;
};
//------------------------------------------------------------------------------
// BaseSymbolLookupDialog
//------------------------------------------------------------------------------
BaseSymbolLookupDialog::BaseSymbolLookupDialog(QWidget *parent)
: BaseClass(parent, LtsWidgets::Behaviour::Modal)
, m_logger(getLogger("BaseSymbolLookupDialog"))
, d(new Private())
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
}
bool BaseSymbolLookupDialog::participantMode() const
{
if (!d->m_baseSymbolWidget)
return false;
return d->m_baseSymbolWidget->participantMode();
}
void BaseSymbolLookupDialog::setParticipantMode(bool onOff)
{
if (!d->m_baseSymbolWidget)
return;
d->m_baseSymbolWidget->setParticipantMode(onOff);
}
void BaseSymbolLookupDialog::setValidBaseSymbolCodes(const QSet<QString> &validBaseSymbolCodes)
{
if (!d->m_baseSymbolWidget)
return;
d->m_baseSymbolWidget->setValidBaseSymbolCodes(validBaseSymbolCodes);
}
bool BaseSymbolLookupDialog::init(AdvancedSymbology::SymbolDictionary &symbolDictionary)
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
LtsUtils::ProjectSettings *ps = LtsUtils::ProjectSettings::getInstance();
bool enableEtsSymbols = ps->value(QStringLiteral("SituationMap"), QStringLiteral("enableEtsSymbols"), true).toBool();
// setup:
delete d->m_baseSymbolWidget;
delete d->m_buttonBox;
AdvancedSymbology::SymbolDictionaryImpl &sdi = static_cast<AdvancedSymbology::SymbolDictionaryImpl &>(symbolDictionary);
AdvancedSymbology::BaseSymbolModel *bsmEsri = sdi.getBaseSymbolModelEsri();
AdvancedSymbology::BaseSymbolModel *bsmXml = sdi.getBaseSymbolModelXML();
AdvancedSymbology::BaseSymbolModel *bsmEts = sdi.getBaseSymbolModelEts();
DEBUG_LOG(m_logger) << LOGFUNCTION << " bsmEsri rowCount" << bsmEsri->rowCount();
const SymbologyType symbologyType = sdi.symbologyType();
AdvancedSymbology::Gui::MODEL_CONT modelCont;
modelCont.append(AdvancedSymbology::Gui::ModelItem(AdvancedSymbology::Gui::SYMBOL_TYPE::ESRI, toString(symbologyType), bsmEsri));
modelCont.append(AdvancedSymbology::Gui::ModelItem(AdvancedSymbology::Gui::SYMBOL_TYPE::XML, QLatin1String("User-defined Symbols"), bsmXml));
if (enableEtsSymbols )
modelCont.append(AdvancedSymbology::Gui::ModelItem(AdvancedSymbology::Gui::SYMBOL_TYPE::ETS, QLatin1String("Ets"), bsmEts));
d->m_baseSymbolWidget = new AdvancedSymbology::Gui::BaseSymbolLookupWidget(modelCont, this);
connect(d->m_baseSymbolWidget, &AdvancedSymbology::Gui::BaseSymbolLookupWidget::symbolClicked, this, &BaseSymbolLookupDialog::onSymbolClicked);
connect(d->m_baseSymbolWidget, &AdvancedSymbology::Gui::BaseSymbolLookupWidget::symbolDoubleClicked, this, &BaseSymbolLookupDialog::onSymbolDoubleClicked);
d->m_buttonBox = new LtsWidgets::LtsDialogButtonBox(this);
connect(d->m_buttonBox->getButton(LtsWidgets::DialogButton::Ok), &QPushButton::clicked, this, &BaseSymbolLookupDialog::apply);
connect(d->m_buttonBox->getButton(LtsWidgets::DialogButton::Close), &QPushButton::clicked, this, &BaseSymbolLookupDialog::close);
d->m_buttonBox->getButton(LtsWidgets::DialogButton::Ok)->setEnabled(false); // until an item is selected
// setup layout:
QVBoxLayout *layout = new QVBoxLayout();
layout->addWidget(d->m_baseSymbolWidget, 2);
layout->addWidget(d->m_buttonBox);
setLayout(layout);
setMinimumWidth(800);
resize(sizeHint().height(), minimumWidth());
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
return true;
}
BaseSymbolLookupDialog::~BaseSymbolLookupDialog()
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
delete d;
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
}
QString BaseSymbolLookupDialog::getCurrentBaseSymbolCode() const
{
if (!d->m_baseSymbolWidget)
return QString();
return d->m_baseSymbolWidget->getCurrentBaseSymbolCode();
}
bool BaseSymbolLookupDialog::setCurrentSidc(const QString &sidc)
{
if (!d->m_baseSymbolWidget)
return false;
bool success = d->m_baseSymbolWidget->setCurrentSidc(sidc);
// d->m_buttonBox->getButton(LtsWidgets::DialogButton::Ok)->setEnabled(success);
return success;
}
void BaseSymbolLookupDialog::onSymbolClicked(const QString &baseSymbolCode, const QString &sidc)
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START, "
<< " baseSymbolCode='" << baseSymbolCode << "'"
<< " sidc='" << sidc << "'";
d->m_buttonBox->getButton(LtsWidgets::DialogButton::Ok)->setEnabled(!sidc.isEmpty());
// slotChangesMade();
}
void BaseSymbolLookupDialog::onSymbolDoubleClicked(const QString &baseSymbolCode, const QString &sidc)
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START, "
<< " baseSymbolCode='" << baseSymbolCode << "'"
<< " sidc='" << sidc << "'";
apply();
}
void BaseSymbolLookupDialog::apply()
{
if (!d->m_baseSymbolWidget)
return ;
QSharedPointer<BaseSymbolItem> bsi = d->m_baseSymbolWidget->getCurrentBaseSymbolItem();
if (!bsi)
return;
const QString &curBsc = bsi->baseSymbolCode();
const QString &curSidc = bsi->sidc();
emit lookupAppliedBaseSymbolCode(curBsc);
emit lookupAppliedCompleteSidc(curSidc);
accept();
}
BaseSymbolLookupDialog *BaseSymbolLookupDialog::showInstance()
{
static QPointer<BaseSymbolLookupDialog> s_BaseSymbolLookupDialog;
if (!s_BaseSymbolLookupDialog)
s_BaseSymbolLookupDialog = createDlg();
return s_BaseSymbolLookupDialog;
}
BaseSymbolLookupDialog *BaseSymbolLookupDialog::createDlg(QWidget *parent)
{
AdvancedSymbology::Gui::BaseSymbolLookupDialog *dlg = new AdvancedSymbology::Gui::BaseSymbolLookupDialog(parent);
dlg->init(AdvancedSymbology::SymbolDictionary::dictionary(AdvancedSymbology::SymbolDictionary::defaultSymbologyType()));
return dlg;
}
} // namespace Gui
} // namespace AdvancedSymbology