238 lines
7.6 KiB
C++
Executable File
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
|