From a50adf87eeb9c1f8a39f495aa2a5275fca75f33b Mon Sep 17 00:00:00 2001 From: eidheim Date: Wed, 13 Jan 2016 12:33:43 +0100 Subject: [PATCH] Cleanup of dialog tooltips --- src/selectiondialog.cc | 103 +++++++---------------------------------- src/selectiondialog.h | 14 ++---- src/source_clang.cc | 39 ++++++++++++++-- src/source_clang.h | 3 +- src/window.cc | 3 +- 5 files changed, 61 insertions(+), 101 deletions(-) diff --git a/src/selectiondialog.cc b/src/selectiondialog.cc index 1cb27e2..ff0f143 100644 --- a/src/selectiondialog.cc +++ b/src/selectiondialog.cc @@ -68,6 +68,20 @@ list_view_text(use_markup), start_mark(start_mark), show_search_entry(show_searc dialog->get_vbox()->pack_start(scrolled_window, true, true); dialog->set_transient_for((Gtk::Window&)(*text_view.get_toplevel())); } + + list_view_text.signal_cursor_changed().connect([this]() { + if(!shown) + return; + auto it=list_view_text.get_selection()->get_selected(); + std::string row; + if(it) + it->get_value(0, row); + if(last_row==row) + return; + if(on_changed) + on_changed(row); + last_row=row; + }); } SelectionDialogBase::~SelectionDialogBase() { @@ -129,21 +143,7 @@ void SelectionDialogBase::resize() { } } -SelectionDialog::SelectionDialog(Gtk::TextView& text_view, Glib::RefPtr start_mark, bool show_search_entry, bool use_markup) : SelectionDialogBase(text_view, start_mark, show_search_entry, use_markup) { - list_view_text.signal_cursor_changed().connect([this]() { - if(!shown) - return; - auto it=list_view_text.get_selection()->get_selected(); - std::string row; - if(it) - it->get_value(0, row); - if(last_row==row) - return; - if(on_changed) - on_changed(row); - last_row=row; - }); -} +SelectionDialog::SelectionDialog(Gtk::TextView& text_view, Glib::RefPtr start_mark, bool show_search_entry, bool use_markup) : SelectionDialogBase(text_view, start_mark, show_search_entry, use_markup) {} void SelectionDialog::show() { SelectionDialogBase::show(); @@ -282,26 +282,7 @@ bool SelectionDialog::on_key_press(GdkEventKey* key) { return false; } -CompletionDialog::CompletionDialog(Gtk::TextView& text_view, Glib::RefPtr start_mark) : SelectionDialogBase(text_view, start_mark, false, false) { - list_view_text.signal_event_after().connect([this](GdkEvent* event){ - if(event->type==GDK_KEY_PRESS || event->type==GDK_BUTTON_PRESS) { - update_tooltips(); - } - }); - if(show_search_entry) { - search_entry.signal_event_after().connect([this](GdkEvent* event){ - if(event->type==GDK_KEY_PRESS || event->type==GDK_BUTTON_PRESS) { - update_tooltips(); - } - }); - } -} - -void CompletionDialog::add_row(const std::string& row, const std::string& tooltip) { - SelectionDialogBase::add_row(row); - if(tooltip.size()>0) - tooltip_texts[row]=tooltip; -} +CompletionDialog::CompletionDialog(Gtk::TextView& text_view, Glib::RefPtr start_mark) : SelectionDialogBase(text_view, start_mark, false, false) {} void CompletionDialog::show() { SelectionDialogBase::show(); @@ -348,18 +329,8 @@ void CompletionDialog::show() { list_view_text.set_search_entry(search_entry); } - if(list_view_text.get_model()->children().size()>0) { + if(list_view_text.get_model()->children().size()>0) list_view_text.set_cursor(list_view_text.get_model()->get_path(list_view_text.get_model()->children().begin())); - update_tooltips(); - } -} - -void CompletionDialog::hide() { - if(!shown) - return; - SelectionDialogBase::hide(); - if(tooltips) - tooltips->hide(); } void CompletionDialog::select(bool hide_window) { @@ -394,7 +365,6 @@ bool CompletionDialog::on_key_release(GdkEventKey* key) { list_view_text.set_cursor(list_view_text.get_model()->get_path(list_view_text.get_model()->children().begin())); } } - update_tooltips(); } return false; } @@ -407,12 +377,9 @@ bool CompletionDialog::on_key_press(GdkEventKey* key) { if(row_in_entry) { text_view.get_buffer()->erase(start_mark->get_iter(), text_view.get_buffer()->get_insert()->get_iter()); row_in_entry=false; - if(key->keyval==GDK_KEY_BackSpace) { - update_tooltips(); + if(key->keyval==GDK_KEY_BackSpace) return true; - } } - update_tooltips(); return false; } if(key->keyval==GDK_KEY_Shift_L || key->keyval==GDK_KEY_Shift_R || key->keyval==GDK_KEY_Alt_L || key->keyval==GDK_KEY_Alt_R || key->keyval==GDK_KEY_Control_L || key->keyval==GDK_KEY_Control_R || key->keyval==GDK_KEY_Meta_L || key->keyval==GDK_KEY_Meta_R) @@ -428,7 +395,6 @@ bool CompletionDialog::on_key_press(GdkEventKey* key) { else list_view_text.set_cursor(list_view_text.get_model()->get_path(list_view_text.get_model()->children().begin())); select(false); - update_tooltips(); return true; } if(key->keyval==GDK_KEY_Up && list_view_text.get_model()->children().size()>0) { @@ -446,7 +412,6 @@ bool CompletionDialog::on_key_press(GdkEventKey* key) { list_view_text.set_cursor(list_view_text.get_model()->get_path(last_it)); } select(false); - update_tooltips(); return true; } if(key->keyval==GDK_KEY_Return || key->keyval==GDK_KEY_ISO_Left_Tab || key->keyval==GDK_KEY_Tab) { @@ -458,35 +423,3 @@ bool CompletionDialog::on_key_press(GdkEventKey* key) { return true; return false; } - -void CompletionDialog::update_tooltips() { - auto it=list_view_text.get_selection()->get_selected(); - if(it) { - std::string row; - it->get_value(0, row); - if(row!=last_row || last_row.size()==0) { - if(tooltips) - tooltips->hide(); - auto it=tooltip_texts.find(row); - if(it!=tooltip_texts.end()) { - auto tooltip_text=it->second; - if(tooltip_text.size()>0) { - tooltips=std::unique_ptr(new Tooltips()); - auto get_tooltip_buffer=[this, tooltip_text]() { - auto tooltip_buffer=Gtk::TextBuffer::create(text_view.get_buffer()->get_tag_table()); - tooltip_buffer->insert_with_tag(tooltip_buffer->get_insert()->get_iter(), tooltip_text, "def:note"); - return tooltip_buffer; - }; - tooltips->emplace_back(get_tooltip_buffer, text_view, text_view.get_buffer()->create_mark(start_mark->get_iter()), text_view.get_buffer()->create_mark(text_view.get_buffer()->get_insert()->get_iter())); - tooltips->show(true); - } - } - } - last_row=row; - } - else { - last_row=""; - if(tooltips) - tooltips->hide(); - } -} diff --git a/src/selectiondialog.h b/src/selectiondialog.h index 0c9b1e5..b95d3c6 100644 --- a/src/selectiondialog.h +++ b/src/selectiondialog.h @@ -36,6 +36,7 @@ public: std::function on_hide; std::function on_select; + std::function on_changed; Glib::RefPtr start_mark; bool shown=false; @@ -48,6 +49,8 @@ protected: ListViewText list_view_text; Gtk::Entry search_entry; bool show_search_entry; + + std::string last_row; }; class SelectionDialog : public SelectionDialogBase { @@ -55,18 +58,12 @@ public: SelectionDialog(Gtk::TextView& text_view, Glib::RefPtr start_mark, bool show_search_entry=true, bool use_markup=false); bool on_key_press(GdkEventKey* key); void show(); - - std::function on_changed; -private: - std::string last_row; }; class CompletionDialog : public SelectionDialogBase { public: CompletionDialog(Gtk::TextView& text_view, Glib::RefPtr start_mark); - void add_row(const std::string& row, const std::string& tooltip); void show(); - void hide(); bool on_key_release(GdkEventKey* key); bool on_key_press(GdkEventKey* key); @@ -75,11 +72,6 @@ private: int show_offset; bool row_in_entry=false; - - void update_tooltips(); - std::unique_ptr tooltips; - std::unordered_map tooltip_texts; - std::string last_row; }; #endif // JUCI_SELECTIONDIALOG_H_ \ No newline at end of file diff --git a/src/source_clang.cc b/src/source_clang.cc index e698e38..77a9c15 100644 --- a/src/source_clang.cc +++ b/src/source_clang.cc @@ -744,10 +744,11 @@ Source::ClangViewParse(file_path, project_path, language), autocomplete_state(Au if (!row.empty()) { if(!return_value.empty()) row+=" --> " + return_value; - autocomplete_dialog_rows[row] = row_insert_on_selection; - autocomplete_dialog->add_row(row, data.brief_comments); + autocomplete_dialog_rows[row] = std::pair(std::move(row_insert_on_selection), std::move(data.brief_comments)); + autocomplete_dialog->add_row(row); } } + autocomplete_data.clear(); set_status(""); autocomplete_state=AutocompleteState::IDLE; if (!autocomplete_dialog_rows.empty()) { @@ -797,11 +798,15 @@ void Source::ClangViewAutocomplete::autocomplete_dialog_setup() { autocomplete_dialog_rows.clear(); autocomplete_dialog->on_hide=[this](){ get_source_buffer()->end_user_action(); + if(autocomplete_tooltips) { + autocomplete_tooltips->hide(); + autocomplete_tooltips.reset(); + } parsed=false; soft_reparse(); }; autocomplete_dialog->on_select=[this](const std::string& selected, bool hide_window) { - auto row = autocomplete_dialog_rows.at(selected); + auto row = autocomplete_dialog_rows.at(selected).first; get_buffer()->erase(autocomplete_dialog->start_mark->get_iter(), get_buffer()->get_insert()->get_iter()); auto iter=get_buffer()->get_insert()->get_iter(); if(*iter=='<' || *iter=='(') { @@ -850,6 +855,34 @@ void Source::ClangViewAutocomplete::autocomplete_dialog_setup() { } } }; + + autocomplete_dialog->on_changed=[this](const std::string &selected) { + if(selected.empty()) { + if(autocomplete_tooltips) + autocomplete_tooltips->hide(); + return; + } + auto tooltip=std::make_shared(autocomplete_dialog_rows.at(selected).second); + if(tooltip->empty()) { + if(autocomplete_tooltips) + autocomplete_tooltips->hide(); + } + else { + autocomplete_tooltips=std::unique_ptr(new Tooltips()); + auto create_tooltip_buffer=[this, tooltip]() { + auto tooltip_buffer=Gtk::TextBuffer::create(get_buffer()->get_tag_table()); + + tooltip_buffer->insert_with_tag(tooltip_buffer->get_insert()->get_iter(), *tooltip, "def:note"); + + return tooltip_buffer; + }; + + auto iter=autocomplete_dialog->start_mark->get_iter(); + autocomplete_tooltips->emplace_back(create_tooltip_buffer, *this, get_buffer()->create_mark(iter), get_buffer()->create_mark(iter)); + + autocomplete_tooltips->show(true); + } + }; } void Source::ClangViewAutocomplete::autocomplete_check() { diff --git a/src/source_clang.h b/src/source_clang.h index f4d26d6..12e4ee4 100644 --- a/src/source_clang.h +++ b/src/source_clang.h @@ -101,8 +101,9 @@ namespace Source { void autocomplete_check(); void autocomplete(); std::vector autocomplete_data; - std::unordered_map autocomplete_dialog_rows; + std::unordered_map > autocomplete_dialog_rows; std::vector autocomplete_get_suggestions(const std::string &buffer, int line_number, int column); + std::unique_ptr autocomplete_tooltips; Glib::Dispatcher autocomplete_done; Glib::Dispatcher autocomplete_restart; Glib::Dispatcher autocomplete_error; diff --git a/src/window.cc b/src/window.cc index ba97259..2fd7f73 100644 --- a/src/window.cc +++ b/src/window.cc @@ -981,7 +981,8 @@ void Window::set_menu_actions() { view->selection_dialog->on_changed=[this, rows, iter](const std::string &selected) { if(selected.empty()) { - debug_variable_tooltips->hide(); + if(debug_variable_tooltips) + debug_variable_tooltips->hide(); return; } if(notebook.get_current_page()!=-1) {