Lua: can make new tabs from lua scripts, doc generation for available tabs to use (#1593)

* lua api: add globals.get_uint and globals.set_uint

* lua doc: remove duplicate function check as we can overload so it doesn't make sense

* lua doc gen: add support for parsing the tabs enum

* gui: custom lua tabs don't have a `func` rendering function but can still have elements to draw

* lua doc: update generated doc

* chore: code style

* chore: minor spelling mistake

* chore: code style

* gui_service: add runtime removal of tabs

* refactor: make it so that it's less likely defining tabs and their translation key in a wrong way.

* lua api: ability to add custom tabs to the gui from lua
This commit is contained in:
Quentin
2023-07-05 00:30:57 +02:00
committed by GitHub
parent bc0f08ce1d
commit 89f57a9a4c
36 changed files with 585 additions and 211 deletions

View File

@ -75,4 +75,26 @@ namespace big
{
return nav;
}
void gui_service::remove_from_nav_internal(std::map<big::tabs, big::navigation_struct>& nav, big::tabs existing_tab_id)
{
std::erase_if(nav, [&](auto& nav_item) {
if (nav_item.first == existing_tab_id)
{
set_selected(tabs::NONE);
return true;
}
else
{
remove_from_nav_internal(nav_item.second.sub_nav, existing_tab_id);
}
return false;
});
}
void gui_service::remove_from_nav(tabs existing_tab_id)
{
remove_from_nav_internal(get_navigation(), existing_tab_id);
}
}

View File

@ -3,6 +3,7 @@
namespace big
{
// Lua API: Tabs
enum class tabs
{
NONE,
@ -51,7 +52,10 @@ namespace big
TRANSLATION_SETTINGS,
DEBUG,
PLAYER
PLAYER,
// Added at runtime by things like lua scripts.
RUNTIME_CUSTOM
};
struct navigation_struct
@ -62,92 +66,88 @@ namespace big
rage::joaat_t hash = rage::joaat(name);
};
// Used for constructing translation key for tabs
#define TAB_DECL_INTERNAL(prefix, tab) \
tabs::tab, \
{ \
#prefix #tab
#define TAB_DECL(tab) TAB_DECL_INTERNAL(GUI_TAB_, tab)
class gui_service final
{
std::vector<tabs> current_tab{};
bool switched_view = true;
// clang-format off
std::map<tabs, navigation_struct> nav = {
{
tabs::SELF,
{
"GUI_TAB_SELF",
TAB_DECL(SELF),
view::self,
{
{tabs::WEAPONS, {"GUI_TAB_WEAPONS", view::weapons}},
{tabs::MOBILE, {"GUI_TAB_MOBILE", view::mobile}},
{tabs::TELEPORT, {"GUI_TAB_TELEPORT", view::teleport}},
{tabs::OUTFIT_EDITOR, {"GUI_TAB_OUTFIT_EDITOR", view::outfit_editor}},
{tabs::OUTFIT_SLOTS, {"GUI_TAB_OUTFIT_SLOTS", view::outfit_slots}},
{TAB_DECL(WEAPONS), view::weapons}},
{TAB_DECL(MOBILE), view::mobile}},
{TAB_DECL(TELEPORT), view::teleport}},
{TAB_DECL(OUTFIT_EDITOR), view::outfit_editor}},
{TAB_DECL(OUTFIT_SLOTS), view::outfit_slots}},
},
},
},
{
tabs::VEHICLE,
{
"GUI_TAB_VEHICLE",
TAB_DECL(VEHICLE),
view::vehicle,
{
{
tabs::HANDLING,
{
"GUI_TAB_HANDLING",
view::handling_current_profile,
TAB_DECL(HANDLING),
view::handling_current_profile,
{
{tabs::HANDLING_CURRENT_PROFILE, {"GUI_TAB_HANDLING_CURRENT_PROFILE", view::handling_current_profile}},
{tabs::HANDLING_SAVED_PROFILE, {"GUI_TAB_HANDLING_SAVED_PROFILES", view::handling_saved_profiles}},
{TAB_DECL(HANDLING_CURRENT_PROFILE), view::handling_current_profile}},
{TAB_DECL(HANDLING_SAVED_PROFILE), view::handling_saved_profiles}},
},
},
},
{tabs::LSC, {"GUI_TAB_LSC", view::lsc}},
{tabs::SPAWN_VEHICLE, {"GUI_TAB_SPAWN_VEHICLE", view::spawn_vehicle}},
{tabs::FUN_VEHICLE, {"GUI_TAB_VEHICLE_FUN_FEATURES", view::fun_vehicle}},
{TAB_DECL(LSC), view::lsc}},
{TAB_DECL(SPAWN_VEHICLE), view::spawn_vehicle}},
{TAB_DECL(FUN_VEHICLE), view::fun_vehicle}},
},
},
},
{
tabs::WORLD,
{
"GUI_TAB_WORLD",
TAB_DECL(WORLD),
view::world,
{
{tabs::SPAWN_PED, {"GUI_TAB_SPAWN_PED", view::spawn_ped}},
{tabs::SQUAD_SPAWNER, {"Squad spawner", view::squad_spawner}},
{tabs::CREATOR, {"GUI_TAB_CREATOR", view::creator}},
{tabs::TRAIN, {"GUI_TAB_TRAIN", view::train}},
{tabs::BLACKHOLE, {"GUI_TAB_BLACKHOLE", view::blackhole}},
{tabs::MODEL_SWAPPER, {"GUI_TAB_MODEL_SWAPPER", view::model_swapper}},
{TAB_DECL(SPAWN_PED), view::spawn_ped}},
{TAB_DECL(SQUAD_SPAWNER), view::squad_spawner}},
{TAB_DECL(CREATOR), view::creator}},
{TAB_DECL(TRAIN), view::train}},
{TAB_DECL(BLACKHOLE), view::blackhole}},
{TAB_DECL(MODEL_SWAPPER), view::model_swapper}},
},
},
},
{
tabs::NETWORK,
{
"GUI_TAB_NETWORK",
TAB_DECL(NETWORK),
view::network,
{
{tabs::SPOOFING, {"GUI_TAB_SPOOFING", view::spoofing}},
{tabs::MISSIONS, {"GUI_TAB_MISSIONS", view::missions}},
{tabs::PLAYER_DATABASE, {"GUI_TAB_PLAYER_DB", view::player_database}},
{tabs::SESSION_BROWSER, {"GUI_TAB_SESSION_BROWSER", view::session_browser}},
{tabs::STAT_EDITOR, {"GUI_TAB_STAT_EDITOR", view::stat_editor}},
{TAB_DECL(SPOOFING), view::spoofing}},
{TAB_DECL(MISSIONS), view::missions}},
{TAB_DECL(PLAYER_DATABASE), view::player_database}},
{TAB_DECL(SESSION_BROWSER), view::session_browser}},
{TAB_DECL(STAT_EDITOR), view::stat_editor}},
},
},
},
{
tabs::SETTINGS,
{
"GUI_TAB_SETTINGS",
TAB_DECL(SETTINGS),
view::settings,
{
{tabs::LUA_SCRIPTS, {"GUI_TAB_LUA_SCRIPTS", view::lua_scripts}},
{tabs::ESP_SETTINGS, {"GUI_TAB_ESP", view::esp_settings}},
{tabs::GTA_CACHE_SETTINGS, {"GTA Cache", view::gta_cache}},
{tabs::GUI_SETTINGS, {"GUI_TAB_GUI", view::gui_settings}},
{tabs::HOTKEY_SETTINGS, {"GUI_TAB_HOTKEYS", view::hotkey_settings}},
{tabs::REACTION_SETTINGS, {"GUI_TAB_REACTIONS", view::reaction_settings}},
{tabs::PROTECTION_SETTINGS, {"GUI_TAB_PROTECTION", view::protection_settings}},
{tabs::DEBUG, {"GUI_TAB_DEBUG", nullptr}},
{TAB_DECL(LUA_SCRIPTS), view::lua_scripts}},
{TAB_DECL(ESP_SETTINGS), view::esp_settings}},
{TAB_DECL(GTA_CACHE_SETTINGS), view::gta_cache}},
{TAB_DECL(GUI_SETTINGS), view::gui_settings}},
{TAB_DECL(HOTKEY_SETTINGS), view::hotkey_settings}},
{TAB_DECL(REACTION_SETTINGS), view::reaction_settings}},
{TAB_DECL(PROTECTION_SETTINGS), view::protection_settings}},
{TAB_DECL(DEBUG), nullptr}},
},
},
},
@ -156,6 +156,9 @@ namespace big
{"", view::view_player},
},
};
// clang-format on
void remove_from_nav_internal(std::map<big::tabs, big::navigation_struct>& nav, big::tabs existing_tab_id);
public:
gui_service();
@ -171,6 +174,7 @@ namespace big
void increment_nav_size();
void reset_nav_size();
std::map<tabs, navigation_struct>& get_navigation();
void remove_from_nav(tabs existing_tab_id);
};
inline gui_service* g_gui_service{};