1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
|
/********************************************************************************
* *
* I c o n C a c h e *
* *
*********************************************************************************
* Copyright (C) 1998,2022 by Jeroen van der Zijp. All Rights Reserved. *
*********************************************************************************
* This library is free software; you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License as published by *
* the Free Software Foundation; either version 3 of the License, or *
* (at your option) any later version. *
* *
* This library 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 Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/> *
********************************************************************************/
#include "xincs.h"
#include "fxver.h"
#include "fxdefs.h"
#include "fxmath.h"
#include "FXArray.h"
#include "FXHash.h"
#include "FXMutex.h"
#include "FXStream.h"
#include "FXString.h"
#include "FXSize.h"
#include "FXPoint.h"
#include "FXRectangle.h"
#include "FXPath.h"
#include "FXDictionary.h"
#include "FXDictionaryOf.h"
#include "FXStringDictionary.h"
#include "FXSettings.h"
#include "FXRegistry.h"
#include "FXEvent.h"
#include "FXWindow.h"
#include "FXApp.h"
#include "FXIcon.h"
#include "FXIconSource.h"
#include "FXIconCache.h"
/*
Notes:
- Icon Cache provides fast mapping of icon name to icon; when encountering
an icon name for the first time, the icon is loaded in using the facilities
of the Icon Source icon loader.
- Icon Source icon loader can be replaced with subclassed icon loader for
additional file formats supported (outside of what FOX provides).
- Icons loaded are not realized (created). This is up to the user to do;
rationale: not all applications need icons rendered for drawing purposes.
- An icon search-path determines which directories are to be searched for
the provided icon name.
- Since loading an icon may fail, don't map the name till we've successfully
obtained the icon.
*/
#define TOPIC_CONSTRUCT 1000
// You can override the default icon locations to search for your
// particular platform by specifying -DDEFAULTICONPATH="path" on
// the command line.
#ifndef DEFAULTICONPATH
#if defined(WIN32)
#define DEFAULTICONPATH "%HOMEDRIVE%%HOMEPATH%\\FIXME;%SYSTEMDRIVE%%SYSTEMROOT%\\FIXME"
#else
#define DEFAULTICONPATH "~/.icons:~/Pictures:/usr/local/share/icons:/usr/share/icons"
#endif
#endif
using namespace FX;
/*******************************************************************************/
namespace FX {
// Default icon path
const FXchar FXIconCache::defaultIconPath[]=DEFAULTICONPATH;
// Object implementation
FXIMPLEMENT(FXIconCache,FXObject,nullptr,0)
// Build icon cache
FXIconCache::FXIconCache():app((FXApp*)-1L),loader(&FXIconSource::defaultIconSource){
FXTRACE((TOPIC_CONSTRUCT,"FXIconCache::FXIconCache\n"));
}
// Build icon cache
FXIconCache::FXIconCache(FXApp* ap,const FXString& sp):app(ap),loader(&FXIconSource::defaultIconSource),path(sp){
FXTRACE((TOPIC_CONSTRUCT,"FXIconCache::FXIconCache\n"));
}
// Insert unique icon loaded from filename into dictionary
FXIcon* FXIconCache::insert(const FXchar* name){
FXTRACE((200,"FXIconCache::insert(\"%s\")\n",name));
FXIcon* result=dict[name];
if(!result){
result=loader->loadIconFile(getApp(),FXPath::search(path,name));
if(result){
dict[name]=result;
}
}
return result;
}
// Remove icon from cache and delete it
void FXIconCache::remove(const FXchar* name){
FXTRACE((200,"FXIconCache::remove(\"%s\")\n",name));
delete dict.remove(name);
}
// Delete all icons
void FXIconCache::clear(){
FXTRACE((200,"FXIconCache::clear()\n"));
for(FXival i=0; i<dict.no(); ++i){
delete dict.data(i);
}
dict.clear();
}
// Save object to stream
void FXIconCache::save(FXStream& store) const {
store << app;
store << path;
}
// Load object from stream
void FXIconCache::load(FXStream& store){
store >> app;
store >> path;
}
// Destructor
FXIconCache::~FXIconCache(){
FXTRACE((TOPIC_CONSTRUCT,"FXIconCache::~FXIconCache\n"));
clear();
app=(FXApp*)-1L;
loader=(FXIconSource*)-1L;
}
}
|