Browse Source

Fixes to selectiondialog.*.

merge-requests/365/head
eidheim 11 years ago
parent
commit
62ca0c8ffe
  1. 59
      juci/selectiondialog.cc
  2. 2
      juci/selectiondialog.h

59
juci/selectiondialog.cc

@ -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,18 +218,24 @@ 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();
}); });
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) {

2
juci/selectiondialog.h

@ -20,7 +20,7 @@ public:
Glib::RefPtr<Gtk::TextBuffer::Mark> start_mark; Glib::RefPtr<Gtk::TextBuffer::Mark> start_mark;
protected: protected:
virtual void resize(); virtual void resize();
virtual void cursor_changed(); virtual void update_tooltips();
Gtk::TextView& text_view; Gtk::TextView& text_view;
std::unique_ptr<Gtk::Window> window; std::unique_ptr<Gtk::Window> window;

Loading…
Cancel
Save