Handle mouse button press of alert

This commit is contained in:
Dan Paulat 2024-07-27 01:05:36 -05:00
parent 2ab8f3a77a
commit efb03ab9cc
4 changed files with 67 additions and 43 deletions

View file

@ -34,7 +34,7 @@ static constexpr std::size_t kIntegersPerVertex_ = 4;
static constexpr std::size_t kIntegerBufferLength_ = static constexpr std::size_t kIntegerBufferLength_ =
kNumTriangles * kVerticesPerTriangle * kIntegersPerVertex_; kNumTriangles * kVerticesPerTriangle * kIntegersPerVertex_;
struct GeoLineDrawItem struct GeoLineDrawItem : types::EventHandler
{ {
bool visible_ {true}; bool visible_ {true};
units::length::nautical_miles<double> threshold_ {}; units::length::nautical_miles<double> threshold_ {};
@ -57,7 +57,7 @@ class GeoLines::Impl
public: public:
struct LineHoverEntry struct LineHoverEntry
{ {
std::shared_ptr<const GeoLineDrawItem> di_; std::shared_ptr<GeoLineDrawItem> di_;
glm::vec2 p1_; glm::vec2 p1_;
glm::vec2 p2_; glm::vec2 p2_;
@ -86,9 +86,9 @@ public:
void Update(); void Update();
void UpdateBuffers(); void UpdateBuffers();
void UpdateModifiedLineBuffers(); void UpdateModifiedLineBuffers();
void UpdateSingleBuffer(const std::shared_ptr<const GeoLineDrawItem>& di, void UpdateSingleBuffer(const std::shared_ptr<GeoLineDrawItem>& di,
std::size_t lineIndex, std::size_t lineIndex,
std::vector<float>& linesBuffer, std::vector<float>& linesBuffer,
std::vector<GLint>& integerBuffer, std::vector<GLint>& integerBuffer,
std::vector<LineHoverEntry>& hoverLines); std::vector<LineHoverEntry>& hoverLines);
@ -517,11 +517,11 @@ void GeoLines::Impl::UpdateModifiedLineBuffers()
} }
void GeoLines::Impl::UpdateSingleBuffer( void GeoLines::Impl::UpdateSingleBuffer(
const std::shared_ptr<const GeoLineDrawItem>& di, const std::shared_ptr<GeoLineDrawItem>& di,
std::size_t lineIndex, std::size_t lineIndex,
std::vector<float>& lineBuffer, std::vector<float>& lineBuffer,
std::vector<GLint>& integerBuffer, std::vector<GLint>& integerBuffer,
std::vector<LineHoverEntry>& hoverLines) std::vector<LineHoverEntry>& hoverLines)
{ {
// Threshold value // Threshold value
units::length::nautical_miles<double> threshold = di->threshold_; units::length::nautical_miles<double> threshold = di->threshold_;
@ -625,8 +625,8 @@ void GeoLines::Impl::UpdateSingleBuffer(
hoverLines.end(), hoverLines.end(),
[&di](auto& entry) { return entry.di_ == di; }); [&di](auto& entry) { return entry.di_ == di; });
if (di->visible_ && if (di->visible_ && (!di->hoverText_.empty() ||
(!di->hoverText_.empty() || di->hoverCallback_ != nullptr)) di->hoverCallback_ != nullptr || di->event_ != nullptr))
{ {
const units::angle::radians<double> radians = angle; const units::angle::radians<double> radians = angle;
@ -697,7 +697,7 @@ bool GeoLines::RunMousePicking(
const QPointF& mouseGlobalPos, const QPointF& mouseGlobalPos,
const glm::vec2& mouseCoords, const glm::vec2& mouseCoords,
const common::Coordinate& /* mouseGeoCoords */, const common::Coordinate& /* mouseGeoCoords */,
std::shared_ptr<types::EventHandler>& /* eventHandler */) std::shared_ptr<types::EventHandler>& eventHandler)
{ {
std::unique_lock lock {p->lineMutex_}; std::unique_lock lock {p->lineMutex_};
@ -790,17 +790,31 @@ bool GeoLines::RunMousePicking(
if (!it->di_->hoverText_.empty()) if (!it->di_->hoverText_.empty())
{ {
// Show tooltip
util::tooltip::Show(it->di_->hoverText_, mouseGlobalPos); util::tooltip::Show(it->di_->hoverText_, mouseGlobalPos);
} }
else if (it->di_->hoverCallback_ != nullptr) else if (it->di_->hoverCallback_ != nullptr)
{ {
it->di_->hoverCallback_(it->di_, mouseGlobalPos); it->di_->hoverCallback_(it->di_, mouseGlobalPos);
} }
if (it->di_->event_ != nullptr)
{
// Register event handler
eventHandler = it->di_;
}
} }
return itemPicked; return itemPicked;
} }
void GeoLines::RegisterEventHandler(
const std::shared_ptr<GeoLineDrawItem>& di,
const std::function<void(QEvent*)>& eventHandler)
{
di->event_ = eventHandler;
}
} // namespace draw } // namespace draw
} // namespace gl } // namespace gl
} // namespace qt } // namespace qt

View file

@ -19,7 +19,7 @@ struct GeoLineDrawItem;
class GeoLines : public DrawItem class GeoLines : public DrawItem
{ {
public: public:
typedef std::function<void(std::shared_ptr<const GeoLineDrawItem>&, typedef std::function<void(std::shared_ptr<GeoLineDrawItem>&,
const QPointF&)> const QPointF&)>
HoverCallback; HoverCallback;
@ -159,6 +159,16 @@ public:
*/ */
void FinishLines(); void FinishLines();
/**
* Registers an event handler for a geo line.
*
* @param [in] di Geo line draw item
* @param [in] eventHandler Event handler function
*/
static void
RegisterEventHandler(const std::shared_ptr<GeoLineDrawItem>& di,
const std::function<void(QEvent*)>& eventHandler);
private: private:
class Impl; class Impl;
std::unique_ptr<Impl> p; std::unique_ptr<Impl> p;

View file

@ -15,6 +15,7 @@
#include <boost/algorithm/string/join.hpp> #include <boost/algorithm/string/join.hpp>
#include <boost/container/stable_vector.hpp> #include <boost/container/stable_vector.hpp>
#include <boost/container_hash/hash.hpp> #include <boost/container_hash/hash.hpp>
#include <QEvent>
namespace scwx namespace scwx
{ {
@ -140,9 +141,10 @@ public:
const std::shared_ptr<AlertLayerHandler::SegmentRecord>& segmentRecord); const std::shared_ptr<AlertLayerHandler::SegmentRecord>& segmentRecord);
void ConnectAlertHandlerSignals(); void ConnectAlertHandlerSignals();
void ConnectSignals(); void ConnectSignals();
void void HandleGeoLinesEvent(std::shared_ptr<gl::draw::GeoLineDrawItem>& di,
HandleGeoLinesHover(std::shared_ptr<const gl::draw::GeoLineDrawItem>& di, QEvent* ev);
const QPointF& mouseGlobalPos); void HandleGeoLinesHover(std::shared_ptr<gl::draw::GeoLineDrawItem>& di,
const QPointF& mouseGlobalPos);
void AddLine(std::shared_ptr<gl::draw::GeoLines>& geoLines, void AddLine(std::shared_ptr<gl::draw::GeoLines>& geoLines,
std::shared_ptr<gl::draw::GeoLineDrawItem>& di, std::shared_ptr<gl::draw::GeoLineDrawItem>& di,
@ -256,22 +258,6 @@ void AlertLayer::Deinitialize()
DrawLayer::Deinitialize(); DrawLayer::Deinitialize();
} }
bool AlertLayer::RunMousePicking(
const QMapLibre::CustomLayerRenderParameters& params,
const QPointF& mouseLocalPos,
const QPointF& mouseGlobalPos,
const glm::vec2& mouseCoords,
const common::Coordinate& mouseGeoCoords,
std::shared_ptr<types::EventHandler>& eventHandler)
{
return DrawLayer::RunMousePicking(params,
mouseLocalPos,
mouseGlobalPos,
mouseCoords,
mouseGeoCoords,
eventHandler);
}
void AlertLayerHandler::HandleAlert(const types::TextEventKey& key, void AlertLayerHandler::HandleAlert(const types::TextEventKey& key,
size_t messageIndex) size_t messageIndex)
{ {
@ -531,12 +517,34 @@ void AlertLayer::Impl::AddLine(std::shared_ptr<gl::draw::GeoLines>& geoLines,
this, this,
std::placeholders::_1, std::placeholders::_1,
std::placeholders::_2)); std::placeholders::_2));
gl::draw::GeoLines::RegisterEventHandler(
di,
std::bind(&AlertLayer::Impl::HandleGeoLinesEvent,
this,
di,
std::placeholders::_1));
}
}
void AlertLayer::Impl::HandleGeoLinesEvent(
std::shared_ptr<gl::draw::GeoLineDrawItem>& di, QEvent* ev)
{
switch (ev->type())
{
case QEvent::Type::MouseButtonPress:
auto it = segmentsByLine_.find(di);
if (it != segmentsByLine_.cend())
{
logger_->info("Selected alert: {}", it->second->key_.ToString());
}
break;
} }
} }
void AlertLayer::Impl::HandleGeoLinesHover( void AlertLayer::Impl::HandleGeoLinesHover(
std::shared_ptr<const gl::draw::GeoLineDrawItem>& di, std::shared_ptr<gl::draw::GeoLineDrawItem>& di,
const QPointF& mouseGlobalPos) const QPointF& mouseGlobalPos)
{ {
if (di != lastHoverDi_) if (di != lastHoverDi_)
{ {

View file

@ -27,14 +27,6 @@ public:
void Render(const QMapLibre::CustomLayerRenderParameters&) override final; void Render(const QMapLibre::CustomLayerRenderParameters&) override final;
void Deinitialize() override final; void Deinitialize() override final;
bool RunMousePicking(
const QMapLibre::CustomLayerRenderParameters& params,
const QPointF& mouseLocalPos,
const QPointF& mouseGlobalPos,
const glm::vec2& mouseCoords,
const common::Coordinate& mouseGeoCoords,
std::shared_ptr<types::EventHandler>& eventHandler) override final;
private: private:
class Impl; class Impl;
std::unique_ptr<Impl> p; std::unique_ptr<Impl> p;