/*
fileicons.cpp
Copyright (C) 2009 yellow wood goblin
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include "fileicons.h"
#include
#include
#include "globalsettings.h"
#include "icons.h"
#include "systemfilenames.h"
#include "ui/binaryfind.h"
cFileIconItem::cFileIconItem(const std::string& aFolderName, const std::string& aFileName)
: _loaded(false), _foldername(aFolderName), _filename(aFileName) {}
cBMP15& cFileIconItem::Icon(void) {
Load();
return _icon;
}
void cFileIconItem::Load(void) {
if (!_loaded) {
_icon = createBMP15FromFile(_foldername + _filename + ".bmp");
_loaded = true;
}
}
static bool Comp(const cFileIconItem& item1, const cFileIconItem& item2) {
return strcasecmp(item1.FileName().c_str(), item2.FileName().c_str()) < 0;
}
bool cFileIconItem::operator<(const cFileIconItem& aValue) const {
return Comp(*this, aValue);
}
cFileIcons::cFileIcons() {
cIconPaths* paths = new cIconPaths;
LoadFolder(*paths, SFN_UI_ICONS_DIRECTORY);
LoadFolder(*paths, SFN_ICONS_DIRECTORY);
for (cIconPaths::const_iterator it = paths->begin(); it != paths->end(); ++it) {
_icons.push_back(*it);
}
delete paths;
}
void cFileIcons::LoadFolder(cIconPaths& aPaths, const std::string& aFolder) {
DIR* dir = opendir(aFolder.c_str());
struct dirent* entry;
if (NULL != dir) {
while ((entry = readdir(dir)) != NULL) {
if (entry->d_type != DT_DIR) {
size_t len = strlen(entry->d_name);
if (len > 4) {
char* extName = entry->d_name + len - 4;
if (strcasecmp(extName, ".bmp") == 0) {
*extName = 0;
aPaths.insert(cFileIconItem(aFolder, entry->d_name));
}
}
}
}
closedir(dir);
}
}
s32 cFileIcons::Icon(const std::string& aValue) {
if (!_icons.size()) return -1;
std::vector::iterator result =
akui::binary_find(_icons.begin(), _icons.end(), cFileIconItem("", aValue), Comp);
if (result == _icons.end()) {
return -1;
}
cBMP15& image = (*result).Icon();
return ((image.valid() && image.width() == 32 && image.height() == 32)
? (result - _icons.begin())
: -1);
}
void cFileIcons::Draw(s32 idx, u8 x, u8 y, GRAPHICS_ENGINE engine) {
gdi().maskBlt(_icons[idx].Icon().buffer(), x, y, 32, 32, engine);
}
void cFileIcons::DrawMem(s32 idx, void* mem) {
cIcons::maskBlt((const u16*)_icons[idx].Icon().buffer(), (u16*)mem);
}