/** ** ** @RDE_HEADER@ ** Implementation of rubberband class to define point feature geoemtry ** $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 .........: ** ** 27.03.2015, JT : First edition for use with Qt5 ** ** ----------------------------------------------------------------------------------------------- */ #include "rubberband_point_cluster.h" #include "rubberband_point_handle.h" #include "rubberband_drawable.h" #include "rubberband_handle_proxy.h" #include "transient_tactical_symbol.h" #include "rubberband_internal.h" #include "rubberband_base_internal.h" namespace SituationMap { namespace RB { struct RubberbandPointCluster::InternalData { Q_DISABLE_COPY(InternalData) InternalData() = default; SituationMap::RefPointer _previewSymbol; }; /* RubberbandMultiPointFeature::InternalData */ RubberbandPointCluster::RubberbandPointCluster( SituationMap::Map * map, QObject * parent, bool isActive ) : RubberbandPointCluster( map, INT_MAX, parent, isActive ) {;} RubberbandPointCluster::RubberbandPointCluster( SituationMap::Map * map, unsigned int maxCoordinates, QObject * parent, bool isActive ) : RubberbandPointFeature(map,parent,isActive), _internal(new InternalData()), _minimalPointCount(1) { _maximalPointCount = maxCoordinates; } /* RubberbandPointCluster::RubberbandPointCluster */ RubberbandPointCluster::~RubberbandPointCluster() { delete _internal; } /* RubberbandPointCluster::~RubberbandPointCluster */ void RubberbandPointCluster::activateButtons() { _baseInternal->_hasUndoButton = isEnabledConstructionState(); _baseInternal->_applyIsPossible = (static_cast(Rubberband::_internal->_handleList.size()) >= _minimalPointCount); _baseInternal->_undoIsPossible = (isEnabledConstructionState() && (static_cast(Rubberband::_internal->_handleList.size()) > _minimalPointCount)); Rubberband::activateButtons(); } /* RubberbandMultiPointFeature::activateButton */ void RubberbandPointCluster::setCoordinateVector(const QVector & coordinateVector, CoordinateSystem cs ) { RubberbandPointFeature::setCoordinateVector( coordinateVector, cs ); enableModificationState(); activateButtons(); } /* RubberbandPointCluster::setCoordinateVector */ bool RubberbandPointCluster::setCoordinateAction( AbstractEventDispatcher * causer, int x, int y ) { bool ok = false; if (rubberbandIsAlive()) { ok = RubberbandPointFeature::setCoordinateAction(causer,x,y); if (ok) activateButtons(); } return ok; } /* RubberbandPointCluster::setCoordinateAction */ void RubberbandPointCluster::update() { RubberbandPointFeature::update(); if (!_previewSidc.isEmpty()) { if (!_internal->_previewSymbol) { _internal->_previewSymbol = new TransientTacticalSymbol( static_cast(_baseInternal->_map.data()), _previewSidc ); } QVector coordinateList; coordinateList.reserve( Rubberband::_internal->_handleList.size() ); for (auto handlePoint : qAsConst(Rubberband::_internal->_handleList)) { RubberbandPointHandle * handlePointPtr = dynamic_cast(handlePoint.get()); if (handlePointPtr) { coordinateList.append( handlePointPtr->getCoordinate() ); } } _internal->_previewSymbol->update( coordinateList ); } else _internal->_previewSymbol = nullptr; } /* RubberbandPointCluster::update */ bool RubberbandPointCluster::deleteAction(AbstractEventDispatcher * causer, int x, int y) { if (rubberbandIsAlive()) { if (static_cast(RubberbandPointFeature::_internal->_handleList.size()) <= _minimalPointCount) return true; return RubberbandPointFeature::deleteAction(causer,x,y); } return false; } /* RubberbandPointCluster::deleteAction */ } } /* namespace SituationMap::RB */