OpenClonk
C4ScenarioListLoader::SubFolder Class Reference

#include <C4StartupScenSelDlg.h>

Inheritance diagram for C4ScenarioListLoader::SubFolder:
[legend]
Collaboration diagram for C4ScenarioListLoader::SubFolder:
[legend]

Public Member Functions

 SubFolder (class C4ScenarioListLoader *pLoader, Folder *pParent)
 
 ~SubFolder () override=default
 
const char * GetDefaultExtension () override
 
StdStrBuf GetTypeName () override
 
const C4ScenarioParameterDefsGetAchievementDefs () const override
 
const C4AchievementGraphicsGetAchievementGfx () const override
 
bool LoadCustomPre (C4Group &rGrp) override
 
bool LoadContents (C4ScenarioListLoader *pLoader, C4Group *pFromGrp, const StdStrBuf *psFilename, bool fLoadEx, bool fReload)
 
uint32_t GetEntryCount () const
 
bool Start () override
 
FolderGetIsFolder () override
 
EntryGetFirstEntry () const
 
void Resort ()
 
EntryFindEntryByName (const char *szFilename) const
 
bool CanOpen (StdStrBuf &sError, bool &CanHide) override
 
bool IsGrayed () override
 
StdStrBuf GetOpenText () override
 
StdStrBuf GetOpenTooltip () override
 
C4MapFolderDataGetMapData () const
 
bool Load (C4Group *pFromGrp, const StdStrBuf *psFilename, bool fLoadEx)
 
const StdStrBufGetName () const
 
const StdStrBufGetEntryFilename () const
 
const StdStrBufGetVersion () const
 
const StdStrBufGetAuthor () const
 
const C4FacetGetIconFacet () const
 
const C4FacetGetTitlePicture () const
 
const StdStrBufGetDesc () const
 
int GetIconIndex ()
 
int GetDifficulty ()
 
int GetFolderIndex ()
 
EntryGetNext () const
 
class FolderGetParent () const
 
virtual bool GetAchievement (int32_t idx, C4Facet *out_facet, const char **out_description)
 
virtual bool IsHidden ()
 
virtual bool HasMissionAccess () const
 
virtual bool HasUnregisteredAccess () const
 
virtual bool SetTitleInGroup (C4Group &rGrp, const char *szNewTitle)
 
bool RenameTo (const char *szNewName)
 
virtual bool IsScenario ()
 
virtual C4ScenarioParameterDefsGetParameterDefs ()
 
virtual C4ScenarioParametersGetParameters ()
 

Static Public Member Functions

static EntryCreateEntryForFile (const StdStrBuf &sFilename, C4ScenarioListLoader *pLoader, Folder *pParent)
 

Protected Member Functions

bool LoadCustom (C4Group &rGrp, bool fNameLoaded, bool fIconLoaded) override
 
bool DoLoadContents (C4ScenarioListLoader *pLoader, C4Group *pFromGrp, const StdStrBuf &sFilename, bool fLoadEx) override
 
void ClearChildren ()
 
void Sort ()
 

Protected Attributes

C4Folder C4F
 
bool fContentsLoaded
 
EntrypFirst
 
class C4MapFolderDatapMapData
 
class C4ScenarioListLoaderpLoader
 
EntrypNext
 
class FolderpParent
 
StdCopyStrBuf sName
 
StdCopyStrBuf sFilename
 
StdCopyStrBuf sDesc
 
StdCopyStrBuf sVersion
 
StdCopyStrBuf sAuthor
 
C4FacetSurface fctIcon
 
C4FacetSurface fctTitle
 
bool fBaseLoaded
 
bool fExLoaded
 
int iIconIndex
 
int iDifficulty
 
int iFolderIndex
 

Detailed Description

Definition at line 190 of file C4StartupScenSelDlg.h.

Constructor & Destructor Documentation

◆ SubFolder()

C4ScenarioListLoader::SubFolder::SubFolder ( class C4ScenarioListLoader pLoader,
Folder pParent 
)
inline

Definition at line 197 of file C4StartupScenSelDlg.h.

◆ ~SubFolder()

C4ScenarioListLoader::SubFolder::~SubFolder ( )
overridedefault

Member Function Documentation

◆ CanOpen()

bool C4ScenarioListLoader::Folder::CanOpen ( StdStrBuf sError,
bool &  CanHide 
)
inlineoverridevirtualinherited

Reimplemented from C4ScenarioListLoader::Entry.

Definition at line 179 of file C4StartupScenSelDlg.h.

179 { return true; } // can always open folders

◆ ClearChildren()

void C4ScenarioListLoader::Folder::ClearChildren ( )
protectedinherited

Definition at line 922 of file C4StartupScenSelDlg.cpp.

923 {
924  // folder deletion: del all the tree non-recursively
925  Folder *pDelFolder = this, *pCheckFolder;
926  for (;;)
927  {
928  // delete all children as long as they are not folders
929  Entry *pChild;
930  while ((pChild = pDelFolder->pFirst))
931  if ((pCheckFolder = pChild->GetIsFolder()))
932  // child entry if folder: Continue delete in there
933  pDelFolder = pCheckFolder;
934  else
935  // regular child entry: del it
936  // destructor of child will remove it from list
937  delete pChild;
938  // this emptied: Done!
939  if (pDelFolder == this) break;
940  // deepest child recursion reached: Travel up folders
941  pDelFolder = (pCheckFolder = pDelFolder)->pParent;
942  assert(pDelFolder);
943  delete pCheckFolder;
944  }
945 }

References C4ScenarioListLoader::Entry::GetIsFolder(), and C4ScenarioListLoader::Folder::pFirst.

Here is the call graph for this function:

◆ CreateEntryForFile()

C4ScenarioListLoader::Entry * C4ScenarioListLoader::Entry::CreateEntryForFile ( const StdStrBuf sFilename,
C4ScenarioListLoader pLoader,
Folder pParent 
)
staticinherited

Definition at line 549 of file C4StartupScenSelDlg.cpp.

550 {
551  // determine entry type by file type
552  const char *szFilename = sFilename.getData();
553  if (!szFilename || !*szFilename) return nullptr;
554  if (WildcardMatch(C4CFN_ScenarioFiles, sFilename.getData())) return new Scenario(pLoader, pParent);
555  if (WildcardMatch(C4CFN_FolderFiles, sFilename.getData())) return new SubFolder(pLoader, pParent);
556  // regular, open folder (C4Group-packed folders without extensions are not regarded, because they could contain anything!)
557  const char *szExt = GetExtension(szFilename);
558  if ((!szExt || !*szExt) && DirectoryExists(sFilename.getData()))
559  {
560  // do not open folders in the mod directory (and the dir itself - thus match minus the separator),
561  // as contained files will be discovered anyway
562  const char * modsDirectoryPrefix = Config.General.ModsDataPath;
563  if (std::strncmp(szFilename, modsDirectoryPrefix, std::strlen(modsDirectoryPrefix) - 1) == 0)
564  return nullptr;
565  // open folders only if they contain a scenario or folder
566  if (DirContainsScenarios(szFilename))
567  return new RegularFolder(pLoader, pParent);
568  }
569  // type not recognized
570  return nullptr;
571 }
#define C4CFN_ScenarioFiles
Definition: C4Components.h:175
#define C4CFN_FolderFiles
Definition: C4Components.h:176
C4Config Config
Definition: C4Config.cpp:930
bool DirContainsScenarios(const char *szDir)
bool DirectoryExists(const char *szFilename)
Definition: StdFile.cpp:708
char * GetExtension(char *szFilename)
Definition: StdFile.cpp:118
bool WildcardMatch(const char *szWildcard, const char *szString)
Definition: StdFile.cpp:396
char ModsDataPath[CFG_MaxString+1]
Definition: C4Config.h:57
C4ConfigGeneral General
Definition: C4Config.h:255
StdCopyStrBuf sFilename
const char * getData() const
Definition: StdBuf.h:442

References C4CFN_FolderFiles, C4CFN_ScenarioFiles, Config, DirContainsScenarios(), DirectoryExists(), C4Config::General, StdStrBuf::getData(), GetExtension(), C4ConfigGeneral::ModsDataPath, and WildcardMatch().

Referenced by DoLoadContents(), and C4ScenarioListLoader::RegularFolder::DoLoadContents().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoLoadContents()

bool C4ScenarioListLoader::SubFolder::DoLoadContents ( C4ScenarioListLoader pLoader,
C4Group pFromGrp,
const StdStrBuf sFilename,
bool  fLoadEx 
)
overrideprotectedvirtual

Implements C4ScenarioListLoader::Folder.

Definition at line 1014 of file C4StartupScenSelDlg.cpp.

1015 {
1016  assert(pLoader);
1017  // clear any previous
1018  ClearChildren();
1019  // group specified: Load as child
1020  C4Group Group;
1021  if (pFromGrp)
1022  {
1023  if (!Group.OpenAsChild(pFromGrp, sFilename.getData())) return false;
1024  }
1025  else
1026  // no parent group: Direct load from filename
1027  if (!Group.Open(sFilename.getData())) return false;
1028  // Load achievement data contained scenarios can fall back to
1029  C4LangStringTable FolderLangStringTable;
1031  AchievementDefs.Load(Group, &FolderLangStringTable);
1032  AchievementGfx.Init(Group);
1033  // get number of entries, to estimate progress
1034  const char *szC4CFN_ScenarioFiles = C4CFN_ScenarioFiles; // assign values for constant comparison
1035  const char *szSearchMask; int32_t iEntryCount=0;
1036  for (szSearchMask = szC4CFN_ScenarioFiles; szSearchMask;)
1037  {
1038  Group.ResetSearch();
1039  while (Group.FindNextEntry(szSearchMask)) ++iEntryCount;
1040  // next search mask
1041  if (szSearchMask == szC4CFN_ScenarioFiles)
1042  szSearchMask = C4CFN_FolderFiles;
1043  else
1044  szSearchMask = nullptr;
1045  }
1046  // initial progress estimate
1047  if (!pLoader->DoProcessCallback(0, iEntryCount, nullptr)) return false;
1048  // iterate through group contents
1049  char ChildFilename[_MAX_FNAME_LEN]; StdStrBuf sChildFilename; int32_t iLoadCount=0;
1050  for (szSearchMask = szC4CFN_ScenarioFiles; szSearchMask;)
1051  {
1052  Group.ResetSearch();
1053  while (Group.FindNextEntry(szSearchMask, ChildFilename))
1054  {
1055  // mark progress
1056  if (!pLoader->DoProcessCallback(iLoadCount, iEntryCount, ChildFilename)) return false;
1057  sChildFilename.Ref(ChildFilename);
1058  // okay; create this item
1059  Entry *pNewEntry = Entry::CreateEntryForFile(sChildFilename, pLoader, this);
1060  if (pNewEntry)
1061  {
1062  // ...and load it
1063  if (!pNewEntry->Load(&Group, &sChildFilename, fLoadEx))
1064  {
1065  DebugLogF(R"(Error loading entry "%s" in SubFolder "%s"!)", sChildFilename.getData(), Group.GetFullName().getData());
1066  delete pNewEntry;
1067  }
1068  }
1069  ++iLoadCount;
1070  }
1071  // next search mask
1072  if (szSearchMask == szC4CFN_ScenarioFiles)
1073  szSearchMask = C4CFN_FolderFiles;
1074  else
1075  szSearchMask = nullptr;
1076  }
1077  // load map folder data
1078  if (Group.FindEntry(C4CFN_MapFolderData))
1079  {
1080  pMapData = new C4MapFolderData();
1081  if (!pMapData->Load(Group, this))
1082  {
1083  // load error :(
1084  delete pMapData;
1085  pMapData = nullptr;
1086  }
1087  }
1088  // done, success
1089  fContentsLoaded = true;
1090  return true;
1091 }
#define C4CFN_ScriptStringTbl
Definition: C4Components.h:68
#define C4CFN_MapFolderData
Definition: C4Components.h:135
bool DebugLogF(const char *strMessage ...)
Definition: C4Log.cpp:290
#define _MAX_FNAME_LEN
bool Init(C4Group &File)
char LanguageEx[CFG_MaxString+1]
Definition: C4Config.h:38
bool FindNextEntry(const char *wildcard, StdStrBuf *filename=nullptr, size_t *size=nullptr, bool start_at_filename=false)
Definition: C4Group.cpp:2217
StdStrBuf GetFullName() const
Definition: C4Group.cpp:2638
bool OpenAsChild(C4Group *mother, const char *entry_name, bool is_exclusive=false, bool do_create=false)
Definition: C4Group.cpp:1952
void ResetSearch(bool reload_contents=false)
Definition: C4Group.cpp:1316
bool FindEntry(const char *wildcard, StdStrBuf *filename=nullptr, size_t *size=nullptr)
Definition: C4Group.cpp:2211
bool Open(const char *group_name, bool do_create=false)
Definition: C4Group.cpp:660
static bool LoadComponentHost(C4ComponentHost *host, C4Group &hGroup, const char *szFilename, const char *szLanguage)
Definition: C4Language.cpp:232
bool Load(C4Group &hGroup, C4ScenarioListLoader::Folder *pScenLoaderFolder)
static Entry * CreateEntryForFile(const StdStrBuf &sFilename, C4ScenarioListLoader *pLoader, Folder *pParent)
class C4MapFolderData * pMapData
bool DoProcessCallback(int32_t iProgress, int32_t iMaxProgress, const char *current_load_info)
bool Load(C4Group &hGroup, class C4LangStringTable *pLang)
void Ref(const char *pnData)
Definition: StdBuf.h:455

References _MAX_FNAME_LEN, C4CFN_FolderFiles, C4CFN_MapFolderData, C4CFN_ScenarioFiles, C4CFN_ScriptStringTbl, Config, C4ScenarioListLoader::Entry::CreateEntryForFile(), DebugLogF(), C4ScenarioListLoader::DoProcessCallback(), C4Group::FindEntry(), C4Group::FindNextEntry(), C4Config::General, StdStrBuf::getData(), C4Group::GetFullName(), C4ConfigGeneral::LanguageEx, C4ScenarioListLoader::Entry::Load(), C4Language::LoadComponentHost(), C4Group::Open(), C4Group::OpenAsChild(), StdStrBuf::Ref(), and C4Group::ResetSearch().

Here is the call graph for this function:

◆ FindEntryByName()

C4ScenarioListLoader::Entry * C4ScenarioListLoader::Folder::FindEntryByName ( const char *  szFilename) const
inherited

Definition at line 962 of file C4StartupScenSelDlg.cpp.

963 {
964  // do a case-insensitive filename comparison
965  for (Entry *pEntry = pFirst; pEntry; pEntry = pEntry->GetNext())
966  if (SEqualNoCase(szFilename, GetFilename(pEntry->GetEntryFilename().getData())))
967  return pEntry;
968  // nothing found
969  return nullptr;
970 }
bool SEqualNoCase(const char *szStr1, const char *szStr2, int iLen)
Definition: Standard.cpp:213
char * GetFilename(char *szPath)
Definition: StdFile.cpp:42
Entry * GetNext() const

References GetFilename(), C4ScenarioListLoader::Entry::GetNext(), and SEqualNoCase().

Referenced by C4MapFolderData::Load().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetAchievement()

virtual bool C4ScenarioListLoader::Entry::GetAchievement ( int32_t  idx,
C4Facet out_facet,
const char **  out_description 
)
inlinevirtualinherited

Reimplemented in C4ScenarioListLoader::Scenario.

Definition at line 87 of file C4StartupScenSelDlg.h.

87 { return false; } // return true and fill output parameters if player got the indexed achievement

Referenced by C4StartupScenSelDlg::ScenListItem::ScenListItem().

Here is the caller graph for this function:

◆ GetAchievementDefs()

const C4ScenarioParameterDefs* C4ScenarioListLoader::SubFolder::GetAchievementDefs ( ) const
inlineoverridevirtual

Reimplemented from C4ScenarioListLoader::Folder.

Definition at line 204 of file C4StartupScenSelDlg.h.

204 { return &AchievementDefs; }

◆ GetAchievementGfx()

const C4AchievementGraphics* C4ScenarioListLoader::SubFolder::GetAchievementGfx ( ) const
inlineoverridevirtual

Reimplemented from C4ScenarioListLoader::Folder.

Definition at line 205 of file C4StartupScenSelDlg.h.

205 { return &AchievementGfx; }

◆ GetAuthor()

const StdStrBuf& C4ScenarioListLoader::Entry::GetAuthor ( ) const
inlineinherited

Definition at line 77 of file C4StartupScenSelDlg.h.

77 { return sAuthor; }
StdCopyStrBuf sAuthor

References C4ScenarioListLoader::Entry::sAuthor.

◆ GetDefaultExtension()

const char* C4ScenarioListLoader::SubFolder::GetDefaultExtension ( )
inlineoverridevirtual

Reimplemented from C4ScenarioListLoader::Entry.

Definition at line 200 of file C4StartupScenSelDlg.h.

200 { return "ocf"; }

◆ GetDesc()

const StdStrBuf& C4ScenarioListLoader::Entry::GetDesc ( ) const
inlineinherited

Definition at line 80 of file C4StartupScenSelDlg.h.

80 { return sDesc; }
StdCopyStrBuf sDesc

References C4ScenarioListLoader::Entry::sDesc.

◆ GetDifficulty()

int C4ScenarioListLoader::Entry::GetDifficulty ( )
inlineinherited

Definition at line 82 of file C4StartupScenSelDlg.h.

References C4ScenarioListLoader::Entry::iDifficulty.

Referenced by EntrySortFunc().

Here is the caller graph for this function:

◆ GetEntryCount()

uint32_t C4ScenarioListLoader::Folder::GetEntryCount ( ) const
inherited

Definition at line 901 of file C4StartupScenSelDlg.cpp.

902 {
903  uint32_t iCount = 0;
904  for (Entry *i = pFirst; i; i = i->pNext) ++iCount;
905  return iCount;
906 }
Entry * pNext

References C4ScenarioListLoader::Entry::pNext.

◆ GetEntryFilename()

const StdStrBuf& C4ScenarioListLoader::Entry::GetEntryFilename ( ) const
inlineinherited

Definition at line 75 of file C4StartupScenSelDlg.h.

75 { return sFilename; }

References C4ScenarioListLoader::Entry::sFilename.

Referenced by C4StartupScenSelDlg::DeleteConfirm(), C4StartupScenSelDlg::KeyDelete(), and C4StartupScenSelDlg::StartScenario().

Here is the caller graph for this function:

◆ GetFirstEntry()

Entry* C4ScenarioListLoader::Folder::GetFirstEntry ( ) const
inlineinherited

Definition at line 175 of file C4StartupScenSelDlg.h.

175 { return pFirst; }

References C4ScenarioListLoader::Folder::pFirst.

Referenced by C4ScenarioListLoader::GetFirstEntry().

Here is the caller graph for this function:

◆ GetFolderIndex()

int C4ScenarioListLoader::Entry::GetFolderIndex ( )
inlineinherited

Definition at line 83 of file C4StartupScenSelDlg.h.

References C4ScenarioListLoader::Entry::iFolderIndex.

Referenced by EntrySortFunc().

Here is the caller graph for this function:

◆ GetIconFacet()

const C4Facet& C4ScenarioListLoader::Entry::GetIconFacet ( ) const
inlineinherited

Definition at line 78 of file C4StartupScenSelDlg.h.

78 { return fctIcon; }
C4FacetSurface fctIcon

References C4ScenarioListLoader::Entry::fctIcon.

Referenced by C4StartupScenSelDlg::ScenListItem::ScenListItem().

Here is the caller graph for this function:

◆ GetIconIndex()

int C4ScenarioListLoader::Entry::GetIconIndex ( )
inlineinherited

Definition at line 81 of file C4StartupScenSelDlg.h.

References C4ScenarioListLoader::Entry::iIconIndex.

Referenced by EntrySortFunc().

Here is the caller graph for this function:

◆ GetIsFolder()

Folder* C4ScenarioListLoader::Folder::GetIsFolder ( )
inlineoverridevirtualinherited

Reimplemented from C4ScenarioListLoader::Entry.

Definition at line 174 of file C4StartupScenSelDlg.h.

174 { return this; } // this is a folder

Referenced by EntrySortFunc().

Here is the caller graph for this function:

◆ GetMapData()

C4MapFolderData* C4ScenarioListLoader::Folder::GetMapData ( ) const
inlineinherited

Definition at line 183 of file C4StartupScenSelDlg.h.

183 { return pMapData; }

References C4ScenarioListLoader::Folder::pMapData.

◆ GetName()

const StdStrBuf& C4ScenarioListLoader::Entry::GetName ( ) const
inlineinherited

Definition at line 74 of file C4StartupScenSelDlg.h.

74 { return sName; }
StdCopyStrBuf sName

References C4ScenarioListLoader::Entry::sName.

Referenced by EntrySortFunc(), C4StartupScenSelDlg::KeyDelete(), and C4StartupScenSelDlg::ScenListItem::ScenListItem().

Here is the caller graph for this function:

◆ GetNext()

Entry* C4ScenarioListLoader::Entry::GetNext ( ) const
inlineinherited

Definition at line 84 of file C4StartupScenSelDlg.h.

84 { return pNext; }

References C4ScenarioListLoader::Entry::pNext.

Referenced by C4ScenarioListLoader::Folder::FindEntryByName().

Here is the caller graph for this function:

◆ GetOpenText()

StdStrBuf C4ScenarioListLoader::Folder::GetOpenText ( )
overridevirtualinherited

Implements C4ScenarioListLoader::Entry.

Definition at line 972 of file C4StartupScenSelDlg.cpp.

973 {
974  return StdCopyStrBuf(LoadResStr("IDS_BTN_OPEN"));
975 }
const char * LoadResStr(const char *id)
Definition: C4Language.h:83

References LoadResStr().

Here is the call graph for this function:

◆ GetOpenTooltip()

StdStrBuf C4ScenarioListLoader::Folder::GetOpenTooltip ( )
overridevirtualinherited

Implements C4ScenarioListLoader::Entry.

Definition at line 977 of file C4StartupScenSelDlg.cpp.

978 {
979  return StdCopyStrBuf(LoadResStr("IDS_DLGTIP_SCENSELNEXT"));
980 }

References LoadResStr().

Here is the call graph for this function:

◆ GetParameterDefs()

virtual C4ScenarioParameterDefs* C4ScenarioListLoader::Entry::GetParameterDefs ( )
inlinevirtualinherited

Reimplemented in C4ScenarioListLoader::Scenario.

Definition at line 104 of file C4StartupScenSelDlg.h.

104 { return nullptr; }

◆ GetParameters()

virtual C4ScenarioParameters* C4ScenarioListLoader::Entry::GetParameters ( )
inlinevirtualinherited

Reimplemented in C4ScenarioListLoader::Scenario.

Definition at line 105 of file C4StartupScenSelDlg.h.

105 { return nullptr; }

◆ GetParent()

class Folder* C4ScenarioListLoader::Entry::GetParent ( ) const
inlineinherited

Definition at line 85 of file C4StartupScenSelDlg.h.

85 { return pParent; }

References C4ScenarioListLoader::Entry::pParent.

Referenced by C4ScenarioListLoader::FolderBack().

Here is the caller graph for this function:

◆ GetTitlePicture()

const C4Facet& C4ScenarioListLoader::Entry::GetTitlePicture ( ) const
inlineinherited

Definition at line 79 of file C4StartupScenSelDlg.h.

79 { return fctTitle; }
C4FacetSurface fctTitle

References C4ScenarioListLoader::Entry::fctTitle.

◆ GetTypeName()

StdStrBuf C4ScenarioListLoader::SubFolder::GetTypeName ( )
inlineoverridevirtual

Implements C4ScenarioListLoader::Entry.

Definition at line 202 of file C4StartupScenSelDlg.h.

202 { return StdCopyStrBuf(LoadResStr("IDS_TYPE_FOLDER"), true); }

References LoadResStr().

Here is the call graph for this function:

◆ GetVersion()

const StdStrBuf& C4ScenarioListLoader::Entry::GetVersion ( ) const
inlineinherited

Definition at line 76 of file C4StartupScenSelDlg.h.

76 { return sVersion; }
StdCopyStrBuf sVersion

References C4ScenarioListLoader::Entry::sVersion.

◆ HasMissionAccess()

virtual bool C4ScenarioListLoader::Entry::HasMissionAccess ( ) const
inlinevirtualinherited

Reimplemented in C4ScenarioListLoader::Scenario.

Definition at line 94 of file C4StartupScenSelDlg.h.

94 { return true; }

◆ HasUnregisteredAccess()

virtual bool C4ScenarioListLoader::Entry::HasUnregisteredAccess ( ) const
inlinevirtualinherited

Definition at line 95 of file C4StartupScenSelDlg.h.

95 { return false; }

◆ IsGrayed()

bool C4ScenarioListLoader::Folder::IsGrayed ( )
overridevirtualinherited

Reimplemented from C4ScenarioListLoader::Entry.

Definition at line 982 of file C4StartupScenSelDlg.cpp.

983 {
984  return false;
985 }

◆ IsHidden()

virtual bool C4ScenarioListLoader::Entry::IsHidden ( )
inlinevirtualinherited

Reimplemented in C4ScenarioListLoader::Scenario.

Definition at line 93 of file C4StartupScenSelDlg.h.

93 { return false; } // condition for hiding element completely

◆ IsScenario()

virtual bool C4ScenarioListLoader::Entry::IsScenario ( )
inlinevirtualinherited

Reimplemented in C4ScenarioListLoader::Scenario.

Definition at line 102 of file C4StartupScenSelDlg.h.

102 { return false; }

◆ Load()

bool C4ScenarioListLoader::Entry::Load ( C4Group pFromGrp,
const StdStrBuf psFilename,
bool  fLoadEx 
)
inherited

Definition at line 431 of file C4StartupScenSelDlg.cpp.

432 {
433  // nothing to do if already loaded
434  if (fBaseLoaded && (fExLoaded || !fLoadEx)) return true;
435  C4Group Group;
436  // group specified: Load as child
437  if (pFromGrp)
438  {
439  assert(psFilename);
440  if (!Group.OpenAsChild(pFromGrp, psFilename->getData())) return false;
441  // set FN by complete entry name
442  this->sFilename.Take(Group.GetFullName());
443  }
444  else
445  {
446  // set FN by complete entry name
447  if (psFilename) this->sFilename.Copy(*psFilename);
448  // no parent group: Direct load from filename
449  if (!Group.Open(sFilename.getData())) return false;
450  }
451  // okay; load standard stuff from group
452  bool fNameLoaded=false, fIconLoaded=false;
453  if (fBaseLoaded)
454  {
455  fNameLoaded = fIconLoaded = true;
456  }
457  else
458  {
459  // Set default name as filename without extension
461  char *szBuf = sName.GrabPointer();
462  RemoveExtension(szBuf);
463  sName.Take(szBuf);
464  // load entry specific stuff that's in the front of the group
465  if (!LoadCustomPre(Group))
466  return false;
467  // Load entry name
468  C4ComponentHost DefNames;
471  fNameLoaded = true;
472  // load entry icon
473  if (Group.FindEntry(C4CFN_IconPNG) && fctIcon.Load(Group, C4CFN_IconPNG, C4FCT_Full, C4FCT_Full, false, 0))
474  fIconLoaded = true;
475  else
476  {
477  C4FacetSurface fctTemp;
478  if (Group.FindEntry(C4CFN_ScenarioIcon) && fctTemp.Load(Group, C4CFN_ScenarioIcon, C4FCT_Full, C4FCT_Full, true, 0))
479  {
480  // old style icon: Blit it on a pieace of paper
481  fctTemp.Surface->Lock();
482  for (int y=0; y<fctTemp.Hgt; ++y)
483  for (int x=0; x<fctTemp.Wdt; ++x)
484  {
485  uint32_t dwPix = fctTemp.Surface->GetPixDw(x,y, false);
486  // transparency has some tolerance...
487  if (Inside<uint8_t>(dwPix & 0xff, 0xb8, 0xff))
488  if (Inside<uint8_t>((dwPix>>0x08) & 0xff, 0x00, 0x0f))
489  if (Inside<uint8_t>((dwPix>>0x10) & 0xff, 0xb8, 0xff))
490  fctTemp.Surface->SetPixDw(x,y,0x00ffffff);
491  }
492  fctTemp.Surface->Unlock();
493  int iIconSize = C4Startup::Get()->Graphics.fctScenSelIcons.Hgt;
494  fctIcon.Create(iIconSize, iIconSize, C4FCT_Full, C4FCT_Full);
496  fctTemp.Draw(fctIcon.Surface, (fctIcon.Wdt-fctTemp.Wdt)/2, (fctIcon.Hgt-fctTemp.Hgt)/2);
497  fctTemp.Clear();
498  fIconLoaded = true;
499  }
500  }
501  // load any entryx-type-specific custom data (e.g. fallbacks for scenario title, and icon)
502  if (!LoadCustom(Group, fNameLoaded, fIconLoaded)) return false;
503  fBaseLoaded = true;
504  }
505  // load extended stuff: title picture
506  if (fLoadEx && !fExLoaded)
507  {
508  // load desc
509  C4ComponentHost DefDesc;
511  {
512  sDesc.Copy(DefDesc.GetData());
513  }
514  // load title
516  fExLoaded = true;
517  // load version
519  }
520  // done, success
521  return true;
522 }
#define C4CFN_ScenarioTitle
Definition: C4Components.h:84
#define C4CFN_ScenarioIcon
Definition: C4Components.h:85
#define C4CFN_ScenarioDesc
Definition: C4Components.h:88
#define C4CFN_Title
Definition: C4Components.h:82
#define C4CFN_Version
Definition: C4Components.h:72
#define C4CFN_IconPNG
Definition: C4Components.h:86
const int C4FCT_Full
Definition: C4FacetEx.h:26
const int32_t C4StartupScenSel_DefaultIcon_OldIconBG
void RemoveExtension(char *szFilename)
Definition: StdFile.cpp:303
const char * GetData() const
bool GetLanguageString(const char *szLanguage, StdStrBuf &rTarget)
C4Surface * Surface
Definition: C4Facet.h:117
C4Facet GetPhase(int iPhaseX=0, int iPhaseY=0)
Definition: C4Facet.cpp:59
float Hgt
Definition: C4Facet.h:118
float Wdt
Definition: C4Facet.h:118
void Draw(C4Facet &cgo, bool fAspect=true, int32_t iPhaseX=0, int32_t iPhaseY=0, bool fTransparent=true)
Definition: C4Facet.cpp:154
bool Load(C4Group &hGroup, const char *szName, int iWdt, int iHgt, bool fNoErrIfNotFound, int iFlags)
Definition: C4FacetEx.cpp:84
bool Create(int iWdt, int iHgt, int iWdt2=C4FCT_Full, int iHgt2=C4FCT_Full)
Definition: C4FacetEx.cpp:54
void Clear()
Definition: C4FacetEx.h:44
bool LoadEntryString(const char *entry_name, StdStrBuf *buffer)
Definition: C4Group.cpp:2430
bool fExLoaded
virtual bool LoadCustom(C4Group &rGrp, bool fNameLoaded, bool fIconLoaded)
bool fBaseLoaded
virtual bool LoadCustomPre(C4Group &rGrp)
C4FacetID fctScenSelIcons
Definition: C4Startup.h:73
static C4Startup * Get()
Definition: C4Startup.h:147
C4StartupGraphics Graphics
Definition: C4Startup.h:112
bool SetPixDw(int iX, int iY, DWORD dwCol)
Definition: C4Surface.cpp:576
DWORD GetPixDw(int iX, int iY, bool fApplyModulation)
Definition: C4Surface.cpp:491
bool Unlock()
Definition: C4Surface.cpp:464
bool Lock()
Definition: C4Surface.cpp:453
void Copy()
Definition: StdBuf.h:467
void Take(char *pnData)
Definition: StdBuf.h:457
char * GrabPointer()
Definition: StdBuf.h:459

References C4CFN_IconPNG, C4CFN_ScenarioDesc, C4CFN_ScenarioIcon, C4CFN_ScenarioTitle, C4CFN_Title, C4CFN_Version, C4FCT_Full, C4StartupScenSel_DefaultIcon_OldIconBG, C4FacetSurface::Clear(), Config, C4Facet::Draw(), C4StartupGraphics::fctScenSelIcons, C4Group::FindEntry(), C4Config::General, C4Startup::Get(), C4ComponentHost::GetData(), StdStrBuf::getData(), GetFilename(), C4Group::GetFullName(), C4ComponentHost::GetLanguageString(), C4Facet::GetPhase(), C4Surface::GetPixDw(), C4Startup::Graphics, C4Facet::Hgt, C4ConfigGeneral::LanguageEx, C4ComponentHost::Load(), C4FacetSurface::Load(), C4Language::LoadComponentHost(), C4Group::LoadEntryString(), C4Surface::Lock(), C4Group::Open(), C4Group::OpenAsChild(), RemoveExtension(), C4Surface::SetPixDw(), C4Facet::Surface, C4Surface::Unlock(), and C4Facet::Wdt.

Referenced by DoLoadContents(), C4ScenarioListLoader::RegularFolder::DoLoadContents(), and C4ScenarioListLoader::LoadExtended().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ LoadContents()

bool C4ScenarioListLoader::Folder::LoadContents ( C4ScenarioListLoader pLoader,
C4Group pFromGrp,
const StdStrBuf psFilename,
bool  fLoadEx,
bool  fReload 
)
inherited

Definition at line 947 of file C4StartupScenSelDlg.cpp.

948 {
949  // contents already loaded?
950  if (fContentsLoaded && !fReload) return true;
951  // clear previous
952  if (pMapData) { delete pMapData; pMapData = nullptr; }
953  // if filename is not given, assume it's been loaded in this entry
954  if (!psFilename) psFilename = &this->sFilename; else this->sFilename = *psFilename;
955  // nothing loaded: Load now
956  if (!DoLoadContents(pLoader, pFromGrp, *psFilename, fLoadEx)) return false;
957  // sort loaded stuff by name
958  Sort();
959  return true;
960 }
virtual bool DoLoadContents(C4ScenarioListLoader *pLoader, C4Group *pFromGrp, const StdStrBuf &sFilename, bool fLoadEx)=0

Referenced by C4ScenarioListLoader::Load().

Here is the caller graph for this function:

◆ LoadCustom()

bool C4ScenarioListLoader::SubFolder::LoadCustom ( C4Group rGrp,
bool  fNameLoaded,
bool  fIconLoaded 
)
overrideprotectedvirtual

Reimplemented from C4ScenarioListLoader::Entry.

Definition at line 1000 of file C4StartupScenSelDlg.cpp.

1001 {
1002  // default icon fallback
1003  if (!fIconLoaded)
1004  {
1007  fctIcon.Set(C4Startup::Get()->Graphics.fctScenSelIcons.GetSection(iIconIndex));
1008  }
1009  // folder index
1011  return true;
1012 }
#define C4CFN_Savegames
Definition: C4Components.h:35
const int32_t C4StartupScenSel_DefaultIcon_Folder
const int32_t C4StartupScenSel_DefaultIcon_SavegamesFolder
void Set(const C4Facet &cpy)
Definition: C4FacetEx.h:46
int32_t Index
Definition: C4Folder.h:25
C4FolderHead Head
Definition: C4Folder.h:36

References C4CFN_Savegames, C4StartupScenSel_DefaultIcon_Folder, C4StartupScenSel_DefaultIcon_SavegamesFolder, C4Startup::Get(), GetFilename(), and WildcardMatch().

Here is the call graph for this function:

◆ LoadCustomPre()

bool C4ScenarioListLoader::Folder::LoadCustomPre ( C4Group rGrp)
overridevirtualinherited

Reimplemented from C4ScenarioListLoader::Entry.

Definition at line 987 of file C4StartupScenSelDlg.cpp.

988 {
989  // load folder core if available
990  StdStrBuf sFileContents;
991  if (rGrp.LoadEntryString(C4CFN_FolderCore, &sFileContents))
992  if (!CompileFromBuf_LogWarn<StdCompilerINIRead>(C4F, sFileContents, (rGrp.GetFullName() + DirSep C4CFN_FolderCore).getData()))
993  return false;
994  return true;
995 }
#define C4CFN_FolderCore
Definition: C4Components.h:44
#define DirSep

References C4CFN_FolderCore, DirSep, StdStrBuf::getData(), C4Group::GetFullName(), and C4Group::LoadEntryString().

Here is the call graph for this function:

◆ RenameTo()

bool C4ScenarioListLoader::Entry::RenameTo ( const char *  szNewName)
inherited

Definition at line 573 of file C4StartupScenSelDlg.cpp.

574 {
575  // change name+filename
576  // some name sanity validation
577  if (!szNewName || !*szNewName) return false;
578  if (SEqual(szNewName, sName.getData())) return true;
579  char fn[_MAX_PATH_LEN];
580  SCopy(szNewName, fn, _MAX_PATH);
581  // generate new file name
583  if (!*fn) return false;
584  const char *szExt = GetDefaultExtension();
585  if (szExt) { SAppend(".", fn, _MAX_PATH); SAppend(szExt, fn, _MAX_PATH); }
586  char fullfn[_MAX_PATH_LEN];
587  SCopy(sFilename.getData(), fullfn, _MAX_PATH);
588  char *fullfn_fn = GetFilename(fullfn);
589  SCopy(fn, fullfn_fn, _MAX_PATH - (fullfn_fn - fullfn));
590  StdCopyStrBuf strErr(LoadResStr("IDS_FAIL_RENAME"));
591  // check if a rename is due
592  if (!ItemIdentical(sFilename.getData(), fullfn))
593  {
594  // check for duplicate filename
595  if (ItemExists(fullfn))
596  {
597  StdStrBuf sMsg; sMsg.Format(LoadResStr("IDS_ERR_FILEEXISTS"), fullfn);
599  return false;
600  }
601  // OK; then rename
602  if (!C4Group_MoveItem(sFilename.getData(), fullfn, true))
603  {
604  StdStrBuf sMsg; sMsg.Format(LoadResStr("IDS_ERR_RENAMEFILE"), sFilename.getData(), fullfn);
606  return false;
607  }
608  sFilename.Copy(fullfn);
609  }
610  // update real name in group, if this is a group
611  if (C4Group_IsGroup(fullfn))
612  {
613  C4Group Grp;
614  if (!Grp.Open(fullfn))
615  {
616  StdStrBuf sMsg; sMsg.Format(LoadResStr("IDS_ERR_OPENFILE"), sFilename.getData(), Grp.GetError());
618  return false;
619  }
620  if (!Grp.Delete(C4CFN_Title))
621  {
622  StdStrBuf sMsg; sMsg.Format(LoadResStr("IDS_ERR_DELOLDTITLE"), sFilename.getData(), Grp.GetError());
624  return false;
625  }
626  if (!SetTitleInGroup(Grp, szNewName)) return false;
627  if (!Grp.Close())
628  {
629  StdStrBuf sMsg; sMsg.Format(LoadResStr("IDS_ERR_WRITENEWTITLE"), sFilename.getData(), Grp.GetError());
631  return false;
632  }
633  }
634  // update title
635  sName.Copy(szNewName);
636  // done
637  return true;
638 }
bool C4Group_MoveItem(const char *source, const char *target, bool no_sorting)
Definition: C4Group.cpp:182
bool C4Group_IsGroup(const char *filename)
Definition: C4Group.cpp:104
C4GUIScreen * pGUI
Definition: C4Gui.cpp:1191
#define _MAX_PATH
#define _MAX_PATH_LEN
void SCopy(const char *szSource, char *sTarget, size_t iMaxL)
Definition: Standard.cpp:152
void SAppend(const char *szSource, char *szTarget, int iMaxL)
Definition: Standard.cpp:263
bool SEqual(const char *szStr1, const char *szStr2)
Definition: Standard.h:93
bool ItemIdentical(const char *szFilename1, const char *szFilename2)
Definition: StdFile.cpp:879
void MakeFilenameFromTitle(char *szTitle)
Definition: StdFile.cpp:426
bool ItemExists(const char *szItemName)
Definition: StdFile.h:75
bool ShowMessageModal(const char *szMessage, const char *szCaption, DWORD dwButtons, Icons icoIcon, int32_t *piConfigDontShowAgainSetting=nullptr)
const char * GetError()
Definition: C4Group.cpp:650
bool Close()
Definition: C4Group.cpp:971
bool Delete(const char *files, bool recursive=false)
Definition: C4Group.cpp:1645
virtual const char * GetDefaultExtension()
virtual bool SetTitleInGroup(C4Group &rGrp, const char *szNewTitle)
void Format(const char *szFmt,...) GNUC_FORMAT_ATTRIBUTE_O
Definition: StdBuf.cpp:174
@ Ico_Error
Definition: C4Gui.h:652

References _MAX_PATH, _MAX_PATH_LEN, C4GUI::MessageDialog::btnOK, C4CFN_Title, C4Group_IsGroup(), C4Group_MoveItem(), C4Group::Close(), C4Group::Delete(), StdStrBuf::Format(), StdStrBuf::getData(), C4Group::GetError(), GetFilename(), C4GUI::Ico_Error, ItemExists(), ItemIdentical(), LoadResStr(), MakeFilenameFromTitle(), C4Group::Open(), pGUI, SAppend(), SCopy(), SEqual(), and C4GUI::Screen::ShowMessageModal().

Here is the call graph for this function:

◆ Resort()

void C4ScenarioListLoader::Folder::Resort ( )
inlineinherited

Definition at line 176 of file C4StartupScenSelDlg.h.

176 { Sort(); }

References C4ScenarioListLoader::Folder::Sort().

Here is the call graph for this function:

◆ SetTitleInGroup()

bool C4ScenarioListLoader::Entry::SetTitleInGroup ( C4Group rGrp,
const char *  szNewTitle 
)
virtualinherited

Definition at line 640 of file C4StartupScenSelDlg.cpp.

641 {
642  // default for group files: Create a title text file and set the title in there
643  // no title needed if filename is sufficient - except for scenarios, where a Scenario.txt could overwrite the title
644  if (!IsScenario())
645  {
646  StdStrBuf sNameByFile; sNameByFile.Copy(GetFilename(sFilename.getData()));
647  char *szBuf = sNameByFile.GrabPointer();
648  RemoveExtension(szBuf);
649  sNameByFile.Take(szBuf);
650  if (SEqual(szNewTitle, sNameByFile.getData())) return true;
651  }
652  // okay, make a title
653  StdStrBuf sTitle; sTitle.Format("%s:%s", Config.General.Language, szNewTitle);
654  if (!rGrp.Add(C4CFN_WriteTitle, sTitle, false, true))
655  {
656  StdStrBuf sMsg; sMsg.Format(LoadResStr("IDS_ERR_ERRORADDINGNEWTITLEFORFIL"), sFilename.getData(), rGrp.GetError());
658  return false;
659  }
660  return true;
661 }
#define C4CFN_WriteTitle
Definition: C4Components.h:83
char Language[CFG_MaxString+1]
Definition: C4Config.h:37
bool Add(const char *filename, const char *entry_name)
Definition: C4Group.cpp:1621
virtual bool IsScenario()

References C4Group::Add(), C4GUI::MessageDialog::btnOK, C4CFN_WriteTitle, Config, StdStrBuf::Copy(), StdStrBuf::Format(), C4Config::General, StdStrBuf::getData(), C4Group::GetError(), GetFilename(), StdStrBuf::GrabPointer(), C4GUI::Ico_Error, C4ConfigGeneral::Language, LoadResStr(), pGUI, RemoveExtension(), SEqual(), C4GUI::Screen::ShowMessageModal(), and StdStrBuf::Take().

Here is the call graph for this function:

◆ Sort()

void C4ScenarioListLoader::Folder::Sort ( )
protectedinherited

Definition at line 908 of file C4StartupScenSelDlg.cpp.

909 {
910  // use C-Library-QSort on a buffer of entry pointers; then re-link list
911  if (!pFirst) return;
912  uint32_t iCount,i;
913  Entry **ppEntries = new Entry *[i = iCount = GetEntryCount()], **ppI, *pI=pFirst, **ppIThis;
914  for (ppI = ppEntries; i--; pI = pI->pNext) *ppI++ = pI;
915  qsort(ppEntries, iCount, sizeof(Entry *), &EntrySortFunc);
916  ppIThis = &pFirst;
917  for (ppI = ppEntries; iCount--; ppIThis = &((*ppIThis)->pNext)) *ppIThis = *ppI++;
918  *ppIThis = nullptr;
919  delete [] ppEntries;
920 }
int EntrySortFunc(const void *pEl1, const void *pEl2)

References EntrySortFunc(), and C4ScenarioListLoader::Entry::pNext.

Referenced by C4ScenarioListLoader::Folder::Resort().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Start()

bool C4ScenarioListLoader::Folder::Start ( )
overridevirtualinherited

Implements C4ScenarioListLoader::Entry.

Definition at line 859 of file C4StartupScenSelDlg.cpp.

860 {
861  // open as subfolder
862  if (!C4StartupScenSelDlg::pInstance) return false;
864 }
static C4StartupScenSelDlg * pInstance
bool OpenFolder(C4ScenarioListLoader::Folder *pNewFolder)

References C4StartupScenSelDlg::OpenFolder(), and C4StartupScenSelDlg::pInstance.

Here is the call graph for this function:

Member Data Documentation

◆ C4F

C4Folder C4ScenarioListLoader::Folder::C4F
protectedinherited

Definition at line 152 of file C4StartupScenSelDlg.h.

◆ fBaseLoaded

bool C4ScenarioListLoader::Entry::fBaseLoaded
protectedinherited

Definition at line 59 of file C4StartupScenSelDlg.h.

◆ fContentsLoaded

bool C4ScenarioListLoader::Folder::fContentsLoaded
protectedinherited

Definition at line 153 of file C4StartupScenSelDlg.h.

◆ fctIcon

C4FacetSurface C4ScenarioListLoader::Entry::fctIcon
protectedinherited

Definition at line 58 of file C4StartupScenSelDlg.h.

Referenced by C4ScenarioListLoader::Entry::GetIconFacet().

◆ fctTitle

C4FacetSurface C4ScenarioListLoader::Entry::fctTitle
protectedinherited

Definition at line 58 of file C4StartupScenSelDlg.h.

Referenced by C4ScenarioListLoader::Entry::GetTitlePicture().

◆ fExLoaded

bool C4ScenarioListLoader::Entry::fExLoaded
protectedinherited

Definition at line 59 of file C4StartupScenSelDlg.h.

◆ iDifficulty

int C4ScenarioListLoader::Entry::iDifficulty
protectedinherited

◆ iFolderIndex

int C4ScenarioListLoader::Entry::iFolderIndex
protectedinherited

◆ iIconIndex

int C4ScenarioListLoader::Entry::iIconIndex
protectedinherited

◆ pFirst

Entry* C4ScenarioListLoader::Folder::pFirst
protectedinherited

◆ pLoader

class C4ScenarioListLoader* C4ScenarioListLoader::Entry::pLoader
protectedinherited

Definition at line 50 of file C4StartupScenSelDlg.h.

◆ pMapData

class C4MapFolderData* C4ScenarioListLoader::Folder::pMapData
protectedinherited

Definition at line 155 of file C4StartupScenSelDlg.h.

Referenced by C4ScenarioListLoader::Folder::GetMapData().

◆ pNext

◆ pParent

class Folder* C4ScenarioListLoader::Entry::pParent
protectedinherited

◆ sAuthor

StdCopyStrBuf C4ScenarioListLoader::Entry::sAuthor
protectedinherited

Definition at line 57 of file C4StartupScenSelDlg.h.

Referenced by C4ScenarioListLoader::Entry::GetAuthor().

◆ sDesc

StdCopyStrBuf C4ScenarioListLoader::Entry::sDesc
protectedinherited

Definition at line 57 of file C4StartupScenSelDlg.h.

Referenced by C4ScenarioListLoader::Entry::GetDesc().

◆ sFilename

StdCopyStrBuf C4ScenarioListLoader::Entry::sFilename
protectedinherited

Definition at line 57 of file C4StartupScenSelDlg.h.

Referenced by C4ScenarioListLoader::Entry::GetEntryFilename().

◆ sName

StdCopyStrBuf C4ScenarioListLoader::Entry::sName
protectedinherited

Definition at line 57 of file C4StartupScenSelDlg.h.

Referenced by C4ScenarioListLoader::Entry::GetName().

◆ sVersion

StdCopyStrBuf C4ScenarioListLoader::Entry::sVersion
protectedinherited

Definition at line 57 of file C4StartupScenSelDlg.h.

Referenced by C4ScenarioListLoader::Entry::GetVersion().


The documentation for this class was generated from the following files: