|
|
|
|
@ -114,6 +114,43 @@ std::vector<Source::View*> &Notebook::get_views() {
|
|
|
|
|
return source_views; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void Notebook::update_labels(const boost::filesystem::path &introduced_file_name) { |
|
|
|
|
std::vector<std::pair<boost::filesystem::path, int>> duplicates; |
|
|
|
|
for (size_t c = 0; c < size(); ++c) { |
|
|
|
|
if (source_views.at(c)->file_path.filename() == introduced_file_name.filename()) { |
|
|
|
|
duplicates.emplace_back(std::make_pair(source_views[c]->file_path, c)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
std::sort(duplicates.begin(), duplicates.end(),[](const std::pair<boost::filesystem::path, int> &a, const std::pair<boost::filesystem::path, int> &b){ |
|
|
|
|
return a.first > b.first; |
|
|
|
|
}); |
|
|
|
|
for (size_t c = 0; c < duplicates.size(); ++c) { |
|
|
|
|
auto &duplicate = duplicates.at(c); |
|
|
|
|
std::cout << duplicate.first << std::endl; |
|
|
|
|
int diff = 0; |
|
|
|
|
const auto parent_path1 = duplicate.first.parent_path(); |
|
|
|
|
const auto index = c-1 == -1 ? duplicates.size()-1 : c-1; |
|
|
|
|
const auto parent_path2 = duplicates.at(index).first.parent_path(); |
|
|
|
|
auto it1 = parent_path1.end(); |
|
|
|
|
const auto it1_end = parent_path1.begin(); |
|
|
|
|
auto it2 = parent_path2.end(); |
|
|
|
|
const auto it2_end = parent_path2.begin(); |
|
|
|
|
while (it1 != it1_end && it2 != it2_end && *it1 == *it2) { |
|
|
|
|
--it1; |
|
|
|
|
--it2; |
|
|
|
|
++diff; |
|
|
|
|
} |
|
|
|
|
const auto current_view = source_views[duplicate.second]; |
|
|
|
|
auto title = it1->string() + (diff > 1 ? "/…/" : "/") + current_view->file_path.filename().string(); |
|
|
|
|
auto &tab_label = tab_labels.at(duplicate.second); |
|
|
|
|
tab_label->label.set_text(title); |
|
|
|
|
if (current_view->update_modified && current_view->get_buffer()->get_modified()) |
|
|
|
|
current_view->update_modified(current_view); |
|
|
|
|
tab_label->set_tooltip_text(filesystem::get_short_path(current_view->file_path).string()); |
|
|
|
|
} |
|
|
|
|
std::cout << std::endl; |
|
|
|
|
//TODO update status
|
|
|
|
|
} |
|
|
|
|
void Notebook::open(const boost::filesystem::path &file_path_, size_t notebook_index) { |
|
|
|
|
auto file_path=filesystem::get_normal_path(file_path_); |
|
|
|
|
|
|
|
|
|
@ -201,45 +238,6 @@ void Notebook::open(const boost::filesystem::path &file_path_, size_t notebook_i
|
|
|
|
|
const auto title = view->get_buffer()->get_modified() ? tab_title + '*' : tab_title.substr(0, tab_title.size() - 1); |
|
|
|
|
label.set_text(title); |
|
|
|
|
}; |
|
|
|
|
source_views.back()->update_tab_label = [this](Source::View *view) { |
|
|
|
|
const auto update_label = [&](size_t index, const std::string &prepend) { |
|
|
|
|
const auto current_view = source_views[index]; |
|
|
|
|
auto title = prepend + current_view->file_path.filename().string(); |
|
|
|
|
auto &tab_label = tab_labels.at(index); |
|
|
|
|
tab_label->label.set_text(title); |
|
|
|
|
if (current_view->update_modified && current_view->get_buffer()->get_modified()) |
|
|
|
|
current_view->update_modified(current_view); |
|
|
|
|
tab_label->set_tooltip_text(filesystem::get_short_path(current_view->file_path).string()); |
|
|
|
|
}; |
|
|
|
|
const auto file_name = view->file_path.filename(); |
|
|
|
|
std::string prepend_current_view; |
|
|
|
|
size_t current_view_index = 0; |
|
|
|
|
for (size_t c = 0; c < size(); ++c) { |
|
|
|
|
if (source_views[c] == view) { |
|
|
|
|
current_view_index = c; |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
if (source_views[c]->file_path.filename() == file_name) { |
|
|
|
|
int diff = 0; |
|
|
|
|
const auto parent_path1 = view->file_path.parent_path(); |
|
|
|
|
const auto parent_path2 = source_views[c]->file_path.parent_path(); |
|
|
|
|
auto it1 = parent_path1.end(); |
|
|
|
|
const auto it1_end = parent_path1.begin(); |
|
|
|
|
auto it2 = parent_path2.end(); |
|
|
|
|
const auto it2_end = parent_path2.begin(); |
|
|
|
|
while (it1 != it1_end && it2 != it2_end && *it1 == *it2) { |
|
|
|
|
--it1; |
|
|
|
|
--it2; |
|
|
|
|
++diff; |
|
|
|
|
} |
|
|
|
|
if (prepend_current_view.empty()) |
|
|
|
|
prepend_current_view = it1->string() + (diff > 0 ? "/…/" : "/"); |
|
|
|
|
update_label(c, it2->string() + (diff > 0 ? "/…/" : "/")); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
update_label(current_view_index, prepend_current_view); |
|
|
|
|
update_status(view); |
|
|
|
|
}; |
|
|
|
|
source_views.back()->update_status_diagnostics=[this](Source::View* view) { |
|
|
|
|
if(get_current_view()==view) { |
|
|
|
|
std::string diagnostic_info; |
|
|
|
|
@ -324,8 +322,7 @@ void Notebook::open(const boost::filesystem::path &file_path_, size_t notebook_i
|
|
|
|
|
close(index); |
|
|
|
|
})); |
|
|
|
|
|
|
|
|
|
if(source_view->update_tab_label) |
|
|
|
|
source_view->update_tab_label(source_view); |
|
|
|
|
update_labels(file_path); |
|
|
|
|
|
|
|
|
|
source_view->get_buffer()->signal_modified_changed().connect([source_view]() { |
|
|
|
|
if (source_view->update_modified) |
|
|
|
|
@ -484,6 +481,7 @@ bool Notebook::save_current() {
|
|
|
|
|
|
|
|
|
|
bool Notebook::close(size_t index) { |
|
|
|
|
if(auto view=get_view(index)) { |
|
|
|
|
auto removed_path = view->file_path; |
|
|
|
|
if(view->get_buffer()->get_modified()){ |
|
|
|
|
if(!save_modified_dialog(index)) |
|
|
|
|
return false; |
|
|
|
|
@ -537,10 +535,7 @@ bool Notebook::close(size_t index) {
|
|
|
|
|
scrolled_windows.erase(scrolled_windows.begin()+index); |
|
|
|
|
hboxes.erase(hboxes.begin()+index); |
|
|
|
|
tab_labels.erase(tab_labels.begin()+index); |
|
|
|
|
} |
|
|
|
|
for (auto view : get_views()) { |
|
|
|
|
if (view->update_tab_label) |
|
|
|
|
view->update_tab_label(view); |
|
|
|
|
Notebook::get().update_labels(removed_path); |
|
|
|
|
} |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|