From c52e6b9cf19912db57a4a567a8e96965477377c8 Mon Sep 17 00:00:00 2001 From: eidheim Date: Wed, 16 Dec 2015 16:41:15 +0100 Subject: [PATCH 01/14] Fixes #124 --- src/cmake.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/cmake.cc b/src/cmake.cc index 2281ae5..9c49e49 100644 --- a/src/cmake.cc +++ b/src/cmake.cc @@ -8,9 +8,11 @@ CMake::CMake(const boost::filesystem::path &path) { const auto find_cmake_project=[this](const boost::filesystem::path &cmake_path) { for(auto &line: filesystem::read_lines(cmake_path)) { - const boost::regex project_regex("^ *project *\\(.*$"); + const boost::regex project_regex("^ *project *\\( *([^ ]+).*\\) *$"); boost::smatch sm; if(boost::regex_match(line, sm, project_regex)) { + variables["CMAKE_PROJECT_NAME"]=sm[1].str(); //TODO: is this variable deprecated/non-standard? + variables["PROJECT_NAME"]=sm[1].str(); return true; } } From 1da102a8abb62be8c6474f61b9106c4d78239dfa Mon Sep 17 00:00:00 2001 From: eidheim Date: Wed, 16 Dec 2015 16:59:03 +0100 Subject: [PATCH 02/14] Now setting PROJECT_NAME correctly even when using variables within project, and if these variables change after using the project function --- src/cmake.cc | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/cmake.cc b/src/cmake.cc index 9c49e49..0ca58db 100644 --- a/src/cmake.cc +++ b/src/cmake.cc @@ -8,13 +8,10 @@ CMake::CMake(const boost::filesystem::path &path) { const auto find_cmake_project=[this](const boost::filesystem::path &cmake_path) { for(auto &line: filesystem::read_lines(cmake_path)) { - const boost::regex project_regex("^ *project *\\( *([^ ]+).*\\) *$"); + const boost::regex project_regex("^ *project *\\(.*$"); boost::smatch sm; - if(boost::regex_match(line, sm, project_regex)) { - variables["CMAKE_PROJECT_NAME"]=sm[1].str(); //TODO: is this variable deprecated/non-standard? - variables["PROJECT_NAME"]=sm[1].str(); + if(boost::regex_match(line, sm, project_regex)) return true; - } } return false; }; @@ -142,8 +139,8 @@ void CMake::find_variables() { end_line=file.size(); if(end_line>start_line) { auto line=file.substr(start_line, end_line-start_line); - const boost::regex set_regex("^ *set *\\( *([A-Za-z_][A-Za-z_0-9]*) +(.*)\\) *$"); boost::smatch sm; + const boost::regex set_regex("^ *set *\\( *([A-Za-z_][A-Za-z_0-9]*) +(.*)\\) *$"); if(boost::regex_match(line, sm, set_regex)) { auto data=sm[2].str(); while(data.size()>0 && data.back()==' ') @@ -151,6 +148,15 @@ void CMake::find_variables() { parse_variable_parameters(data); variables[sm[1].str()]=data; } + else { + const boost::regex project_regex("^ *project *\\( *([^ ]+).*\\) *$"); + if(boost::regex_match(line, sm, project_regex)) { + auto data=sm[1].str(); + parse_variable_parameters(data); + variables["CMAKE_PROJECT_NAME"]=data; //TODO: is this variable deprecated/non-standard? + variables["PROJECT_NAME"]=data; + } + } } pos=end_line+1; } From 80d4a84961168487b345cdaac86f479b8ed4eb3e Mon Sep 17 00:00:00 2001 From: eidheim Date: Thu, 17 Dec 2015 08:10:41 +0100 Subject: [PATCH 03/14] Fixes #128 --- src/source.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/source.cc b/src/source.cc index a34755e..d2aba97 100644 --- a/src/source.cc +++ b/src/source.cc @@ -509,7 +509,8 @@ void Source::View::replace_forward(const std::string &replacement) { auto offset=match_start.get_offset(); gtk_source_search_context_replace(search_context, match_start.gobj(), match_end.gobj(), replacement.c_str(), replacement.size(), NULL); - get_buffer()->select_range(get_buffer()->get_iter_at_offset(offset), get_buffer()->get_iter_at_offset(offset+replacement.size())); + Glib::ustring replacement_ustring=replacement; + get_buffer()->select_range(get_buffer()->get_iter_at_offset(offset), get_buffer()->get_iter_at_offset(offset+replacement_ustring.size())); scroll_to(get_buffer()->get_insert()); } } From cda802676e104ebd6c0a270e187cf61c82949fb2 Mon Sep 17 00:00:00 2001 From: eidheim Date: Thu, 17 Dec 2015 08:49:42 +0100 Subject: [PATCH 04/14] Work in progress related to #130 --- src/source.cc | 7 +++++++ src/window.cc | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/source.cc b/src/source.cc index d2aba97..c5d8e2d 100644 --- a/src/source.cc +++ b/src/source.cc @@ -451,6 +451,13 @@ void Source::View::set_tooltip_events() { diagnostic_tooltips.hide(); return false; }); + + signal_leave_notify_event().connect([this](GdkEventCrossing*) { + delayed_tooltips_connection.disconnect(); + type_tooltips.hide(); + diagnostic_tooltips.hide(); + return false; + }); } void Source::View::search_occurrences_updated(GtkWidget* widget, GParamSpec* property, gpointer data) { diff --git a/src/window.cc b/src/window.cc index f7fad76..3c4f6bc 100644 --- a/src/window.cc +++ b/src/window.cc @@ -25,7 +25,7 @@ namespace sigc { Window::Window() : compiling(false) { JDEBUG("start"); set_title("juCi++"); - set_events(Gdk::POINTER_MOTION_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::SCROLL_MASK); + set_events(Gdk::POINTER_MOTION_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::SCROLL_MASK|Gdk::LEAVE_NOTIFY_MASK); set_menu_actions(); configure(); set_default_size(Config::get().window.default_size.first, Config::get().window.default_size.second); From da62ee9bd67c58bfde9262b7014225e2ceaf338c Mon Sep 17 00:00:00 2001 From: eidheim Date: Thu, 17 Dec 2015 17:59:51 +0100 Subject: [PATCH 05/14] Fixes #130, but need some testing before merge --- src/selectiondialog.h | 4 ++-- src/source.cc | 31 +++++++++++++++++-------------- src/source.h | 4 ++-- src/source_clang.cc | 31 ++++++++++++++----------------- src/source_clang.h | 3 +-- 5 files changed, 36 insertions(+), 37 deletions(-) diff --git a/src/selectiondialog.h b/src/selectiondialog.h index 5673f1a..09a28f1 100644 --- a/src/selectiondialog.h +++ b/src/selectiondialog.h @@ -37,6 +37,8 @@ public: std::function on_hide; std::function on_select; Glib::RefPtr start_mark; + + bool shown=false; protected: virtual void resize(); virtual void update_tooltips(); @@ -50,8 +52,6 @@ protected: std::unique_ptr tooltips; std::unordered_map tooltip_texts; std::string last_row; -private: - bool shown=false; }; class SelectionDialog : public SelectionDialogBase { diff --git a/src/source.cc b/src/source.cc index c5d8e2d..4683fbf 100644 --- a/src/source.cc +++ b/src/source.cc @@ -8,8 +8,6 @@ #include "filesystem.h" #include "terminal.h" -using namespace std; //TODO: remove - namespace sigc { #ifndef SIGC_FUNCTORS_DEDUCE_RESULT_TYPE_WITH_DECLTYPE template @@ -219,7 +217,7 @@ Source::View::View(const boost::filesystem::path &file_path, const boost::filesy return; if(mark->get_name()=="insert") { - if(spellcheck_suggestions_dialog_shown) + if(spellcheck_suggestions_dialog && spellcheck_suggestions_dialog->shown) spellcheck_suggestions_dialog->hide(); delayed_spellcheck_suggestions_connection.disconnect(); delayed_spellcheck_suggestions_connection=Glib::signal_timeout().connect([this]() { @@ -233,9 +231,6 @@ Source::View::View(const boost::filesystem::path &file_path, const boost::filesy } if(need_suggestions) { spellcheck_suggestions_dialog=std::unique_ptr(new SelectionDialog(*this, get_buffer()->create_mark(get_buffer()->get_insert()->get_iter()), false)); - spellcheck_suggestions_dialog->on_hide=[this](){ - spellcheck_suggestions_dialog_shown=false; - }; auto word=spellcheck_get_word(get_buffer()->get_insert()->get_iter()); auto suggestions=spellcheck_get_suggestions(word.first, word.second); if(suggestions.size()==0) @@ -250,7 +245,6 @@ Source::View::View(const boost::filesystem::path &file_path, const boost::filesy delayed_tooltips_connection.disconnect(); }; spellcheck_suggestions_dialog->show(); - spellcheck_suggestions_dialog_shown=true; } return false; }, 500); @@ -261,7 +255,7 @@ Source::View::View(const boost::filesystem::path &file_path, const boost::filesy set_info(info); }); - set_tooltip_events(); + set_tooltip_and_dialog_events(); tab_char=Config::get().source.default_tab_char; tab_size=Config::get().source.default_tab_size; @@ -386,7 +380,7 @@ void Source::View::configure() { get_buffer()->remove_tag_by_name("spellcheck_error", get_buffer()->begin(), get_buffer()->end()); } -void Source::View::set_tooltip_events() { +void Source::View::set_tooltip_and_dialog_events() { signal_motion_notify_event().connect([this](GdkEventMotion* event) { if(on_motion_last_x!=event->x || on_motion_last_y!=event->y) { delayed_tooltips_connection.disconnect(); @@ -437,11 +431,18 @@ void Source::View::set_tooltip_events() { set_info(info); } }); - + signal_scroll_event().connect([this](GdkEventScroll* event) { delayed_tooltips_connection.disconnect(); type_tooltips.hide(); diagnostic_tooltips.hide(); + delayed_spellcheck_suggestions_connection.disconnect(); + if(spellcheck_suggestions_dialog) + spellcheck_suggestions_dialog->hide(); + if(autocomplete_dialog) + autocomplete_dialog->hide(); + if(selection_dialog) + selection_dialog->hide(); return false; }); @@ -449,6 +450,7 @@ void Source::View::set_tooltip_events() { delayed_tooltips_connection.disconnect(); type_tooltips.hide(); diagnostic_tooltips.hide(); + delayed_spellcheck_suggestions_connection.disconnect(); return false; }); @@ -456,6 +458,7 @@ void Source::View::set_tooltip_events() { delayed_tooltips_connection.disconnect(); type_tooltips.hide(); diagnostic_tooltips.hide(); + delayed_spellcheck_suggestions_connection.disconnect(); return false; }); } @@ -931,7 +934,7 @@ bool Source::View::find_left_bracket_backward(Gtk::TextIter iter, Gtk::TextIter //Basic indentation bool Source::View::on_key_press_event(GdkEventKey* key) { - if(spellcheck_suggestions_dialog_shown) { + if(spellcheck_suggestions_dialog && spellcheck_suggestions_dialog->shown) { if(spellcheck_suggestions_dialog->on_key_press(key)) return true; } @@ -1235,8 +1238,8 @@ std::pair Source::View::find_tab_char_and_size() { } else if(!iter.ends_line()) { if(tab_count!=last_tab_count) - tab_sizes[abs(tab_count-last_tab_count)]++; - last_tab_diff=abs(tab_count-last_tab_count); + tab_sizes[std::abs(tab_count-last_tab_count)]++; + last_tab_diff=std::abs(tab_count-last_tab_count); last_tab_count=tab_count; last_char=0; } @@ -1290,7 +1293,7 @@ std::pair Source::View::find_tab_char_and_size() { } else if(!iter.ends_line()) { if(tab_count!=last_tab_count) - tab_sizes[abs(tab_count-last_tab_count)]++; + tab_sizes[std::abs(tab_count-last_tab_count)]++; last_tab_count=tab_count; } } diff --git a/src/source.h b/src/source.h index e11a57c..35d6c98 100644 --- a/src/source.h +++ b/src/source.h @@ -85,6 +85,7 @@ namespace Source { std::function goto_next_diagnostic; std::function apply_fix_its; + std::unique_ptr autocomplete_dialog; std::unique_ptr selection_dialog; sigc::connection delayed_tooltips_connection; @@ -114,7 +115,7 @@ namespace Source { virtual void show_type_tooltips(const Gdk::Rectangle &rectangle) {} gdouble on_motion_last_x; gdouble on_motion_last_y; - void set_tooltip_events(); + void set_tooltip_and_dialog_events(); std::string get_line(const Gtk::TextIter &iter); std::string get_line(Glib::RefPtr mark); @@ -143,7 +144,6 @@ namespace Source { bool spellcheck_all=false; std::unique_ptr spellcheck_suggestions_dialog; - bool spellcheck_suggestions_dialog_shown=false; bool last_keyval_is_backspace=false; bool last_keyval_is_return=false; private: diff --git a/src/source_clang.cc b/src/source_clang.cc index f51a9a8..e379fba 100644 --- a/src/source_clang.cc +++ b/src/source_clang.cc @@ -422,7 +422,7 @@ void Source::ClangViewParse::show_type_tooltips(const Gdk::Rectangle &rectangle) //Clang indentation. bool Source::ClangViewParse::on_key_press_event(GdkEventKey* key) { - if(spellcheck_suggestions_dialog_shown) { + if(spellcheck_suggestions_dialog && spellcheck_suggestions_dialog->shown) { if(spellcheck_suggestions_dialog->on_key_press(key)) return true; } @@ -622,7 +622,7 @@ Source::ClangViewParse(file_path, project_path, language), autocomplete_state(Au } else { if(autocomplete_state==AutocompleteState::STARTING) - autocomplete_state=AutocompleteState::CANCELED; + autocomplete_state=AutocompleteState::RESTARTING; else { auto iter=get_buffer()->get_insert()->get_iter(); if(last_keyval=='.' || last_keyval==':' || (last_keyval=='>' && iter.backward_char() && iter.backward_char() && *iter=='-')) @@ -633,17 +633,10 @@ Source::ClangViewParse(file_path, project_path, language), autocomplete_state(Au }); get_buffer()->signal_mark_set().connect([this](const Gtk::TextBuffer::iterator& iterator, const Glib::RefPtr& mark){ if(mark->get_name()=="insert") { - if(autocomplete_state==AutocompleteState::SHOWN) - autocomplete_dialog->hide(); if(autocomplete_state==AutocompleteState::STARTING) autocomplete_state=AutocompleteState::CANCELED; } }); - signal_scroll_event().connect([this](GdkEventScroll* event){ - if(autocomplete_state==AutocompleteState::SHOWN) - autocomplete_dialog->hide(); - return false; - }, false); signal_key_release_event().connect([this](GdkEventKey* key){ if(autocomplete_state==AutocompleteState::SHOWN) { if(autocomplete_dialog->on_key_release(key)) @@ -654,8 +647,6 @@ Source::ClangViewParse(file_path, project_path, language), autocomplete_state(Au }, false); signal_focus_out_event().connect([this](GdkEventFocus* event) { - if(autocomplete_state==AutocompleteState::SHOWN) - autocomplete_dialog->hide(); if(autocomplete_state==AutocompleteState::STARTING) autocomplete_state=AutocompleteState::CANCELED; return false; @@ -666,6 +657,11 @@ Source::ClangViewParse(file_path, project_path, language), autocomplete_state(Au set_status(""); soft_reparse(); autocomplete_state=AutocompleteState::IDLE; + } + else if(autocomplete_state==AutocompleteState::RESTARTING) { + set_status(""); + soft_reparse(); + autocomplete_state=AutocompleteState::IDLE; autocomplete_restart(); } else { @@ -815,14 +811,14 @@ void Source::ClangViewAutocomplete::autocomplete_check() { prefix_mutex.lock(); prefix=sm[3].str(); prefix_mutex.unlock(); - if(autocomplete_state==AutocompleteState::IDLE && (prefix.size()==0 || prefix[0]<'0' || prefix[0]>'9')) + if(prefix.size()==0 || prefix[0]<'0' || prefix[0]>'9') autocomplete(); } else if(boost::regex_match(line, sm, within_namespace)) { prefix_mutex.lock(); prefix=sm[3].str(); prefix_mutex.unlock(); - if(autocomplete_state==AutocompleteState::IDLE && (prefix.size()==0 || prefix[0]<'0' || prefix[0]>'9')) + if(prefix.size()==0 || prefix[0]<'0' || prefix[0]>'9') autocomplete(); } if(autocomplete_state!=AutocompleteState::IDLE) @@ -832,12 +828,13 @@ void Source::ClangViewAutocomplete::autocomplete_check() { void Source::ClangViewAutocomplete::autocomplete() { if(parse_state!=ParseState::PROCESSING) return; - if(autocomplete_state==AutocompleteState::STARTING) { - autocomplete_state=AutocompleteState::CANCELED; - return; - } + if(autocomplete_state==AutocompleteState::CANCELED) + autocomplete_state=AutocompleteState::RESTARTING; + + if(autocomplete_state!=AutocompleteState::IDLE) return; + autocomplete_state=AutocompleteState::STARTING; autocomplete_data.clear(); diff --git a/src/source_clang.h b/src/source_clang.h index 117d8d1..a436b35 100644 --- a/src/source_clang.h +++ b/src/source_clang.h @@ -72,7 +72,7 @@ namespace Source { class ClangViewAutocomplete : public ClangViewParse { protected: - enum class AutocompleteState {IDLE, STARTING, CANCELED, SHOWN}; + enum class AutocompleteState {IDLE, STARTING, RESTARTING, CANCELED, SHOWN}; public: class AutoCompleteData { public: @@ -101,7 +101,6 @@ namespace Source { void autocomplete_check(); void autocomplete(); std::vector autocomplete_data; - std::unique_ptr autocomplete_dialog; std::unordered_map autocomplete_dialog_rows; std::vector autocomplete_get_suggestions(const std::string &buffer, int line_number, int column); Glib::Dispatcher autocomplete_done; From 9eac6d1382f733a4489ac065cbdc087e40a711e6 Mon Sep 17 00:00:00 2001 From: eidheim Date: Thu, 17 Dec 2015 18:05:19 +0100 Subject: [PATCH 06/14] Minor cleanup to dialog events --- src/source.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/source.cc b/src/source.cc index 4683fbf..d11074a 100644 --- a/src/source.cc +++ b/src/source.cc @@ -437,11 +437,11 @@ void Source::View::set_tooltip_and_dialog_events() { type_tooltips.hide(); diagnostic_tooltips.hide(); delayed_spellcheck_suggestions_connection.disconnect(); - if(spellcheck_suggestions_dialog) + if(spellcheck_suggestions_dialog && spellcheck_suggestions_dialog->shown) spellcheck_suggestions_dialog->hide(); - if(autocomplete_dialog) + if(autocomplete_dialog && autocomplete_dialog->shown) autocomplete_dialog->hide(); - if(selection_dialog) + if(selection_dialog && selection_dialog->shown) selection_dialog->hide(); return false; }); From c4b3e869df13af52f5645f9f076bf2aab959d016 Mon Sep 17 00:00:00 2001 From: eidheim Date: Thu, 17 Dec 2015 18:27:56 +0100 Subject: [PATCH 07/14] Final fix to #130 hopefully --- src/source.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/source.cc b/src/source.cc index d11074a..ff3ecc6 100644 --- a/src/source.cc +++ b/src/source.cc @@ -451,6 +451,10 @@ void Source::View::set_tooltip_and_dialog_events() { type_tooltips.hide(); diagnostic_tooltips.hide(); delayed_spellcheck_suggestions_connection.disconnect(); + if(spellcheck_suggestions_dialog && spellcheck_suggestions_dialog->shown) + spellcheck_suggestions_dialog->hide(); + if(autocomplete_dialog && autocomplete_dialog->shown) + autocomplete_dialog->hide(); return false; }); From c20f284403cb29cff50fc36f9fa709e9ead7820d Mon Sep 17 00:00:00 2001 From: eidheim Date: Thu, 17 Dec 2015 18:42:52 +0100 Subject: [PATCH 08/14] Minor fix to autocomplete states --- src/source_clang.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/source_clang.cc b/src/source_clang.cc index e379fba..4ad068d 100644 --- a/src/source_clang.cc +++ b/src/source_clang.cc @@ -622,7 +622,7 @@ Source::ClangViewParse(file_path, project_path, language), autocomplete_state(Au } else { if(autocomplete_state==AutocompleteState::STARTING) - autocomplete_state=AutocompleteState::RESTARTING; + autocomplete_state=AutocompleteState::CANCELED; else { auto iter=get_buffer()->get_insert()->get_iter(); if(last_keyval=='.' || last_keyval==':' || (last_keyval=='>' && iter.backward_char() && iter.backward_char() && *iter=='-')) From 5fcd3c4889f1a53b18481f4673c5e3bb191110c6 Mon Sep 17 00:00:00 2001 From: eidheim Date: Thu, 17 Dec 2015 22:28:36 +0100 Subject: [PATCH 09/14] Autocomplete cleanup --- src/source_clang.cc | 24 +++++++++--------------- src/source_clang.h | 2 +- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/src/source_clang.cc b/src/source_clang.cc index 4ad068d..864f318 100644 --- a/src/source_clang.cc +++ b/src/source_clang.cc @@ -610,7 +610,7 @@ bool Source::ClangViewParse::on_key_press_event(GdkEventKey* key) { Source::ClangViewAutocomplete::ClangViewAutocomplete(const boost::filesystem::path &file_path, const boost::filesystem::path& project_path, Glib::RefPtr language): Source::ClangViewParse(file_path, project_path, language), autocomplete_state(AutocompleteState::IDLE) { get_buffer()->signal_changed().connect([this](){ - if(autocomplete_state==AutocompleteState::SHOWN) + if(autocomplete_dialog && autocomplete_dialog->shown) delayed_reparse_connection.disconnect(); else { if(!has_focus()) @@ -621,7 +621,7 @@ Source::ClangViewParse(file_path, project_path, language), autocomplete_state(Au autocomplete_check(); } else { - if(autocomplete_state==AutocompleteState::STARTING) + if(autocomplete_state==AutocompleteState::STARTING || autocomplete_state==AutocompleteState::RESTARTING) autocomplete_state=AutocompleteState::CANCELED; else { auto iter=get_buffer()->get_insert()->get_iter(); @@ -633,12 +633,12 @@ Source::ClangViewParse(file_path, project_path, language), autocomplete_state(Au }); get_buffer()->signal_mark_set().connect([this](const Gtk::TextBuffer::iterator& iterator, const Glib::RefPtr& mark){ if(mark->get_name()=="insert") { - if(autocomplete_state==AutocompleteState::STARTING) + if(autocomplete_state==AutocompleteState::STARTING || autocomplete_state==AutocompleteState::RESTARTING) autocomplete_state=AutocompleteState::CANCELED; } }); signal_key_release_event().connect([this](GdkEventKey* key){ - if(autocomplete_state==AutocompleteState::SHOWN) { + if(autocomplete_dialog && autocomplete_dialog->shown) { if(autocomplete_dialog->on_key_release(key)) return true; } @@ -647,7 +647,7 @@ Source::ClangViewParse(file_path, project_path, language), autocomplete_state(Au }, false); signal_focus_out_event().connect([this](GdkEventFocus* event) { - if(autocomplete_state==AutocompleteState::STARTING) + if(autocomplete_state==AutocompleteState::STARTING || autocomplete_state==AutocompleteState::RESTARTING) autocomplete_state=AutocompleteState::CANCELED; return false; }); @@ -689,15 +689,13 @@ Source::ClangViewParse(file_path, project_path, language), autocomplete_state(Au } } set_status(""); + autocomplete_state=AutocompleteState::IDLE; if (!autocomplete_dialog_rows.empty()) { - autocomplete_state=AutocompleteState::SHOWN; get_source_buffer()->begin_user_action(); autocomplete_dialog->show(); } - else { - autocomplete_state=AutocompleteState::IDLE; + else soft_reparse(); - } } }); @@ -724,7 +722,7 @@ Source::ClangViewParse(file_path, project_path, language), autocomplete_state(Au bool Source::ClangViewAutocomplete::on_key_press_event(GdkEventKey *key) { last_keyval=key->keyval; - if(autocomplete_state==AutocompleteState::SHOWN) { + if(autocomplete_dialog && autocomplete_dialog->shown) { if(autocomplete_dialog->on_key_press(key)) return true; } @@ -739,7 +737,6 @@ void Source::ClangViewAutocomplete::autocomplete_dialog_setup() { autocomplete_dialog_rows.clear(); autocomplete_dialog->on_hide=[this](){ get_source_buffer()->end_user_action(); - autocomplete_state=AutocompleteState::IDLE; parsed=false; soft_reparse(); }; @@ -755,7 +752,6 @@ void Source::ClangViewAutocomplete::autocomplete_dialog_setup() { } get_buffer()->insert(autocomplete_dialog->start_mark->get_iter(), row); if(hide_window) { - autocomplete_state=AutocompleteState::IDLE; auto para_pos=row.find('('); auto angle_pos=row.find('<'); size_t start_pos=std::string::npos; @@ -789,10 +785,8 @@ void Source::ClangViewAutocomplete::autocomplete_dialog_setup() { else { //new autocomplete after for instance when selecting "std::" auto iter=get_buffer()->get_insert()->get_iter(); - if(iter.backward_char() && *iter==':') { - autocomplete_state=AutocompleteState::IDLE; + if(iter.backward_char() && *iter==':') autocomplete_restart(); - } } } }; diff --git a/src/source_clang.h b/src/source_clang.h index a436b35..f4d26d6 100644 --- a/src/source_clang.h +++ b/src/source_clang.h @@ -72,7 +72,7 @@ namespace Source { class ClangViewAutocomplete : public ClangViewParse { protected: - enum class AutocompleteState {IDLE, STARTING, RESTARTING, CANCELED, SHOWN}; + enum class AutocompleteState {IDLE, STARTING, RESTARTING, CANCELED}; public: class AutoCompleteData { public: From bba3d05751433a21a31c3db3e8afb2d1c68d9232 Mon Sep 17 00:00:00 2001 From: Ole Christian Eidheim Date: Fri, 18 Dec 2015 11:07:07 +0100 Subject: [PATCH 10/14] No longer shows tooltips right after goto declaration --- src/window.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/window.cc b/src/window.cc index 3c4f6bc..ef955b9 100644 --- a/src/window.cc +++ b/src/window.cc @@ -411,6 +411,7 @@ void Window::set_menu_actions() { if(notebook.get_current_page()!=-1 && notebook.get_current_view()==view) { view->get_buffer()->place_cursor(view->get_buffer()->get_iter_at_line_index(line, index)); view->scroll_to(view->get_buffer()->get_insert(), 0.0, 1.0, 0.5); + view->delayed_tooltips_connection.disconnect(); } } } From 08910538d8ab1f8c90d4b1bfbc706d2a5d1c080a Mon Sep 17 00:00:00 2001 From: Ole Christian Eidheim Date: Fri, 18 Dec 2015 11:38:13 +0100 Subject: [PATCH 11/14] Dialogs now gets hidden if a new cursor position is chosen using the mouse. Also made the run command entry a bit larger --- src/source.cc | 8 ++++++++ src/window.cc | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/source.cc b/src/source.cc index ff3ecc6..1afe104 100644 --- a/src/source.cc +++ b/src/source.cc @@ -428,6 +428,14 @@ void Source::View::set_tooltip_and_dialog_events() { }, 500); type_tooltips.hide(); diagnostic_tooltips.hide(); + + if(spellcheck_suggestions_dialog && spellcheck_suggestions_dialog->shown) + spellcheck_suggestions_dialog->hide(); + if(autocomplete_dialog && autocomplete_dialog->shown) + autocomplete_dialog->hide(); + if(selection_dialog && selection_dialog->shown) + selection_dialog->hide(); + set_info(info); } }); diff --git a/src/window.cc b/src/window.cc index ef955b9..aef42c8 100644 --- a/src/window.cc +++ b/src/window.cc @@ -592,7 +592,7 @@ void Window::set_menu_actions() { }); } entry_box.hide(); - }); + }, 30); auto entry_it=entry_box.entries.begin(); entry_it->set_placeholder_text("Command"); entry_box.buttons.emplace_back("Run command", [this, entry_it](){ From b11494b15d1752c33b8fcd6ec1aa586ef1c5849e Mon Sep 17 00:00:00 2001 From: Ole Christian Eidheim Date: Fri, 18 Dec 2015 11:53:56 +0100 Subject: [PATCH 12/14] Cleanup of cmake project search, no longer tried to search for cmakelists if starting/reaching a directory without cmakelists --- src/cmake.cc | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/src/cmake.cc b/src/cmake.cc index 0ca58db..620575f 100644 --- a/src/cmake.cc +++ b/src/cmake.cc @@ -17,25 +17,21 @@ CMake::CMake(const boost::filesystem::path &path) { }; auto search_path=path; - auto search_cmake_path=search_path; - search_cmake_path+="/CMakeLists.txt"; - if(boost::filesystem::exists(search_cmake_path)) - paths.emplace(paths.begin(), search_cmake_path); - if(find_cmake_project(search_cmake_path)) - project_path=search_path; - else { - do { - search_path=search_path.parent_path(); - search_cmake_path=search_path; - search_cmake_path+="/CMakeLists.txt"; - if(boost::filesystem::exists(search_cmake_path)) - paths.emplace(paths.begin(), search_cmake_path); - if(find_cmake_project(search_cmake_path)) { - project_path=search_path; - break; - } - } while(search_path!=search_path.root_directory()); + while(true) { + auto search_cmake_path=search_path/"CMakeLists.txt"; + if(boost::filesystem::exists(search_cmake_path)) + paths.emplace(paths.begin(), search_cmake_path); + else + break; + if(find_cmake_project(search_cmake_path)) { + project_path=search_path; + break; + } + if(search_path==search_path.root_directory()) + break; + search_path=search_path.parent_path(); } + if(!project_path.empty()) { if(boost::filesystem::exists(project_path/"CMakeLists.txt") && !boost::filesystem::exists(project_path/"compile_commands.json")) create_compile_commands(project_path); From b4e2b2fc80508fb6e6463bdf10f63474f59320ca Mon Sep 17 00:00:00 2001 From: eidheim Date: Fri, 18 Dec 2015 15:44:20 +0100 Subject: [PATCH 13/14] Now tries to guess executable based on add_executable parameters --- src/window.cc | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/window.cc b/src/window.cc index aef42c8..6b796f1 100644 --- a/src/window.cc +++ b/src/window.cc @@ -1,4 +1,3 @@ - #include "window.h" #include "logging.h" #include "config.h" @@ -8,6 +7,9 @@ #include "dialogs.h" #include "filesystem.h" +#include //TODO: remove +using namespace std; //TODO: remove + namespace sigc { #ifndef SIGC_FUNCTORS_DEDUCE_RESULT_TYPE_WITH_DECLTYPE template @@ -518,11 +520,26 @@ void Window::set_menu_actions() { return; CMake cmake(cmake_path); auto executables = cmake.get_functions_parameters("add_executable"); + + //Attempt to find executable based add_executable files and opened tab boost::filesystem::path executable_path; - if(executables.size()>0 && executables[0].second.size()>0) { - executable_path=executables[0].first.parent_path(); - executable_path+="/"+executables[0].second[0]; + if(notebook.get_current_page()!=-1) { + for(auto &executable: executables) { + if(executable.second.size()>1) { + for(size_t c=1;cfile_path.filename()) { + executable_path=executable.first.parent_path()/executable.second[0]; + break; + } + } + } + if(!executable_path.empty()) + break; + } } + if(executable_path.empty() && executables.size()>0 && executables[0].second.size()>0) + executable_path=executables[0].first.parent_path()/executables[0].second[0]; + if(cmake.project_path!="") { if(executable_path!="") { compiling=true; From 28ea45dbdd8ce496368af3bac556ba1dd2a1b40b Mon Sep 17 00:00:00 2001 From: eidheim Date: Fri, 18 Dec 2015 15:45:54 +0100 Subject: [PATCH 14/14] Forgot to remove iostream --- src/window.cc | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/window.cc b/src/window.cc index 6b796f1..acc4024 100644 --- a/src/window.cc +++ b/src/window.cc @@ -7,9 +7,6 @@ #include "dialogs.h" #include "filesystem.h" -#include //TODO: remove -using namespace std; //TODO: remove - namespace sigc { #ifndef SIGC_FUNCTORS_DEDUCE_RESULT_TYPE_WITH_DECLTYPE template