#include "tooltips.h" #include Gdk::Rectangle Tooltips::drawn_tooltips_rectangle=Gdk::Rectangle(); Tooltip::Tooltip(std::shared_ptr widget, Gtk::TextView& text_view, Glib::RefPtr start_mark, Glib::RefPtr end_mark): widget(widget), text_view(text_view), Gtk::Dialog("", (Gtk::Window&)*text_view.get_toplevel()), start_mark(start_mark), end_mark(end_mark) { get_content_area()->add(*widget); property_decorated()=false; set_accept_focus(false); signal_realize().connect([this](){ adjust(); //Fix for older GTK+ versions? }); } void Tooltip::update() { auto iter=start_mark->get_iter(); auto end_iter=end_mark->get_iter(); if(iter.get_offset()get_root_coords(activation_rectangle.get_x(), activation_rectangle.get_y(), root_x, root_y); Gdk::Rectangle rectangle; rectangle.set_x(root_x); rectangle.set_y(root_y-tooltip_height); rectangle.set_width(tooltip_width); rectangle.set_height(tooltip_height); if(Tooltips::drawn_tooltips_rectangle.get_width()!=0) { if(rectangle.intersects(Tooltips::drawn_tooltips_rectangle)) rectangle.set_y(Tooltips::drawn_tooltips_rectangle.get_y()-tooltip_height); Tooltips::drawn_tooltips_rectangle.join(rectangle); } else Tooltips::drawn_tooltips_rectangle=rectangle; move(rectangle.get_x(), rectangle.get_y()); adjusted=true; } void Tooltips::show(const Gdk::Rectangle& rectangle) { for(auto& tooltip: *this) { tooltip.update(); if(rectangle.intersects(tooltip.activation_rectangle)) { tooltip.show_all(); if(tooltip.get_realized()) tooltip.adjust(); } else tooltip.hide(); } } void Tooltips::show() { for(auto& tooltip: *this) { tooltip.update(); tooltip.show_all(); if(tooltip.get_realized()) tooltip.adjust(); } } void Tooltips::hide() { for(auto& tooltip: *this) { tooltip.hide(); } }