Browse Source

Now showing only methods/variables including the string the user writes if the completion window opens right after ->, :: or . Very useful if the user do not know the beginning of the method or variable searched for.

merge-requests/365/head
eidheim 11 years ago
parent
commit
7f6d388602
  1. 66
      juci/selectiondialog.cc
  2. 2
      juci/selectiondialog.h

66
juci/selectiondialog.cc

@ -25,7 +25,6 @@ start_mark(start_mark), show_search_entry(show_search_entry), list_view_text(1,
list_view_text.set_rules_hint(true); list_view_text.set_rules_hint(true);
//list_view_text.set_fixed_height_mode(true); //TODO: This is buggy on OS X, remember to post an issue on GTK+ 3 //list_view_text.set_fixed_height_mode(true); //TODO: This is buggy on OS X, remember to post an issue on GTK+ 3
list_view_text.signal_cursor_changed().connect(sigc::mem_fun(*this, &SelectionDialog::cursor_changed), true);
list_view_text.signal_realize().connect([this](){ list_view_text.signal_realize().connect([this](){
resize(); resize();
}); });
@ -69,13 +68,16 @@ void SelectionDialogBase::hide() {
on_hide(); on_hide();
} }
//TODO: this is not called when selecting row with mouse, but I guess that is ok.
void SelectionDialogBase::cursor_changed() { void SelectionDialogBase::cursor_changed() {
auto selected=list_view_text.get_selected(); if(list_view_text.get_selected().size()>0) {
if(selected.size()>0) { auto it=list_view_text.get_selection()->get_selected();
if(selected[0]!=last_selected || last_selected==-1) { std::string row;
it->get_value(0, row);
if(row!=last_row || last_row.size()==0) {
if(tooltips) if(tooltips)
tooltips->hide(); tooltips->hide();
auto it=tooltip_texts.find(list_view_text.get_text(selected[0])); auto it=tooltip_texts.find(row);
if(it!=tooltip_texts.end()) { if(it!=tooltip_texts.end()) {
auto tooltip_text=it->second; auto tooltip_text=it->second;
if(tooltip_text.size()>0) { if(tooltip_text.size()>0) {
@ -91,13 +93,13 @@ void SelectionDialogBase::cursor_changed() {
} }
} }
} }
last_row=row;
}
else {
last_row="";
if(tooltips)
tooltips->hide();
} }
else if(tooltips)
tooltips->hide();
if(selected.size()>0)
last_selected=selected[0];
else
last_selected=-1;
} }
void SelectionDialogBase::move() { void SelectionDialogBase::move() {
@ -201,8 +203,7 @@ void SelectionDialog::show() {
auto it=list_view_text.get_selection()->get_selected(); auto it=list_view_text.get_selection()->get_selected();
std::string row; std::string row;
it->get_value(0, row); it->get_value(0, row);
std::string selected = row; on_select(row, true);
on_select(selected, true);
} }
window->hide(); window->hide();
}; };
@ -225,6 +226,27 @@ void CompletionDialog::show() {
show_offset=text_view.get_buffer()->get_insert()->get_iter().get_offset(); show_offset=text_view.get_buffer()->get_insert()->get_iter().get_offset();
if(show_offset==start_mark->get_iter().get_offset()) {
std::shared_ptr<std::string> search_key(new std::string());
auto filter_model=Gtk::TreeModelFilter::create(list_view_text.get_model());
filter_model->set_visible_func([this, search_key](const Gtk::TreeModel::const_iterator& iter){
std::string row_lc;
iter->get_value(0, row_lc);
auto search_key_lc=*search_key;
std::transform(row_lc.begin(), row_lc.end(), row_lc.begin(), ::tolower);
std::transform(search_key_lc.begin(), search_key_lc.end(), search_key_lc.begin(), ::tolower);
if(row_lc.find(search_key_lc)!=std::string::npos)
return true;
return false;
});
list_view_text.set_model(filter_model);
search_entry.signal_changed().connect([this, search_key, filter_model](){
*search_key=search_entry.get_text();
filter_model->refilter();
list_view_text.set_search_entry(search_entry); //TODO:Report the need of this to GTK's git (bug)
});
}
list_view_text.signal_row_activated().connect([this](const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn*) { list_view_text.signal_row_activated().connect([this](const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn*) {
select(); select();
}); });
@ -238,11 +260,15 @@ void CompletionDialog::show() {
void CompletionDialog::select(bool hide_window) { void CompletionDialog::select(bool hide_window) {
row_in_entry=true; row_in_entry=true;
auto selected=list_view_text.get_selected();
if(selected.size()>0) { if(list_view_text.get_selected().size()>0) {
auto it=list_view_text.get_selection()->get_selected();
std::string row;
it->get_value(0, row);
if(on_select) if(on_select)
on_select(list_view_text.get_text(selected[0]), hide_window); on_select(row, hide_window);
} }
if(hide_window) { if(hide_window) {
hide(); hide();
} }
@ -257,10 +283,8 @@ bool CompletionDialog::on_key_release(GdkEventKey* key) {
} }
else { else {
auto text=text_view.get_buffer()->get_text(start_mark->get_iter(), text_view.get_buffer()->get_insert()->get_iter()); auto text=text_view.get_buffer()->get_text(start_mark->get_iter(), text_view.get_buffer()->get_insert()->get_iter());
if(text.size()>0) { search_entry.set_text(text);
search_entry.set_text(text); list_view_text.set_search_entry(search_entry);
list_view_text.set_search_entry(search_entry);
}
cursor_changed(); cursor_changed();
} }
return false; return false;
@ -275,9 +299,11 @@ bool CompletionDialog::on_key_press(GdkEventKey* key) {
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) {
cursor_changed();
return true; return true;
} }
} }
cursor_changed();
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)

2
juci/selectiondialog.h

@ -30,7 +30,7 @@ protected:
bool show_search_entry; bool show_search_entry;
std::unique_ptr<Tooltips> tooltips; std::unique_ptr<Tooltips> tooltips;
std::unordered_map<std::string, std::string> tooltip_texts; std::unordered_map<std::string, std::string> tooltip_texts;
int last_selected=-1; std::string last_row;
}; };
class SelectionDialog : public SelectionDialogBase { class SelectionDialog : public SelectionDialogBase {

Loading…
Cancel
Save