#include "navigation.hpp" #include "try_engine/event/event_classificator.hpp" #include "utils/types.hpp" #include "logger/logger.hpp" namespace rrr::layers::gui { void navigation::on_attach() { BASE_WINDOW_FLAGS(); data = cnt->get(TYPE_WIN::NAVIGATION); } void navigation::on_detach() { } void navigation::gui_render() { if (!show) return; ImGui::SetNextWindowPos(ImVec2(pos_x, pos_y)); ImGui::SetNextWindowSize(ImVec2(width, height)); ImGuiStyle& st = ImGui::GetStyle(); st.Colors[ImGuiCol_WindowBg] = func::get_IMGUI_color(33.f, 36.f, 46.f); BEGIN_IMGUI_WIN(); auto pos = ImGui::GetCursorPos(); pos.x += 17.f; pos.y += 9.f; // небольшой отступ сверху ImGui::SetCursorPosY(pos.y); int index = 0; for (auto& item : *data) { ImGui::PushID(item.id); push_style(item); if (cursor_position == index) { font = try_engine::style::fonts::get_font(item.is_hidden ? font_type::SEMI_BOLD_ITALIC : font_type::SEMI_BOLD, 18); ImGui::PushFont(font); ImGui::TextUnformatted(">"); ImGui::SameLine(22.f); current_file = item; } else { ImGui::SetCursorPosX(pos.x); font = try_engine::style::fonts::get_font(item.is_hidden ? font_type::MEDIUM_ITALIC : font_type::MEDIUM, 18); ImGui::PushFont(font); } ImGui::TextUnformatted(get_file_content(item).data()); ++index; pop_style(item); } END_IMGUI_WIN(); } void navigation::push_style(file& f) { switch (f.type) { case file_type::DIR: ImGui::PushStyleColor(ImGuiCol_Text, dir_color); break; default: // когда просто файл ImGui::PushStyleColor(ImGuiCol_Text, file_color); break; } if (f.is_link) ImGui::PushStyleColor(ImGuiCol_Text, link_color); if (f.is_hidden) font = try_engine::style::fonts::get_font(font_type::MEDIUM_ITALIC, 18); } void navigation::pop_style(file& f) { ImGui::PopFont(); ImGui::PopStyleColor(); ImGui::PopID(); if (f.is_link) ImGui::PopStyleColor(); } std::string navigation::get_file_content(file& f) { auto file_content = f.path.filename().string(); if (f.is_link) file_content += " ->"; return file_content; } void navigation::on_event(system_event& e) { if (e.get_name() == try_engine::system_event::classificator::WINDOW_RESIZE()) resize(); if (e.get_name() == try_engine::system_event::classificator::KEY_PRESSED()) pressed(e); if (e.get_name() == try_engine::system_event::classificator::KEY_RELEASED()) released(e); } void navigation::on_event(std::any event_type, std::any value) { auto et = std::any_cast(event_type); switch (et) { case types::event_type::FREEZE_BROWSER_ACTION: freeze = true; break; case types::event_type::UNFREEZE_BROWSER_ACTION: freeze = false; break; case types::event_type::DELETE_CURRENT_FILE: freeze = false; hack::log()("DELETE FILE"); break; case types::event_type::CREATE_FILE: { freeze = false; auto filename = std::any_cast(value); cnt->create_file(filename); data = cnt->get(TYPE_WIN::NAVIGATION); } break; default: break; } } void navigation::on_update(time t) { } void navigation::resize() { height = try_engine::application::get()->get_window()->height(); width = try_engine::application::get()->get_window()->width() / 3.f - padding_between_window; pos_x = try_engine::application::get()->get_window()->width() / 3.f + padding_between_window / 2.f; } void navigation::pressed(system_event& e) { if (freeze) return; auto key = static_cast(e); if (key.get_keycode() == try_engine::key::LEFTSHIFT || key.get_keycode() == try_engine::key::RIGHTSHIFT) shift = true; if (key.get_keycode() == try_engine::key::J) { cnt->increment_position(STEP_DOWN); em->execute(types::event_type::NAVIGATION_DOWN, nullptr); } if (key.get_keycode() == try_engine::key::K) { cnt->increment_position(STEP_UP); em->execute(types::event_type::NAVIGATION_UP, nullptr); } if (key.get_keycode() == try_engine::key::H) { cnt->navigation_left(); data = cnt->get(TYPE_WIN::NAVIGATION); em->execute(types::event_type::NAVIGATION_LEFT, nullptr); } if (key.get_keycode() == try_engine::key::L) { cnt->navigation_right(); data = cnt->get(TYPE_WIN::NAVIGATION); em->execute(types::event_type::NAVIGATION_RIGHT, nullptr); } // удаление if (shift && key.get_keycode() == try_engine::key::D) { em->execute(types::event_type::SHOW_DELETE_ONE_FILE_DIALOG, current_file); freeze = true; } // создание файла/директории if (shift && key.get_keycode() == try_engine::key::A) { em->execute(types::event_type::SHOW_CREATE_FILE_DIALOG, nullptr); freeze = true; } cursor_position = cnt->get_cursor_position(TYPE_WIN::NAVIGATION); } void navigation::released(system_event& e) { auto key = static_cast(e); if (key.get_keycode() == try_engine::key::LEFTSHIFT || key.get_keycode() == try_engine::key::RIGHTSHIFT) shift = false; } }