From 3100fa3a6d12146842af3ffa4e3e5325979e5f2c Mon Sep 17 00:00:00 2001 From: Koerty Date: Sun, 15 Apr 2018 14:29:02 +0200 Subject: [PATCH] Add grid default image and folder image Add default game image and folder image to the grid. They can be configured by the theme with the gameImage and folderImage properties of the imagegrid. --- THEMES.md | 4 ++ es-core/src/ThemeData.cpp | 2 + es-core/src/components/ImageGridComponent.h | 65 +++++++++++++++++++- resources/blank_game.png | Bin 0 -> 14299 bytes resources/folder.png | Bin 0 -> 586 bytes 5 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 resources/blank_game.png create mode 100644 resources/folder.png diff --git a/THEMES.md b/THEMES.md index f44baaaf1..b9af4284b 100644 --- a/THEMES.md +++ b/THEMES.md @@ -578,6 +578,10 @@ Can be created as an extra. * `size` - type: NORMALIZED_PAIR. - The size of the grid. Take care the selected tile can go out of the grid size, so don't position the grid too close to another element or the screen border. * `margin` - type: NORMALIZED_PAIR. +* `gameImage` - type: PATH. + - The default image used for games which doesn't have an image. +* `folderImage` - type: PATH. + - The default image used for folders which doesn't have an image. * `scrollDirection` - type: STRING. - `vertical` by default, can also be set to `horizontal`. Not that in `horizontal` mod, the tiles are ordered from top to bottom, then from left to right. diff --git a/es-core/src/ThemeData.cpp b/es-core/src/ThemeData.cpp index 49052fe2a..b8d263286 100644 --- a/es-core/src/ThemeData.cpp +++ b/es-core/src/ThemeData.cpp @@ -29,6 +29,8 @@ std::map> The { "pos", NORMALIZED_PAIR }, { "size", NORMALIZED_PAIR }, { "margin", NORMALIZED_PAIR }, + { "gameImage", PATH }, + { "folderImage", PATH }, { "scrollDirection", STRING } } }, { "gridtile", { { "size", NORMALIZED_PAIR }, diff --git a/es-core/src/components/ImageGridComponent.h b/es-core/src/components/ImageGridComponent.h index 0e46f0ab0..c5e6e8501 100644 --- a/es-core/src/components/ImageGridComponent.h +++ b/es-core/src/components/ImageGridComponent.h @@ -2,6 +2,7 @@ #ifndef ES_CORE_COMPONENTS_IMAGE_GRID_COMPONENT_H #define ES_CORE_COMPONENTS_IMAGE_GRID_COMPONENT_H +#include "Log.h" #include "components/IList.h" #include "resources/TextureResource.h" #include "GridTileComponent.h" @@ -61,6 +62,8 @@ private: // IMAGES & ENTRIES bool mEntriesDirty; + std::shared_ptr mDefaultGameTexture; + std::shared_ptr mDefaultFolderTexture; // TILES Vector2f mMargin; @@ -80,6 +83,8 @@ ImageGridComponent::ImageGridComponent(Window* window) : IList::add(const std::string& name, const std::string& imag typename IList::Entry entry; entry.name = name; entry.object = obj; - entry.data.texture = ResourceManager::getInstance()->fileExists(imagePath) ? TextureResource::get(imagePath) : TextureResource::get(":/button.png"); + + if (ResourceManager::getInstance()->fileExists(imagePath)) + { + entry.data.texture = TextureResource::get(imagePath); + } + else + { + // FileType::FOLDER = 2, but FileData is our template parameter T, + // so we don't want to bring that dependence to FileData here + if (obj->getType() == 2) + entry.data.texture = mDefaultFolderTexture; + else + entry.data.texture = mDefaultGameTexture; + } + static_cast*>(this)->add(entry); mEntriesDirty = true; } @@ -189,6 +208,50 @@ void ImageGridComponent::applyTheme(const std::shared_ptr& theme, if (elem->has("scrollDirection")) mScrollDirection = (ScrollDirection)(elem->get("scrollDirection") == "horizontal"); + + if (elem->has("gameImage")) + { + std::string path = elem->get("gameImage"); + + if (!ResourceManager::getInstance()->fileExists(path)) + LOG(LogWarning) << "Could not replace default game image, check path: " << path; + else + { + std::shared_ptr oldDefaultGameTexture = mDefaultGameTexture; + + mDefaultGameTexture = TextureResource::get(path); + + // mEntries are already loaded at this point, + // so we need to update them with new game image texture + for (auto it = mEntries.begin(); it != mEntries.end(); it++) + { + if ((*it).data.texture == oldDefaultGameTexture) + (*it).data.texture = mDefaultGameTexture; + } + } + } + + if (elem->has("folderImage")) + { + std::string path = elem->get("folderImage"); + + if (!ResourceManager::getInstance()->fileExists(path)) + LOG(LogWarning) << "Could not replace default folder image, check path: " << path; + else + { + std::shared_ptr oldDefaultFolderTexture = mDefaultFolderTexture; + + mDefaultFolderTexture = TextureResource::get(path); + + // mEntries are already loaded at this point, + // so we need to update them with new folder image texture + for (auto it = mEntries.begin(); it != mEntries.end(); it++) + { + if ((*it).data.texture == oldDefaultFolderTexture) + (*it).data.texture = mDefaultFolderTexture; + } + } + } } // We still need to manually get the grid tile size here, diff --git a/resources/blank_game.png b/resources/blank_game.png new file mode 100644 index 0000000000000000000000000000000000000000..23b2930632b52ff7570305ccc1e1993045096099 GIT binary patch literal 14299 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 VF_uS#fWN&1RPJcrE>ysV{9iGSqQn3I literal 0 HcmV?d00001 diff --git a/resources/folder.png b/resources/folder.png new file mode 100644 index 0000000000000000000000000000000000000000..7582a4a2752c2ca0ac848f66318506bd3c64924a GIT binary patch literal 586 zcmeAS@N?(olHy`uVBq!ia0vp^^&rf_0wi;`T%7@=n3BBRT^Rni_n+Ah4nJ za0`PlBg3pY5H=O_J^D-f{NmeV&@JqFfiWsba4!+xb^mqevzo7!10gw^UFSc zdKGBcc}RhI4nzAxsfcrp58384Jd*1W5o`8gDPS;=`1H(Qd76VL+d)0kC$-V*Zmd23 zRU^UK@S{P^$?#Q68N=g;qEyOY|r+CkF2?-hRU7jypj?B(;%HL`J4 zQ(u34d3EyjO-T`THwu5gx%}9-J2SEFw*U8geCM_=dHdCGw$w%wd;i;i>kGafy>jLA zqnqW|FTG##;ULK1_&a}oK2Lh{bc@sV?8-X_n=FZaDJ;&~bmTtXD(DiqJ?w+=gTKsx*bmfmfPr99-zIo(qS$L+pZu70u z3#LA|#mny6@2dZ1=-n0Lyz<;1v#nR_D*A63{PDb6YxlcP$93M%xWePEa;^I3<6gl% zN;SqGd$(yK>!!V)^>`Os_lGB|ei&|A^F--+^P}C*Jc6cO+P-`Jt#fZ1eoU&i{CBFQ w%u_0@@815q3|}8?_P>i9@OFQ0OWkJ_5-&OSBdd2SFy