(Win Only) Detection of cursor size, to place tooltips on scene, performed on tooltip text setting instead of being repeated every frame

This commit is contained in:
enricoturri1966 2022-12-06 13:49:05 +01:00
parent cf37f154ee
commit 5351137183
3 changed files with 38 additions and 39 deletions

View File

@ -773,18 +773,8 @@ void GLCanvas3D::Labels::render(const std::vector<const ModelInstance*>& sorted_
} }
} }
void GLCanvas3D::Tooltip::set_text(const std::string& text) static float get_cursor_height()
{ {
// If the mouse is inside an ImGUI dialog, then the tooltip is suppressed.
m_text = m_in_imgui ? std::string() : text;
}
void GLCanvas3D::Tooltip::render(const Vec2d& mouse_position, GLCanvas3D& canvas)
{
static ImVec2 size(0.0f, 0.0f);
auto validate_position = [](const Vec2d& position, const GLCanvas3D& canvas, const ImVec2& wnd_size) {
auto calc_cursor_height = []() {
float ret = 16.0f; float ret = 16.0f;
#ifdef _WIN32 #ifdef _WIN32
// see: https://forums.codeguru.com/showthread.php?449040-get-the-system-current-cursor-size // see: https://forums.codeguru.com/showthread.php?449040-get-the-system-current-cursor-size
@ -794,8 +784,8 @@ void GLCanvas3D::Tooltip::render(const Vec2d& mouse_position, GLCanvas3D& canvas
if (::GetIconInfo((HICON)GetCursor(), &ii) != 0) { if (::GetIconInfo((HICON)GetCursor(), &ii) != 0) {
BITMAP bitmap; BITMAP bitmap;
::GetObject(ii.hbmMask, sizeof(BITMAP), &bitmap); ::GetObject(ii.hbmMask, sizeof(BITMAP), &bitmap);
int width = bitmap.bmWidth; const int width = bitmap.bmWidth;
int height = (ii.hbmColor == nullptr) ? bitmap.bmHeight / 2 : bitmap.bmHeight; const int height = (ii.hbmColor == nullptr) ? bitmap.bmHeight / 2 : bitmap.bmHeight;
HDC dc = ::CreateCompatibleDC(nullptr); HDC dc = ::CreateCompatibleDC(nullptr);
if (dc != nullptr) { if (dc != nullptr) {
if (::SelectObject(dc, ii.hbmMask) != nullptr) { if (::SelectObject(dc, ii.hbmMask) != nullptr) {
@ -815,11 +805,23 @@ void GLCanvas3D::Tooltip::render(const Vec2d& mouse_position, GLCanvas3D& canvas
} }
#endif // _WIN32 #endif // _WIN32
return ret; return ret;
}; }
void GLCanvas3D::Tooltip::set_text(const std::string& text)
{
// If the mouse is inside an ImGUI dialog, then the tooltip is suppressed.
m_text = m_in_imgui ? std::string() : text;
m_cursor_height = get_cursor_height();
}
void GLCanvas3D::Tooltip::render(const Vec2d& mouse_position, GLCanvas3D& canvas)
{
static ImVec2 size(0.0f, 0.0f);
auto validate_position = [this](const Vec2d& position, const GLCanvas3D& canvas, const ImVec2& wnd_size) {
const Size cnv_size = canvas.get_canvas_size(); const Size cnv_size = canvas.get_canvas_size();
const float x = std::clamp(float(position.x()), 0.0f, float(cnv_size.get_width()) - wnd_size.x); const float x = std::clamp(float(position.x()), 0.0f, float(cnv_size.get_width()) - wnd_size.x);
const float y = std::clamp(float(position.y()) + calc_cursor_height(), 0.0f, float(cnv_size.get_height()) - wnd_size.y); const float y = std::clamp(float(position.y()) + m_cursor_height, 0.0f, float(cnv_size.get_height()) - wnd_size.y);
return Vec2f(x, y); return Vec2f(x, y);
}; };

View File

@ -400,6 +400,7 @@ class GLCanvas3D
std::chrono::steady_clock::time_point m_start_time; std::chrono::steady_clock::time_point m_start_time;
// Indicator that the mouse is inside an ImGUI dialog, therefore the tooltip should be suppressed. // Indicator that the mouse is inside an ImGUI dialog, therefore the tooltip should be suppressed.
bool m_in_imgui = false; bool m_in_imgui = false;
float m_cursor_height{ 16.0f };
public: public:
bool is_empty() const { return m_text.empty(); } bool is_empty() const { return m_text.empty(); }

View File

@ -584,15 +584,11 @@ bool Selection::is_sla_compliant() const
bool Selection::is_single_text() const bool Selection::is_single_text() const
{ {
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#if ENABLE_WORLD_COORDINATE #if ENABLE_WORLD_COORDINATE
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
if (!is_single_volume_or_modifier()) if (!is_single_volume_or_modifier())
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#else #else
if (!is_single_volume() && !is_single_modifier()) if (!is_single_volume() && !is_single_modifier())
#endif // ENABLE_WORLD_COORDINATE #endif // ENABLE_WORLD_COORDINATE
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
return false; return false;
const GLVolume* gl_volume = (*m_volumes)[*m_list.begin()]; const GLVolume* gl_volume = (*m_volumes)[*m_list.begin()];