diff --git a/src/menu.cc b/src/menu.cc index a9eccf0..ac6a464 100644 --- a/src/menu.cc +++ b/src/menu.cc @@ -245,8 +245,8 @@ Menu::Menu() { app.compile - _Clean _Project - app.clean_project + _Recreate _Build + app.project_recreate_build
diff --git a/src/project.cc b/src/project.cc index 96d6c1a..11de813 100644 --- a/src/project.cc +++ b/src/project.cc @@ -147,17 +147,8 @@ void Project::Base::compile_and_run() { Info::get().print("Could not find a supported project"); } -void Project::Base::clean_project() { - auto default_build_path=build->get_default_path(); - if(default_build_path.empty() || !build->update_default()) - return; - - if(Config::get().project.clear_terminal_on_compile) - Terminal::get().clear(); - Terminal::get().print("Cleaning build directory\n"); - boost::filesystem::remove_all(default_build_path); - boost::filesystem::create_directory(default_build_path); - Terminal::get().print("Build directory cleaned!\n"); +void Project::Base::recreate_build() { + Info::get().print("Could not find a supported project"); } std::pair Project::Base::debug_get_run_arguments() { @@ -281,6 +272,59 @@ void Project::Clang::compile_and_run() { }); } +void Project::Clang::recreate_build() { + auto default_build_path=build->get_default_path(); + if(default_build_path.empty()) + return; + + auto debug_build_path=build->get_debug_path(); + bool has_default_build=boost::filesystem::exists(default_build_path); + bool has_debug_build=!debug_build_path.empty() && boost::filesystem::exists(debug_build_path); + + if(has_default_build || has_debug_build) { + Gtk::MessageDialog dialog(*static_cast(Notebook::get().get_toplevel()), "Recreate Build", false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_YES_NO); + dialog.set_default_response(Gtk::RESPONSE_NO); + std::string message="Are you sure you want to recreate "; + if(has_default_build) + message+=default_build_path.string(); + if(has_debug_build) { + if(has_default_build) + message+=" and "; + message+=debug_build_path.string(); + } + dialog.set_secondary_text(message+"?"); + if(dialog.run()!=Gtk::RESPONSE_YES) + return; + try { + if(has_default_build) + boost::filesystem::remove_all(default_build_path); + if(has_debug_build) + boost::filesystem::remove_all(debug_build_path); + } + catch(const std::exception &e) { + Terminal::get().print(std::string("Error: could remove build: ")+e.what()+"\n", true); + return; + } + } + + build->update_default(true); + if(has_debug_build) + build->update_debug(true); + + for(size_t c=0;c(source_view)) { + if(filesystem::file_in_path(source_clang_view->file_path, build->project_path)) + source_clang_view->full_reparse_needed=true; + } + } + + if(auto view=Notebook::get().get_current_view()) { + if(view->full_reparse_needed) + view->full_reparse(); + } +} + #ifdef JUCI_ENABLE_DEBUG std::pair Project::Clang::debug_get_run_arguments() { auto build_path=build->get_debug_path(); diff --git a/src/project.h b/src/project.h index e1270a1..d9596c6 100644 --- a/src/project.h +++ b/src/project.h @@ -43,7 +43,7 @@ namespace Project { virtual std::pair get_run_arguments(); virtual void compile(); virtual void compile_and_run(); - virtual void clean_project(); + virtual void recreate_build(); virtual std::pair debug_get_run_arguments(); virtual Gtk::Popover *debug_get_options() { return nullptr; } @@ -84,6 +84,7 @@ namespace Project { std::pair get_run_arguments() override; void compile() override; void compile_and_run() override; + void recreate_build() override; #ifdef JUCI_ENABLE_DEBUG std::pair debug_get_run_arguments() override; diff --git a/src/source.h b/src/source.h index 01ef30f..4091003 100644 --- a/src/source.h +++ b/src/source.h @@ -96,7 +96,7 @@ namespace Source { bool soft_reparse_needed=false; bool full_reparse_needed=false; virtual void soft_reparse() {soft_reparse_needed=false;} - virtual bool full_reparse() {full_reparse_needed=false; return true;} + virtual void full_reparse() {full_reparse_needed=false;} protected: std::time_t last_read_time; bool parsed=false; diff --git a/src/source_clang.cc b/src/source_clang.cc index 95d9571..80d14b6 100644 --- a/src/source_clang.cc +++ b/src/source_clang.cc @@ -1409,14 +1409,23 @@ Source::ClangView::ClangView(const boost::filesystem::path &file_path, Glib::Ref }); } -bool Source::ClangView::full_reparse() { +void Source::ClangView::full_reparse() { + auto print_error=[this] { + Terminal::get().async_print("Error: failed to reparse "+file_path.string()+". Please reopen the file manually.\n", true); + }; full_reparse_needed=false; - if(!full_reparse_running) { + if(full_reparse_running) { + print_error(); + return; + } + else { auto expected=ParseState::PROCESSING; if(!parse_state.compare_exchange_strong(expected, ParseState::RESTARTING)) { expected=ParseState::RESTARTING; - if(!parse_state.compare_exchange_strong(expected, ParseState::RESTARTING)) - return false; + if(!parse_state.compare_exchange_strong(expected, ParseState::RESTARTING)) { + print_error(); + return; + } } autocomplete_state=AutocompleteState::IDLE; soft_reparse_needed=false; @@ -1433,9 +1442,7 @@ bool Source::ClangView::full_reparse() { full_reparse_running=false; }); }); - return true; } - return false; } void Source::ClangView::async_delete() { diff --git a/src/source_clang.h b/src/source_clang.h index 24212a6..f429a42 100644 --- a/src/source_clang.h +++ b/src/source_clang.h @@ -118,7 +118,7 @@ namespace Source { public: ClangView(const boost::filesystem::path &file_path, Glib::RefPtr language); - bool full_reparse() override; + void full_reparse() override; void async_delete(); private: diff --git a/src/window.cc b/src/window.cc index 40a58f3..c34f7ea 100644 --- a/src/window.cc +++ b/src/window.cc @@ -117,10 +117,8 @@ Window::Window() { Directories::get().select(view->file_path); - if(view->full_reparse_needed) { - if(!view->full_reparse()) - Terminal::get().async_print("Error: failed to reparse "+view->file_path.string()+". Please reopen the file manually.\n", true); - } + if(view->full_reparse_needed) + view->full_reparse(); else if(view->soft_reparse_needed) view->soft_reparse(); @@ -855,18 +853,15 @@ void Window::set_menu_actions() { Project::current->compile(); }); - menu.add_action("clean_project", [this]() { + menu.add_action("project_recreate_build", [this]() { if(Project::compiling || Project::debugging) { Info::get().print("Compile or debug in progress"); return; } Project::current=Project::create(); - - if(Config::get().project.save_on_compile_or_run) - Project::save_files(Project::current->build->project_path); - Project::current->clean_project(); + Project::current->recreate_build(); }); menu.add_action("run_command", [this]() {