From ea80038121e5b13fccea6db430fa6acd23c4bddc Mon Sep 17 00:00:00 2001 From: chatlanin Date: Tue, 9 May 2023 12:27:38 +0300 Subject: [PATCH] add simple preview code without colorize --- src/rrr/content/content.cpp | 6 +- .../gui/browser/navigation/navigation.cpp | 183 +++++++++--------- .../gui/browser/navigation/navigation.hpp | 3 +- .../layers/gui/browser/preview/preview.cpp | 27 ++- .../layers/gui/browser/preview/preview.hpp | 4 +- src/rrr/layers/gui/dialogs/dialogs.cpp | 6 +- src/rrr/utils/types.hpp | 3 +- 7 files changed, 133 insertions(+), 99 deletions(-) diff --git a/src/rrr/content/content.cpp b/src/rrr/content/content.cpp index 2561532..f8a9fe3 100644 --- a/src/rrr/content/content.cpp +++ b/src/rrr/content/content.cpp @@ -50,14 +50,14 @@ namespace rrr set_history_cursor_position(); f = his.data.at(history_cursor_position); } - catch(...) { hack::error()("Dont set history"); } + catch(...) {} break; case TYPE_WIN::NAVIGATION: try { f = nav.data.at(navigation_cursor_position); } - catch(...) { hack::error()("Dont set navigation"); } + catch(...) {} break; case TYPE_WIN::PREVIEW: try @@ -65,7 +65,7 @@ namespace rrr set_preview_cursor_position(); f = prev.data.at(preview_cursor_position); } - catch(...) { hack::error()("Dont set preview"); } + catch(...) {} break; } diff --git a/src/rrr/layers/gui/browser/navigation/navigation.cpp b/src/rrr/layers/gui/browser/navigation/navigation.cpp index 1db3109..81b05ae 100644 --- a/src/rrr/layers/gui/browser/navigation/navigation.cpp +++ b/src/rrr/layers/gui/browser/navigation/navigation.cpp @@ -255,105 +255,108 @@ namespace rrr::layers::gui set_delta(MOVE_DIRECTION::UP); set_scroll(); } - - return; } - - if (key.get_keycode() == try_engine::key::J) + else { - cnt->increment_position(STEP_DOWN); - selected_file = cnt->get_selected_file(TYPE_WIN::NAVIGATION); - em->execute(types::event_type::NAVIGATION_DOWN, nullptr); - set_delta(MOVE_DIRECTION::DOWN); - } + if (key.get_keycode() == try_engine::key::J) + { + cnt->increment_position(STEP_DOWN); + selected_file = cnt->get_selected_file(TYPE_WIN::NAVIGATION); + em->execute(types::event_type::NAVIGATION_DOWN, nullptr); + set_delta(MOVE_DIRECTION::DOWN); + } - if (key.get_keycode() == try_engine::key::K) - { - cnt->increment_position(STEP_UP); - selected_file = cnt->get_selected_file(TYPE_WIN::NAVIGATION); - em->execute(types::event_type::NAVIGATION_UP, nullptr); - set_delta(MOVE_DIRECTION::UP); - } + if (key.get_keycode() == try_engine::key::K) + { + cnt->increment_position(STEP_UP); + selected_file = cnt->get_selected_file(TYPE_WIN::NAVIGATION); + em->execute(types::event_type::NAVIGATION_UP, nullptr); + set_delta(MOVE_DIRECTION::UP); + } - if (key.get_keycode() == try_engine::key::H) - { - cnt->navigation_left(); - data = cnt->get(TYPE_WIN::NAVIGATION); - selected_file = cnt->get_selected_file(TYPE_WIN::NAVIGATION); - em->execute(types::event_type::NAVIGATION_LEFT, nullptr); - set_scroll(); - } + if (key.get_keycode() == try_engine::key::H) + { + cnt->navigation_left(); + data = cnt->get(TYPE_WIN::NAVIGATION); + selected_file = cnt->get_selected_file(TYPE_WIN::NAVIGATION); + em->execute(types::event_type::NAVIGATION_LEFT, nullptr); + set_scroll(); + } - if (key.get_keycode() == try_engine::key::L) - { - cnt->navigation_right(); - data = cnt->get(TYPE_WIN::NAVIGATION); - selected_file = cnt->get_selected_file(TYPE_WIN::NAVIGATION); - em->execute(types::event_type::NAVIGATION_RIGHT, nullptr); - set_scroll(); - } + // HERE начинаем тут + // если дирректория пуста и туда заъодить, то происходит краш приложения + // сотрим тут: void content::navigation_right() + if (key.get_keycode() == try_engine::key::L) + { + cnt->navigation_right(); + data = cnt->get(TYPE_WIN::NAVIGATION); + selected_file = cnt->get_selected_file(TYPE_WIN::NAVIGATION); + em->execute(types::event_type::NAVIGATION_RIGHT, nullptr); + set_scroll(); + } - // двойное нажатие перемещение в начало списка - if (key.get_keycode() == try_engine::key::G) - { - ++g_coutn; - if (g_coutn != 2) return; - cnt->increment_position(-data->size()); - selected_file = cnt->get_selected_file(TYPE_WIN::NAVIGATION); - em->execute(types::event_type::NAVIGATION_UP, nullptr); - set_delta(MOVE_DIRECTION::UP); - set_scroll(); - g_coutn = 0; - } + // двойное нажатие перемещение в начало списка + if (key.get_keycode() == try_engine::key::G) + { + ++g_coutn; + if (g_coutn != 2) return; + cnt->increment_position(-data->size()); + selected_file = cnt->get_selected_file(TYPE_WIN::NAVIGATION); + em->execute(types::event_type::NAVIGATION_UP, nullptr); + set_delta(MOVE_DIRECTION::UP); + set_scroll(); + g_coutn = 0; + } - // копирование/добавление в буфер одного файла вместо другого - // когда в буфере что-то есть и мы на томже файле жмем кнопку еще раз - // то происходит очищение буфера - if (key.get_keycode() == try_engine::key::C) - { - // проверяем а может это файл отмечен на вырезание - 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_copy_buffer[1].path) - buffers::get_instance().single_copy_buffer.clear(); - else - 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) + // копирование/добавление в буфер одного файла вместо другого + // когда в буфере что-то есть и мы на томже файле жмем кнопку еще раз + // то происходит очищение буфера + if (key.get_keycode() == try_engine::key::C) + { + // проверяем а может это файл отмечен на вырезание + 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_copy_buffer[1].path) + buffers::get_instance().single_copy_buffer.clear(); + else + 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_copy_buffer.clear(); + buffers::get_instance().single_cut_buffer.clear(); + } + + // помощь + if (key.get_keycode() == try_engine::key::F1) + { + em->execute(types::event_type::SHOW_HELP_DIALOG, nullptr); + freeze = true; + } } - // очистка - if (key.get_keycode() == try_engine::key::ESCAPE) - { - buffers::get_instance().single_copy_buffer.clear(); - buffers::get_instance().single_cut_buffer.clear(); - } - - // помощь - if (key.get_keycode() == try_engine::key::F1) - { - em->execute(types::event_type::SHOW_HELP_DIALOG, nullptr); - freeze = true; - } - - detect_img(); + detect_file(); } void navigation::released(system_event& e) @@ -455,11 +458,15 @@ namespace rrr::layers::gui selected_file = cnt->get_selected_file(TYPE_WIN::NAVIGATION); } - void navigation::detect_img() + void navigation::detect_file() { + if (std::filesystem::is_directory(selected_file.path)) return; + if (selected_file.path.extension() == ".jpg" || selected_file.path.extension() == ".jpeg" || selected_file.path.extension() == ".png") em->execute(types::event_type::SHOW_IMG, selected_file.path); + else + em->execute(types::event_type::SHOW_SRC, selected_file.path); } } diff --git a/src/rrr/layers/gui/browser/navigation/navigation.hpp b/src/rrr/layers/gui/browser/navigation/navigation.hpp index f095600..a6289f6 100644 --- a/src/rrr/layers/gui/browser/navigation/navigation.hpp +++ b/src/rrr/layers/gui/browser/navigation/navigation.hpp @@ -70,7 +70,8 @@ namespace rrr::layers::gui void set_scroll(); void paste_from_copy(); // вставка после копирования void paste_from_cut(); // вставки после вырезания - void detect_img(); + void detect_file(); // определяем не кортинка ли это или определяем не является ли + // это что-то типа кода, который можно вывести на просмотр }; } diff --git a/src/rrr/layers/gui/browser/preview/preview.cpp b/src/rrr/layers/gui/browser/preview/preview.cpp index 202b8f8..4017fcf 100644 --- a/src/rrr/layers/gui/browser/preview/preview.cpp +++ b/src/rrr/layers/gui/browser/preview/preview.cpp @@ -43,7 +43,7 @@ namespace rrr::layers::gui { make_media = false; tx.make(); - frame = cv::imread(media_path); + frame = cv::imread(src_path); cv::cvtColor(frame, frame, cv::COLOR_BGR2RGBA); tx.bind(frame); media_show = true; @@ -53,6 +53,13 @@ namespace rrr::layers::gui if (media_show) tx.draw(ImVec2(pos.x + 830.f, pos.y), ImVec2(width + 850.f, frame.rows / 1.6f)); + if (src_show) + { + TR_PUSH_FONT(MEDIUM, 18); + ImGui::TextUnformatted(src_data.data()); + TR_POP_FONT(); + } + for (files::iterator it = begin; it != end; ++it) { auto item = *it; @@ -114,7 +121,9 @@ namespace rrr::layers::gui case types::event_type::NAVIGATION_DOWN: case types::event_type::NAVIGATION_LEFT: case types::event_type::NAVIGATION_RIGHT: - media_path.clear(); + src_path.clear(); + src_data.clear(); + src_show = false; media_show = false; selected_file = cnt->get_selected_file(TYPE_WIN::PREVIEW); cursor_position = 0; @@ -123,9 +132,21 @@ namespace rrr::layers::gui set_scroll(); break; case types::event_type::SHOW_IMG: - media_path = std::any_cast(value); + src_path = std::any_cast(value); make_media = true; break; + case types::event_type::SHOW_SRC: + src_path = std::any_cast(value); + // HERE + // пока не подсвечиваем, для этого нужно видимо написать свой токенайзер + // и разбирать всю баш строку на наличие цветов + // буз этого пока поживешь, не сломаешься! + // src_data = hack::utils::unix_cmd("bat --style=plain --color=always " + src_path.string()); + if (std::filesystem::is_empty(src_path)) src_data = "no data"; + else + src_data = hack::utils::unix_cmd("cat " + src_path.string()); + src_show = true; + break; default: break; } diff --git a/src/rrr/layers/gui/browser/preview/preview.hpp b/src/rrr/layers/gui/browser/preview/preview.hpp index 16661c7..4d6f26a 100644 --- a/src/rrr/layers/gui/browser/preview/preview.hpp +++ b/src/rrr/layers/gui/browser/preview/preview.hpp @@ -42,12 +42,14 @@ namespace rrr::layers::gui int delta = 0; enum class MOVE_DIRECTION { UP, DOWN }; - std::filesystem::path media_path; try_engine::texture tx; cv::Mat frame; cv::VideoCapture cap; + std::filesystem::path src_path; bool media_show = false; bool make_media = false; + bool src_show = false; + std::string src_data; // данные для показа кода из файла private: const ImVec4 dir_color = func::get_IMGUI_color(91.f, 128.f, 191.f); diff --git a/src/rrr/layers/gui/dialogs/dialogs.cpp b/src/rrr/layers/gui/dialogs/dialogs.cpp index 72ba8ff..95cc886 100644 --- a/src/rrr/layers/gui/dialogs/dialogs.cpp +++ b/src/rrr/layers/gui/dialogs/dialogs.cpp @@ -284,7 +284,7 @@ namespace rrr::layers::gui void dialogs::draw_help_dialog() { - height = try_engine::application::get()->get_window()->height() / 2.7f; + height = try_engine::application::get()->get_window()->height() / 2.5f; TR_PUSH_FONT(MEDIUM, 16); @@ -300,7 +300,7 @@ namespace rrr::layers::gui ImGui::TextUnformatted(label.data()); ImGui::Separator(); - ImGui::TextUnformatted("Копирование: С / backspace"); + ImGui::TextUnformatted("Копирование: c / backspace"); ImGui::TextUnformatted("Вставка: P"); ImGui::TextUnformatted("Удаление: D"); ImGui::TextUnformatted("Переименование: R"); @@ -309,6 +309,8 @@ namespace rrr::layers::gui ImGui::Separator(); ImGui::TextUnformatted("Перемещение в начало: gg"); ImGui::TextUnformatted("Перемещение в конец: G"); + ImGui::TextUnformatted("Быстрое перемещение вверх: J"); + ImGui::TextUnformatted("Быстрое перемещение вниз: K"); ImGui::Separator(); ImGui::TextUnformatted("Выход из помощи: F1"); diff --git a/src/rrr/utils/types.hpp b/src/rrr/utils/types.hpp index 999f6f1..37f707a 100644 --- a/src/rrr/utils/types.hpp +++ b/src/rrr/utils/types.hpp @@ -18,7 +18,8 @@ namespace rrr::types SHOW_RENAME_FILE_DIALOG, RENAME_FILE, SHOW_HELP_DIALOG, - SHOW_IMG + SHOW_IMG, + SHOW_SRC // показываем содержимое файла если это код }; }