From d037e74788c1f3c37915260ac291eb36a085fc78 Mon Sep 17 00:00:00 2001 From: chatlanin Date: Mon, 10 Apr 2023 11:19:21 +0300 Subject: [PATCH] add single_buffer and copy/paste one file or dir --- src/rrr/buffer/buffer.hpp | 17 ++++++++-- src/rrr/content/content.cpp | 34 +++++++++++++++---- src/rrr/content/content.hpp | 1 + src/rrr/content/file/file.hpp | 1 + .../gui/browser/navigation/navigation.cpp | 32 ++++++++++++++++- src/rrr/utils/types.hpp | 3 +- 6 files changed, 78 insertions(+), 10 deletions(-) diff --git a/src/rrr/buffer/buffer.hpp b/src/rrr/buffer/buffer.hpp index 3ca970b..1cbf3e0 100644 --- a/src/rrr/buffer/buffer.hpp +++ b/src/rrr/buffer/buffer.hpp @@ -11,7 +11,7 @@ // value - это то, что тебя там ждет. // т.е. буфер хранит наши прошщлые похождения // и это отображается в history -namespace rrr::buffer +namespace rrr { struct content_hash { @@ -29,6 +29,19 @@ namespace rrr::buffer } }; - inline std::unordered_map state; + struct buffers + { + using single_buffer_t = std::map; + using path_buffer_t = std::unordered_map; + + single_buffer_t single_buffer; // для хранения отмеченный файлов. в моменте может бытьтолько один файл + path_buffer_t path_buffer; // для хранения истории пути пользователя + + static buffers& get_instance() + { + static buffers bf; + return bf; + } + }; } diff --git a/src/rrr/content/content.cpp b/src/rrr/content/content.cpp index a591d19..7cc732f 100644 --- a/src/rrr/content/content.cpp +++ b/src/rrr/content/content.cpp @@ -91,12 +91,12 @@ namespace rrr auto pwd = nav.data.at(navigation_cursor_position).path; preview_cursor_position = 0; - if (buffer::state.contains(pwd)) + if (buffers::get_instance().path_buffer.contains(pwd)) { tbb::parallel_for(tbb::blocked_range(0, prev.data.size()), [&](tbb::blocked_range r) { for (int i = r.begin(); i < r.end(); ++i) - if (prev.data.at(i).path == buffer::state[pwd].path) + if (prev.data.at(i).path == buffers::get_instance().path_buffer[pwd].path) preview_cursor_position = i; }); } @@ -134,9 +134,9 @@ namespace rrr // смотрим есть ли в этом pwd какой-то файл в буфере // проще говоря, были ли мы тут // и если были, то устанавливаем курсор - if (buffer::state.contains(PWD)) + if (buffers::get_instance().path_buffer.contains(PWD)) { - auto f = buffer::state[PWD]; + auto f = buffers::get_instance().path_buffer[PWD]; tbb::parallel_for(tbb::blocked_range(0, nav.data.size()), [&](tbb::blocked_range r) { for (int i = r.begin(); i < r.end(); ++i) @@ -162,7 +162,7 @@ namespace rrr // буфер заполняется только когда отсюда уходишь // типа я тут был и если тут что-то есть if (!std::filesystem::is_empty(PWD)) - buffer::state[PWD] = nav.data.at(navigation_cursor_position); + buffers::get_instance().path_buffer[PWD] = nav.data.at(navigation_cursor_position); auto from = PWD; @@ -216,7 +216,6 @@ namespace rrr } hack::utils::unix_cmd("mv " + old_name.string() + " " + new_name.string()); - hack::log()(old_name, new_name); nav.fill(PWD); tbb::parallel_for(tbb::blocked_range(0, nav.data.size()), [&](tbb::blocked_range r) @@ -229,6 +228,29 @@ namespace rrr check_cursor_position(); } + void content::paste(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 = std::filesystem::is_directory(f) ? "cp -R " : "cp "; + hack::utils::unix_cmd(cmd + f.string() + " " + target.string()); + nav.fill(PWD); + + check_cursor_position(); + } + void content::delete_file(file f) { std::string cmd = "delete " + f.path.string(); diff --git a/src/rrr/content/content.hpp b/src/rrr/content/content.hpp index 9f2d110..f506bb7 100644 --- a/src/rrr/content/content.hpp +++ b/src/rrr/content/content.hpp @@ -33,6 +33,7 @@ namespace rrr void navigation_left(); void create_file(std::string); void rename_file(std::filesystem::path, std::filesystem::path); + void paste(std::filesystem::path); void delete_file(file); file get_selected_file(TYPE_WIN); diff --git a/src/rrr/content/file/file.hpp b/src/rrr/content/file/file.hpp index 0f2d0e1..7fd7843 100644 --- a/src/rrr/content/file/file.hpp +++ b/src/rrr/content/file/file.hpp @@ -42,6 +42,7 @@ namespace rrr bool is_link = false; bool is_hidden = false; bool is_mark = false; + bool is_single_buffer = false; }; } diff --git a/src/rrr/layers/gui/browser/navigation/navigation.cpp b/src/rrr/layers/gui/browser/navigation/navigation.cpp index ae36f93..2396a23 100644 --- a/src/rrr/layers/gui/browser/navigation/navigation.cpp +++ b/src/rrr/layers/gui/browser/navigation/navigation.cpp @@ -4,6 +4,7 @@ #include "try_engine/event/event_classificator.hpp" #include "utils/types.hpp" +#include "buffer/buffer.hpp" #include "logger/logger.hpp" @@ -58,6 +59,8 @@ namespace rrr::layers::gui ImGui::TextUnformatted(">"); ImGui::SameLine(22.f); + // HERE + // нужно использовать std::distance current_position = it - data->begin(); } else @@ -107,6 +110,10 @@ 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) + file_content = "* " + file_content; + if (f.is_link) file_content += " ->"; @@ -219,10 +226,17 @@ namespace rrr::layers::gui set_scroll(); } + // вставка из 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(); + } + return; } - if (key.get_keycode() == try_engine::key::J) { cnt->increment_position(STEP_DOWN); @@ -269,6 +283,22 @@ namespace rrr::layers::gui set_scroll(); g_coutn = 0; } + + // копирование/добавление в буфер одного файла вместо другого + if (key.get_keycode() == try_engine::key::C) + { + if (buffers::get_instance().single_buffer.empty()) + buffers::get_instance().single_buffer[1] = selected_file; + else + if (selected_file.path == buffers::get_instance().single_buffer[1].path) + buffers::get_instance().single_buffer.clear(); + else + buffers::get_instance().single_buffer[1] = selected_file; + } + + // очистка + if (key.get_keycode() == try_engine::key::ESCAPE) + buffers::get_instance().single_buffer.clear(); } void navigation::released(system_event& e) diff --git a/src/rrr/utils/types.hpp b/src/rrr/utils/types.hpp index d4ef36e..e4cd364 100644 --- a/src/rrr/utils/types.hpp +++ b/src/rrr/utils/types.hpp @@ -16,7 +16,8 @@ namespace rrr::types SHOW_CREATE_FILE_DIALOG, CREATE_FILE, SHOW_RENAME_FILE_DIALOG, - RENAME_FILE + RENAME_FILE, + ADD_SINGLE_BUFFER // добавляет в буфер только один файлол }; }