Browse Source

WIP

merge-requests/365/head
Jørgen Lien Sellæg 8 years ago
parent
commit
f2f443bd85
  1. 10
      src/directories.cc
  2. 85
      src/notebook.cc
  3. 1
      src/notebook.h
  4. 2
      src/source.cc
  5. 1
      src/source.h

10
src/directories.cc

@ -69,7 +69,7 @@ bool Directories::TreeStore::drag_data_received_vfunc(const TreeModel::Path &pat
Terminal::get().print("Error: could not move file: "+ec.message()+'\n', true);
return false;
}
auto new_file_path = target_path;
for(size_t c=0;c<Notebook::get().size();c++) {
auto view=Notebook::get().get_view(c);
if(is_directory) {
@ -77,7 +77,6 @@ bool Directories::TreeStore::drag_data_received_vfunc(const TreeModel::Path &pat
auto file_it=view->file_path.begin();
for(auto source_it=source_path.begin();source_it!=source_path.end();source_it++)
file_it++;
auto new_file_path=target_path;
for(;file_it!=view->file_path.end();file_it++)
new_file_path/=*file_it;
view->rename(new_file_path);
@ -88,7 +87,7 @@ bool Directories::TreeStore::drag_data_received_vfunc(const TreeModel::Path &pat
break;
}
}
Notebook::get().update_labels(new_file_path);
Directories::get().update();
Directories::get().on_save_file(target_path);
directories.select(target_path);
@ -263,7 +262,7 @@ Directories::Directories() : Gtk::ListViewText(1) {
update();
on_save_file(target_path);
select(target_path);
auto new_file_path=target_path;
for(size_t c=0;c<Notebook::get().size();c++) {
auto view=Notebook::get().get_view(c);
if(is_directory) {
@ -271,7 +270,6 @@ Directories::Directories() : Gtk::ListViewText(1) {
auto file_it=view->file_path.begin();
for(auto source_it=source_path.begin();source_it!=source_path.end();source_it++)
file_it++;
auto new_file_path=target_path;
for(;file_it!=view->file_path.end();file_it++)
new_file_path/=*file_it;
view->rename(new_file_path);
@ -291,7 +289,7 @@ Directories::Directories() : Gtk::ListViewText(1) {
Terminal::get().print("Warning: language for "+target_path.string()+" has changed. Please reopen the file\n");
}
}
Notebook::get().update_labels(new_file_path);
EntryBox::get().hide();
});
auto entry_it=EntryBox::get().entries.begin();

85
src/notebook.cc

@ -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;
}

1
src/notebook.h

@ -42,6 +42,7 @@ public:
void next();
void previous();
void toggle_split();
void update_labels(const boost::filesystem::path &introduced_file_name = "");
/// Hide/Show tabs.
void toggle_tabs();
boost::filesystem::path get_current_folder();

2
src/source.cc

@ -629,8 +629,6 @@ void Source::View::rename(const boost::filesystem::path &path) {
}
if(update_status_file_path)
update_status_file_path(this);
if(update_tab_label)
update_tab_label(this);
}
void Source::View::set_tab_char_and_size(char tab_char, unsigned tab_size) {

1
src/source.h

@ -99,7 +99,6 @@ namespace Source {
void hide_tooltips() override;
void hide_dialogs() override;
std::function<void(View *view)> update_tab_label;
std::function<void(View *view)> update_modified;
std::function<void(View *view)> update_status_location;
std::function<void(View *view)> update_status_file_path;

Loading…
Cancel
Save