add base navigation left and right

This commit is contained in:
chatlanin 2023-04-02 10:22:21 +03:00
parent c39fb0e6da
commit d82d6a63a3
7 changed files with 221 additions and 13 deletions

View File

@ -159,11 +159,8 @@ namespace rrr
void content::navigation_left() void content::navigation_left()
{ {
// буфер заполняется только когда отсюда уходишь // буфер заполняется только когда отсюда уходишь
// типа я тут был // типа я тут был и если тут что-то есть
if (std::filesystem::is_empty(PWD)) if (!std::filesystem::is_empty(PWD))
// buffer::state[PWD] = nav.store[PWD.parent_path()].at(cursor_position);
buffer::state[PWD] = nav.data.at(navigation_cursor_position);
else
buffer::state[PWD] = nav.data.at(navigation_cursor_position); buffer::state[PWD] = nav.data.at(navigation_cursor_position);
auto from = PWD; auto from = PWD;

View File

@ -34,8 +34,12 @@ namespace rrr::layers::gui
pos.y += 9.f; // небольшой отступ сверху pos.y += 9.f; // небольшой отступ сверху
ImGui::SetCursorPosY(pos.y); ImGui::SetCursorPosY(pos.y);
for (auto& item : *data) auto begin = data->begin() + delta;
auto end = data->end();
for (files::iterator it = begin; it != end; ++it)
{ {
auto item = *it;
ImGui::PushID(item.id); ImGui::PushID(item.id);
if (item.type == file_type::DIR) if (item.type == file_type::DIR)
@ -48,6 +52,7 @@ namespace rrr::layers::gui
TR_PUSH_FONT(SEMI_BOLD, 18); TR_PUSH_FONT(SEMI_BOLD, 18);
ImGui::TextUnformatted(">"); ImGui::TextUnformatted(">");
ImGui::SameLine(22.f); ImGui::SameLine(22.f);
current_position = it - data->begin();
} }
else else
{ {
@ -86,6 +91,7 @@ namespace rrr::layers::gui
case types::event_type::NAVIGATION_LEFT: case types::event_type::NAVIGATION_LEFT:
case types::event_type::NAVIGATION_RIGHT: case types::event_type::NAVIGATION_RIGHT:
selected_file = cnt->get_selected_file(TYPE_WIN::HISTORY); selected_file = cnt->get_selected_file(TYPE_WIN::HISTORY);
set_scroll();
break; break;
default: default:
break; break;
@ -96,5 +102,80 @@ namespace rrr::layers::gui
{ {
} }
void history::set_delta(MOVE_DIRECTION mvd)
{
auto row_size = 26.3f; // высота вы пикселях одной строки списка
int h = height / row_size; // высота в строках списка всего столбца экрана
auto big_content = height < data->size() * row_size;
int size = data->size();
if (big_content)
{
if (mvd == MOVE_DIRECTION::DOWN)
{
++cursor_position;
// на самом деле получаем его выше, но делаем такой трюк
// т.к. происходит задержка на один ход нажатия клавиши
++current_position;
if (current_position >= size) current_position = size - 1;
bool is_end = size - current_position <= 10;
if (cursor_position >= h - 10 && !is_end)
{
++delta;
cursor_position = h - 10;
}
if (cursor_position >= h) cursor_position = h;
}
if (mvd == MOVE_DIRECTION::UP)
{
--cursor_position;
--current_position;
if (cursor_position <= 10)
--delta;
if (cursor_position < 10 && current_position > 12)
cursor_position = 10;
if (delta < 0)
{
delta = 0;
cursor_position = 0;
}
}
}
}
void history::set_scroll()
{
delta = 0;
current_position = 0;
cursor_position = 0;
auto row_size = 26.3f; // высота вы пикселях одной строки списка
auto big_content = height < data->size() * row_size;
if (big_content)
{
for (const auto& f : *data)
{
if (f.path != selected_file.path)
{
set_delta(MOVE_DIRECTION::DOWN);
}
else
{
set_delta(MOVE_DIRECTION::DOWN);
break;
}
}
}
}
} }

View File

@ -36,6 +36,12 @@ namespace rrr::layers::gui
float pos_x = 0.f; float pos_x = 0.f;
float pos_y = 0.f; float pos_y = 0.f;
// все что нужно для установки курсора при длинных списках
int current_position = 0; // позиция курсора относительно списка
int cursor_position = 0; // позиция курсора относительно высоты экрана
int delta = 0;
enum class MOVE_DIRECTION { UP, DOWN };
private: private:
const ImVec4 dir_color = func::get_IMGUI_color<ImVec4>(91.f, 128.f, 191.f); const ImVec4 dir_color = func::get_IMGUI_color<ImVec4>(91.f, 128.f, 191.f);
const ImVec4 file_color = func::get_IMGUI_color<ImVec4>(186.f, 186.f, 186.f); const ImVec4 file_color = func::get_IMGUI_color<ImVec4>(186.f, 186.f, 186.f);
@ -43,6 +49,8 @@ namespace rrr::layers::gui
private: private:
void resize(); void resize();
void set_delta(MOVE_DIRECTION);
void set_scroll();
}; };
} }

View File

@ -1,5 +1,7 @@
#include "navigation.hpp" #include "navigation.hpp"
#include <algorithm>
#include "try_engine/event/event_classificator.hpp" #include "try_engine/event/event_classificator.hpp"
#include "utils/types.hpp" #include "utils/types.hpp"
@ -179,6 +181,7 @@ namespace rrr::layers::gui
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);
selected_file = cnt->get_selected_file(TYPE_WIN::NAVIGATION);
em->execute(types::event_type::NAVIGATION_DOWN, nullptr); em->execute(types::event_type::NAVIGATION_DOWN, nullptr);
set_delta(MOVE_DIRECTION::DOWN); set_delta(MOVE_DIRECTION::DOWN);
} }
@ -186,6 +189,7 @@ namespace rrr::layers::gui
if (key.get_keycode() == try_engine::key::K) if (key.get_keycode() == try_engine::key::K)
{ {
cnt->increment_position(STEP_UP); cnt->increment_position(STEP_UP);
selected_file = cnt->get_selected_file(TYPE_WIN::NAVIGATION);
em->execute(types::event_type::NAVIGATION_UP, nullptr); em->execute(types::event_type::NAVIGATION_UP, nullptr);
set_delta(MOVE_DIRECTION::UP); set_delta(MOVE_DIRECTION::UP);
} }
@ -194,14 +198,18 @@ namespace rrr::layers::gui
{ {
cnt->navigation_left(); cnt->navigation_left();
data = cnt->get(TYPE_WIN::NAVIGATION); data = cnt->get(TYPE_WIN::NAVIGATION);
selected_file = cnt->get_selected_file(TYPE_WIN::NAVIGATION);
em->execute(types::event_type::NAVIGATION_LEFT, nullptr); em->execute(types::event_type::NAVIGATION_LEFT, nullptr);
set_scroll();
} }
if (key.get_keycode() == try_engine::key::L) if (key.get_keycode() == try_engine::key::L)
{ {
cnt->navigation_right(); cnt->navigation_right();
data = cnt->get(TYPE_WIN::NAVIGATION); data = cnt->get(TYPE_WIN::NAVIGATION);
selected_file = cnt->get_selected_file(TYPE_WIN::NAVIGATION);
em->execute(types::event_type::NAVIGATION_RIGHT, nullptr); em->execute(types::event_type::NAVIGATION_RIGHT, nullptr);
set_scroll();
} }
// удаление // удаление
@ -217,8 +225,6 @@ namespace rrr::layers::gui
em->execute(types::event_type::SHOW_CREATE_FILE_DIALOG, nullptr); em->execute(types::event_type::SHOW_CREATE_FILE_DIALOG, nullptr);
freeze = true; freeze = true;
} }
selected_file = cnt->get_selected_file(TYPE_WIN::NAVIGATION);
} }
void navigation::released(system_event& e) void navigation::released(system_event& e)
@ -235,7 +241,6 @@ namespace rrr::layers::gui
int h = height / row_size; // высота в строках списка всего столбца экрана int h = height / row_size; // высота в строках списка всего столбца экрана
auto big_content = height < data->size() * row_size; auto big_content = height < data->size() * row_size;
static auto cursor_position = 0; // позиция курсора относительно высоты экрана
int size = data->size(); int size = data->size();
if (big_content) if (big_content)
@ -278,4 +283,30 @@ namespace rrr::layers::gui
} }
} }
} }
void navigation::set_scroll()
{
delta = 0;
current_position = 0;
cursor_position = 0;
auto row_size = 26.3f; // высота вы пикселях одной строки списка
auto big_content = height < data->size() * row_size;
if (big_content)
{
for (const auto& f : *data)
{
if (f.path != selected_file.path)
{
set_delta(MOVE_DIRECTION::DOWN);
}
else
{
set_delta(MOVE_DIRECTION::DOWN);
break;
}
}
}
}
} }

View File

@ -43,16 +43,18 @@ namespace rrr::layers::gui
const int STEP_DOWN = 1; const int STEP_DOWN = 1;
file selected_file; file selected_file;
bool shift = false; bool shift = false;
int current_position = 0;
// все что нужно для установки курсора при длинных списках
int current_position = 0; // позиция курсора относительно списка
int cursor_position = 0; // позиция курсора относительно высоты экрана
int delta = 0; int delta = 0;
enum class MOVE_DIRECTION { UP, DOWN };
private: private:
const ImVec4 dir_color = func::get_IMGUI_color<ImVec4>(91.f, 128.f, 191.f); const ImVec4 dir_color = func::get_IMGUI_color<ImVec4>(91.f, 128.f, 191.f);
const ImVec4 file_color = func::get_IMGUI_color<ImVec4>(186.f, 186.f, 186.f); const ImVec4 file_color = func::get_IMGUI_color<ImVec4>(186.f, 186.f, 186.f);
const ImVec4 link_color = func::get_IMGUI_color<ImVec4>(51.f, 95.f, 165.f); const ImVec4 link_color = func::get_IMGUI_color<ImVec4>(51.f, 95.f, 165.f);
enum class MOVE_DIRECTION { UP, DOWN };
private: private:
void resize(); void resize();
void pressed(system_event& e); void pressed(system_event& e);
@ -62,6 +64,7 @@ namespace rrr::layers::gui
void pop_style(file&); void pop_style(file&);
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();
}; };
} }

View File

@ -34,8 +34,12 @@ namespace rrr::layers::gui
pos.y += 9.f; // небольшой отступ сверху pos.y += 9.f; // небольшой отступ сверху
ImGui::SetCursorPosY(pos.y); ImGui::SetCursorPosY(pos.y);
for (auto& item : *data) auto begin = data->begin() + delta;
auto end = data->end();
for (files::iterator it = begin; it != end; ++it)
{ {
auto item = *it;
ImGui::PushID(item.id); ImGui::PushID(item.id);
if (item.type == file_type::DIR) if (item.type == file_type::DIR)
@ -94,6 +98,7 @@ namespace rrr::layers::gui
case types::event_type::NAVIGATION_LEFT: case types::event_type::NAVIGATION_LEFT:
case types::event_type::NAVIGATION_RIGHT: case types::event_type::NAVIGATION_RIGHT:
selected_file = cnt->get_selected_file(TYPE_WIN::PREVIEW); selected_file = cnt->get_selected_file(TYPE_WIN::PREVIEW);
set_scroll();
break; break;
default: default:
break; break;
@ -104,5 +109,80 @@ namespace rrr::layers::gui
{ {
} }
void preview::set_delta(MOVE_DIRECTION mvd)
{
auto row_size = 26.3f; // высота вы пикселях одной строки списка
int h = height / row_size; // высота в строках списка всего столбца экрана
auto big_content = height < data->size() * row_size;
int size = data->size();
if (big_content)
{
if (mvd == MOVE_DIRECTION::DOWN)
{
++cursor_position;
// на самом деле получаем его выше, но делаем такой трюк
// т.к. происходит задержка на один ход нажатия клавиши
++current_position;
if (current_position >= size) current_position = size - 1;
bool is_end = size - current_position <= 10;
if (cursor_position >= h - 10 && !is_end)
{
++delta;
cursor_position = h - 10;
}
if (cursor_position >= h) cursor_position = h;
}
if (mvd == MOVE_DIRECTION::UP)
{
--cursor_position;
--current_position;
if (cursor_position <= 10)
--delta;
if (cursor_position < 10 && current_position > 12)
cursor_position = 10;
if (delta < 0)
{
delta = 0;
cursor_position = 0;
}
}
}
}
void preview::set_scroll()
{
delta = 0;
current_position = 0;
cursor_position = 0;
auto row_size = 26.3f; // высота вы пикселях одной строки списка
auto big_content = height < data->size() * row_size;
if (big_content)
{
for (const auto& f : *data)
{
if (f.path != selected_file.path)
{
set_delta(MOVE_DIRECTION::DOWN);
}
else
{
set_delta(MOVE_DIRECTION::DOWN);
break;
}
}
}
}
} }

View File

@ -36,6 +36,12 @@ namespace rrr::layers::gui
float pos_x = 0.f; float pos_x = 0.f;
float pos_y = 0.f; float pos_y = 0.f;
// все что нужно для установки курсора при длинных списках
int current_position = 0; // позиция курсора относительно списка
int cursor_position = 0; // позиция курсора относительно высоты экрана
int delta = 0;
enum class MOVE_DIRECTION { UP, DOWN };
private: private:
const ImVec4 dir_color = func::get_IMGUI_color<ImVec4>(91.f, 128.f, 191.f); const ImVec4 dir_color = func::get_IMGUI_color<ImVec4>(91.f, 128.f, 191.f);
const ImVec4 file_color = func::get_IMGUI_color<ImVec4>(186.f, 186.f, 186.f); const ImVec4 file_color = func::get_IMGUI_color<ImVec4>(186.f, 186.f, 186.f);
@ -44,6 +50,8 @@ namespace rrr::layers::gui
private: private:
void resize(); void resize();
void update_content(); void update_content();
void set_delta(MOVE_DIRECTION);
void set_scroll();
}; };
} }