#ifndef MENU_H_ #define MENU_H_ #include #include #include #include #include #include namespace pt { struct menu_item { menu_item(std::string title_val, std::function action_val); friend std::ostream& operator<<(std::ostream& lhs, menu_item const& rhs); std::string title; std::function action; }; class menu { public: explicit menu(std::string title_val, std::string description_val = "", std::vector items_val = {}); void add_item(menu_item item); void add_item(std::string title_val, std::function action); void add_item_at(int index, menu_item item); void add_item_at(int index, std::string title_val, std::function action); void remove_item(int index); void add_submenu(std::shared_ptr const& menu_val); void add_submenu(std::string title_val, std::shared_ptr const& menu_val); void add_submenu_at(int index, std::shared_ptr const& menu_val); void add_submenu_at(int index, std::string title_val, std::shared_ptr const& menu_val); void set_title(std::string title_val); void set_description(std::string description_val); void loop() const; private: // helper functions void print_choices() const; [[nodiscard]] int read_choice() const; void check_index(std::size_t index) const; static void print_title(std::string_view title); // wrapper function for menu::loop static std::function invoke_menu_loop(std::shared_ptr const& menu_val); static constexpr char quit_choice = 'q'; static int nesting_level; std::string title; std::string description; std::vector items; }; } // namespace pt #endif // MENU_HPP_