222 lines
5.5 KiB
C++
222 lines
5.5 KiB
C++
#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<ImVec4>(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<types::event_type>(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<std::string>(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<try_engine::system_event::key_pressed_event&>(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<try_engine::system_event::key_pressed_event&>(e);
|
|
|
|
if (key.get_keycode() == try_engine::key::LEFTSHIFT || key.get_keycode() == try_engine::key::RIGHTSHIFT)
|
|
shift = false;
|
|
}
|
|
}
|