#pragma once #include "source_base.hpp" #include #include #include #include #include #include #include #include class Tooltip { public: Tooltip(Gsv::View *view, const Gtk::TextIter &start_iter, const Gtk::TextIter &end_iter, std::function set_buffer_); Tooltip(std::function set_buffer_); ~Tooltip(); void update(); void show(bool disregard_drawn = false, const std::function &on_motion = nullptr); void hide(const boost::optional> &last_mouse_pos, const boost::optional> &mouse_pos); Gdk::Rectangle activation_rectangle; Source::Mark start_mark, end_mark; Glib::RefPtr buffer; void insert_with_links_tagged(const std::string &text); void insert_markdown(const std::string &text); void insert_code(const std::string &code, boost::variant> language = Glib::RefPtr{}, bool block = false); void insert_doxygen(const std::string &input, bool remove_delimiters); /// Inserts python docstring void insert_docstring(const std::string &input); /// Remove empty lines at end of buffer void remove_trailing_newlines(); private: std::unique_ptr window; Gtk::ScrolledWindow *scrolled_window = nullptr; Gsv::View *view; std::function set_buffer; /// Initial maximum number of characters on each line int max_columns = 80; std::pair size; Gdk::Rectangle rectangle; bool shown = false; Glib::RefPtr link_tag; Glib::RefPtr h1_tag; Glib::RefPtr h2_tag; Glib::RefPtr h3_tag; Glib::RefPtr code_tag; Glib::RefPtr code_block_tag; Glib::RefPtr bold_tag; Glib::RefPtr italic_tag; Glib::RefPtr strikethrough_tag; std::map, std::string> links; std::map, std::string> reference_links; std::unordered_map references; void wrap_lines(); void create_tags(); }; 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 boost::optional> &last_mouse_pos = {}, const boost::optional> &mouse_pos = {}); 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; };