From 73a3b29196795204eb093032f2a3d76bb432cc18 Mon Sep 17 00:00:00 2001 From: chatlanin Date: Sat, 15 Apr 2023 12:57:46 +0300 Subject: [PATCH] add cut --- src/rrr/buffer/buffer.hpp | 3 +- src/rrr/content/content.cpp | 32 +++++++++ src/rrr/content/content.hpp | 1 + .../gui/browser/navigation/navigation.cpp | 69 ++++++++++++++----- .../gui/browser/navigation/navigation.hpp | 2 + 5 files changed, 90 insertions(+), 17 deletions(-) diff --git a/src/rrr/buffer/buffer.hpp b/src/rrr/buffer/buffer.hpp index 1cbf3e0..76037af 100644 --- a/src/rrr/buffer/buffer.hpp +++ b/src/rrr/buffer/buffer.hpp @@ -34,7 +34,8 @@ namespace rrr using single_buffer_t = std::map; using path_buffer_t = std::unordered_map; - single_buffer_t single_buffer; // для хранения отмеченный файлов. в моменте может бытьтолько один файл + single_buffer_t single_copy_buffer; // для хранения отмеченный файлов. в моменте может быть только один файл + single_buffer_t single_cut_buffer; // для хранения отмеченный файлов. в моменте может быть только один файл path_buffer_t path_buffer; // для хранения истории пути пользователя static buffers& get_instance() diff --git a/src/rrr/content/content.cpp b/src/rrr/content/content.cpp index 7cc732f..2561532 100644 --- a/src/rrr/content/content.cpp +++ b/src/rrr/content/content.cpp @@ -258,4 +258,36 @@ namespace rrr nav.fill(PWD); increment_position(-1); } + + void content::cut(std::filesystem::path f) + { + std::filesystem::path target; + if (std::filesystem::exists(PWD / f.filename())) + { + target = f.filename().string() + "_" + + std::to_string( + std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count() + ); + target = f.parent_path() / std::filesystem::path(target); + } + else + { + target = PWD / f.filename(); + } + + std::string cmd = "mv "; + hack::utils::unix_cmd(cmd + f.string() + " " + target.string()); + nav.fill(PWD); + + tbb::parallel_for(tbb::blocked_range(0, nav.data.size()), [&](tbb::blocked_range r) + { + for (int i = r.begin(); i < r.end(); ++i) + if (nav.data.at(i).path == target) + { + navigation_cursor_position = i; + } + }); + + check_cursor_position(); + } } diff --git a/src/rrr/content/content.hpp b/src/rrr/content/content.hpp index f506bb7..a2c73cc 100644 --- a/src/rrr/content/content.hpp +++ b/src/rrr/content/content.hpp @@ -34,6 +34,7 @@ namespace rrr void create_file(std::string); void rename_file(std::filesystem::path, std::filesystem::path); void paste(std::filesystem::path); + void cut(std::filesystem::path); void delete_file(file); file get_selected_file(TYPE_WIN); diff --git a/src/rrr/layers/gui/browser/navigation/navigation.cpp b/src/rrr/layers/gui/browser/navigation/navigation.cpp index a112a20..4809622 100644 --- a/src/rrr/layers/gui/browser/navigation/navigation.cpp +++ b/src/rrr/layers/gui/browser/navigation/navigation.cpp @@ -110,10 +110,14 @@ namespace rrr::layers::gui { auto file_content = f.path.filename().string(); - if (!buffers::get_instance().single_buffer.empty()) - if (f.path == buffers::get_instance().single_buffer[1].path) + if (!buffers::get_instance().single_copy_buffer.empty()) + if (f.path == buffers::get_instance().single_copy_buffer[1].path) file_content = "* " + file_content; + if (!buffers::get_instance().single_cut_buffer.empty()) + if (f.path == buffers::get_instance().single_cut_buffer[1].path) + file_content = "** " + file_content; + if (f.is_link) file_content += " ->"; @@ -229,9 +233,8 @@ namespace rrr::layers::gui // вставка из single_buffer if (shift && key.get_keycode() == try_engine::key::P) { - if (buffers::get_instance().single_buffer.empty()) return; - cnt->paste(buffers::get_instance().single_buffer[1].path); - buffers::get_instance().single_buffer.clear(); + paste_from_copy(); + paste_from_cut(); } return; @@ -285,20 +288,44 @@ namespace rrr::layers::gui } // копирование/добавление в буфер одного файла вместо другого + // когда в буфере что-то есть и мы на томже файле жмем кнопку еще раз + // то происходит очищение буфера if (key.get_keycode() == try_engine::key::C) { - if (buffers::get_instance().single_buffer.empty()) - buffers::get_instance().single_buffer[1] = selected_file; + // проверяем а может это файл отмечен на вырезание + if (!buffers::get_instance().single_cut_buffer.empty()) + buffers::get_instance().single_cut_buffer.clear(); + + if (buffers::get_instance().single_copy_buffer.empty()) + buffers::get_instance().single_copy_buffer[1] = selected_file; else - if (selected_file.path == buffers::get_instance().single_buffer[1].path) - buffers::get_instance().single_buffer.clear(); + if (selected_file.path == buffers::get_instance().single_copy_buffer[1].path) + buffers::get_instance().single_copy_buffer.clear(); else - buffers::get_instance().single_buffer[1] = selected_file; + buffers::get_instance().single_copy_buffer[1] = selected_file; + } + + if (key.get_keycode() == try_engine::key::X) + { + // проверяем а может это файл отмечен на копирование + if (!buffers::get_instance().single_copy_buffer.empty()) + buffers::get_instance().single_copy_buffer.clear(); + + if (buffers::get_instance().single_cut_buffer.empty()) + buffers::get_instance().single_cut_buffer[1] = selected_file; + else + if (selected_file.path == buffers::get_instance().single_cut_buffer[1].path) + buffers::get_instance().single_cut_buffer.clear(); + else + buffers::get_instance().single_cut_buffer[1] = selected_file; } // очистка if (key.get_keycode() == try_engine::key::ESCAPE) - buffers::get_instance().single_buffer.clear(); + { + buffers::get_instance().single_copy_buffer.clear(); + buffers::get_instance().single_cut_buffer.clear(); + } // помощь if (key.get_keycode() == try_engine::key::F1) @@ -306,11 +333,6 @@ namespace rrr::layers::gui em->execute(types::event_type::SHOW_HELP_DIALOG, nullptr); freeze = true; } - - // HERE начинаем тут - // сделали помощь и начинаем делать множественное копирование и вырезание - // буфер для этого делаем в папке buffers - // там уже есть организация такого типа } void navigation::released(system_event& e) @@ -396,4 +418,19 @@ namespace rrr::layers::gui } } } + + void navigation::paste_from_copy() + { + if (buffers::get_instance().single_copy_buffer.empty()) return; + cnt->paste(buffers::get_instance().single_copy_buffer[1].path); + buffers::get_instance().single_copy_buffer.clear(); + } + + void navigation::paste_from_cut() + { + if (buffers::get_instance().single_cut_buffer.empty()) return; + cnt->cut(buffers::get_instance().single_cut_buffer[1].path); + buffers::get_instance().single_cut_buffer.clear(); + selected_file = cnt->get_selected_file(TYPE_WIN::NAVIGATION); + } } diff --git a/src/rrr/layers/gui/browser/navigation/navigation.hpp b/src/rrr/layers/gui/browser/navigation/navigation.hpp index f9b3aa6..8c84332 100644 --- a/src/rrr/layers/gui/browser/navigation/navigation.hpp +++ b/src/rrr/layers/gui/browser/navigation/navigation.hpp @@ -68,6 +68,8 @@ namespace rrr::layers::gui std::string get_file_content(file&); void set_delta(MOVE_DIRECTION); void set_scroll(); + void paste_from_copy(); // вставка после копирования + void paste_from_cut(); // вставки после вырезания }; }