mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-10-30 21:30:05 +00:00
Add ability to install event handlers from mouse picking
This commit is contained in:
parent
ff882f5c06
commit
b3e035c53d
26 changed files with 222 additions and 76 deletions
|
|
@ -58,7 +58,8 @@ bool DrawItem::RunMousePicking(
|
|||
const QPointF& /* mouseLocalPos */,
|
||||
const QPointF& /* mouseGlobalPos */,
|
||||
const glm::vec2& /* mouseCoords */,
|
||||
const common::Coordinate& /* mouseGeoCoords */)
|
||||
const common::Coordinate& /* mouseGeoCoords */,
|
||||
std::shared_ptr<types::EventHandler>& /* eventHandler */)
|
||||
{
|
||||
// By default, the draw item is not picked
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
#pragma once
|
||||
|
||||
#include <scwx/qt/gl/gl.hpp>
|
||||
#include <scwx/qt/types/event_types.hpp>
|
||||
#include <scwx/common/geographic.hpp>
|
||||
|
||||
#include <memory>
|
||||
|
|
@ -43,15 +44,17 @@ public:
|
|||
* @param [in] mouseGlobalPos Mouse cursor screen position
|
||||
* @param [in] mouseCoords Mouse cursor location in map screen coordinates
|
||||
* @param [in] mouseGeoCoords Mouse cursor location in geographic coordinates
|
||||
* @param [out] eventHandler Event handler associated with picked draw item
|
||||
*
|
||||
* @return true if the draw item was picked, otherwise false
|
||||
*/
|
||||
virtual bool
|
||||
RunMousePicking(const QMapLibreGL::CustomLayerRenderParameters& params,
|
||||
const QPointF& mouseLocalPos,
|
||||
const QPointF& mouseGlobalPos,
|
||||
const glm::vec2& mouseCoords,
|
||||
const common::Coordinate& mouseGeoCoords);
|
||||
const QPointF& mouseLocalPos,
|
||||
const QPointF& mouseGlobalPos,
|
||||
const glm::vec2& mouseCoords,
|
||||
const common::Coordinate& mouseGeoCoords,
|
||||
std::shared_ptr<types::EventHandler>& eventHandler);
|
||||
|
||||
protected:
|
||||
void
|
||||
|
|
|
|||
|
|
@ -736,7 +736,8 @@ bool GeoIcons::RunMousePicking(
|
|||
const QPointF& /* mouseLocalPos */,
|
||||
const QPointF& mouseGlobalPos,
|
||||
const glm::vec2& mouseCoords,
|
||||
const common::Coordinate& /* mouseGeoCoords */)
|
||||
const common::Coordinate& /* mouseGeoCoords */,
|
||||
std::shared_ptr<types::EventHandler>& /* eventHandler */)
|
||||
{
|
||||
std::unique_lock lock {p->iconMutex_};
|
||||
|
||||
|
|
|
|||
|
|
@ -37,11 +37,13 @@ public:
|
|||
bool textureAtlasChanged) override;
|
||||
void Deinitialize() override;
|
||||
|
||||
bool RunMousePicking(const QMapLibreGL::CustomLayerRenderParameters& params,
|
||||
const QPointF& mouseLocalPos,
|
||||
const QPointF& mouseGlobalPos,
|
||||
const glm::vec2& mouseCoords,
|
||||
const common::Coordinate& mouseGeoCoords) override;
|
||||
bool
|
||||
RunMousePicking(const QMapLibreGL::CustomLayerRenderParameters& params,
|
||||
const QPointF& mouseLocalPos,
|
||||
const QPointF& mouseGlobalPos,
|
||||
const glm::vec2& mouseCoords,
|
||||
const common::Coordinate& mouseGeoCoords,
|
||||
std::shared_ptr<types::EventHandler>& eventHandler) override;
|
||||
|
||||
/**
|
||||
* Sets the visibility of the geo icons.
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ static constexpr std::size_t kIconBufferLength =
|
|||
static constexpr std::size_t kTextureBufferLength =
|
||||
kNumTriangles * kVerticesPerTriangle * kPointsPerTexCoord;
|
||||
|
||||
struct IconDrawItem
|
||||
struct IconDrawItem : types::EventHandler
|
||||
{
|
||||
boost::gil::rgba32f_pixel_t modulate_ {1.0f, 1.0f, 1.0f, 1.0f};
|
||||
double x_ {};
|
||||
|
|
@ -424,7 +424,7 @@ void Icons::Impl::UpdateBuffers()
|
|||
x, y, lx, ty, mc0, mc1, mc2, mc3, a // TL
|
||||
});
|
||||
|
||||
if (!di->hoverText_.empty())
|
||||
if (!di->hoverText_.empty() || di->event_ != nullptr)
|
||||
{
|
||||
const units::angle::radians<double> radians = angle;
|
||||
|
||||
|
|
@ -579,7 +579,8 @@ bool Icons::RunMousePicking(
|
|||
const QPointF& mouseLocalPos,
|
||||
const QPointF& mouseGlobalPos,
|
||||
const glm::vec2& /* mouseCoords */,
|
||||
const common::Coordinate& /* mouseGeoCoords */)
|
||||
const common::Coordinate& /* mouseGeoCoords */,
|
||||
std::shared_ptr<types::EventHandler>& eventHandler)
|
||||
{
|
||||
std::unique_lock lock {p->iconMutex_};
|
||||
|
||||
|
|
@ -617,12 +618,29 @@ bool Icons::RunMousePicking(
|
|||
if (it != p->currentHoverIcons_.crend())
|
||||
{
|
||||
itemPicked = true;
|
||||
util::tooltip::Show(it->di_->hoverText_, mouseGlobalPos);
|
||||
|
||||
if (!it->di_->hoverText_.empty())
|
||||
{
|
||||
// Show tooltip
|
||||
util::tooltip::Show(it->di_->hoverText_, mouseGlobalPos);
|
||||
}
|
||||
if (it->di_->event_ != nullptr)
|
||||
{
|
||||
// Register event handler
|
||||
eventHandler = it->di_;
|
||||
}
|
||||
}
|
||||
|
||||
return itemPicked;
|
||||
}
|
||||
|
||||
void Icons::RegisterEventHandler(
|
||||
const std::shared_ptr<IconDrawItem>& di,
|
||||
const std::function<void(QEvent*)>& eventHandler)
|
||||
{
|
||||
di->event_ = eventHandler;
|
||||
}
|
||||
|
||||
} // namespace draw
|
||||
} // namespace gl
|
||||
} // namespace qt
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@
|
|||
#include <boost/gil.hpp>
|
||||
#include <units/angle.h>
|
||||
|
||||
class QEvent;
|
||||
|
||||
namespace scwx
|
||||
{
|
||||
namespace qt
|
||||
|
|
@ -34,11 +36,13 @@ public:
|
|||
bool textureAtlasChanged) override;
|
||||
void Deinitialize() override;
|
||||
|
||||
bool RunMousePicking(const QMapLibreGL::CustomLayerRenderParameters& params,
|
||||
const QPointF& mouseLocalPos,
|
||||
const QPointF& mouseGlobalPos,
|
||||
const glm::vec2& mouseCoords,
|
||||
const common::Coordinate& mouseGeoCoords) override;
|
||||
bool
|
||||
RunMousePicking(const QMapLibreGL::CustomLayerRenderParameters& params,
|
||||
const QPointF& mouseLocalPos,
|
||||
const QPointF& mouseGlobalPos,
|
||||
const glm::vec2& mouseCoords,
|
||||
const common::Coordinate& mouseGeoCoords,
|
||||
std::shared_ptr<types::EventHandler>& eventHandler) override;
|
||||
|
||||
/**
|
||||
* Sets the visibility of the icons.
|
||||
|
|
@ -151,6 +155,16 @@ public:
|
|||
*/
|
||||
void FinishIcons();
|
||||
|
||||
/**
|
||||
* Registers an event handler for an icon.
|
||||
*
|
||||
* @param [in] di Icon draw item
|
||||
* @param [in] eventHandler Event handler function
|
||||
*/
|
||||
static void
|
||||
RegisterEventHandler(const std::shared_ptr<IconDrawItem>& di,
|
||||
const std::function<void(QEvent*)>& eventHandler);
|
||||
|
||||
private:
|
||||
class Impl;
|
||||
|
||||
|
|
|
|||
|
|
@ -689,7 +689,8 @@ bool PlacefileIcons::RunMousePicking(
|
|||
const QPointF& /* mouseLocalPos */,
|
||||
const QPointF& mouseGlobalPos,
|
||||
const glm::vec2& mouseCoords,
|
||||
const common::Coordinate& /* mouseGeoCoords */)
|
||||
const common::Coordinate& /* mouseGeoCoords */,
|
||||
std::shared_ptr<types::EventHandler>& /* eventHandler */)
|
||||
{
|
||||
std::unique_lock lock {p->iconMutex_};
|
||||
|
||||
|
|
|
|||
|
|
@ -35,11 +35,13 @@ public:
|
|||
bool textureAtlasChanged) override;
|
||||
void Deinitialize() override;
|
||||
|
||||
bool RunMousePicking(const QMapLibreGL::CustomLayerRenderParameters& params,
|
||||
const QPointF& mouseLocalPos,
|
||||
const QPointF& mouseGlobalPos,
|
||||
const glm::vec2& mouseCoords,
|
||||
const common::Coordinate& mouseGeoCoords) override;
|
||||
bool
|
||||
RunMousePicking(const QMapLibreGL::CustomLayerRenderParameters& params,
|
||||
const QPointF& mouseLocalPos,
|
||||
const QPointF& mouseGlobalPos,
|
||||
const glm::vec2& mouseCoords,
|
||||
const common::Coordinate& mouseGeoCoords,
|
||||
std::shared_ptr<types::EventHandler>& eventHandler) override;
|
||||
|
||||
/**
|
||||
* Resets and prepares the draw item for adding a new set of icons.
|
||||
|
|
|
|||
|
|
@ -500,7 +500,8 @@ bool PlacefileLines::RunMousePicking(
|
|||
const QPointF& /* mouseLocalPos */,
|
||||
const QPointF& mouseGlobalPos,
|
||||
const glm::vec2& mouseCoords,
|
||||
const common::Coordinate& /* mouseGeoCoords */)
|
||||
const common::Coordinate& /* mouseGeoCoords */,
|
||||
std::shared_ptr<types::EventHandler>& /* eventHandler */)
|
||||
{
|
||||
std::unique_lock lock {p->lineMutex_};
|
||||
|
||||
|
|
|
|||
|
|
@ -32,11 +32,13 @@ public:
|
|||
void Render(const QMapLibreGL::CustomLayerRenderParameters& params) override;
|
||||
void Deinitialize() override;
|
||||
|
||||
bool RunMousePicking(const QMapLibreGL::CustomLayerRenderParameters& params,
|
||||
const QPointF& mouseLocalPos,
|
||||
const QPointF& mouseGlobalPos,
|
||||
const glm::vec2& mouseCoords,
|
||||
const common::Coordinate& mouseGeoCoords) override;
|
||||
bool
|
||||
RunMousePicking(const QMapLibreGL::CustomLayerRenderParameters& params,
|
||||
const QPointF& mouseLocalPos,
|
||||
const QPointF& mouseGlobalPos,
|
||||
const glm::vec2& mouseCoords,
|
||||
const common::Coordinate& mouseGeoCoords,
|
||||
std::shared_ptr<types::EventHandler>& eventHandler) override;
|
||||
|
||||
/**
|
||||
* Resets and prepares the draw item for adding a new set of lines.
|
||||
|
|
|
|||
|
|
@ -242,7 +242,8 @@ bool PlacefileText::RunMousePicking(
|
|||
const QPointF& /* mouseLocalPos */,
|
||||
const QPointF& mouseGlobalPos,
|
||||
const glm::vec2& /* mouseCoords */,
|
||||
const common::Coordinate& /* mouseGeoCoords */)
|
||||
const common::Coordinate& /* mouseGeoCoords */,
|
||||
std::shared_ptr<types::EventHandler>& /* eventHandler */)
|
||||
{
|
||||
bool itemPicked = false;
|
||||
|
||||
|
|
|
|||
|
|
@ -37,11 +37,13 @@ public:
|
|||
void Render(const QMapLibreGL::CustomLayerRenderParameters& params) override;
|
||||
void Deinitialize() override;
|
||||
|
||||
bool RunMousePicking(const QMapLibreGL::CustomLayerRenderParameters& params,
|
||||
const QPointF& mouseLocalPos,
|
||||
const QPointF& mouseGlobalPos,
|
||||
const glm::vec2& mouseCoords,
|
||||
const common::Coordinate& mouseGeoCoords) override;
|
||||
bool
|
||||
RunMousePicking(const QMapLibreGL::CustomLayerRenderParameters& params,
|
||||
const QPointF& mouseLocalPos,
|
||||
const QPointF& mouseGlobalPos,
|
||||
const glm::vec2& mouseCoords,
|
||||
const common::Coordinate& mouseGeoCoords,
|
||||
std::shared_ptr<types::EventHandler>& eventHandler) override;
|
||||
|
||||
/**
|
||||
* Resets and prepares the draw item for adding a new set of text.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue