add base navigation left and right
This commit is contained in:
parent
c39fb0e6da
commit
d82d6a63a3
@ -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;
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user