summaryrefslogtreecommitdiff
path: root/lib/nes/app/ui/screen-browser.cc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/nes/app/ui/screen-browser.cc')
-rw-r--r--lib/nes/app/ui/screen-browser.cc79
1 files changed, 66 insertions, 13 deletions
diff --git a/lib/nes/app/ui/screen-browser.cc b/lib/nes/app/ui/screen-browser.cc
index da2d82d..daca18e 100644
--- a/lib/nes/app/ui/screen-browser.cc
+++ b/lib/nes/app/ui/screen-browser.cc
@@ -1,30 +1,53 @@
#include "nes/app/ui/screen-browser.hh"
#include "nes/app/graphics/renderer.hh"
#include "nes/app/graphics/color.hh"
+#include "nes/app/graphics/tiles/icons.hh"
#include "nes/app/input/input-device-keyboard.hh"
#include "nes/common/string-builder.hh"
+#include "nes/common/path-view.hh"
namespace nes::app
{
auto screen_browser::selection_impl::render_item(
- renderer& renderer, i32 const& item, i32 const x, i32 const y, u32 const width, color const color) const -> void
+ renderer& renderer, item const& item, i32 const x, i32 const y, u32 const width,
+ color const color) const -> void
{
- renderer.render_text_format(x, y, color, text_attributes{}.set_max_width(width), "Item {}", item);
+ switch (item.data.get_type())
+ {
+ case file_browser::item_type::file: renderer.render_mask_tile(x, y, tiles::icon_cartridge, color); break;
+ case file_browser::item_type::directory: renderer.render_mask_tile(x, y, tiles::icon_directory, color); break;
+ }
+
+ renderer.render_text(x + 2, y, item.data.get_name(), color, text_attributes{}
+ .set_ellipsize_mode(ellipsize_mode::end)
+ .set_max_width(width - 2));
}
- auto screen_browser::selection_impl::load_page(int (&items)[5], u32 const page) -> u32
+ auto screen_browser::selection_impl::load_page(item (&items)[8], u32 const page) -> u32
{
- for (auto i = u32{ 0 }; i < 5; ++i)
+ auto offset = u32{ 0 };
+ if (page == 0 && file_browser_.get_path().get_component_count() > 0)
+ {
+ items[0].is_parent = true;
+ items[0].data = file_browser::item{ file_browser::item_type::directory, "[Parent Directory]" };
+ offset = 1;
+ }
+ file_browser::item buffer[8];
+ auto const count = file_browser_.read_items(page * 8, buffer, 8 - offset);
+ for (auto i = u32{ 0 }; i < count; ++i)
{
- items[i] = static_cast<i32>(page * 5 + i);
+ items[i + offset].is_parent = false;
+ items[i + offset].data = buffer[i];
}
- return 5;
+ return count + offset;
}
- screen_browser::screen_browser(input_device_keyboard& keyboard)
+ screen_browser::screen_browser(input_device_keyboard& keyboard, file_browser& file_browser)
: keyboard_{ keyboard }
+ , file_browser_{ file_browser }
+ , selection_{ file_browser }
{
- selection_.set_page_count(2);
+ selection_.set_page_count(std::max(u32{ 1 }, (file_browser_.read_item_count() + 7) / 8));
}
auto screen_browser::render(renderer& renderer) -> void
@@ -32,11 +55,21 @@ namespace nes::app
renderer.render_fill(color::background_primary);
renderer.render_rect(0, 0, 32, 3, color::background_secondary);
- renderer.render_text(2, 1, "Load Game", color::foreground_primary);
- renderer.render_text_format(
+ auto const page_length = renderer.render_text_format(
30, 1, color::foreground_secondary, text_attributes{}.set_alignment(text_alignment::right),
"Page {}/{}", selection_.get_current_page() + 1, selection_.get_page_count());
+ char path_buffer[32];
+ auto path_builder = string_builder{ path_buffer, sizeof(path_buffer) };
+ for (auto const component : file_browser_.get_path())
+ {
+ path_builder.append_format("> {} ", component);
+ }
+ path_builder.append_string(">");
+ renderer.render_text(
+ 2, 1, path_builder.get_result(), color::foreground_primary,
+ text_attributes{}.set_max_width(26 - page_length).set_ellipsize_mode(ellipsize_mode::end));
+
selection_.render(renderer);
}
@@ -58,14 +91,34 @@ namespace nes::app
}
else if (event == input_event::key_down(key::backspace))
{
- return action::go_to_title;
+ return action::go_to_title();
}
else if (event == input_event::key_down(key::enter))
{
- return action::launch_game;
+ auto selected = selection_.get_selected();
+ if (selected)
+ {
+ if (selected->is_parent)
+ {
+ file_browser_.navigate_up();
+ selection_.set_page_count(std::max(u32{ 1 }, (file_browser_.read_item_count() + 7) / 8));
+ }
+ else
+ {
+ switch (selected->data.get_type())
+ {
+ case file_browser::item_type::directory:
+ file_browser_.navigate(selected->data.get_name());
+ selection_.set_page_count(std::max(u32{ 1 }, (file_browser_.read_item_count() + 7) / 8));
+ break;
+ case file_browser::item_type::file:
+ return action::launch_game(selected->data.get_name());
+ }
+ }
+ }
}
}
- return action::none;
+ return action{};
}
} // namespace nes::app \ No newline at end of file