add single_buffer and copy/paste one file or dir

This commit is contained in:
chatlanin 2023-04-10 11:19:21 +03:00
parent c451d859a7
commit d037e74788
6 changed files with 78 additions and 10 deletions

View File

@ -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<std::filesystem::path, file, opt_path_hash> state;
struct buffers
{
using single_buffer_t = std::map<int, file>;
using path_buffer_t = std::unordered_map<std::filesystem::path, file, opt_path_hash>;
single_buffer_t single_buffer; // для хранения отмеченный файлов. в моменте может бытьтолько один файл
path_buffer_t path_buffer; // для хранения истории пути пользователя
static buffers& get_instance()
{
static buffers bf;
return bf;
}
};
}

View File

@ -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<int>(0, prev.data.size()), [&](tbb::blocked_range<int> 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<int>(0, nav.data.size()), [&](tbb::blocked_range<int> 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<int>(0, nav.data.size()), [&](tbb::blocked_range<int> 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::milliseconds>(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();

View File

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

View File

@ -42,6 +42,7 @@ namespace rrr
bool is_link = false;
bool is_hidden = false;
bool is_mark = false;
bool is_single_buffer = false;
};
}

View File

@ -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)

View File

@ -16,7 +16,8 @@ namespace rrr::types
SHOW_CREATE_FILE_DIALOG,
CREATE_FILE,
SHOW_RENAME_FILE_DIALOG,
RENAME_FILE
RENAME_FILE,
ADD_SINGLE_BUFFER // добавляет в буфер только один файлол
};
}