#pragma once #include "gtkmm.h" #include #include #include #include class Tooltip { public: Tooltip(std::function()> create_tooltip_buffer, Gtk::TextView *text_view, Glib::RefPtr start_mark, Glib::RefPtr end_mark); Tooltip(std::function()> create_tooltip_buffer) : Tooltip(create_tooltip_buffer, nullptr, Glib::RefPtr(), Glib::RefPtr()) {} ~Tooltip(); void update(); void show(bool disregard_drawn=false, const std::function &on_motion=nullptr); void hide(const std::pair &last_mouse_pos = {-1, -1}, const std::pair &mouse_pos = {-1, -1}); Gdk::Rectangle activation_rectangle; Glib::RefPtr start_mark; Glib::RefPtr end_mark; Glib::RefPtr text_buffer; private: std::unique_ptr window; void wrap_lines(); std::function()> create_tooltip_buffer; Gtk::TextView *text_view; std::pair size; Gdk::Rectangle rectangle; bool shown=false; }; class Tooltips { public: static std::set shown_tooltips; static Gdk::Rectangle drawn_tooltips_rectangle; static void init() {drawn_tooltips_rectangle=Gdk::Rectangle();} void show(const Gdk::Rectangle& rectangle, bool disregard_drawn=false); void show(bool disregard_drawn=false); void hide(const std::pair &last_mouse_pos = {-1, -1}, const std::pair &mouse_pos = {-1, -1}); void clear() {tooltip_list.clear();}; template void emplace_back(Ts&&... params) { tooltip_list.emplace_back(std::forward(params)...); } std::function on_motion; private: std::list tooltip_list; };