Browse Source

Cleanup of dialog tooltips

merge-requests/365/head
eidheim 10 years ago
parent
commit
a50adf87ee
  1. 103
      src/selectiondialog.cc
  2. 14
      src/selectiondialog.h
  3. 39
      src/source_clang.cc
  4. 3
      src/source_clang.h
  5. 1
      src/window.cc

103
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->get_vbox()->pack_start(scrolled_window, true, true);
dialog->set_transient_for((Gtk::Window&)(*text_view.get_toplevel())); 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() { SelectionDialogBase::~SelectionDialogBase() {
@ -129,21 +143,7 @@ void SelectionDialogBase::resize() {
} }
} }
SelectionDialog::SelectionDialog(Gtk::TextView& text_view, Glib::RefPtr<Gtk::TextBuffer::Mark> start_mark, bool show_search_entry, bool use_markup) : SelectionDialogBase(text_view, start_mark, show_search_entry, use_markup) { SelectionDialog::SelectionDialog(Gtk::TextView& text_view, Glib::RefPtr<Gtk::TextBuffer::Mark> 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;
});
}
void SelectionDialog::show() { void SelectionDialog::show() {
SelectionDialogBase::show(); SelectionDialogBase::show();
@ -282,26 +282,7 @@ bool SelectionDialog::on_key_press(GdkEventKey* key) {
return false; return false;
} }
CompletionDialog::CompletionDialog(Gtk::TextView& text_view, Glib::RefPtr<Gtk::TextBuffer::Mark> start_mark) : SelectionDialogBase(text_view, start_mark, false, false) { CompletionDialog::CompletionDialog(Gtk::TextView& text_view, Glib::RefPtr<Gtk::TextBuffer::Mark> 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;
}
void CompletionDialog::show() { void CompletionDialog::show() {
SelectionDialogBase::show(); SelectionDialogBase::show();
@ -348,18 +329,8 @@ void CompletionDialog::show() {
list_view_text.set_search_entry(search_entry); 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())); 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) { 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())); list_view_text.set_cursor(list_view_text.get_model()->get_path(list_view_text.get_model()->children().begin()));
} }
} }
update_tooltips();
} }
return false; return false;
} }
@ -407,12 +377,9 @@ bool CompletionDialog::on_key_press(GdkEventKey* key) {
if(row_in_entry) { if(row_in_entry) {
text_view.get_buffer()->erase(start_mark->get_iter(), text_view.get_buffer()->get_insert()->get_iter()); text_view.get_buffer()->erase(start_mark->get_iter(), text_view.get_buffer()->get_insert()->get_iter());
row_in_entry=false; row_in_entry=false;
if(key->keyval==GDK_KEY_BackSpace) { if(key->keyval==GDK_KEY_BackSpace)
update_tooltips();
return true; return true;
} }
}
update_tooltips();
return false; 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) 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 else
list_view_text.set_cursor(list_view_text.get_model()->get_path(list_view_text.get_model()->children().begin())); list_view_text.set_cursor(list_view_text.get_model()->get_path(list_view_text.get_model()->children().begin()));
select(false); select(false);
update_tooltips();
return true; return true;
} }
if(key->keyval==GDK_KEY_Up && list_view_text.get_model()->children().size()>0) { 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)); list_view_text.set_cursor(list_view_text.get_model()->get_path(last_it));
} }
select(false); select(false);
update_tooltips();
return true; return true;
} }
if(key->keyval==GDK_KEY_Return || key->keyval==GDK_KEY_ISO_Left_Tab || key->keyval==GDK_KEY_Tab) { 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 true;
return false; 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<Tooltips>(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();
}
}

14
src/selectiondialog.h

@ -36,6 +36,7 @@ public:
std::function<void()> on_hide; std::function<void()> on_hide;
std::function<void(const std::string& selected, bool hide_window)> on_select; std::function<void(const std::string& selected, bool hide_window)> on_select;
std::function<void(const std::string &selected)> on_changed;
Glib::RefPtr<Gtk::TextBuffer::Mark> start_mark; Glib::RefPtr<Gtk::TextBuffer::Mark> start_mark;
bool shown=false; bool shown=false;
@ -48,6 +49,8 @@ protected:
ListViewText list_view_text; ListViewText list_view_text;
Gtk::Entry search_entry; Gtk::Entry search_entry;
bool show_search_entry; bool show_search_entry;
std::string last_row;
}; };
class SelectionDialog : public SelectionDialogBase { class SelectionDialog : public SelectionDialogBase {
@ -55,18 +58,12 @@ public:
SelectionDialog(Gtk::TextView& text_view, Glib::RefPtr<Gtk::TextBuffer::Mark> start_mark, bool show_search_entry=true, bool use_markup=false); SelectionDialog(Gtk::TextView& text_view, Glib::RefPtr<Gtk::TextBuffer::Mark> start_mark, bool show_search_entry=true, bool use_markup=false);
bool on_key_press(GdkEventKey* key); bool on_key_press(GdkEventKey* key);
void show(); void show();
std::function<void(const std::string &selected)> on_changed;
private:
std::string last_row;
}; };
class CompletionDialog : public SelectionDialogBase { class CompletionDialog : public SelectionDialogBase {
public: public:
CompletionDialog(Gtk::TextView& text_view, Glib::RefPtr<Gtk::TextBuffer::Mark> start_mark); CompletionDialog(Gtk::TextView& text_view, Glib::RefPtr<Gtk::TextBuffer::Mark> start_mark);
void add_row(const std::string& row, const std::string& tooltip);
void show(); void show();
void hide();
bool on_key_release(GdkEventKey* key); bool on_key_release(GdkEventKey* key);
bool on_key_press(GdkEventKey* key); bool on_key_press(GdkEventKey* key);
@ -75,11 +72,6 @@ private:
int show_offset; int show_offset;
bool row_in_entry=false; bool row_in_entry=false;
void update_tooltips();
std::unique_ptr<Tooltips> tooltips;
std::unordered_map<std::string, std::string> tooltip_texts;
std::string last_row;
}; };
#endif // JUCI_SELECTIONDIALOG_H_ #endif // JUCI_SELECTIONDIALOG_H_

39
src/source_clang.cc

@ -744,10 +744,11 @@ Source::ClangViewParse(file_path, project_path, language), autocomplete_state(Au
if (!row.empty()) { if (!row.empty()) {
if(!return_value.empty()) if(!return_value.empty())
row+=" --> " + return_value; row+=" --> " + return_value;
autocomplete_dialog_rows[row] = row_insert_on_selection; autocomplete_dialog_rows[row] = std::pair<std::string, std::string>(std::move(row_insert_on_selection), std::move(data.brief_comments));
autocomplete_dialog->add_row(row, data.brief_comments); autocomplete_dialog->add_row(row);
} }
} }
autocomplete_data.clear();
set_status(""); set_status("");
autocomplete_state=AutocompleteState::IDLE; autocomplete_state=AutocompleteState::IDLE;
if (!autocomplete_dialog_rows.empty()) { if (!autocomplete_dialog_rows.empty()) {
@ -797,11 +798,15 @@ void Source::ClangViewAutocomplete::autocomplete_dialog_setup() {
autocomplete_dialog_rows.clear(); autocomplete_dialog_rows.clear();
autocomplete_dialog->on_hide=[this](){ autocomplete_dialog->on_hide=[this](){
get_source_buffer()->end_user_action(); get_source_buffer()->end_user_action();
if(autocomplete_tooltips) {
autocomplete_tooltips->hide();
autocomplete_tooltips.reset();
}
parsed=false; parsed=false;
soft_reparse(); soft_reparse();
}; };
autocomplete_dialog->on_select=[this](const std::string& selected, bool hide_window) { 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()); get_buffer()->erase(autocomplete_dialog->start_mark->get_iter(), get_buffer()->get_insert()->get_iter());
auto iter=get_buffer()->get_insert()->get_iter(); auto iter=get_buffer()->get_insert()->get_iter();
if(*iter=='<' || *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<std::string>(autocomplete_dialog_rows.at(selected).second);
if(tooltip->empty()) {
if(autocomplete_tooltips)
autocomplete_tooltips->hide();
}
else {
autocomplete_tooltips=std::unique_ptr<Tooltips>(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() { void Source::ClangViewAutocomplete::autocomplete_check() {

3
src/source_clang.h

@ -101,8 +101,9 @@ namespace Source {
void autocomplete_check(); void autocomplete_check();
void autocomplete(); void autocomplete();
std::vector<AutoCompleteData> autocomplete_data; std::vector<AutoCompleteData> autocomplete_data;
std::unordered_map<std::string, std::string> autocomplete_dialog_rows; std::unordered_map<std::string, std::pair<std::string, std::string> > autocomplete_dialog_rows;
std::vector<AutoCompleteData> autocomplete_get_suggestions(const std::string &buffer, int line_number, int column); std::vector<AutoCompleteData> autocomplete_get_suggestions(const std::string &buffer, int line_number, int column);
std::unique_ptr<Tooltips> autocomplete_tooltips;
Glib::Dispatcher autocomplete_done; Glib::Dispatcher autocomplete_done;
Glib::Dispatcher autocomplete_restart; Glib::Dispatcher autocomplete_restart;
Glib::Dispatcher autocomplete_error; Glib::Dispatcher autocomplete_error;

1
src/window.cc

@ -981,6 +981,7 @@ void Window::set_menu_actions() {
view->selection_dialog->on_changed=[this, rows, iter](const std::string &selected) { view->selection_dialog->on_changed=[this, rows, iter](const std::string &selected) {
if(selected.empty()) { if(selected.empty()) {
if(debug_variable_tooltips)
debug_variable_tooltips->hide(); debug_variable_tooltips->hide();
return; return;
} }

Loading…
Cancel
Save