This commit is contained in:
chatlanin 2023-04-15 12:57:46 +03:00
parent d2816fb157
commit 73a3b29196
5 changed files with 90 additions and 17 deletions

View File

@ -34,7 +34,8 @@ namespace rrr
using single_buffer_t = std::map<int, file>; using single_buffer_t = std::map<int, file>;
using path_buffer_t = std::unordered_map<std::filesystem::path, file, opt_path_hash>; using path_buffer_t = std::unordered_map<std::filesystem::path, file, opt_path_hash>;
single_buffer_t single_buffer; // для хранения отмеченный файлов. в моменте может бытьтолько один файл single_buffer_t single_copy_buffer; // для хранения отмеченный файлов. в моменте может быть только один файл
single_buffer_t single_cut_buffer; // для хранения отмеченный файлов. в моменте может быть только один файл
path_buffer_t path_buffer; // для хранения истории пути пользователя path_buffer_t path_buffer; // для хранения истории пути пользователя
static buffers& get_instance() static buffers& get_instance()

View File

@ -258,4 +258,36 @@ namespace rrr
nav.fill(PWD); nav.fill(PWD);
increment_position(-1); 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::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 = "mv ";
hack::utils::unix_cmd(cmd + f.string() + " " + target.string());
nav.fill(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)
if (nav.data.at(i).path == target)
{
navigation_cursor_position = i;
}
});
check_cursor_position();
}
} }

View File

@ -34,6 +34,7 @@ namespace rrr
void create_file(std::string); void create_file(std::string);
void rename_file(std::filesystem::path, std::filesystem::path); void rename_file(std::filesystem::path, std::filesystem::path);
void paste(std::filesystem::path); void paste(std::filesystem::path);
void cut(std::filesystem::path);
void delete_file(file); void delete_file(file);
file get_selected_file(TYPE_WIN); file get_selected_file(TYPE_WIN);

View File

@ -110,10 +110,14 @@ namespace rrr::layers::gui
{ {
auto file_content = f.path.filename().string(); auto file_content = f.path.filename().string();
if (!buffers::get_instance().single_buffer.empty()) if (!buffers::get_instance().single_copy_buffer.empty())
if (f.path == buffers::get_instance().single_buffer[1].path) if (f.path == buffers::get_instance().single_copy_buffer[1].path)
file_content = "* " + file_content; 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) if (f.is_link)
file_content += " ->"; file_content += " ->";
@ -229,9 +233,8 @@ namespace rrr::layers::gui
// вставка из single_buffer // вставка из single_buffer
if (shift && key.get_keycode() == try_engine::key::P) if (shift && key.get_keycode() == try_engine::key::P)
{ {
if (buffers::get_instance().single_buffer.empty()) return; paste_from_copy();
cnt->paste(buffers::get_instance().single_buffer[1].path); paste_from_cut();
buffers::get_instance().single_buffer.clear();
} }
return; return;
@ -285,20 +288,44 @@ namespace rrr::layers::gui
} }
// копирование/добавление в буфер одного файла вместо другого // копирование/добавление в буфер одного файла вместо другого
// когда в буфере что-то есть и мы на томже файле жмем кнопку еще раз
// то происходит очищение буфера
if (key.get_keycode() == try_engine::key::C) 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 else
if (selected_file.path == buffers::get_instance().single_buffer[1].path) if (selected_file.path == buffers::get_instance().single_copy_buffer[1].path)
buffers::get_instance().single_buffer.clear(); buffers::get_instance().single_copy_buffer.clear();
else 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) 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) 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); em->execute(types::event_type::SHOW_HELP_DIALOG, nullptr);
freeze = true; freeze = true;
} }
// HERE начинаем тут
// сделали помощь и начинаем делать множественное копирование и вырезание
// буфер для этого делаем в папке buffers
// там уже есть организация такого типа
} }
void navigation::released(system_event& e) 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);
}
} }

View File

@ -68,6 +68,8 @@ namespace rrr::layers::gui
std::string get_file_content(file&); std::string get_file_content(file&);
void set_delta(MOVE_DIRECTION); void set_delta(MOVE_DIRECTION);
void set_scroll(); void set_scroll();
void paste_from_copy(); // вставка после копирования
void paste_from_cut(); // вставки после вырезания
}; };
} }