Browse Source

Fixed tooltip class.

merge-requests/365/head
eidheim 11 years ago
parent
commit
097bfc65dc
  1. 2
      juci/source.cc
  2. 25
      juci/tooltips.cc
  3. 6
      juci/tooltips.h

2
juci/source.cc

@ -367,7 +367,7 @@ void Source::ClangView::update_diagnostics() {
tooltip_widget->set_editable(false); tooltip_widget->set_editable(false);
tooltip_widget->get_buffer()->insert_with_tag(tooltip_widget->get_buffer()->get_insert()->get_iter(), diagnostic.severity_spelling, diagnostic_tag_name); tooltip_widget->get_buffer()->insert_with_tag(tooltip_widget->get_buffer()->get_insert()->get_iter(), diagnostic.severity_spelling, diagnostic_tag_name);
tooltip_widget->get_buffer()->insert_at_cursor(": \n"+diagnostic.spelling); tooltip_widget->get_buffer()->insert_at_cursor(": \n"+diagnostic.spelling);
//TODO: Insert newlines in tooltip_widget->get_buffer() (use 80 chars, then newline?) //TODO: Insert newlines to diagnostic.spelling (use 80 chars, then newline?)
diagnostic_tooltips.emplace_back(tooltip_widget, *this, get_source_buffer()->create_mark(start), get_source_buffer()->create_mark(end)); diagnostic_tooltips.emplace_back(tooltip_widget, *this, get_source_buffer()->create_mark(start), get_source_buffer()->create_mark(end));
auto tag=buffer->create_tag(); auto tag=buffer->create_tag();

25
juci/tooltips.cc

@ -3,18 +3,19 @@
Gdk::Rectangle Tooltips::drawn_tooltips_rectangle=Gdk::Rectangle(); 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): 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) { start_mark(start_mark), end_mark(end_mark) {
add(*widget); add(*tooltip_widget);
property_decorated()=false; property_decorated()=false;
set_accept_focus(false); set_accept_focus(false);
set_skip_taskbar_hint(true); set_skip_taskbar_hint(true);
set_default_size(0, 0); 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() { 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); 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_x(location_window_x);
activation_rectangle.set_y(location_window_y); activation_rectangle.set_y(location_window_y);
adjusted=false;
} }
void Tooltip::adjust() { void Tooltip::adjust() {
if(adjusted)
return;
int tooltip_width, tooltip_height;
get_size(tooltip_width, tooltip_height);
int root_x, root_y; 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); 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; Gdk::Rectangle rectangle;
@ -59,16 +55,14 @@ void Tooltip::adjust() {
Tooltips::drawn_tooltips_rectangle=rectangle; Tooltips::drawn_tooltips_rectangle=rectangle;
move(rectangle.get_x(), rectangle.get_y()); move(rectangle.get_x(), rectangle.get_y());
adjusted=true;
} }
void Tooltips::show(const Gdk::Rectangle& rectangle) { void Tooltips::show(const Gdk::Rectangle& rectangle) {
for(auto& tooltip: *this) { for(auto& tooltip: *this) {
tooltip.update(); tooltip.update();
if(rectangle.intersects(tooltip.activation_rectangle)) { if(rectangle.intersects(tooltip.activation_rectangle)) {
tooltip.adjust();
tooltip.show_all(); tooltip.show_all();
if(tooltip.get_realized())
tooltip.adjust();
} }
else else
tooltip.hide(); tooltip.hide();
@ -78,9 +72,8 @@ void Tooltips::show(const Gdk::Rectangle& rectangle) {
void Tooltips::show() { void Tooltips::show() {
for(auto& tooltip: *this) { for(auto& tooltip: *this) {
tooltip.update(); tooltip.update();
tooltip.adjust();
tooltip.show_all(); tooltip.show_all();
if(tooltip.get_realized())
tooltip.adjust();
} }
} }

6
juci/tooltips.h

@ -6,18 +6,18 @@
class Tooltip : public Gtk::Window { class Tooltip : public Gtk::Window {
public: public:
Tooltip(std::shared_ptr<Gtk::Widget> widget, Gtk::TextView& text_view, Glib::RefPtr<Gtk::TextBuffer::Mark> start_mark, Glib::RefPtr<Gtk::TextBuffer::Mark> end_mark); 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);
void update(); void update();
void adjust(); void adjust();
Gdk::Rectangle activation_rectangle; Gdk::Rectangle activation_rectangle;
bool adjusted=false;
private: private:
std::shared_ptr<Gtk::Widget> widget; std::shared_ptr<Gtk::TextView> tooltip_widget;
Glib::RefPtr<Gtk::TextBuffer::Mark> start_mark; Glib::RefPtr<Gtk::TextBuffer::Mark> start_mark;
Glib::RefPtr<Gtk::TextBuffer::Mark> end_mark; Glib::RefPtr<Gtk::TextBuffer::Mark> end_mark;
Gtk::TextView& text_view; Gtk::TextView& text_view;
int tooltip_width, tooltip_height;
}; };
class Tooltips : public std::list<Tooltip> { class Tooltips : public std::list<Tooltip> {

Loading…
Cancel
Save