optimise: pass all large objects (std::function, std::string, structs) by const ref rather than value.

really, these functions should be passed by && and using std::forward on assignment.
however, this means writing a lot of extra code for every single class, as well as explicitly calling move
in a lot of cases.

In the case of std::string, passing by value and calling std::move is the correct approach, especially if the
string is created as an rvalue, then it is only created once and moved into the dest.
Whereas with a const ref, the string is created and then copied into the dst, basically creating 2 copies.
The same thing happens std::function, and well any object.

However, accepting everything by value sucks if you call a constructor from within a constructor, as now you need to create 2 impls
that accept by value and the other by rvalue. All of this extra code to have a more efficent impl just isn't worth it when, going by
the benchmarks, makes no measurable difference (i count anything within >= 1ms as measurable).
This commit is contained in:
ITotalJustice
2025-08-04 18:58:20 +01:00
parent 9fe9c9d491
commit 54d73a6d3b
36 changed files with 127 additions and 133 deletions

View File

@@ -247,6 +247,7 @@ set(NANOVG_NO_HDR ON)
set(NANOVG_NO_PIC ON) set(NANOVG_NO_PIC ON)
set(NANOVG_NO_PNM ON) set(NANOVG_NO_PNM ON)
set(YYJSON_INSTALL OFF)
set(YYJSON_DISABLE_READER OFF) set(YYJSON_DISABLE_READER OFF)
set(YYJSON_DISABLE_WRITER OFF) set(YYJSON_DISABLE_WRITER OFF)
set(YYJSON_DISABLE_UTILS ON) set(YYJSON_DISABLE_UTILS ON)

View File

@@ -71,7 +71,7 @@ public:
static void PopToMenu(); static void PopToMenu();
// this is thread safe // this is thread safe
static void Notify(std::string text, ui::NotifEntry::Side side = ui::NotifEntry::Side::RIGHT); static void Notify(const std::string& text, ui::NotifEntry::Side side = ui::NotifEntry::Side::RIGHT);
static void Notify(ui::NotifEntry entry); static void Notify(ui::NotifEntry entry);
static void NotifyPop(ui::NotifEntry::Side side = ui::NotifEntry::Side::RIGHT); static void NotifyPop(ui::NotifEntry::Side side = ui::NotifEntry::Side::RIGHT);
static void NotifyClear(ui::NotifEntry::Side side = ui::NotifEntry::Side::RIGHT); static void NotifyClear(ui::NotifEntry::Side side = ui::NotifEntry::Side::RIGHT);

View File

@@ -52,7 +52,7 @@ struct Fields {
struct Header { struct Header {
Header() = default; Header() = default;
Header(std::initializer_list<std::pair<const std::string, std::string>> p) : m_map{p} {} Header(std::initializer_list<std::pair<const std::string, std::string>>&& p) : m_map{std::forward<decltype(p)>(p)} {}
std::unordered_map<std::string, std::string> m_map; std::unordered_map<std::string, std::string> m_map;
auto Find(const std::string& key) const { auto Find(const std::string& key) const {
@@ -91,7 +91,7 @@ struct UserPass {
struct UploadInfo { struct UploadInfo {
UploadInfo() = default; UploadInfo() = default;
UploadInfo(const std::string& name) : m_name{name} {} UploadInfo(const std::string& name) : m_name{name} {}
UploadInfo(const std::string& name, s64 size, OnUploadCallback cb) : m_name{name}, m_size{size}, m_callback{cb} {} UploadInfo(const std::string& name, s64 size, const OnUploadCallback& cb) : m_name{name}, m_size{size}, m_callback{cb} {}
UploadInfo(const std::string& name, const std::vector<u8>& data) : m_name{name}, m_data{data} {} UploadInfo(const std::string& name, const std::vector<u8>& data) : m_name{name}, m_data{data} {}
std::string m_name{}; std::string m_name{};
std::vector<u8> m_data{}; std::vector<u8> m_data{};

View File

@@ -487,7 +487,7 @@ struct FsNative : Fs {
FsFileSystem m_fs{}; FsFileSystem m_fs{};
Result m_open_result{}; Result m_open_result{};
bool m_own{true}; const bool m_own{true};
}; };
#if 0 #if 0

View File

@@ -11,7 +11,7 @@ using OnInstallStart = std::function<bool(const char* path)>;
using OnInstallWrite = std::function<bool(const void* buf, size_t size)>; using OnInstallWrite = std::function<bool(const void* buf, size_t size)>;
using OnInstallClose = std::function<void()>; using OnInstallClose = std::function<void()>;
void InitInstallMode(OnInstallStart on_start, OnInstallWrite on_write, OnInstallClose on_close); void InitInstallMode(const OnInstallStart& on_start, const OnInstallWrite& on_write, const OnInstallClose& on_close);
void DisableInstallMode(); void DisableInstallMode();
unsigned GetPort(); unsigned GetPort();

View File

@@ -11,7 +11,7 @@ using OnInstallStart = std::function<bool(const char* path)>;
using OnInstallWrite = std::function<bool(const void* buf, size_t size)>; using OnInstallWrite = std::function<bool(const void* buf, size_t size)>;
using OnInstallClose = std::function<void()>; using OnInstallClose = std::function<void()>;
void InitInstallMode(OnInstallStart on_start, OnInstallWrite on_write, OnInstallClose on_close); void InitInstallMode(const OnInstallStart& on_start, const OnInstallWrite& on_write, const OnInstallClose& on_close);
void DisableInstallMode(); void DisableInstallMode();
} // namespace sphaira::haze } // namespace sphaira::haze

View File

@@ -32,11 +32,11 @@ using StartCallback = std::function<Result(PullCallback pull)>;
using StartCallback2 = std::function<Result(StartThreadCallback start, PullCallback pull)>; using StartCallback2 = std::function<Result(StartThreadCallback start, PullCallback pull)>;
// reads data from rfunc into wfunc. // reads data from rfunc into wfunc.
Result Transfer(ui::ProgressBox* pbox, s64 size, ReadCallback rfunc, WriteCallback wfunc, Mode mode = Mode::MultiThreaded); Result Transfer(ui::ProgressBox* pbox, s64 size, const ReadCallback& rfunc, const WriteCallback& wfunc, Mode mode = Mode::MultiThreaded);
// reads data from rfunc, pull data from provided pull() callback. // reads data from rfunc, pull data from provided pull() callback.
Result TransferPull(ui::ProgressBox* pbox, s64 size, ReadCallback rfunc, StartCallback sfunc, Mode mode = Mode::MultiThreaded); Result TransferPull(ui::ProgressBox* pbox, s64 size, const ReadCallback& rfunc, const StartCallback& sfunc, Mode mode = Mode::MultiThreaded);
Result TransferPull(ui::ProgressBox* pbox, s64 size, ReadCallback rfunc, StartCallback2 sfunc, Mode mode = Mode::MultiThreaded); Result TransferPull(ui::ProgressBox* pbox, s64 size, const ReadCallback& rfunc, const StartCallback2& sfunc, Mode mode = Mode::MultiThreaded);
// helper for extract zips. // helper for extract zips.
// this will multi-thread unzip if size >= 512KiB, otherwise it'll single pass. // this will multi-thread unzip if size >= 512KiB, otherwise it'll single pass.
@@ -50,7 +50,7 @@ using UnzipAllFilter = std::function<bool(const fs::FsPath& name, fs::FsPath& pa
// helper all-in-one unzip function that unzips a zip (either open or path provided). // helper all-in-one unzip function that unzips a zip (either open or path provided).
// the filter function can be used to modify the path and filter out unwanted files. // the filter function can be used to modify the path and filter out unwanted files.
Result TransferUnzipAll(ui::ProgressBox* pbox, void* zfile, fs::Fs* fs, const fs::FsPath& base_path, UnzipAllFilter filter = nullptr, Mode mode = Mode::SingleThreadedIfSmaller); Result TransferUnzipAll(ui::ProgressBox* pbox, void* zfile, fs::Fs* fs, const fs::FsPath& base_path, const UnzipAllFilter& filter = nullptr, Mode mode = Mode::SingleThreadedIfSmaller);
Result TransferUnzipAll(ui::ProgressBox* pbox, const fs::FsPath& zip_out, fs::Fs* fs, const fs::FsPath& base_path, UnzipAllFilter filter = nullptr, Mode mode = Mode::SingleThreadedIfSmaller); Result TransferUnzipAll(ui::ProgressBox* pbox, const fs::FsPath& zip_out, fs::Fs* fs, const fs::FsPath& base_path, const UnzipAllFilter& filter = nullptr, Mode mode = Mode::SingleThreadedIfSmaller);
} // namespace sphaira::thread } // namespace sphaira::thread

View File

@@ -10,14 +10,14 @@ struct List final : Object {
GRID, GRID,
}; };
using Callback = std::function<void(NVGcontext* vg, Theme* theme, Vec4 v, s64 index)>; using Callback = std::function<void(NVGcontext* vg, Theme* theme, const Vec4& v, s64 index)>;
using TouchCallback = std::function<void(bool touch, s64 index)>; using TouchCallback = std::function<void(bool touch, s64 index)>;
List(s64 row, s64 page, const Vec4& pos, const Vec4& v, const Vec2& pad = {}); List(s64 row, s64 page, const Vec4& pos, const Vec4& v, const Vec2& pad = {});
void OnUpdate(Controller* controller, TouchInfo* touch, s64 index, s64 count, TouchCallback callback); void OnUpdate(Controller* controller, TouchInfo* touch, s64 index, s64 count, const TouchCallback& callback);
void Draw(NVGcontext* vg, Theme* theme, s64 count, Callback callback) const; void Draw(NVGcontext* vg, Theme* theme, s64 count, const Callback& callback) const;
auto SetScrollBarPos(float x, float y, float h) { auto SetScrollBarPos(float x, float y, float h) {
m_scrollbar.x = x; m_scrollbar.x = x;
@@ -73,10 +73,10 @@ private:
auto ClampX(float x, s64 count) const -> float; auto ClampX(float x, s64 count) const -> float;
auto ClampY(float y, s64 count) const -> float; auto ClampY(float y, s64 count) const -> float;
void OnUpdateHome(Controller* controller, TouchInfo* touch, s64 index, s64 count, TouchCallback callback); void OnUpdateHome(Controller* controller, TouchInfo* touch, s64 index, s64 count, const TouchCallback& callback);
void OnUpdateGrid(Controller* controller, TouchInfo* touch, s64 index, s64 count, TouchCallback callback); void OnUpdateGrid(Controller* controller, TouchInfo* touch, s64 index, s64 count, const TouchCallback& callback);
void DrawHome(NVGcontext* vg, Theme* theme, s64 count, Callback callback) const; void DrawHome(NVGcontext* vg, Theme* theme, s64 count, const Callback& callback) const;
void DrawGrid(NVGcontext* vg, Theme* theme, s64 count, Callback callback) const; void DrawGrid(NVGcontext* vg, Theme* theme, s64 count, const Callback& callback) const;
private: private:
const s64 m_row; const s64 m_row;

View File

@@ -86,14 +86,16 @@ struct EntryMenu final : MenuBase {
private: private:
struct Option { struct Option {
Option(const std::string& dt, const std::string& ct, std::function<void(void)> f) using Callback = std::function<void(void)>;
Option(const std::string& dt, const std::string& ct, const Callback& f)
: display_text{dt}, confirm_text{ct}, func{f} {} : display_text{dt}, confirm_text{ct}, func{f} {}
Option(const std::string& dt, std::function<void(void)> f) Option(const std::string& dt, const Callback& f)
: display_text{dt}, func{f} {} : display_text{dt}, func{f} {}
std::string display_text{}; const std::string display_text;
std::string confirm_text{}; const std::string confirm_text;
std::function<void(void)> func{}; const Callback func{};
}; };
Entry& m_entry; Entry& m_entry;

View File

@@ -33,9 +33,17 @@ struct MenuBase : Widget {
return true; return true;
} }
void SetTitle(std::string title); void SetTitle(const std::string& title) {
void SetTitleSubHeading(std::string sub_heading); m_title = title;
void SetSubHeading(std::string sub_heading); }
void SetTitleSubHeading(const std::string& sub_heading) {
m_title_sub_heading = sub_heading;
}
void SetSubHeading(const std::string& sub_heading) {
m_sub_heading = sub_heading;
}
auto GetTitle() const { auto GetTitle() const {
return m_title; return m_title;

View File

@@ -104,7 +104,7 @@ struct Config {
u32 limit{18}; u32 limit{18};
bool nsfw{false}; bool nsfw{false};
void SetQuery(std::string new_query) { void SetQuery(const std::string& new_query) {
query = new_query; query = new_query;
} }
@@ -112,7 +112,7 @@ struct Config {
query.clear(); query.clear();
} }
void SetCreator(Creator new_creator) { void SetCreator(const Creator& new_creator) {
creator = new_creator.id; creator = new_creator.id;
} }

View File

@@ -11,8 +11,7 @@ public:
enum class Side { LEFT, RIGHT }; enum class Side { LEFT, RIGHT };
public: public:
NotifEntry(std::string text, Side side); NotifEntry(const std::string& text, Side side);
~NotifEntry() = default;
auto Draw(NVGcontext* vg, Theme* theme, float y) -> bool; auto Draw(NVGcontext* vg, Theme* theme, float y) -> bool;
auto GetSide() const noexcept { return m_side; } auto GetSide() const noexcept { return m_side; }
@@ -22,17 +21,14 @@ private:
void Draw(NVGcontext* vg, Theme* theme) override; void Draw(NVGcontext* vg, Theme* theme) override;
private: private:
std::string m_text{}; std::string m_text;
Side m_side;
std::size_t m_count{180}; // count down to zero std::size_t m_count{180}; // count down to zero
Side m_side{};
bool m_bounds_measured{}; bool m_bounds_measured{};
}; };
class NotifMananger final : public Object { class NotifMananger final : public Object {
public: public:
NotifMananger() = default;
~NotifMananger() = default;
void Draw(NVGcontext* vg, Theme* theme) override; void Draw(NVGcontext* vg, Theme* theme) override;
void Push(const NotifEntry& entry); void Push(const NotifEntry& entry);

View File

@@ -54,7 +54,7 @@ public:
m_pos = { x, y, w, h }; m_pos = { x, y, w, h };
} }
auto SetPos(Vec4 v) noexcept -> void { auto SetPos(const Vec4& v) noexcept -> void {
m_pos = v; m_pos = v;
} }

View File

@@ -9,7 +9,7 @@ class OptionBoxEntry final : public Widget {
public: public:
public: public:
OptionBoxEntry(const std::string& text, Vec4 pos); OptionBoxEntry(const std::string& text, const Vec4& pos);
auto Update(Controller* controller, TouchInfo* touch) -> void override {} auto Update(Controller* controller, TouchInfo* touch) -> void override {}
auto Draw(NVGcontext* vg, Theme* theme) -> void override; auto Draw(NVGcontext* vg, Theme* theme) -> void override;

View File

@@ -13,11 +13,11 @@ public:
using Callback = std::function<void(std::optional<s64>)>; using Callback = std::function<void(std::optional<s64>)>;
public: public:
explicit PopupList(std::string title, Items items, Callback cb, s64 index = 0); explicit PopupList(const std::string& title, const Items& items, const Callback& cb, s64 index = 0);
PopupList(std::string title, Items items, Callback cb, std::string index); PopupList(const std::string& title, const Items& items, const Callback& cb, const std::string& index);
PopupList(std::string title, Items items, std::string& index_str_ref, s64& index); PopupList(const std::string& title, const Items& items, std::string& index_str_ref, s64& index);
PopupList(std::string title, Items items, std::string& index_ref); PopupList(const std::string& title, const Items& items, std::string& index_ref);
PopupList(std::string title, Items items, s64& index_ref); PopupList(const std::string& title, const Items& items, s64& index_ref);
auto Update(Controller* controller, TouchInfo* touch) -> void override; auto Update(Controller* controller, TouchInfo* touch) -> void override;
auto Draw(NVGcontext* vg, Theme* theme) -> void override; auto Draw(NVGcontext* vg, Theme* theme) -> void override;
@@ -33,8 +33,8 @@ private:
static constexpr float m_text_xoffset{15.f}; static constexpr float m_text_xoffset{15.f};
static constexpr float m_line_width{1220.f}; static constexpr float m_line_width{1220.f};
std::string m_title{}; const std::string m_title;
Items m_items{}; const Items m_items;
Callback m_callback{}; Callback m_callback{};
s64 m_index{}; // index in list array s64 m_index{}; // index in list array
s64 m_starting_index{}; s64 m_starting_index{};

View File

@@ -17,7 +17,7 @@ struct ProgressBox final : Widget {
int image, int image,
const std::string& action, const std::string& action,
const std::string& title, const std::string& title,
ProgressBoxCallback callback, ProgressBoxDoneCallback done = [](Result rc){}, const ProgressBoxCallback& callback, const ProgressBoxDoneCallback& done = [](Result rc){},
int cpuid = 1, int prio = PRIO_PREEMPTIVE, int stack_size = 1024*128 int cpuid = 1, int prio = PRIO_PREEMPTIVE, int stack_size = 1024*128
); );
~ProgressBox(); ~ProgressBox();

View File

@@ -59,10 +59,10 @@ protected:
} }
protected: protected:
std::string m_title; const std::string m_title;
private: private:
std::string m_info{}; const std::string m_info;
std::string m_depends_info{}; std::string m_depends_info{};
DependsCallback m_depends_callback{}; DependsCallback m_depends_callback{};
DependsClickCallback m_depends_click{}; DependsClickCallback m_depends_click{};
@@ -78,7 +78,7 @@ public:
using Callback = std::function<void(bool&)>; using Callback = std::function<void(bool&)>;
public: public:
explicit SidebarEntryBool(const std::string& title, bool option, Callback cb, const std::string& info = "", const std::string& true_str = "On", const std::string& false_str = "Off"); explicit SidebarEntryBool(const std::string& title, bool option, const Callback& cb, const std::string& info = "", const std::string& true_str = "On", const std::string& false_str = "Off");
explicit SidebarEntryBool(const std::string& title, bool& option, const std::string& info = "", const std::string& true_str = "On", const std::string& false_str = "Off"); explicit SidebarEntryBool(const std::string& title, bool& option, const std::string& info = "", const std::string& true_str = "On", const std::string& false_str = "Off");
explicit SidebarEntryBool(const std::string& title, option::OptionBool& option, const Callback& cb, const std::string& info = "", const std::string& true_str = "On", const std::string& false_str = "Off"); explicit SidebarEntryBool(const std::string& title, option::OptionBool& option, const Callback& cb, const std::string& info = "", const std::string& true_str = "On", const std::string& false_str = "Off");
explicit SidebarEntryBool(const std::string& title, option::OptionBool& option, const std::string& info = "", const std::string& true_str = "On", const std::string& false_str = "Off"); explicit SidebarEntryBool(const std::string& title, option::OptionBool& option, const std::string& info = "", const std::string& true_str = "On", const std::string& false_str = "Off");
@@ -96,13 +96,13 @@ public:
using Callback = std::function<void()>; using Callback = std::function<void()>;
public: public:
explicit SidebarEntryCallback(const std::string& title, Callback cb, const std::string& info); explicit SidebarEntryCallback(const std::string& title, const Callback& cb, const std::string& info);
explicit SidebarEntryCallback(const std::string& title, Callback cb, bool pop_on_click = false, const std::string& info = ""); explicit SidebarEntryCallback(const std::string& title, const Callback& cb, bool pop_on_click = false, const std::string& info = "");
void Draw(NVGcontext* vg, Theme* theme, const Vec4& root_pos, bool left) override; void Draw(NVGcontext* vg, Theme* theme, const Vec4& root_pos, bool left) override;
private: private:
Callback m_callback; const Callback m_callback;
bool m_pop_on_click; const bool m_pop_on_click;
}; };
class SidebarEntryArray final : public SidebarEntryBase { class SidebarEntryArray final : public SidebarEntryBase {
@@ -112,16 +112,16 @@ public:
using Callback = std::function<void(s64& index)>; using Callback = std::function<void(s64& index)>;
public: public:
explicit SidebarEntryArray(const std::string& title, const Items& items, Callback cb, s64 index = 0, const std::string& info = ""); explicit SidebarEntryArray(const std::string& title, const Items& items, const Callback& cb, s64 index = 0, const std::string& info = "");
explicit SidebarEntryArray(const std::string& title, const Items& items, Callback cb, const std::string& index, const std::string& info = ""); explicit SidebarEntryArray(const std::string& title, const Items& items, const Callback& cb, const std::string& index, const std::string& info = "");
explicit SidebarEntryArray(const std::string& title, const Items& items, std::string& index, const std::string& info = ""); explicit SidebarEntryArray(const std::string& title, const Items& items, std::string& index, const std::string& info = "");
void Draw(NVGcontext* vg, Theme* theme, const Vec4& root_pos, bool left) override; void Draw(NVGcontext* vg, Theme* theme, const Vec4& root_pos, bool left) override;
private: private:
Items m_items; const Items m_items;
ListCallback m_list_callback; const Callback m_callback;
Callback m_callback;
s64 m_index; s64 m_index;
ListCallback m_list_callback{};
}; };
// single text entry. // single text entry.
@@ -204,9 +204,9 @@ private:
void SetupButtons(); void SetupButtons();
private: private:
std::string m_title; const std::string m_title;
std::string m_sub; const std::string m_sub;
Side m_side; const Side m_side;
Items m_items; Items m_items;
s64 m_index{}; s64 m_index{};

View File

@@ -56,8 +56,8 @@ struct Vec2 {
struct Vec4 { struct Vec4 {
constexpr Vec4() = default; constexpr Vec4() = default;
constexpr Vec4(float _x, float _y, float _w, float _h) : x{_x}, y{_y}, w{_w}, h{_h} {} constexpr Vec4(float _x, float _y, float _w, float _h) : x{_x}, y{_y}, w{_w}, h{_h} {}
constexpr Vec4(Vec2 vec0, Vec2 vec1) : x{vec0.x}, y{vec0.y}, w{vec1.x}, h{vec1.y} {} constexpr Vec4(const Vec2& vec0, const Vec2& vec1) : x{vec0.x}, y{vec0.y}, w{vec1.x}, h{vec1.y} {}
constexpr Vec4(Vec4 vec0, Vec4 vec1) : x{vec0.x}, y{vec0.y}, w{vec1.w}, h{vec1.h} {} constexpr Vec4(const Vec4& vec0, const Vec4& vec1) : x{vec0.x}, y{vec0.y}, w{vec1.w}, h{vec1.h} {}
float& operator[](std::size_t idx) { float& operator[](std::size_t idx) {
switch (idx) { switch (idx) {
@@ -339,10 +339,10 @@ struct Action final {
CallbackWithBool CallbackWithBool
>; >;
Action(Callback cb) : Action{ActionType::DOWN, "", cb} {} explicit Action(const Callback& cb) : Action{ActionType::DOWN, "", cb} {}
Action(std::string hint, Callback cb) : Action{ActionType::DOWN, hint, cb} {} explicit Action(const std::string& hint, const Callback& cb) : Action{ActionType::DOWN, hint, cb} {}
Action(u8 type, Callback cb) : Action{type, "", cb} {} explicit Action(u8 type, const Callback& cb) : Action{type, "", cb} {}
Action(u8 type, std::string hint, Callback cb) : m_type{type}, m_callback{cb}, m_hint{hint} {} explicit Action(u8 type, const std::string& hint, const Callback& cb) : m_type{type}, m_callback{cb}, m_hint{hint} {}
auto IsHidden() const noexcept { return m_hint.empty(); } auto IsHidden() const noexcept { return m_hint.empty(); }

View File

@@ -48,8 +48,8 @@ struct Widget : public Object {
} }
auto HasAction(Button button) const -> bool; auto HasAction(Button button) const -> bool;
void SetAction(Button button, Action action); void SetAction(Button button, const Action& action);
void SetActions(std::same_as<std::pair<Button, Action>> auto ...args) { void SetActions(std::same_as<std::pair<Button, Action>> auto&& ...args) {
const std::array list = {args...}; const std::array list = {args...};
for (const auto& [button, action] : list) { for (const auto& [button, action] : list) {
SetAction(button, action); SetAction(button, action);

View File

@@ -539,7 +539,7 @@ auto App::PopToMenu() -> void {
} }
} }
void App::Notify(std::string text, ui::NotifEntry::Side side) { void App::Notify(const std::string& text, ui::NotifEntry::Side side) {
g_app->m_notif_manager.Push({text, side}); g_app->m_notif_manager.Push({text, side});
} }

View File

@@ -406,7 +406,7 @@ void Exit() {
} }
#if ENABLE_NETWORK_INSTALL #if ENABLE_NETWORK_INSTALL
void InitInstallMode(OnInstallStart on_start, OnInstallWrite on_write, OnInstallClose on_close) { void InitInstallMode(const OnInstallStart& on_start, const OnInstallWrite& on_write, const OnInstallClose& on_close) {
SCOPED_MUTEX(&g_shared_data.mutex); SCOPED_MUTEX(&g_shared_data.mutex);
g_shared_data.on_start = on_start; g_shared_data.on_start = on_start;
g_shared_data.on_write = on_write; g_shared_data.on_write = on_write;

View File

@@ -610,7 +610,7 @@ void Exit() {
} }
#if ENABLE_NETWORK_INSTALL #if ENABLE_NETWORK_INSTALL
void InitInstallMode(OnInstallStart on_start, OnInstallWrite on_write, OnInstallClose on_close) { void InitInstallMode(const OnInstallStart& on_start, const OnInstallWrite& on_write, const OnInstallClose& on_close) {
SCOPED_MUTEX(&g_shared_data.mutex); SCOPED_MUTEX(&g_shared_data.mutex);
g_shared_data.on_start = on_start; g_shared_data.on_start = on_start;
g_shared_data.on_write = on_write; g_shared_data.on_write = on_write;

View File

@@ -72,7 +72,7 @@ public:
}; };
struct ThreadData { struct ThreadData {
ThreadData(ui::ProgressBox* _pbox, s64 size, ReadCallback _rfunc, WriteCallback _wfunc, u64 buffer_size); ThreadData(ui::ProgressBox* _pbox, s64 size, const ReadCallback& _rfunc, const WriteCallback& _wfunc, u64 buffer_size);
auto GetResults() volatile -> Result; auto GetResults() volatile -> Result;
void WakeAllThreads(); void WakeAllThreads();
@@ -131,8 +131,8 @@ private:
private: private:
// these need to be copied // these need to be copied
ui::ProgressBox* const pbox; ui::ProgressBox* const pbox;
const ReadCallback rfunc; const ReadCallback& rfunc;
const WriteCallback wfunc; const WriteCallback& wfunc;
// these need to be created // these need to be created
Mutex mutex{}; Mutex mutex{};
@@ -165,7 +165,7 @@ private:
std::atomic_bool write_running{true}; std::atomic_bool write_running{true};
}; };
ThreadData::ThreadData(ui::ProgressBox* _pbox, s64 size, ReadCallback _rfunc, WriteCallback _wfunc, u64 buffer_size) ThreadData::ThreadData(ui::ProgressBox* _pbox, s64 size, const ReadCallback& _rfunc, const WriteCallback& _wfunc, u64 buffer_size)
: pbox{_pbox} : pbox{_pbox}
, rfunc{_rfunc} , rfunc{_rfunc}
, wfunc{_wfunc} , wfunc{_wfunc}
@@ -355,7 +355,7 @@ auto GetAlternateCore(int id) {
return id == 1 ? 2 : 1; return id == 1 ? 2 : 1;
} }
Result TransferInternal(ui::ProgressBox* pbox, s64 size, ReadCallback rfunc, WriteCallback wfunc, StartCallback2 sfunc, Mode mode, u64 buffer_size = NORMAL_BUFFER_SIZE) { Result TransferInternal(ui::ProgressBox* pbox, s64 size, const ReadCallback& rfunc, const WriteCallback& wfunc, const StartCallback2& sfunc, Mode mode, u64 buffer_size = NORMAL_BUFFER_SIZE) {
const auto is_file_based_emummc = App::IsFileBaseEmummc(); const auto is_file_based_emummc = App::IsFileBaseEmummc();
if (is_file_based_emummc) { if (is_file_based_emummc) {
@@ -480,18 +480,18 @@ Result TransferInternal(ui::ProgressBox* pbox, s64 size, ReadCallback rfunc, Wri
} // namespace } // namespace
Result Transfer(ui::ProgressBox* pbox, s64 size, ReadCallback rfunc, WriteCallback wfunc, Mode mode) { Result Transfer(ui::ProgressBox* pbox, s64 size, const ReadCallback& rfunc, const WriteCallback& wfunc, Mode mode) {
return TransferInternal(pbox, size, rfunc, wfunc, nullptr, mode); return TransferInternal(pbox, size, rfunc, wfunc, nullptr, mode);
} }
Result TransferPull(ui::ProgressBox* pbox, s64 size, ReadCallback rfunc, StartCallback sfunc, Mode mode) { Result TransferPull(ui::ProgressBox* pbox, s64 size, const ReadCallback& rfunc, const StartCallback& sfunc, Mode mode) {
return TransferInternal(pbox, size, rfunc, nullptr, [sfunc](StartThreadCallback start, PullCallback pull) -> Result { return TransferInternal(pbox, size, rfunc, nullptr, [sfunc](StartThreadCallback start, PullCallback pull) -> Result {
R_TRY(start()); R_TRY(start());
return sfunc(pull); return sfunc(pull);
}, mode); }, mode);
} }
Result TransferPull(ui::ProgressBox* pbox, s64 size, ReadCallback rfunc, StartCallback2 sfunc, Mode mode) { Result TransferPull(ui::ProgressBox* pbox, s64 size, const ReadCallback& rfunc, const StartCallback2& sfunc, Mode mode) {
return TransferInternal(pbox, size, rfunc, nullptr, sfunc, mode); return TransferInternal(pbox, size, rfunc, nullptr, sfunc, mode);
} }
@@ -575,7 +575,7 @@ Result TransferZip(ui::ProgressBox* pbox, void* zfile, fs::Fs* fs, const fs::FsP
); );
} }
Result TransferUnzipAll(ui::ProgressBox* pbox, void* zfile, fs::Fs* fs, const fs::FsPath& base_path, UnzipAllFilter filter, Mode mode) { Result TransferUnzipAll(ui::ProgressBox* pbox, void* zfile, fs::Fs* fs, const fs::FsPath& base_path, const UnzipAllFilter& filter, Mode mode) {
unz_global_info64 ginfo; unz_global_info64 ginfo;
if (UNZ_OK != unzGetGlobalInfo64(zfile, &ginfo)) { if (UNZ_OK != unzGetGlobalInfo64(zfile, &ginfo)) {
R_THROW(Result_UnzGetGlobalInfo64); R_THROW(Result_UnzGetGlobalInfo64);
@@ -632,7 +632,7 @@ Result TransferUnzipAll(ui::ProgressBox* pbox, void* zfile, fs::Fs* fs, const fs
R_SUCCEED(); R_SUCCEED();
} }
Result TransferUnzipAll(ui::ProgressBox* pbox, const fs::FsPath& zip_out, fs::Fs* fs, const fs::FsPath& base_path, UnzipAllFilter filter, Mode mode) { Result TransferUnzipAll(ui::ProgressBox* pbox, const fs::FsPath& zip_out, fs::Fs* fs, const fs::FsPath& base_path, const UnzipAllFilter& filter, Mode mode) {
zlib_filefunc64_def file_func; zlib_filefunc64_def file_func;
mz::FileFuncStdio(&file_func); mz::FileFuncStdio(&file_func);

View File

@@ -35,7 +35,7 @@ auto List::ClampY(float y, s64 count) const -> float {
return std::clamp(y, 0.F, y_max); return std::clamp(y, 0.F, y_max);
} }
void List::OnUpdate(Controller* controller, TouchInfo* touch, s64 index, s64 count, TouchCallback callback) { void List::OnUpdate(Controller* controller, TouchInfo* touch, s64 index, s64 count, const TouchCallback& callback) {
switch (m_layout) { switch (m_layout) {
case Layout::HOME: case Layout::HOME:
OnUpdateHome(controller, touch, index, count, callback); OnUpdateHome(controller, touch, index, count, callback);
@@ -46,7 +46,7 @@ void List::OnUpdate(Controller* controller, TouchInfo* touch, s64 index, s64 cou
} }
} }
void List::Draw(NVGcontext* vg, Theme* theme, s64 count, Callback callback) const { void List::Draw(NVGcontext* vg, Theme* theme, s64 count, const Callback& callback) const {
switch (m_layout) { switch (m_layout) {
case Layout::HOME: case Layout::HOME:
DrawHome(vg, theme, count, callback); DrawHome(vg, theme, count, callback);
@@ -129,7 +129,7 @@ auto List::ScrollUp(s64& index, s64 step, s64 count) -> bool {
return false; return false;
} }
void List::OnUpdateHome(Controller* controller, TouchInfo* touch, s64 index, s64 count, TouchCallback callback) { void List::OnUpdateHome(Controller* controller, TouchInfo* touch, s64 index, s64 count, const TouchCallback& callback) {
if (controller->GotDown(Button::RIGHT)) { if (controller->GotDown(Button::RIGHT)) {
if (ScrollDown(index, m_row, count)) { if (ScrollDown(index, m_row, count)) {
callback(false, index); callback(false, index);
@@ -165,7 +165,7 @@ void List::OnUpdateHome(Controller* controller, TouchInfo* touch, s64 index, s64
} }
} }
void List::OnUpdateGrid(Controller* controller, TouchInfo* touch, s64 index, s64 count, TouchCallback callback) { void List::OnUpdateGrid(Controller* controller, TouchInfo* touch, s64 index, s64 count, const TouchCallback& callback) {
const auto page_up_button = GetPageJump() ? (m_row == 1 ? Button::DPAD_LEFT : Button::L2) : (Button::NONE); const auto page_up_button = GetPageJump() ? (m_row == 1 ? Button::DPAD_LEFT : Button::L2) : (Button::NONE);
const auto page_down_button = GetPageJump() ? (m_row == 1 ? Button::DPAD_RIGHT : Button::R2) : (Button::NONE); const auto page_down_button = GetPageJump() ? (m_row == 1 ? Button::DPAD_RIGHT : Button::R2) : (Button::NONE);
@@ -236,7 +236,7 @@ void List::OnUpdateGrid(Controller* controller, TouchInfo* touch, s64 index, s64
} }
} }
void List::DrawHome(NVGcontext* vg, Theme* theme, s64 count, Callback callback) const { void List::DrawHome(NVGcontext* vg, Theme* theme, s64 count, const Callback& callback) const {
const auto yoff = ClampX(m_yoff + m_y_prog, count); const auto yoff = ClampX(m_yoff + m_y_prog, count);
auto v = m_v; auto v = m_v;
v.x -= yoff; v.x -= yoff;
@@ -260,7 +260,7 @@ void List::DrawHome(NVGcontext* vg, Theme* theme, s64 count, Callback callback)
nvgRestore(vg); nvgRestore(vg);
} }
void List::DrawGrid(NVGcontext* vg, Theme* theme, s64 count, Callback callback) const { void List::DrawGrid(NVGcontext* vg, Theme* theme, s64 count, const Callback& callback) const {
const auto yoff = ClampY(m_yoff + m_y_prog, count); const auto yoff = ClampY(m_yoff + m_y_prog, count);
const s64 start = yoff / GetMaxY() * m_row; const s64 start = yoff / GetMaxY() * m_row;
gfx::drawScrollbar2(vg, theme, m_scrollbar.x, m_scrollbar.y, m_scrollbar.h, start, count, m_row, m_page); gfx::drawScrollbar2(vg, theme, m_scrollbar.x, m_scrollbar.y, m_scrollbar.h, start, count, m_row, m_page);

View File

@@ -288,7 +288,7 @@ void DrawIcon(NVGcontext* vg, const LazyImage& l, const LazyImage& d, float x, f
} }
} }
void DrawIcon(NVGcontext* vg, const LazyImage& l, const LazyImage& d, Vec4 vec, bool rounded = true, float scale = 1.0) { void DrawIcon(NVGcontext* vg, const LazyImage& l, const LazyImage& d, const Vec4& vec, bool rounded = true, float scale = 1.0) {
DrawIcon(vg, l, d, vec.x, vec.y, vec.w, vec.h, rounded, scale); DrawIcon(vg, l, d, vec.x, vec.y, vec.w, vec.h, rounded, scale);
} }

View File

@@ -444,7 +444,7 @@ void Menu::Draw(NVGcontext* vg, Theme* theme) {
constexpr float text_xoffset{15.f}; constexpr float text_xoffset{15.f};
bool got_dir_count = false; bool got_dir_count = false;
m_list->Draw(vg, theme, m_entries_current.size(), [this, text_col, &got_dir_count](auto* vg, auto* theme, auto v, auto i) { m_list->Draw(vg, theme, m_entries_current.size(), [this, text_col, &got_dir_count](auto* vg, auto* theme, auto& v, auto i) {
const auto& [x, y, w, h] = v; const auto& [x, y, w, h] = v;
auto& e = GetEntry(i); auto& e = GetEntry(i);

View File

@@ -568,7 +568,7 @@ void FsView::Draw(NVGcontext* vg, Theme* theme) {
constexpr float text_xoffset{15.f}; constexpr float text_xoffset{15.f};
bool got_dir_count = false; bool got_dir_count = false;
m_list->Draw(vg, theme, m_entries_current.size(), [this, text_col, &got_dir_count](auto* vg, auto* theme, auto v, auto i) { m_list->Draw(vg, theme, m_entries_current.size(), [this, text_col, &got_dir_count](auto* vg, auto* theme, auto& v, auto i) {
const auto& [x, y, w, h] = v; const auto& [x, y, w, h] = v;
auto& e = GetEntry(i); auto& e = GetEntry(i);

View File

@@ -502,7 +502,7 @@ void Menu::Draw(NVGcontext* vg, Theme* theme) {
nvgRestore(vg); nvgRestore(vg);
} }
m_list->Draw(vg, theme, std::size(g_option_list), [this](auto* vg, auto* theme, auto v, auto i) { m_list->Draw(vg, theme, std::size(g_option_list), [this](auto* vg, auto* theme, auto& v, auto i) {
const auto& [x, y, w, h] = v; const auto& [x, y, w, h] = v;
const auto text_y = y + (h / 2.f); const auto text_y = y + (h / 2.f);
auto colour = ThemeEntryID_TEXT; auto colour = ThemeEntryID_TEXT;

View File

@@ -215,7 +215,7 @@ void Menu::Draw(NVGcontext* vg, Theme* theme) {
constexpr float text_xoffset{15.f}; constexpr float text_xoffset{15.f};
m_list->Draw(vg, theme, m_entries.size(), [this, text_col](auto* vg, auto* theme, auto v, auto i) { m_list->Draw(vg, theme, m_entries.size(), [this, text_col](auto* vg, auto* theme, auto& v, auto i) {
const auto& [x, y, w, h] = v; const auto& [x, y, w, h] = v;
auto& e = m_entries[i]; auto& e = m_entries[i];

View File

@@ -110,16 +110,4 @@ void MenuBase::Draw(NVGcontext* vg, Theme* theme) {
m_scroll_sub_heading.Draw(vg, true, 80, 685, text_w - 160, 18, NVG_ALIGN_LEFT, theme->GetColour(ThemeEntryID_TEXT), m_sub_heading.c_str()); m_scroll_sub_heading.Draw(vg, true, 80, 685, text_w - 160, 18, NVG_ALIGN_LEFT, theme->GetColour(ThemeEntryID_TEXT), m_sub_heading.c_str());
} }
void MenuBase::SetTitle(std::string title) {
m_title = title;
}
void MenuBase::SetTitleSubHeading(std::string sub_heading) {
m_title_sub_heading = sub_heading;
}
void MenuBase::SetSubHeading(std::string sub_heading) {
m_sub_heading = sub_heading;
}
} // namespace sphaira::ui::menu } // namespace sphaira::ui::menu

View File

@@ -11,8 +11,8 @@ constexpr u64 MAX_ENTRIES = 9;
} // namespace } // namespace
NotifEntry::NotifEntry(std::string text, Side side) NotifEntry::NotifEntry(const std::string& text, Side side)
: m_text{std::move(text)} : m_text{text}
, m_side{side} { , m_side{side} {
} }

View File

@@ -4,7 +4,7 @@
namespace sphaira::ui { namespace sphaira::ui {
OptionBoxEntry::OptionBoxEntry(const std::string& text, Vec4 pos) OptionBoxEntry::OptionBoxEntry(const std::string& text, const Vec4& pos)
: m_text{text} { : m_text{text} {
m_pos = pos; m_pos = pos;
m_text_pos = Vec2{m_pos.x + (m_pos.w / 2.f), m_pos.y + (m_pos.h / 2.f)}; m_text_pos = Vec2{m_pos.x + (m_pos.w / 2.f), m_pos.y + (m_pos.h / 2.f)};

View File

@@ -6,8 +6,8 @@
namespace sphaira::ui { namespace sphaira::ui {
PopupList::PopupList(std::string title, Items items, std::string& index_str_ref, s64& index_ref) PopupList::PopupList(const std::string& title, const Items& items, std::string& index_str_ref, s64& index_ref)
: PopupList{std::move(title), std::move(items), Callback{}, index_ref} { : PopupList{title, items, Callback{}, index_ref} {
m_callback = [&index_str_ref, &index_ref, this](auto op_idx) { m_callback = [&index_str_ref, &index_ref, this](auto op_idx) {
if (op_idx) { if (op_idx) {
@@ -17,8 +17,8 @@ PopupList::PopupList(std::string title, Items items, std::string& index_str_ref,
}; };
} }
PopupList::PopupList(std::string title, Items items, std::string& index_ref) PopupList::PopupList(const std::string& title, const Items& items, std::string& index_ref)
: PopupList{std::move(title), std::move(items), Callback{}} { : PopupList{title, items, Callback{}} {
const auto it = std::find(m_items.cbegin(), m_items.cend(), index_ref); const auto it = std::find(m_items.cbegin(), m_items.cend(), index_ref);
if (it != m_items.cend()) { if (it != m_items.cend()) {
@@ -35,8 +35,8 @@ PopupList::PopupList(std::string title, Items items, std::string& index_ref)
}; };
} }
PopupList::PopupList(std::string title, Items items, s64& index_ref) PopupList::PopupList(const std::string& title, const Items& items, s64& index_ref)
: PopupList{std::move(title), std::move(items), Callback{}, index_ref} { : PopupList{title, items, Callback{}, index_ref} {
m_callback = [&index_ref, this](auto op_idx) { m_callback = [&index_ref, this](auto op_idx) {
if (op_idx) { if (op_idx) {
@@ -45,8 +45,8 @@ PopupList::PopupList(std::string title, Items items, s64& index_ref)
}; };
} }
PopupList::PopupList(std::string title, Items items, Callback cb, std::string index) PopupList::PopupList(const std::string& title, const Items& items, const Callback& cb, const std::string& index)
: PopupList{std::move(title), std::move(items), cb, 0} { : PopupList{title, items, cb, 0} {
const auto it = std::find(m_items.cbegin(), m_items.cend(), index); const auto it = std::find(m_items.cbegin(), m_items.cend(), index);
if (it != m_items.cend()) { if (it != m_items.cend()) {
@@ -57,9 +57,9 @@ PopupList::PopupList(std::string title, Items items, Callback cb, std::string in
} }
} }
PopupList::PopupList(std::string title, Items items, Callback cb, s64 index) PopupList::PopupList(const std::string& title, const Items& items, const Callback& cb, s64 index)
: m_title{std::move(title)} : m_title{title}
, m_items{std::move(items)} , m_items{items}
, m_callback{cb} , m_callback{cb}
, m_index{index} { , m_index{index} {
this->SetActions( this->SetActions(
@@ -111,7 +111,7 @@ auto PopupList::Draw(NVGcontext* vg, Theme* theme) -> void {
gfx::drawRect(vg, 30.f, m_line_top, m_line_width, 1.f, theme->GetColour(ThemeEntryID_LINE)); gfx::drawRect(vg, 30.f, m_line_top, m_line_width, 1.f, theme->GetColour(ThemeEntryID_LINE));
gfx::drawRect(vg, 30.f, m_line_bottom, m_line_width, 1.f, theme->GetColour(ThemeEntryID_LINE)); gfx::drawRect(vg, 30.f, m_line_bottom, m_line_width, 1.f, theme->GetColour(ThemeEntryID_LINE));
m_list->Draw(vg, theme, m_items.size(), [this](auto* vg, auto* theme, auto v, auto i) { m_list->Draw(vg, theme, m_items.size(), [this](auto* vg, auto* theme, auto& v, auto i) {
const auto& [x, y, w, h] = v; const auto& [x, y, w, h] = v;
auto colour = ThemeEntryID_TEXT; auto colour = ThemeEntryID_TEXT;
const auto selected = m_index == i; const auto selected = m_index == i;

View File

@@ -19,7 +19,11 @@ void threadFunc(void* arg) {
} // namespace } // namespace
ProgressBox::ProgressBox(int image, const std::string& action, const std::string& title, ProgressBoxCallback callback, ProgressBoxDoneCallback done, int cpuid, int prio, int stack_size) { ProgressBox::ProgressBox(int image, const std::string& action, const std::string& title, const ProgressBoxCallback& callback, const ProgressBoxDoneCallback& done, int cpuid, int prio, int stack_size)
: m_done{done}
, m_action{action}
, m_title{title}
, m_image{image} {
if (App::GetApp()->m_progress_boost_mode.Get()) { if (App::GetApp()->m_progress_boost_mode.Get()) {
App::SetBoostMode(true); App::SetBoostMode(true);
} }
@@ -38,11 +42,6 @@ ProgressBox::ProgressBox(int image, const std::string& action, const std::string
m_pos.x = (SCREEN_WIDTH / 2.f) - (m_pos.w / 2.f); m_pos.x = (SCREEN_WIDTH / 2.f) - (m_pos.w / 2.f);
m_pos.y = (SCREEN_HEIGHT / 2.f) - (m_pos.h / 2.f); m_pos.y = (SCREEN_HEIGHT / 2.f) - (m_pos.h / 2.f);
m_done = done;
m_title = title;
m_action = action;
m_image = image;
// create cancel event. // create cancel event.
ueventCreate(&m_uevent, false); ueventCreate(&m_uevent, false);

View File

@@ -10,7 +10,7 @@
namespace sphaira::ui { namespace sphaira::ui {
namespace { namespace {
auto DistanceBetweenY(Vec4 va, Vec4 vb) -> Vec4 { auto DistanceBetweenY(const Vec4& va, const Vec4& vb) -> Vec4 {
return Vec4{ return Vec4{
va.x, va.y, va.x, va.y,
va.w, vb.y - va.y va.w, vb.y - va.y
@@ -104,7 +104,7 @@ void SidebarEntryBase::DrawEntry(NVGcontext* vg, Theme* theme, const std::string
m_scolling_value.Draw(vg, HasFocus(), xpos, ypos, max_off, 20.f, NVG_ALIGN_LEFT | NVG_ALIGN_MIDDLE, theme->GetColour(value_id), right); m_scolling_value.Draw(vg, HasFocus(), xpos, ypos, max_off, 20.f, NVG_ALIGN_LEFT | NVG_ALIGN_MIDDLE, theme->GetColour(value_id), right);
} }
SidebarEntryBool::SidebarEntryBool(const std::string& title, bool option, Callback cb, const std::string& info, const std::string& true_str, const std::string& false_str) SidebarEntryBool::SidebarEntryBool(const std::string& title, bool option, const Callback& cb, const std::string& info, const std::string& true_str, const std::string& false_str)
: SidebarEntryBase{title, info} : SidebarEntryBase{title, info}
, m_option{option} , m_option{option}
, m_callback{cb} , m_callback{cb}
@@ -154,7 +154,7 @@ void SidebarEntryBool::Draw(NVGcontext* vg, Theme* theme, const Vec4& root_pos,
SidebarEntryBase::DrawEntry(vg, theme, m_title, m_option ? m_true_str : m_false_str, m_option); SidebarEntryBase::DrawEntry(vg, theme, m_title, m_option ? m_true_str : m_false_str, m_option);
} }
SidebarEntryCallback::SidebarEntryCallback(const std::string& title, Callback cb, bool pop_on_click, const std::string& info) SidebarEntryCallback::SidebarEntryCallback(const std::string& title, const Callback& cb, bool pop_on_click, const std::string& info)
: SidebarEntryBase{title, info} : SidebarEntryBase{title, info}
, m_callback{cb} , m_callback{cb}
, m_pop_on_click{pop_on_click} { , m_pop_on_click{pop_on_click} {
@@ -170,7 +170,7 @@ SidebarEntryCallback::SidebarEntryCallback(const std::string& title, Callback cb
}); });
} }
SidebarEntryCallback::SidebarEntryCallback(const std::string& title, Callback cb, const std::string& info) SidebarEntryCallback::SidebarEntryCallback(const std::string& title, const Callback& cb, const std::string& info)
: SidebarEntryCallback{title, cb, false, info} { : SidebarEntryCallback{title, cb, false, info} {
} }
@@ -197,7 +197,7 @@ SidebarEntryArray::SidebarEntryArray(const std::string& title, const Items& item
}; };
} }
SidebarEntryArray::SidebarEntryArray(const std::string& title, const Items& items, Callback cb, const std::string& index, const std::string& info) SidebarEntryArray::SidebarEntryArray(const std::string& title, const Items& items, const Callback& cb, const std::string& index, const std::string& info)
: SidebarEntryArray{title, items, cb, 0, info} { : SidebarEntryArray{title, items, cb, 0, info} {
const auto it = std::find(m_items.cbegin(), m_items.cend(), index); const auto it = std::find(m_items.cbegin(), m_items.cend(), index);
@@ -206,7 +206,7 @@ SidebarEntryArray::SidebarEntryArray(const std::string& title, const Items& item
} }
} }
SidebarEntryArray::SidebarEntryArray(const std::string& title, const Items& items, Callback cb, s64 index, const std::string& info) SidebarEntryArray::SidebarEntryArray(const std::string& title, const Items& items, const Callback& cb, s64 index, const std::string& info)
: SidebarEntryBase{title, info} : SidebarEntryBase{title, info}
, m_items{items} , m_items{items}
, m_callback{cb} , m_callback{cb}
@@ -355,7 +355,7 @@ auto Sidebar::Draw(NVGcontext* vg, Theme* theme) -> void {
Widget::Draw(vg, theme); Widget::Draw(vg, theme);
m_list->Draw(vg, theme, m_items.size(), [this](auto* vg, auto* theme, auto v, auto i) { m_list->Draw(vg, theme, m_items.size(), [this](auto* vg, auto* theme, auto& v, auto i) {
const auto& [x, y, w, h] = v; const auto& [x, y, w, h] = v;
if (i != m_items.size() - 1) { if (i != m_items.size() - 1) {

View File

@@ -70,7 +70,7 @@ auto Widget::HasAction(Button button) const -> bool {
return m_actions.contains(button); return m_actions.contains(button);
} }
void Widget::SetAction(Button button, Action action) { void Widget::SetAction(Button button, const Action& action) {
m_actions.insert_or_assign(button, action); m_actions.insert_or_assign(button, action);
} }