|
|
|
|
@ -3,18 +3,19 @@
|
|
|
|
|
|
|
|
|
|
Gdk::Rectangle Tooltips::drawn_tooltips_rectangle=Gdk::Rectangle(); |
|
|
|
|
|
|
|
|
|
Tooltip::Tooltip(std::shared_ptr<Gtk::Widget> widget, Gtk::TextView& text_view,
|
|
|
|
|
Tooltip::Tooltip(std::shared_ptr<Gtk::TextView> tooltip_widget, Gtk::TextView& text_view,
|
|
|
|
|
Glib::RefPtr<Gtk::TextBuffer::Mark> start_mark, Glib::RefPtr<Gtk::TextBuffer::Mark> end_mark): |
|
|
|
|
widget(widget), text_view(text_view), Gtk::Window(Gtk::WindowType::WINDOW_POPUP),
|
|
|
|
|
tooltip_widget(tooltip_widget), text_view(text_view), Gtk::Window(Gtk::WindowType::WINDOW_POPUP),
|
|
|
|
|
start_mark(start_mark), end_mark(end_mark) { |
|
|
|
|
add(*widget); |
|
|
|
|
add(*tooltip_widget); |
|
|
|
|
property_decorated()=false; |
|
|
|
|
set_accept_focus(false); |
|
|
|
|
set_skip_taskbar_hint(true); |
|
|
|
|
set_default_size(0, 0); |
|
|
|
|
signal_realize().connect([this](){ |
|
|
|
|
adjust(); //Fix for older GTK+ versions?
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
auto layout=Pango::Layout::create(tooltip_widget->get_pango_context()); |
|
|
|
|
layout->set_text(tooltip_widget->get_buffer()->get_text()); |
|
|
|
|
layout->get_pixel_size(tooltip_width, tooltip_height); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void Tooltip::update() { |
|
|
|
|
@ -34,14 +35,9 @@ void Tooltip::update() {
|
|
|
|
|
text_view.buffer_to_window_coords(Gtk::TextWindowType::TEXT_WINDOW_TEXT, activation_rectangle.get_x(), activation_rectangle.get_y(), location_window_x, location_window_y); |
|
|
|
|
activation_rectangle.set_x(location_window_x); |
|
|
|
|
activation_rectangle.set_y(location_window_y); |
|
|
|
|
adjusted=false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void Tooltip::adjust() { |
|
|
|
|
if(adjusted) |
|
|
|
|
return; |
|
|
|
|
int tooltip_width, tooltip_height; |
|
|
|
|
get_size(tooltip_width, tooltip_height); |
|
|
|
|
int root_x, root_y; |
|
|
|
|
text_view.get_window(Gtk::TextWindowType::TEXT_WINDOW_TEXT)->get_root_coords(activation_rectangle.get_x(), activation_rectangle.get_y(), root_x, root_y); |
|
|
|
|
Gdk::Rectangle rectangle; |
|
|
|
|
@ -59,16 +55,14 @@ void Tooltip::adjust() {
|
|
|
|
|
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(); |
|
|
|
|
tooltip.show_all(); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
tooltip.hide(); |
|
|
|
|
@ -78,9 +72,8 @@ void Tooltips::show(const Gdk::Rectangle& rectangle) {
|
|
|
|
|
void Tooltips::show() { |
|
|
|
|
for(auto& tooltip: *this) { |
|
|
|
|
tooltip.update(); |
|
|
|
|
tooltip.show_all(); |
|
|
|
|
if(tooltip.get_realized()) |
|
|
|
|
tooltip.adjust(); |
|
|
|
|
tooltip.show_all(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|