Browse Source

Added line wrapping to tooltips (80 chars max).

merge-requests/365/head
eidheim 10 years ago
parent
commit
05fe364e99
  1. 1
      src/menu.cc
  2. 3
      src/notebook.cc
  3. 8
      src/source.cc
  4. 60
      src/tooltips.cc
  5. 6
      src/tooltips.h

1
src/menu.cc

@ -33,4 +33,3 @@ void Menu::build() {
} }
ui_manager->insert_action_group(action_group); ui_manager->insert_action_group(action_group);
} }

3
src/notebook.cc

@ -131,9 +131,8 @@ bool Notebook::close_current_page() {
source_views.erase(source_views.begin()+ page); source_views.erase(source_views.begin()+ page);
scrolled_windows.erase(scrolled_windows.begin()+page); scrolled_windows.erase(scrolled_windows.begin()+page);
hboxes.erase(hboxes.begin()+page); hboxes.erase(hboxes.begin()+page);
if(auto source_clang_view=dynamic_cast<Source::ClangView*>(source_view)) { if(auto source_clang_view=dynamic_cast<Source::ClangView*>(source_view))
source_clang_view->delete_object(); source_clang_view->delete_object();
}
else else
delete source_view; delete source_view;
} }

8
src/source.cc

@ -496,14 +496,14 @@ void Source::ClangViewParse::update_diagnostics() {
auto spelling=diagnostic.spelling; auto spelling=diagnostic.spelling;
auto severity_spelling=diagnostic.severity_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()); 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_with_tag(tooltip_buffer->get_insert()->get_iter(), severity_spelling, diagnostic_tag_name);
tooltip_buffer->insert_at_cursor(":\n"+spelling); tooltip_buffer->insert_at_cursor(":\n"+spelling);
//TODO: Insert newlines to clang_tu->diagnostics[c].spelling (use 80 chars, then newline?) //TODO: Insert newlines to clang_tu->diagnostics[c].spelling (use 80 chars, then newline?)
return tooltip_buffer; 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); 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()) { if(token.get_kind()==clang::Token_Identifier && token.has_type()) {
auto start=get_buffer()->get_iter_at_offset(token.offsets.first); auto start=get_buffer()->get_iter_at_offset(token.offsets.first);
auto end=get_buffer()->get_iter_at_offset(token.offsets.second); 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()); auto tooltip_buffer=Gtk::TextBuffer::create(get_buffer()->get_tag_table());
tooltip_buffer->insert_at_cursor("Type: "+token.get_type()); tooltip_buffer->insert_at_cursor("Type: "+token.get_type());
auto brief_comment=token.get_brief_comments(); auto brief_comment=token.get_brief_comments();
@ -525,7 +525,7 @@ void Source::ClangViewParse::update_types() {
return tooltip_buffer; 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));
} }
} }
} }

60
src/tooltips.cc

@ -1,11 +1,15 @@
#include "tooltips.h" #include "tooltips.h"
#include "singletons.h" #include "singletons.h"
namespace sigc {
SIGC_FUNCTORS_DEDUCE_RESULT_TYPE_WITH_DECLTYPE
}
Gdk::Rectangle Tooltips::drawn_tooltips_rectangle=Gdk::Rectangle(); Gdk::Rectangle Tooltips::drawn_tooltips_rectangle=Gdk::Rectangle();
Tooltip::Tooltip(std::function<Glib::RefPtr<Gtk::TextBuffer>()> get_buffer, Gtk::TextView& text_view, Tooltip::Tooltip(std::function<Glib::RefPtr<Gtk::TextBuffer>()> create_tooltip_buffer, 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):
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) {} start_mark(start_mark), end_mark(end_mark) {}
Tooltip::~Tooltip() { Tooltip::~Tooltip() {
@ -38,13 +42,17 @@ void Tooltip::adjust(bool disregard_drawn) {
window=std::unique_ptr<Gtk::Window>(new Gtk::Window(Gtk::WindowType::WINDOW_POPUP)); window=std::unique_ptr<Gtk::Window>(new Gtk::Window(Gtk::WindowType::WINDOW_POPUP));
window->set_events(Gdk::POINTER_MOTION_MASK); 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->property_decorated()=false;
window->set_accept_focus(false); window->set_accept_focus(false);
window->set_skip_taskbar_hint(true); window->set_skip_taskbar_hint(true);
window->set_default_size(0, 0); window->set_default_size(0, 0);
tooltip_widget=std::unique_ptr<Gtk::TextView>(new Gtk::TextView(this->get_buffer())); tooltip_widget=std::unique_ptr<Gtk::TextView>(new Gtk::TextView(create_tooltip_buffer()));
wrap_lines(tooltip_widget->get_buffer());
tooltip_widget->set_editable(false); tooltip_widget->set_editable(false);
tooltip_widget->override_background_color(Gdk::RGBA(Singleton::Config::source()->background_tooltips)); tooltip_widget->override_background_color(Gdk::RGBA(Singleton::Config::source()->background_tooltips));
window->add(*tooltip_widget); window->add(*tooltip_widget);
@ -76,9 +84,47 @@ void Tooltip::adjust(bool disregard_drawn) {
window->move(rectangle.get_x(), rectangle.get_y()); window->move(rectangle.get_x(), rectangle.get_y());
} }
bool Tooltip::tooltip_on_motion_notify_event(GdkEventMotion* event) { void Tooltip::wrap_lines(Glib::RefPtr<Gtk::TextBuffer> text_buffer) {
window->hide(); INFO("Tooltip::wrap_lines");
return false; 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) { void Tooltips::show(const Gdk::Rectangle& rectangle, bool disregard_drawn) {

6
src/tooltips.h

@ -6,7 +6,7 @@
class Tooltip { class Tooltip {
public: public:
Tooltip(std::function<Glib::RefPtr<Gtk::TextBuffer>()> get_buffer, Gtk::TextView& text_view, Glib::RefPtr<Gtk::TextBuffer::Mark> start_mark, Glib::RefPtr<Gtk::TextBuffer::Mark> end_mark); Tooltip(std::function<Glib::RefPtr<Gtk::TextBuffer>()> create_tooltip_buffer, Gtk::TextView& text_view, Glib::RefPtr<Gtk::TextBuffer::Mark> start_mark, Glib::RefPtr<Gtk::TextBuffer::Mark> end_mark);
~Tooltip(); ~Tooltip();
void update(); void update();
@ -15,9 +15,9 @@ public:
Gdk::Rectangle activation_rectangle; Gdk::Rectangle activation_rectangle;
std::unique_ptr<Gtk::Window> window; std::unique_ptr<Gtk::Window> window;
private: private:
bool tooltip_on_motion_notify_event(GdkEventMotion* event); void wrap_lines(Glib::RefPtr<Gtk::TextBuffer> text_buffer);
std::function<Glib::RefPtr<Gtk::TextBuffer>()> get_buffer; std::function<Glib::RefPtr<Gtk::TextBuffer>()> create_tooltip_buffer;
std::unique_ptr<Gtk::TextView> tooltip_widget; std::unique_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;

Loading…
Cancel
Save