/** ** ** @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 #include #include // AdvancedSymbology::Gui::SYMBOL_TYPE #include #include #include #include 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 m_dlgSymbolLookup; // 'wraps' bslWidget QPointer m_bslWidgetSymbols; QPointer m_bslWidgetParticipant; QPointer &getBaseSymbolLookupWidgetRef() { if (m_isParticipantDialog) return m_bslWidgetParticipant; return m_bslWidgetSymbols; } QSet 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 &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