mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-09 09:38:19 +00:00
Merge pull request #8803 from furo321/file-picker-entities
Add a popup for picking a map for background entities setting
This commit is contained in:
commit
77790f677e
|
@ -599,7 +599,7 @@ MACRO_CONFIG_INT(ClOverlayEntities, cl_overlay_entities, 0, 0, 100, CFGFLAG_CLIE
|
||||||
MACRO_CONFIG_INT(ClShowQuads, cl_showquads, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show quads (only interesting for mappers, or if your system has extremely bad performance)")
|
MACRO_CONFIG_INT(ClShowQuads, cl_showquads, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show quads (only interesting for mappers, or if your system has extremely bad performance)")
|
||||||
MACRO_CONFIG_COL(ClBackgroundColor, cl_background_color, 128, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Background color") // 0 0 128
|
MACRO_CONFIG_COL(ClBackgroundColor, cl_background_color, 128, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Background color") // 0 0 128
|
||||||
MACRO_CONFIG_COL(ClBackgroundEntitiesColor, cl_background_entities_color, 128, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Background (entities) color") // 0 0 128
|
MACRO_CONFIG_COL(ClBackgroundEntitiesColor, cl_background_entities_color, 128, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Background (entities) color") // 0 0 128
|
||||||
MACRO_CONFIG_STR(ClBackgroundEntities, cl_background_entities, 100, "", CFGFLAG_CLIENT | CFGFLAG_SAVE, "Background (entities)")
|
MACRO_CONFIG_STR(ClBackgroundEntities, cl_background_entities, IO_MAX_PATH_LENGTH, "", CFGFLAG_CLIENT | CFGFLAG_SAVE, "Background (entities)")
|
||||||
MACRO_CONFIG_STR(ClRunOnJoin, cl_run_on_join, 100, "", CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Command to run when joining a server")
|
MACRO_CONFIG_STR(ClRunOnJoin, cl_run_on_join, 100, "", CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Command to run when joining a server")
|
||||||
|
|
||||||
// menu background map
|
// menu background map
|
||||||
|
|
|
@ -607,6 +607,36 @@ protected:
|
||||||
void RenderSettings(CUIRect MainView);
|
void RenderSettings(CUIRect MainView);
|
||||||
void RenderSettingsCustom(CUIRect MainView);
|
void RenderSettingsCustom(CUIRect MainView);
|
||||||
|
|
||||||
|
class CMapListItem
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
char m_aFilename[IO_MAX_PATH_LENGTH];
|
||||||
|
bool m_IsDirectory;
|
||||||
|
};
|
||||||
|
class CPopupMapPickerContext
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
std::vector<CMapListItem> m_vMaps;
|
||||||
|
char m_aCurrentMapFolder[IO_MAX_PATH_LENGTH] = "";
|
||||||
|
static int MapListFetchCallback(const CFsFileInfo *pInfo, int IsDir, int StorageType, void *pUser);
|
||||||
|
void MapListPopulate();
|
||||||
|
CMenus *m_pMenus;
|
||||||
|
int m_Selection;
|
||||||
|
};
|
||||||
|
|
||||||
|
static bool CompareFilenameAscending(const CMapListItem Lhs, const CMapListItem Rhs)
|
||||||
|
{
|
||||||
|
if(str_comp(Lhs.m_aFilename, "..") == 0)
|
||||||
|
return true;
|
||||||
|
if(str_comp(Rhs.m_aFilename, "..") == 0)
|
||||||
|
return false;
|
||||||
|
if(Lhs.m_IsDirectory != Rhs.m_IsDirectory)
|
||||||
|
return Lhs.m_IsDirectory;
|
||||||
|
return str_comp_filenames(Lhs.m_aFilename, Rhs.m_aFilename) < 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static CUi::EPopupMenuFunctionResult PopupMapPicker(void *pContext, CUIRect View, bool Active);
|
||||||
|
|
||||||
void SetNeedSendInfo();
|
void SetNeedSendInfo();
|
||||||
void SetActive(bool Active);
|
void SetActive(bool Active);
|
||||||
void UpdateColors();
|
void UpdateColors();
|
||||||
|
|
|
@ -3212,11 +3212,12 @@ void CMenus::RenderSettingsDDNet(CUIRect MainView)
|
||||||
static CButtonContainer s_ResetId2;
|
static CButtonContainer s_ResetId2;
|
||||||
DoLine_ColorPicker(&s_ResetId2, 25.0f, 13.0f, 5.0f, &Background, Localize("Entities background color"), &g_Config.m_ClBackgroundEntitiesColor, GreyDefault, false);
|
DoLine_ColorPicker(&s_ResetId2, 25.0f, 13.0f, 5.0f, &Background, Localize("Entities background color"), &g_Config.m_ClBackgroundEntitiesColor, GreyDefault, false);
|
||||||
|
|
||||||
CUIRect EditBox;
|
CUIRect EditBox, ReloadButton;
|
||||||
Background.HSplitTop(20.0f, &Label, &Background);
|
Background.HSplitTop(20.0f, &Label, &Background);
|
||||||
Background.HSplitTop(2.0f, nullptr, &Background);
|
Background.HSplitTop(2.0f, nullptr, &Background);
|
||||||
Label.VSplitLeft(100.0f, &Label, &EditBox);
|
Label.VSplitLeft(100.0f, &Label, &EditBox);
|
||||||
EditBox.VSplitRight(100.0f, &EditBox, &Button);
|
EditBox.VSplitRight(60.0f, &EditBox, &Button);
|
||||||
|
Button.VSplitMid(&ReloadButton, &Button, 5.0f);
|
||||||
EditBox.VSplitRight(5.0f, &EditBox, nullptr);
|
EditBox.VSplitRight(5.0f, &EditBox, nullptr);
|
||||||
|
|
||||||
Ui()->DoLabel(&Label, Localize("Map"), 14.0f, TEXTALIGN_ML);
|
Ui()->DoLabel(&Label, Localize("Map"), 14.0f, TEXTALIGN_ML);
|
||||||
|
@ -3224,12 +3225,23 @@ void CMenus::RenderSettingsDDNet(CUIRect MainView)
|
||||||
static CLineInput s_BackgroundEntitiesInput(g_Config.m_ClBackgroundEntities, sizeof(g_Config.m_ClBackgroundEntities));
|
static CLineInput s_BackgroundEntitiesInput(g_Config.m_ClBackgroundEntities, sizeof(g_Config.m_ClBackgroundEntities));
|
||||||
Ui()->DoEditBox(&s_BackgroundEntitiesInput, &EditBox, 14.0f);
|
Ui()->DoEditBox(&s_BackgroundEntitiesInput, &EditBox, 14.0f);
|
||||||
|
|
||||||
static CButtonContainer s_BackgroundEntitiesReloadButton;
|
static CButtonContainer s_BackgroundEntitiesMapPicker, s_BackgroundEntitiesReload;
|
||||||
if(DoButton_Menu(&s_BackgroundEntitiesReloadButton, Localize("Reload"), 0, &Button))
|
|
||||||
|
if(DoButton_FontIcon(&s_BackgroundEntitiesReload, FONT_ICON_ARROW_ROTATE_RIGHT, 0, &ReloadButton))
|
||||||
{
|
{
|
||||||
UpdateBackgroundEntities();
|
UpdateBackgroundEntities();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(DoButton_FontIcon(&s_BackgroundEntitiesMapPicker, FONT_ICON_FOLDER, 0, &Button))
|
||||||
|
{
|
||||||
|
static SPopupMenuId s_PopupMapPickerId;
|
||||||
|
static CPopupMapPickerContext s_PopupMapPickerContext;
|
||||||
|
s_PopupMapPickerContext.m_pMenus = this;
|
||||||
|
|
||||||
|
s_PopupMapPickerContext.MapListPopulate();
|
||||||
|
Ui()->DoPopupMenu(&s_PopupMapPickerId, Ui()->MouseX(), Ui()->MouseY(), 300.0f, 250.0f, &s_PopupMapPickerContext, PopupMapPicker);
|
||||||
|
}
|
||||||
|
|
||||||
Background.HSplitTop(20.0f, &Button, &Background);
|
Background.HSplitTop(20.0f, &Button, &Background);
|
||||||
const bool UseCurrentMap = str_comp(g_Config.m_ClBackgroundEntities, CURRENT_MAP) == 0;
|
const bool UseCurrentMap = str_comp(g_Config.m_ClBackgroundEntities, CURRENT_MAP) == 0;
|
||||||
static int s_UseCurrentMapId = 0;
|
static int s_UseCurrentMapId = 0;
|
||||||
|
@ -3320,3 +3332,104 @@ void CMenus::RenderSettingsDDNet(CUIRect MainView)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CUi::EPopupMenuFunctionResult CMenus::PopupMapPicker(void *pContext, CUIRect View, bool Active)
|
||||||
|
{
|
||||||
|
CPopupMapPickerContext *pPopupContext = static_cast<CPopupMapPickerContext *>(pContext);
|
||||||
|
CMenus *pMenus = pPopupContext->m_pMenus;
|
||||||
|
|
||||||
|
static CListBox s_ListBox;
|
||||||
|
s_ListBox.SetActive(Active);
|
||||||
|
s_ListBox.DoStart(20.0f, pPopupContext->m_vMaps.size(), 1, 1, -1, &View, false);
|
||||||
|
|
||||||
|
int MapIndex = 0;
|
||||||
|
for(auto &Map : pPopupContext->m_vMaps)
|
||||||
|
{
|
||||||
|
MapIndex++;
|
||||||
|
const CListboxItem Item = s_ListBox.DoNextItem(&Map, MapIndex == pPopupContext->m_Selection);
|
||||||
|
if(!Item.m_Visible)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
CUIRect Label, Icon;
|
||||||
|
Item.m_Rect.VSplitLeft(20.0f, &Icon, &Label);
|
||||||
|
|
||||||
|
char aLabelText[IO_MAX_PATH_LENGTH];
|
||||||
|
str_copy(aLabelText, Map.m_aFilename);
|
||||||
|
if(Map.m_IsDirectory)
|
||||||
|
str_append(aLabelText, "/", sizeof(aLabelText));
|
||||||
|
|
||||||
|
const char *pIconType;
|
||||||
|
if(!Map.m_IsDirectory)
|
||||||
|
{
|
||||||
|
pIconType = FONT_ICON_MAP;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(!str_comp(Map.m_aFilename, ".."))
|
||||||
|
pIconType = FONT_ICON_FOLDER_TREE;
|
||||||
|
else
|
||||||
|
pIconType = FONT_ICON_FOLDER;
|
||||||
|
}
|
||||||
|
|
||||||
|
pMenus->TextRender()->SetFontPreset(EFontPreset::ICON_FONT);
|
||||||
|
pMenus->TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING);
|
||||||
|
pMenus->Ui()->DoLabel(&Icon, pIconType, 12.0f, TEXTALIGN_ML);
|
||||||
|
pMenus->TextRender()->SetRenderFlags(0);
|
||||||
|
pMenus->TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT);
|
||||||
|
|
||||||
|
pMenus->Ui()->DoLabel(&Label, aLabelText, 10.0f, TEXTALIGN_ML);
|
||||||
|
}
|
||||||
|
|
||||||
|
const int NewSelected = s_ListBox.DoEnd();
|
||||||
|
pPopupContext->m_Selection = NewSelected >= 0 ? NewSelected : -1;
|
||||||
|
if(s_ListBox.WasItemSelected() || s_ListBox.WasItemActivated())
|
||||||
|
{
|
||||||
|
const CMapListItem SelectedItem = pPopupContext->m_vMaps[pPopupContext->m_Selection];
|
||||||
|
|
||||||
|
if(SelectedItem.m_IsDirectory)
|
||||||
|
{
|
||||||
|
if(!str_comp(SelectedItem.m_aFilename, ".."))
|
||||||
|
{
|
||||||
|
fs_parent_dir(pPopupContext->m_aCurrentMapFolder);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
str_append(pPopupContext->m_aCurrentMapFolder, "/", sizeof(pPopupContext->m_aCurrentMapFolder));
|
||||||
|
str_append(pPopupContext->m_aCurrentMapFolder, SelectedItem.m_aFilename, sizeof(pPopupContext->m_aCurrentMapFolder));
|
||||||
|
}
|
||||||
|
pPopupContext->MapListPopulate();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
str_format(g_Config.m_ClBackgroundEntities, sizeof(g_Config.m_ClBackgroundEntities), "%s/%s", pPopupContext->m_aCurrentMapFolder, SelectedItem.m_aFilename);
|
||||||
|
pMenus->UpdateBackgroundEntities();
|
||||||
|
return CUi::POPUP_CLOSE_CURRENT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return CUi::POPUP_KEEP_OPEN;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CMenus::CPopupMapPickerContext::MapListPopulate()
|
||||||
|
{
|
||||||
|
m_vMaps.clear();
|
||||||
|
char aTemp[IO_MAX_PATH_LENGTH];
|
||||||
|
str_format(aTemp, sizeof(aTemp), "maps/%s", m_aCurrentMapFolder);
|
||||||
|
m_pMenus->Storage()->ListDirectoryInfo(IStorage::TYPE_ALL, aTemp, MapListFetchCallback, this);
|
||||||
|
std::stable_sort(m_vMaps.begin(), m_vMaps.end(), CompareFilenameAscending);
|
||||||
|
}
|
||||||
|
|
||||||
|
int CMenus::CPopupMapPickerContext::MapListFetchCallback(const CFsFileInfo *pInfo, int IsDir, int StorageType, void *pUser)
|
||||||
|
{
|
||||||
|
CPopupMapPickerContext *pRealUser = (CPopupMapPickerContext *)pUser;
|
||||||
|
if((!IsDir && !str_endswith(pInfo->m_pName, ".map")) || !str_comp(pInfo->m_pName, ".") || (!str_comp(pInfo->m_pName, "..") && (!str_comp(pRealUser->m_aCurrentMapFolder, ""))))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
CMapListItem Item;
|
||||||
|
str_copy(Item.m_aFilename, pInfo->m_pName);
|
||||||
|
Item.m_IsDirectory = IsDir;
|
||||||
|
|
||||||
|
pRealUser->m_vMaps.emplace_back(Item);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue