Add custom marker icons, and rework how marker icons are handled.

This commit is contained in:
AdenKoperczak 2024-12-09 13:47:01 -05:00
parent 3685599693
commit 5bb4a7f95a
10 changed files with 368 additions and 204 deletions

View file

@ -30,11 +30,16 @@ public:
{
ConnectSignals();
}
~Impl() {}
~Impl() = default;
void ReloadMarkers();
void ConnectSignals();
std::shared_ptr<manager::MarkerManager> markerManager_ {
manager::MarkerManager::Instance()};
void set_icon_sheets();
MarkerLayer* self_;
std::shared_ptr<gl::draw::GeoIcons> geoIcons_;
@ -43,25 +48,26 @@ public:
void MarkerLayer::Impl::ConnectSignals()
{
auto markerManager = manager::MarkerManager::Instance();
QObject::connect(markerManager.get(),
&manager::MarkerManager::MarkersUpdated,
self_,
[this]()
{
this->ReloadMarkers();
});
QObject::connect(markerManager_.get(),
&manager::MarkerManager::MarkersUpdated,
self_,
[this]() { ReloadMarkers(); });
QObject::connect(markerManager_.get(),
&manager::MarkerManager::IconsReady,
self_,
[this]() { set_icon_sheets(); });
QObject::connect(markerManager_.get(),
&manager::MarkerManager::IconAdded,
self_,
[this]() { set_icon_sheets(); });
}
void MarkerLayer::Impl::ReloadMarkers()
{
logger_->debug("ReloadMarkers()");
auto markerManager = manager::MarkerManager::Instance();
geoIcons_->StartIcons();
markerManager->for_each(
markerManager_->for_each(
[this](const types::MarkerInfo& marker)
{
// must use local ID, instead of reference to marker in event handler
@ -69,6 +75,7 @@ void MarkerLayer::Impl::ReloadMarkers()
types::MarkerId id = marker.id;
std::shared_ptr<gl::draw::GeoIconDrawItem> icon = geoIcons_->AddIcon();
geoIcons_->SetIconTexture(icon, marker.iconName, 0);
geoIcons_->SetIconLocation(icon, marker.latitude, marker.longitude);
geoIcons_->SetIconHoverText(icon, marker.name);
@ -81,7 +88,7 @@ void MarkerLayer::Impl::ReloadMarkers()
{
case QEvent::Type::MouseButtonPress:
{
QMouseEvent* mouseEvent = reinterpret_cast<QMouseEvent*>(ev);
auto* mouseEvent = reinterpret_cast<QMouseEvent*>(ev);
if (mouseEvent->buttons() == Qt::MouseButton::RightButton)
{
editMarkerDialog_->setup(id);
@ -113,17 +120,24 @@ void MarkerLayer::Initialize()
logger_->debug("Initialize()");
DrawLayer::Initialize();
p->geoIcons_->StartIconSheets();
for (auto& markerIcon : types::getMarkerIcons())
{
p->geoIcons_->AddIconSheet(
markerIcon.name, 0, 0, markerIcon.hotX, markerIcon.hotY);
}
p->geoIcons_->FinishIconSheets();
p->set_icon_sheets();
p->ReloadMarkers();
}
void MarkerLayer::Impl::set_icon_sheets()
{
geoIcons_->StartIconSheets();
for (auto& markerIcon : markerManager_->get_icons())
{
geoIcons_->AddIconSheet(markerIcon.second.name,
0,
0,
markerIcon.second.hotX,
markerIcon.second.hotY);
}
geoIcons_->FinishIconSheets();
}
void MarkerLayer::Render(const QMapLibre::CustomLayerRenderParameters& params)
{
gl::OpenGLFunctions& gl = context()->gl();