Files
qt5-legatus-legacy/Lts/Plugins/PlanEditor/lookup_symbol_manager.cpp
T
2026-08-13 18:33:10 +02:00

238 lines
7.6 KiB
C++
Executable File

/**
**
** @RDE_HEADER@
** Used to manage symbol look up dialog.
** $Id$
** $HeadURL$
** $Author$
**
** -----------------------------------------------------------------------------------------------
**
** Hardware-Environment: Intel-PC
** Software-Environment: Windows 7, Qt 5.4. ArcGIS 10.2.5
**
** Language ........: C++ 11
**
** -----------------------------------------------------------------------------------------------
**
** Author ...........: Jörg Turla, SPD G, Tel. 3132
**
** -----------------------------------------------------------------------------------------------
**
** Notes .........:
**
** 17.08.2016, JT : First edition for use with Qt5
**
** -----------------------------------------------------------------------------------------------
*/
#include "lookup_symbol_manager.h"
#include "lookup_symbol_dlg.h"
#include "plan_editor.h"
#include "plan_editor_session.h"
#include <Symbology/sidc_codec.h>
#include <Symbology/sidc_builder_base.h>
#include <SymbologyGui/base_symbol_lookup_widget.h> // AdvancedSymbology::Gui::SYMBOL_TYPE
#include <LtsWidgets/lts_base_layout_widget.h>
#include <LtsWidgets/lts_dialog.h>
#include <QtCore/QPointer>
#include <QTimer>
namespace PlanEditor
{
class LookupSymbolManager::InternalData
{
public:
PlanEditor *m_planEditor;
SituationMap::Map *m_map;
const PlanEditorSession &m_session;
// use QPointer here because LtsDialog has a close button which can destroy the widget
QPointer<LookupSymbolDlg> m_dlgSymbolLookup; // 'wraps' bslWidget
QPointer<AdvancedSymbology::Gui::BaseSymbolLookupWidget> m_bslWidgetSymbols;
QPointer<AdvancedSymbology::Gui::BaseSymbolLookupWidget> m_bslWidgetParticipant;
QPointer<AdvancedSymbology::Gui::BaseSymbolLookupWidget> &getBaseSymbolLookupWidgetRef()
{
if (m_isParticipantDialog)
return m_bslWidgetParticipant;
return m_bslWidgetSymbols;
}
QSet<QString> m_participantSidcsInUse; // baseSymbolCodes
QStringList m_symbolScopeList;
bool m_isParticipantDialog;
InternalData(PlanEditor *planEditor, SituationMap::Map *map, const PlanEditorSession &session)
: m_planEditor(planEditor)
, m_map(map)
, m_session(session)
, m_dlgSymbolLookup()
, m_symbolScopeList()
, m_isParticipantDialog(false)
{}
~InternalData()
{
delete m_dlgSymbolLookup;
m_dlgSymbolLookup = nullptr;
}
};
// LookupSymbolManager::InternalData
LookupSymbolManager::LookupSymbolManager(PlanEditor *planEditor
, SituationMap::Map *map
, const PlanEditorSession &session)
: QObject(planEditor),
m_internal(new LookupSymbolManager::InternalData(planEditor, map, session))
{
// in former times, every single change of the (user) searchString leads
// to a re-fill of the m_baseSymbolModel.
// Following, this signal BaseSymbolModel::readModelFinished was connect to
// LookupSymbolManager::readModelFinished.
// Since the model is stable, use singleShot now:
QTimer::singleShot(1000, this, [this]()
{
emit readModelFinished();
});
}
LookupSymbolManager::~LookupSymbolManager()
{
// most likely we have still the lookupWidgets, cleanup:
delete m_internal->m_bslWidgetSymbols;
m_internal->m_bslWidgetSymbols = nullptr;
delete m_internal->m_bslWidgetParticipant;
m_internal->m_bslWidgetParticipant = nullptr;
delete m_internal;
m_internal = nullptr;
}
void LookupSymbolManager::setParticipantsSidcsInUse(const QSet<QString> &sidcs)
{
m_internal->m_participantSidcsInUse = sidcs;
}
AdvancedSymbology::SymbolDictionary &LookupSymbolManager::symbolDictionary()
{
return m_internal->m_map->symbolDictionary();
}
bool LookupSymbolManager::isParticipantDialog() const
{
return m_internal->m_isParticipantDialog;
}
void LookupSymbolManager::openDialog(const QString &title, const QString &widgetId)
{
if (m_internal->m_dlgSymbolLookup)
onCloseDialog();
m_internal->m_dlgSymbolLookup = new LookupSymbolDlg(this, m_internal->m_planEditor, widgetId, m_internal->getBaseSymbolLookupWidgetRef());
if (m_internal->m_isParticipantDialog)
{
m_internal->m_dlgSymbolLookup->setParticipantMode(true);
m_internal->m_dlgSymbolLookup->setValidBaseSymbolCodes(m_internal->m_participantSidcsInUse);
}
m_internal->m_session.addWidget(m_internal->m_dlgSymbolLookup
, m_internal->m_planEditor->title()
, title
, LtsWidgets::LayoutArea::eDialogTab
, true);
m_internal->m_dlgSymbolLookup->setTitle(title);
connect(m_internal->m_dlgSymbolLookup.data(), &LookupSymbolDlg::beginDestroy, this, &LookupSymbolManager::onLookupSymbolDialogBeginDestroy);
connect(m_internal->m_dlgSymbolLookup.data(), &LookupSymbolDlg::addToSymbolFavourites, this, &LookupSymbolManager::addToSymbolFavourites);
connect(m_internal->m_dlgSymbolLookup.data(), &LookupSymbolDlg::symbolDoubleClicked, this, &LookupSymbolManager::onSymbolDoubleClicked);
m_internal->m_dlgSymbolLookup->onUpdateSymbolScopes(m_internal->m_symbolScopeList);
}
void LookupSymbolManager::onLookupSymbolDialogBeginDestroy()
{
m_internal->getBaseSymbolLookupWidgetRef() = m_internal->m_dlgSymbolLookup->detachAndTakeBaseSymbolLookupWidget();
}
void LookupSymbolManager::onCloseDialog()
{
if (m_internal->m_dlgSymbolLookup)
{
delete m_internal->m_dlgSymbolLookup;
m_internal->m_dlgSymbolLookup = nullptr;
}
}
void LookupSymbolManager::onOpenSymbolDialog()
{
if (m_internal->m_dlgSymbolLookup)
return;
m_internal->m_isParticipantDialog = false;
openDialog(tr("Symbol-Lookup"), QStringLiteral("PlanEditor_Symbols"));
}
void LookupSymbolManager::onOpenParticipantDialog()
{
if (m_internal->m_dlgSymbolLookup)
return;
m_internal->m_isParticipantDialog = true;
openDialog(tr("Participant-Lookup"), QStringLiteral("PlanEditor_Participants"));
}
void LookupSymbolManager::onUpdateSymbolScopes(const QStringList &scopeList)
{
m_internal->m_symbolScopeList = scopeList;
if (m_internal->m_dlgSymbolLookup)
m_internal->m_dlgSymbolLookup->onUpdateSymbolScopes(m_internal->m_symbolScopeList);
}
void LookupSymbolManager::initializeSymbolLookupModelDrag()
{
// not supported anymore,
// since approach using DropHandlerKey does not really match with SINGLE
// baseSymbol per process.
// DropHandlyerKey is the address of the DropCreateSymbol and the method
// transfers these adresses to every single baseSymbolItem...
// If there will exists more than one PlanEditor simultaneously it will not work :-(
//
// for (int idx = 0; idx < m_internal->m_baseSymbolModel->size(); ++idx)
// {
// if (m_internal->m_baseSymbolModel->getDropHandlerKey(idx) == 0L)
// {
// const QString &sidc = m_internal->m_baseSymbolModel->getSidc(idx);
// qulonglong dropEventHandlerKey = m_internal->m_planEditor->createSymbolDropEvent(sidc);
// m_internal->m_baseSymbolModel->setDropHandlerKey(idx, dropEventHandlerKey);
// }
// }
}
void LookupSymbolManager::onSymbolDoubleClicked(const QString &baseSymbolCode)
{
if (!m_internal->m_planEditor)
return;
const QString &encodedCompleteCode = AdvancedSymbology::SidcBuilderBase::baseSymbolCodeToSidc(baseSymbolCode);
m_internal->m_planEditor->onSymbolCreateRubberband(encodedCompleteCode, m_internal->m_isParticipantDialog);
}
} // namespace PlanEditor