summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorHannes Schulze <hannes.hs.schulze@fau.de>2025-05-02 15:16:35 +0200
committerHannes Schulze <hannes.hs.schulze@fau.de>2025-05-02 15:16:35 +0200
commit91c9b3addf5f3db972fd28752855eda811221afe (patch)
treee3f23bc153e66afa0481430c9c828f6d7a28859b /lib
parent24c521f5a4b9f2e1a98668e9d9f7b19b4c9a9bd7 (diff)
different action depending on file extension
Diffstat (limited to 'lib')
-rw-r--r--lib/nes/app/action.hh11
-rw-r--r--lib/nes/app/application.cc4
-rw-r--r--lib/nes/app/ui/screen-browser.cc35
-rw-r--r--lib/nes/app/ui/screen-browser.hh2
-rw-r--r--lib/nes/common/containers/string-view.cc56
-rw-r--r--lib/nes/common/containers/string-view.hh11
-rw-r--r--lib/nes/common/status.hh5
7 files changed, 101 insertions, 23 deletions
diff --git a/lib/nes/app/action.hh b/lib/nes/app/action.hh
index c88a5f1..8caf969 100644
--- a/lib/nes/app/action.hh
+++ b/lib/nes/app/action.hh
@@ -2,6 +2,7 @@
#include "nes/common/containers/string-view.hh"
#include "nes/common/status.hh"
+#include <cstdio>
namespace nes::app
{
@@ -22,6 +23,7 @@ namespace nes::app
launch_game,
show_error,
prompt_key,
+ view_file,
};
private:
@@ -65,6 +67,13 @@ namespace nes::app
return res;
}
+ static auto view_file(string_view const file_name) -> action
+ {
+ auto res = action{ type::view_file };
+ res.file_name_ = file_name;
+ return res;
+ }
+
auto get_type() const -> type { return type_; }
auto get_file_name() const -> string_view { return file_name_; }
auto get_key() const -> string_view { return key_; }
@@ -77,4 +86,4 @@ namespace nes::app
{
}
};
-} // namespace nes::app \ No newline at end of file
+} // namespace nes::app
diff --git a/lib/nes/app/application.cc b/lib/nes/app/application.cc
index 5646fa9..521cc40 100644
--- a/lib/nes/app/application.cc
+++ b/lib/nes/app/application.cc
@@ -191,6 +191,10 @@ namespace nes::app
display_.visible_popup = nullptr;
break;
}
+ case action::type::view_file:
+ {
+ break;
+ }
case action::type::show_error:
{
show_error(a.get_message(), a.get_error());
diff --git a/lib/nes/app/ui/screen-browser.cc b/lib/nes/app/ui/screen-browser.cc
index 84fb647..080f869 100644
--- a/lib/nes/app/ui/screen-browser.cc
+++ b/lib/nes/app/ui/screen-browser.cc
@@ -8,6 +8,29 @@
namespace nes::app
{
+ namespace
+ {
+ auto default_file_action(string_view const file_name) -> action
+ {
+ if (file_name.has_suffix(".nes"))
+ {
+ return action::launch_game(file_name);
+ }
+ else if (file_name.has_suffix(".aes"))
+ {
+ return action::prompt_key(file_name);
+ }
+ else if (file_name.has_suffix(".txt"))
+ {
+ return action::view_file(file_name);
+ }
+ else
+ {
+ return action::show_error("Unable to open file", status::error_unknown_file_type);
+ }
+ }
+ } // namespace
+
auto screen_browser::selection_impl::render_item(
renderer& renderer, item const& item, i32 const x, i32 const y, u32 const width, color const c) const -> void
{
@@ -111,14 +134,6 @@ namespace nes::app
return action::go_to_title();
}
}
- else if (event == input_event::key_down(key::letter_d))
- {
- auto const selected = selection_.get_selected();
- if (selected && selected->entry.get_type() == file_browser::entry_type::file)
- {
- return action::prompt_key(selected->entry.get_name());
- }
- }
else if (event == input_event::key_down(key::enter))
{
auto const selected = selection_.get_selected();
@@ -144,7 +159,7 @@ namespace nes::app
}
else if (selected->entry.get_type() == file_browser::entry_type::file)
{
- return action::launch_game(selected->entry.get_name());
+ return default_file_action(selected->entry.get_name());
}
}
}
@@ -163,4 +178,4 @@ namespace nes::app
// Always show at least one page.
selection_.set_page_count(max(u32{ 1 }, page_count));
}
-} // namespace nes::app \ No newline at end of file
+} // namespace nes::app
diff --git a/lib/nes/app/ui/screen-browser.hh b/lib/nes/app/ui/screen-browser.hh
index 4ba6e73..d31bef3 100644
--- a/lib/nes/app/ui/screen-browser.hh
+++ b/lib/nes/app/ui/screen-browser.hh
@@ -49,4 +49,4 @@ namespace nes::app
private:
auto refresh() -> void;
};
-} // namespace nes::app \ No newline at end of file
+} // namespace nes::app
diff --git a/lib/nes/common/containers/string-view.cc b/lib/nes/common/containers/string-view.cc
index 8265d09..e3470c0 100644
--- a/lib/nes/common/containers/string-view.cc
+++ b/lib/nes/common/containers/string-view.cc
@@ -15,6 +15,16 @@ namespace nes
}
return res;
}
+
+ auto to_uppercase(char const c) -> char
+ {
+ if (c >= 'a' && c <= 'z')
+ {
+ return static_cast<char>(c - 'a' + 'A');
+ }
+
+ return c;
+ }
} // namespace
string_view::string_view(span<char const> const data)
@@ -44,6 +54,28 @@ namespace nes
return data_[data_.get_length() - 1];
}
+ auto string_view::compare(string_view const other, case_sensitive const sensitive) const -> bool
+ {
+ if (get_length() != other.get_length()) { return false; }
+
+ for (auto i = u32{ 0 }; i < get_length(); ++i)
+ {
+ auto const a = (*this)[i];
+ auto const b = other[i];
+
+ if (sensitive == case_sensitive::yes)
+ {
+ if (a != b) { return false; }
+ }
+ else
+ {
+ if (to_uppercase(a) != to_uppercase(b)) { return false; }
+ }
+ }
+
+ return true;
+ }
+
auto string_view::contains(char const needle) const -> bool
{
for (const auto c : *this)
@@ -63,19 +95,25 @@ namespace nes
return string_view{ data_.subspan(first, length) };
}
- auto operator==(string_view const lhs, string_view const rhs) -> bool
+ auto string_view::has_prefix(string_view const prefix, case_sensitive const case_sensitive) const -> bool
{
- if (lhs.get_length() != rhs.get_length()) { return false; }
+ if (prefix.get_length() > get_length()) { return false; }
+ return substring(0, prefix.get_length()).compare(prefix, case_sensitive);
+ }
- for (auto i = u32{ 0 }; i < lhs.get_length(); ++i)
- {
- if (lhs[i] != rhs[i]) { return false; }
- }
+ auto string_view::has_suffix(string_view const suffix, case_sensitive const case_sensitive) const -> bool
+ {
+ if (suffix.get_length() > get_length()) { return false; }
+ return substring(get_length() - suffix.get_length()).compare(suffix, case_sensitive);
+ }
- return true;
+ auto operator==(string_view const lhs, string_view const rhs) -> bool
+ {
+ return lhs.compare(rhs);
}
+
auto operator!=(string_view const lhs, string_view const rhs) -> bool
{
- return !(lhs == rhs);
+ return !lhs.compare(rhs);
}
-} // namespace nes \ No newline at end of file
+} // namespace nes
diff --git a/lib/nes/common/containers/string-view.hh b/lib/nes/common/containers/string-view.hh
index 9bd27ae..858a858 100644
--- a/lib/nes/common/containers/string-view.hh
+++ b/lib/nes/common/containers/string-view.hh
@@ -5,6 +5,12 @@
namespace nes
{
+ enum class case_sensitive
+ {
+ yes,
+ no,
+ };
+
/// Non-owning view into a (not necessarily null-terminated) string.
class string_view
{
@@ -30,11 +36,14 @@ namespace nes
auto get_first() const -> char;
auto get_last() const -> char;
+ auto compare(string_view, case_sensitive = case_sensitive::yes) const -> bool;
auto contains(char) const -> bool;
auto substring(u32 first) const -> string_view;
auto substring(u32 first, u32 length) const -> string_view;
+ auto has_prefix(string_view, case_sensitive = case_sensitive::yes) const -> bool;
+ auto has_suffix(string_view, case_sensitive = case_sensitive::yes) const -> bool;
};
auto operator==(string_view, string_view) -> bool;
auto operator!=(string_view, string_view) -> bool;
-} // namespace nes \ No newline at end of file
+} // namespace nes
diff --git a/lib/nes/common/status.hh b/lib/nes/common/status.hh
index 4b23b60..54c210f 100644
--- a/lib/nes/common/status.hh
+++ b/lib/nes/common/status.hh
@@ -13,6 +13,7 @@ namespace nes
error_buffer_overflow,
error_invalid_path,
error_invalid_format_string,
+ error_unknown_file_type,
};
constexpr auto to_string(status const status) -> char const*
@@ -35,8 +36,10 @@ namespace nes
return "Invalid path";
case status::error_invalid_format_string:
return "Invalid format string";
+ case status::error_unknown_file_type:
+ return "Unknown file type";
}
return "(invalid)";
}
-} // namespace nes \ No newline at end of file
+} // namespace nes