|
|
|
|
@ -59,31 +59,6 @@ list_view_text(use_markup), start_mark(start_mark), show_search_entry(show_searc
|
|
|
|
|
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(); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
list_view_text.signal_cursor_changed().connect([this]() { |
|
|
|
|
if(!shown) |
|
|
|
|
return; |
|
|
|
|
auto it=list_view_text.get_selection()->get_selected(); |
|
|
|
|
if(it) { |
|
|
|
|
std::string row; |
|
|
|
|
it->get_value(0, row); |
|
|
|
|
if(on_changed) |
|
|
|
|
on_changed(row); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
scrolled_window.add(list_view_text); |
|
|
|
|
if(!show_search_entry) |
|
|
|
|
window->add(scrolled_window); |
|
|
|
|
@ -99,10 +74,8 @@ SelectionDialogBase::~SelectionDialogBase() {
|
|
|
|
|
text_view.get_buffer()->delete_mark(start_mark); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void SelectionDialogBase::add_row(const std::string& row, const std::string& tooltip) { |
|
|
|
|
void SelectionDialogBase::add_row(const std::string& row) { |
|
|
|
|
list_view_text.append(row); |
|
|
|
|
if(tooltip.size()>0) |
|
|
|
|
tooltip_texts[row]=tooltip; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void SelectionDialogBase::show() { |
|
|
|
|
@ -116,45 +89,11 @@ void SelectionDialogBase::hide() {
|
|
|
|
|
return; |
|
|
|
|
shown=false; |
|
|
|
|
window->hide(); |
|
|
|
|
if(tooltips) |
|
|
|
|
tooltips->hide(); |
|
|
|
|
if(on_hide) |
|
|
|
|
on_hide(); |
|
|
|
|
list_view_text.clear(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void SelectionDialogBase::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(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void SelectionDialogBase::move() { |
|
|
|
|
Gdk::Rectangle rectangle; |
|
|
|
|
text_view.get_iter_location(start_mark->get_iter(), rectangle); |
|
|
|
|
@ -190,7 +129,21 @@ 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() { |
|
|
|
|
SelectionDialogBase::show(); |
|
|
|
|
@ -284,10 +237,8 @@ void SelectionDialog::show() {
|
|
|
|
|
return true; |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
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(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool SelectionDialog::on_key_press(GdkEventKey* key) { |
|
|
|
|
@ -331,7 +282,26 @@ bool SelectionDialog::on_key_press(GdkEventKey* key) {
|
|
|
|
|
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() { |
|
|
|
|
SelectionDialogBase::show(); |
|
|
|
|
@ -384,6 +354,14 @@ void CompletionDialog::show() {
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void CompletionDialog::hide() { |
|
|
|
|
if(!shown) |
|
|
|
|
return; |
|
|
|
|
SelectionDialogBase::hide(); |
|
|
|
|
if(tooltips) |
|
|
|
|
tooltips->hide(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void CompletionDialog::select(bool hide_window) { |
|
|
|
|
row_in_entry=true; |
|
|
|
|
|
|
|
|
|
@ -480,3 +458,35 @@ 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<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(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|