|
|
|
@ -29,6 +29,19 @@ start_mark(start_mark), show_search_entry(show_search_entry), list_view_text(1, |
|
|
|
resize(); |
|
|
|
resize(); |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
scrolled_window.add(list_view_text); |
|
|
|
scrolled_window.add(list_view_text); |
|
|
|
if(!show_search_entry) |
|
|
|
if(!show_search_entry) |
|
|
|
window->add(scrolled_window); |
|
|
|
window->add(scrolled_window); |
|
|
|
@ -51,13 +64,8 @@ void SelectionDialogBase::add_row(const std::string& row, const std::string& too |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void SelectionDialogBase::show() { |
|
|
|
void SelectionDialogBase::show() { |
|
|
|
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())); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
move(); |
|
|
|
move(); |
|
|
|
window->show_all(); |
|
|
|
window->show_all(); |
|
|
|
search_entry.show(); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void SelectionDialogBase::hide() { |
|
|
|
void SelectionDialogBase::hide() { |
|
|
|
@ -68,8 +76,7 @@ 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::update_tooltips() { |
|
|
|
void SelectionDialogBase::cursor_changed() { |
|
|
|
|
|
|
|
if(list_view_text.get_selected().size()>0) { |
|
|
|
if(list_view_text.get_selected().size()>0) { |
|
|
|
auto it=list_view_text.get_selection()->get_selected(); |
|
|
|
auto it=list_view_text.get_selection()->get_selected(); |
|
|
|
std::string row; |
|
|
|
std::string row; |
|
|
|
@ -146,6 +153,7 @@ void SelectionDialog::show() { |
|
|
|
SelectionDialogBase::show(); |
|
|
|
SelectionDialogBase::show(); |
|
|
|
std::shared_ptr<std::string> search_key(new std::string()); |
|
|
|
std::shared_ptr<std::string> search_key(new std::string()); |
|
|
|
auto filter_model=Gtk::TreeModelFilter::create(list_view_text.get_model()); |
|
|
|
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){ |
|
|
|
filter_model->set_visible_func([this, search_key](const Gtk::TreeModel::const_iterator& iter){ |
|
|
|
std::string row_lc; |
|
|
|
std::string row_lc; |
|
|
|
iter->get_value(0, row_lc); |
|
|
|
iter->get_value(0, row_lc); |
|
|
|
@ -156,15 +164,19 @@ void SelectionDialog::show() { |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
list_view_text.set_model(filter_model); |
|
|
|
list_view_text.set_model(filter_model); |
|
|
|
|
|
|
|
|
|
|
|
list_view_text.set_search_equal_func([this](const Glib::RefPtr<Gtk::TreeModel>& model, int column, const Glib::ustring& key, const Gtk::TreeModel::iterator& iter) { |
|
|
|
list_view_text.set_search_equal_func([this](const Glib::RefPtr<Gtk::TreeModel>& model, int column, const Glib::ustring& key, const Gtk::TreeModel::iterator& iter) { |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
search_entry.signal_changed().connect([this, search_key, filter_model](){ |
|
|
|
search_entry.signal_changed().connect([this, search_key, filter_model](){ |
|
|
|
*search_key=search_entry.get_text(); |
|
|
|
*search_key=search_entry.get_text(); |
|
|
|
filter_model->refilter(); |
|
|
|
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.set_search_entry(search_entry); //TODO:Report the need of this to GTK's git (bug)
|
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
search_entry.signal_event().connect([this](GdkEvent* event) { |
|
|
|
search_entry.signal_event().connect([this](GdkEvent* event) { |
|
|
|
if(event->type==GDK_KEY_PRESS) { |
|
|
|
if(event->type==GDK_KEY_PRESS) { |
|
|
|
auto key=(GdkEventKey*)event; |
|
|
|
auto key=(GdkEventKey*)event; |
|
|
|
@ -198,6 +210,7 @@ void SelectionDialog::show() { |
|
|
|
} |
|
|
|
} |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
auto activate=[this](){ |
|
|
|
auto activate=[this](){ |
|
|
|
if(on_select && list_view_text.get_selected().size()>0) { |
|
|
|
if(on_select && list_view_text.get_selected().size()>0) { |
|
|
|
auto it=list_view_text.get_selection()->get_selected(); |
|
|
|
auto it=list_view_text.get_selection()->get_selected(); |
|
|
|
@ -205,7 +218,7 @@ void SelectionDialog::show() { |
|
|
|
it->get_value(0, row); |
|
|
|
it->get_value(0, row); |
|
|
|
on_select(row, true); |
|
|
|
on_select(row, true); |
|
|
|
} |
|
|
|
} |
|
|
|
window->hide(); |
|
|
|
hide(); |
|
|
|
}; |
|
|
|
}; |
|
|
|
search_entry.signal_activate().connect([this, activate](){ |
|
|
|
search_entry.signal_activate().connect([this, activate](){ |
|
|
|
activate(); |
|
|
|
activate(); |
|
|
|
@ -213,10 +226,16 @@ void SelectionDialog::show() { |
|
|
|
list_view_text.signal_row_activated().connect([this, activate](const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn*) { |
|
|
|
list_view_text.signal_row_activated().connect([this, activate](const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn*) { |
|
|
|
activate(); |
|
|
|
activate(); |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
window->signal_focus_out_event().connect([this](GdkEventFocus*){ |
|
|
|
window->signal_focus_out_event().connect([this](GdkEventFocus*){ |
|
|
|
window->hide(); |
|
|
|
hide(); |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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(); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
CompletionDialog::CompletionDialog(Gtk::TextView& text_view, Glib::RefPtr<Gtk::TextBuffer::Mark> start_mark) : SelectionDialogBase(text_view, start_mark, false) {} |
|
|
|
CompletionDialog::CompletionDialog(Gtk::TextView& text_view, Glib::RefPtr<Gtk::TextBuffer::Mark> start_mark) : SelectionDialogBase(text_view, start_mark, false) {} |
|
|
|
@ -256,6 +275,11 @@ void CompletionDialog::show() { |
|
|
|
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); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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::select(bool hide_window) { |
|
|
|
void CompletionDialog::select(bool hide_window) { |
|
|
|
@ -285,7 +309,12 @@ bool CompletionDialog::on_key_release(GdkEventKey* key) { |
|
|
|
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()); |
|
|
|
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(); |
|
|
|
if(text=="") { |
|
|
|
|
|
|
|
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(); |
|
|
|
} |
|
|
|
} |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -299,11 +328,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(); |
|
|
|
update_tooltips(); |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
cursor_changed(); |
|
|
|
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) |
|
|
|
@ -319,7 +348,7 @@ 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); |
|
|
|
cursor_changed(); |
|
|
|
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) { |
|
|
|
@ -336,7 +365,7 @@ 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); |
|
|
|
cursor_changed(); |
|
|
|
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) { |
|
|
|
|