mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-11-04 12:40:05 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			109 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include <scwx/qt/map/marker_layer.hpp>
 | 
						|
#include <scwx/qt/manager/marker_manager.hpp>
 | 
						|
#include <scwx/util/logger.hpp>
 | 
						|
#include <scwx/qt/types/marker_types.hpp>
 | 
						|
#include <scwx/qt/types/texture_types.hpp>
 | 
						|
#include <scwx/qt/gl/draw/geo_icons.hpp>
 | 
						|
 | 
						|
namespace scwx
 | 
						|
{
 | 
						|
namespace qt
 | 
						|
{
 | 
						|
namespace map
 | 
						|
{
 | 
						|
 | 
						|
static const std::string logPrefix_ = "scwx::qt::map::marker_layer";
 | 
						|
static const auto        logger_    = scwx::util::Logger::Create(logPrefix_);
 | 
						|
 | 
						|
class MarkerLayer::Impl
 | 
						|
{
 | 
						|
public:
 | 
						|
   explicit Impl(MarkerLayer* self, std::shared_ptr<MapContext> context) :
 | 
						|
       self_ {self}, geoIcons_ {std::make_shared<gl::draw::GeoIcons>(context)}
 | 
						|
   {
 | 
						|
      ConnectSignals();
 | 
						|
   }
 | 
						|
   ~Impl() {}
 | 
						|
 | 
						|
   void ReloadMarkers();
 | 
						|
   void ConnectSignals();
 | 
						|
 | 
						|
   MarkerLayer* self_;
 | 
						|
   const std::string& markerIconName_ {
 | 
						|
      types::GetTextureName(types::ImageTexture::LocationMarker)};
 | 
						|
 | 
						|
   std::shared_ptr<gl::draw::GeoIcons> geoIcons_;
 | 
						|
};
 | 
						|
 | 
						|
void MarkerLayer::Impl::ConnectSignals()
 | 
						|
{
 | 
						|
   auto markerManager = manager::MarkerManager::Instance();
 | 
						|
 | 
						|
   QObject::connect(markerManager.get(),
 | 
						|
         &manager::MarkerManager::MarkersUpdated,
 | 
						|
         self_,
 | 
						|
         [this]()
 | 
						|
         {
 | 
						|
            this->ReloadMarkers();
 | 
						|
         });
 | 
						|
}
 | 
						|
 | 
						|
void MarkerLayer::Impl::ReloadMarkers()
 | 
						|
{
 | 
						|
   logger_->debug("ReloadMarkers()");
 | 
						|
   auto markerManager = manager::MarkerManager::Instance();
 | 
						|
 | 
						|
   geoIcons_->StartIcons();
 | 
						|
 | 
						|
   markerManager->for_each(
 | 
						|
      [this](const types::MarkerInfo& marker)
 | 
						|
      {
 | 
						|
         std::shared_ptr<gl::draw::GeoIconDrawItem> icon = geoIcons_->AddIcon();
 | 
						|
         geoIcons_->SetIconTexture(icon, markerIconName_, 0);
 | 
						|
         geoIcons_->SetIconLocation(icon, marker.latitude, marker.longitude);
 | 
						|
      });
 | 
						|
 | 
						|
   geoIcons_->FinishIcons();
 | 
						|
   Q_EMIT self_->NeedsRendering();
 | 
						|
}
 | 
						|
 | 
						|
MarkerLayer::MarkerLayer(const std::shared_ptr<MapContext>& context) :
 | 
						|
    DrawLayer(context), p(std::make_unique<MarkerLayer::Impl>(this, context))
 | 
						|
{
 | 
						|
   AddDrawItem(p->geoIcons_);
 | 
						|
}
 | 
						|
 | 
						|
MarkerLayer::~MarkerLayer() = default;
 | 
						|
 | 
						|
void MarkerLayer::Initialize()
 | 
						|
{
 | 
						|
   logger_->debug("Initialize()");
 | 
						|
   DrawLayer::Initialize();
 | 
						|
 | 
						|
   p->geoIcons_->StartIconSheets();
 | 
						|
   p->geoIcons_->AddIconSheet(p->markerIconName_);
 | 
						|
   p->geoIcons_->FinishIconSheets();
 | 
						|
 | 
						|
   p->ReloadMarkers();
 | 
						|
}
 | 
						|
 | 
						|
void MarkerLayer::Render(const QMapLibre::CustomLayerRenderParameters& params)
 | 
						|
{
 | 
						|
   // auto markerManager = manager::MarkerManager::Instance();
 | 
						|
   gl::OpenGLFunctions& gl = context()->gl();
 | 
						|
 | 
						|
   DrawLayer::Render(params);
 | 
						|
 | 
						|
   SCWX_GL_CHECK_ERROR();
 | 
						|
}
 | 
						|
 | 
						|
void MarkerLayer::Deinitialize()
 | 
						|
{
 | 
						|
   logger_->debug("Deinitialize()");
 | 
						|
 | 
						|
   DrawLayer::Deinitialize();
 | 
						|
}
 | 
						|
 | 
						|
} // namespace map
 | 
						|
} // namespace qt
 | 
						|
} // namespace scwx
 |