diff --git a/src/menu.cc b/src/menu.cc index ca59401..4998bee 100644 --- a/src/menu.cc +++ b/src/menu.cc @@ -33,4 +33,3 @@ void Menu::build() { } ui_manager->insert_action_group(action_group); } - diff --git a/src/notebook.cc b/src/notebook.cc index b3d183f..71ec3ed 100644 --- a/src/notebook.cc +++ b/src/notebook.cc @@ -131,9 +131,8 @@ bool Notebook::close_current_page() { source_views.erase(source_views.begin()+ page); scrolled_windows.erase(scrolled_windows.begin()+page); hboxes.erase(hboxes.begin()+page); - if(auto source_clang_view=dynamic_cast(source_view)) { + if(auto source_clang_view=dynamic_cast(source_view)) source_clang_view->delete_object(); - } else delete source_view; } diff --git a/src/source.cc b/src/source.cc index d27e381..783ad12 100644 --- a/src/source.cc +++ b/src/source.cc @@ -496,14 +496,14 @@ void Source::ClangViewParse::update_diagnostics() { auto spelling=diagnostic.spelling; auto severity_spelling=diagnostic.severity_spelling; - auto get_tooltip_buffer=[this, spelling, severity_spelling, diagnostic_tag_name]() { + auto create_tooltip_buffer=[this, spelling, severity_spelling, diagnostic_tag_name]() { auto tooltip_buffer=Gtk::TextBuffer::create(get_buffer()->get_tag_table()); tooltip_buffer->insert_with_tag(tooltip_buffer->get_insert()->get_iter(), severity_spelling, diagnostic_tag_name); tooltip_buffer->insert_at_cursor(":\n"+spelling); //TODO: Insert newlines to clang_tu->diagnostics[c].spelling (use 80 chars, then newline?) return tooltip_buffer; }; - diagnostic_tooltips.emplace_back(get_tooltip_buffer, *this, get_buffer()->create_mark(start), get_buffer()->create_mark(end)); + diagnostic_tooltips.emplace_back(create_tooltip_buffer, *this, get_buffer()->create_mark(start), get_buffer()->create_mark(end)); get_buffer()->apply_tag_by_name(diagnostic_tag_name+"_underline", start, end); } @@ -516,7 +516,7 @@ void Source::ClangViewParse::update_types() { if(token.get_kind()==clang::Token_Identifier && token.has_type()) { auto start=get_buffer()->get_iter_at_offset(token.offsets.first); auto end=get_buffer()->get_iter_at_offset(token.offsets.second); - auto get_tooltip_buffer=[this, &token]() { + auto create_tooltip_buffer=[this, &token]() { auto tooltip_buffer=Gtk::TextBuffer::create(get_buffer()->get_tag_table()); tooltip_buffer->insert_at_cursor("Type: "+token.get_type()); auto brief_comment=token.get_brief_comments(); @@ -525,7 +525,7 @@ void Source::ClangViewParse::update_types() { return tooltip_buffer; }; - type_tooltips.emplace_back(get_tooltip_buffer, *this, get_buffer()->create_mark(start), get_buffer()->create_mark(end)); + type_tooltips.emplace_back(create_tooltip_buffer, *this, get_buffer()->create_mark(start), get_buffer()->create_mark(end)); } } } diff --git a/src/tooltips.cc b/src/tooltips.cc index 62b9476..5afc1f3 100644 --- a/src/tooltips.cc +++ b/src/tooltips.cc @@ -1,11 +1,15 @@ #include "tooltips.h" #include "singletons.h" +namespace sigc { + SIGC_FUNCTORS_DEDUCE_RESULT_TYPE_WITH_DECLTYPE +} + Gdk::Rectangle Tooltips::drawn_tooltips_rectangle=Gdk::Rectangle(); -Tooltip::Tooltip(std::function()> get_buffer, Gtk::TextView& text_view, +Tooltip::Tooltip(std::function()> create_tooltip_buffer, Gtk::TextView& text_view, Glib::RefPtr start_mark, Glib::RefPtr end_mark): -get_buffer(get_buffer), text_view(text_view), +create_tooltip_buffer(create_tooltip_buffer), text_view(text_view), start_mark(start_mark), end_mark(end_mark) {} Tooltip::~Tooltip() { @@ -38,13 +42,17 @@ void Tooltip::adjust(bool disregard_drawn) { window=std::unique_ptr(new Gtk::Window(Gtk::WindowType::WINDOW_POPUP)); window->set_events(Gdk::POINTER_MOTION_MASK); - window->signal_motion_notify_event().connect(sigc::mem_fun(*this, &Tooltip::tooltip_on_motion_notify_event), false); + window->signal_motion_notify_event().connect([this](GdkEventMotion* event){ + window->hide(); + return false; + }); window->property_decorated()=false; window->set_accept_focus(false); window->set_skip_taskbar_hint(true); window->set_default_size(0, 0); - tooltip_widget=std::unique_ptr(new Gtk::TextView(this->get_buffer())); + tooltip_widget=std::unique_ptr(new Gtk::TextView(create_tooltip_buffer())); + wrap_lines(tooltip_widget->get_buffer()); tooltip_widget->set_editable(false); tooltip_widget->override_background_color(Gdk::RGBA(Singleton::Config::source()->background_tooltips)); window->add(*tooltip_widget); @@ -76,9 +84,47 @@ void Tooltip::adjust(bool disregard_drawn) { window->move(rectangle.get_x(), rectangle.get_y()); } -bool Tooltip::tooltip_on_motion_notify_event(GdkEventMotion* event) { - window->hide(); - return false; +void Tooltip::wrap_lines(Glib::RefPtr text_buffer) { + INFO("Tooltip::wrap_lines"); + auto iter=text_buffer->begin(); + + while(iter) { + auto last_space=text_buffer->end(); + bool end=false; + for(unsigned c=0;c<=80;c++) { + if(!iter) { + end=true; + break; + } + if(*iter==' ') + last_space=iter; + if(*iter=='\n') { + end=true; + iter++; + break; + } + iter++; + } + if(!end) { + while(!last_space && iter) { //If no space (word longer than 80) + iter++; + if(iter && *iter==' ') + last_space=iter; + } + if(iter && last_space) { + auto mark=text_buffer->create_mark(last_space); + auto iter_mark=text_buffer->create_mark(iter); + auto last_space_p=last_space++; + text_buffer->erase(last_space, last_space_p); + text_buffer->insert(mark->get_iter(), "\n"); + + iter=iter_mark->get_iter(); + + text_buffer->delete_mark(mark); + text_buffer->delete_mark(iter_mark); + } + } + } } void Tooltips::show(const Gdk::Rectangle& rectangle, bool disregard_drawn) { diff --git a/src/tooltips.h b/src/tooltips.h index e41475f..3d52c27 100644 --- a/src/tooltips.h +++ b/src/tooltips.h @@ -6,7 +6,7 @@ class Tooltip { public: - Tooltip(std::function()> get_buffer, Gtk::TextView& text_view, Glib::RefPtr start_mark, Glib::RefPtr end_mark); + Tooltip(std::function()> create_tooltip_buffer, Gtk::TextView& text_view, Glib::RefPtr start_mark, Glib::RefPtr end_mark); ~Tooltip(); void update(); @@ -15,9 +15,9 @@ public: Gdk::Rectangle activation_rectangle; std::unique_ptr window; private: - bool tooltip_on_motion_notify_event(GdkEventMotion* event); + void wrap_lines(Glib::RefPtr text_buffer); - std::function()> get_buffer; + std::function()> create_tooltip_buffer; std::unique_ptr tooltip_widget; Glib::RefPtr start_mark; Glib::RefPtr end_mark;