add single_buffer and copy/paste one file or dir
This commit is contained in:
parent
c451d859a7
commit
d037e74788
@ -11,7 +11,7 @@
|
|||||||
// value - это то, что тебя там ждет.
|
// value - это то, что тебя там ждет.
|
||||||
// т.е. буфер хранит наши прошщлые похождения
|
// т.е. буфер хранит наши прошщлые похождения
|
||||||
// и это отображается в history
|
// и это отображается в history
|
||||||
namespace rrr::buffer
|
namespace rrr
|
||||||
{
|
{
|
||||||
struct content_hash
|
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;
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -91,12 +91,12 @@ namespace rrr
|
|||||||
auto pwd = nav.data.at(navigation_cursor_position).path;
|
auto pwd = nav.data.at(navigation_cursor_position).path;
|
||||||
preview_cursor_position = 0;
|
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)
|
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)
|
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;
|
preview_cursor_position = i;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -134,9 +134,9 @@ namespace rrr
|
|||||||
// смотрим есть ли в этом pwd какой-то файл в буфере
|
// смотрим есть ли в этом 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)
|
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)
|
for (int i = r.begin(); i < r.end(); ++i)
|
||||||
@ -162,7 +162,7 @@ namespace rrr
|
|||||||
// буфер заполняется только когда отсюда уходишь
|
// буфер заполняется только когда отсюда уходишь
|
||||||
// типа я тут был и если тут что-то есть
|
// типа я тут был и если тут что-то есть
|
||||||
if (!std::filesystem::is_empty(PWD))
|
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;
|
auto from = PWD;
|
||||||
|
|
||||||
@ -216,7 +216,6 @@ namespace rrr
|
|||||||
}
|
}
|
||||||
|
|
||||||
hack::utils::unix_cmd("mv " + old_name.string() + " " + new_name.string());
|
hack::utils::unix_cmd("mv " + old_name.string() + " " + new_name.string());
|
||||||
hack::log()(old_name, new_name);
|
|
||||||
nav.fill(PWD);
|
nav.fill(PWD);
|
||||||
|
|
||||||
tbb::parallel_for(tbb::blocked_range<int>(0, nav.data.size()), [&](tbb::blocked_range<int> r)
|
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();
|
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)
|
void content::delete_file(file f)
|
||||||
{
|
{
|
||||||
std::string cmd = "delete " + f.path.string();
|
std::string cmd = "delete " + f.path.string();
|
||||||
|
@ -33,6 +33,7 @@ namespace rrr
|
|||||||
void navigation_left();
|
void navigation_left();
|
||||||
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 delete_file(file);
|
void delete_file(file);
|
||||||
|
|
||||||
file get_selected_file(TYPE_WIN);
|
file get_selected_file(TYPE_WIN);
|
||||||
|
@ -42,6 +42,7 @@ namespace rrr
|
|||||||
bool is_link = false;
|
bool is_link = false;
|
||||||
bool is_hidden = false;
|
bool is_hidden = false;
|
||||||
bool is_mark = false;
|
bool is_mark = false;
|
||||||
|
bool is_single_buffer = false;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
#include "try_engine/event/event_classificator.hpp"
|
#include "try_engine/event/event_classificator.hpp"
|
||||||
#include "utils/types.hpp"
|
#include "utils/types.hpp"
|
||||||
|
#include "buffer/buffer.hpp"
|
||||||
|
|
||||||
#include "logger/logger.hpp"
|
#include "logger/logger.hpp"
|
||||||
|
|
||||||
@ -58,6 +59,8 @@ namespace rrr::layers::gui
|
|||||||
|
|
||||||
ImGui::TextUnformatted(">");
|
ImGui::TextUnformatted(">");
|
||||||
ImGui::SameLine(22.f);
|
ImGui::SameLine(22.f);
|
||||||
|
// HERE
|
||||||
|
// нужно использовать std::distance
|
||||||
current_position = it - data->begin();
|
current_position = it - data->begin();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -107,6 +110,10 @@ 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 (f.path == buffers::get_instance().single_buffer[1].path)
|
||||||
|
file_content = "* " + file_content;
|
||||||
|
|
||||||
if (f.is_link)
|
if (f.is_link)
|
||||||
file_content += " ->";
|
file_content += " ->";
|
||||||
|
|
||||||
@ -219,10 +226,17 @@ namespace rrr::layers::gui
|
|||||||
set_scroll();
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (key.get_keycode() == try_engine::key::J)
|
if (key.get_keycode() == try_engine::key::J)
|
||||||
{
|
{
|
||||||
cnt->increment_position(STEP_DOWN);
|
cnt->increment_position(STEP_DOWN);
|
||||||
@ -269,6 +283,22 @@ namespace rrr::layers::gui
|
|||||||
set_scroll();
|
set_scroll();
|
||||||
g_coutn = 0;
|
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)
|
void navigation::released(system_event& e)
|
||||||
|
@ -16,7 +16,8 @@ namespace rrr::types
|
|||||||
SHOW_CREATE_FILE_DIALOG,
|
SHOW_CREATE_FILE_DIALOG,
|
||||||
CREATE_FILE,
|
CREATE_FILE,
|
||||||
SHOW_RENAME_FILE_DIALOG,
|
SHOW_RENAME_FILE_DIALOG,
|
||||||
RENAME_FILE
|
RENAME_FILE,
|
||||||
|
ADD_SINGLE_BUFFER // добавляет в буфер только один файлол
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user